minerva-design 1.13.2 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/custom-elements.json +194 -12
- package/dist/angular/fesm2022/minerva-angular.mjs +20 -0
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +10 -1
- package/dist/charts/canvas.d.cts +1 -0
- package/dist/charts/canvas.d.ts +1 -0
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +152 -128
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -1
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +475 -405
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.js +263 -248
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/dom.cjs +1 -1
- package/dist/charts/engine/dom.cjs.map +1 -1
- package/dist/charts/engine/dom.d.cts +34 -0
- package/dist/charts/engine/dom.d.ts +34 -0
- package/dist/charts/engine/dom.js +62 -51
- package/dist/charts/engine/dom.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +1 -1
- package/dist/charts/engine/graph/chart.cjs.map +1 -1
- package/dist/charts/engine/graph/chart.js +835 -821
- package/dist/charts/engine/graph/chart.js.map +1 -1
- package/dist/charts/engine/graph/dom.cjs +1 -1
- package/dist/charts/engine/graph/dom.cjs.map +1 -1
- package/dist/charts/engine/graph/dom.js +44 -51
- package/dist/charts/engine/graph/dom.js.map +1 -1
- package/dist/charts/engine/hover-rect.cjs +2 -0
- package/dist/charts/engine/hover-rect.cjs.map +1 -0
- package/dist/charts/engine/hover-rect.d.cts +10 -0
- package/dist/charts/engine/hover-rect.d.ts +10 -0
- package/dist/charts/engine/hover-rect.js +47 -0
- package/dist/charts/engine/hover-rect.js.map +1 -0
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.js +8 -8
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.js +191 -191
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/depth.cjs +1 -1
- package/dist/charts/engine/orderbook/depth.cjs.map +1 -1
- package/dist/charts/engine/orderbook/depth.js +63 -63
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.js +155 -155
- package/dist/charts/engine/orderbook/host.cjs +1 -1
- package/dist/charts/engine/orderbook/host.cjs.map +1 -1
- package/dist/charts/engine/orderbook/host.js +87 -75
- package/dist/charts/engine/orderbook/host.js.map +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
- package/dist/charts/engine/orderbook/ladder.js +41 -41
- package/dist/charts/engine/orderbook/tape.cjs +1 -1
- package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
- package/dist/charts/engine/orderbook/tape.js +31 -31
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.js +15 -15
- package/dist/charts/engine/renderers/vector-gpu.cjs +24 -0
- package/dist/charts/engine/renderers/vector-gpu.cjs.map +1 -0
- package/dist/charts/engine/renderers/vector-gpu.d.cts +22 -0
- package/dist/charts/engine/renderers/vector-gpu.d.ts +22 -0
- package/dist/charts/engine/renderers/vector-gpu.js +301 -0
- package/dist/charts/engine/renderers/vector-gpu.js.map +1 -0
- package/dist/charts/engine/renderers/vector.cjs +2 -0
- package/dist/charts/engine/renderers/vector.cjs.map +1 -0
- package/dist/charts/engine/renderers/vector.d.cts +140 -0
- package/dist/charts/engine/renderers/vector.d.ts +140 -0
- package/dist/charts/engine/renderers/vector.js +568 -0
- package/dist/charts/engine/renderers/vector.js.map +1 -0
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +43 -3
- package/dist/charts/engine/scene.d.ts +43 -3
- package/dist/charts/engine/scene.js +411 -338
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/bullet.cjs +1 -1
- package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
- package/dist/charts/engine/shapes/bullet.js +36 -36
- package/dist/charts/engine/shapes/calendar.cjs +1 -1
- package/dist/charts/engine/shapes/calendar.cjs.map +1 -1
- package/dist/charts/engine/shapes/calendar.js +53 -53
- package/dist/charts/engine/shapes/chart.cjs +1 -1
- package/dist/charts/engine/shapes/chart.cjs.map +1 -1
- package/dist/charts/engine/shapes/chart.d.cts +3 -2
- package/dist/charts/engine/shapes/chart.d.ts +3 -2
- package/dist/charts/engine/shapes/chart.js +192 -162
- package/dist/charts/engine/shapes/chart.js.map +1 -1
- package/dist/charts/engine/shapes/draw.cjs +1 -1
- package/dist/charts/engine/shapes/draw.cjs.map +1 -1
- package/dist/charts/engine/shapes/draw.js +87 -86
- package/dist/charts/engine/shapes/draw.js.map +1 -1
- package/dist/charts/engine/shapes/layout.cjs +2 -2
- package/dist/charts/engine/shapes/layout.cjs.map +1 -1
- package/dist/charts/engine/shapes/layout.d.cts +8 -7
- package/dist/charts/engine/shapes/layout.d.ts +8 -7
- package/dist/charts/engine/shapes/layout.js +262 -166
- package/dist/charts/engine/shapes/layout.js.map +1 -1
- package/dist/charts/engine/shapes/types.d.cts +13 -1
- package/dist/charts/engine/shapes/types.d.ts +13 -1
- package/dist/charts/engine/three-d/chart.cjs +1 -1
- package/dist/charts/engine/three-d/chart.cjs.map +1 -1
- package/dist/charts/engine/three-d/chart.js +266 -257
- package/dist/charts/engine/three-d/chart.js.map +1 -1
- package/dist/charts/engine/three-d/dom.cjs +1 -1
- package/dist/charts/engine/three-d/dom.cjs.map +1 -1
- package/dist/charts/engine/three-d/dom.js +28 -35
- package/dist/charts/engine/three-d/dom.js.map +1 -1
- package/dist/charts/engine/three-d/geometry.cjs +1 -1
- package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
- package/dist/charts/engine/three-d/geometry.js +70 -70
- package/dist/charts/engine/three-d/overlay.cjs +1 -1
- package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
- package/dist/charts/engine/three-d/overlay.js +15 -15
- package/dist/charts/engine/tooltip.cjs +2 -0
- package/dist/charts/engine/tooltip.cjs.map +1 -0
- package/dist/charts/engine/tooltip.d.cts +94 -0
- package/dist/charts/engine/tooltip.d.ts +94 -0
- package/dist/charts/engine/tooltip.js +242 -0
- package/dist/charts/engine/tooltip.js.map +1 -0
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.js +135 -135
- package/dist/charts/react/shapes.cjs +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +10 -1
- package/dist/charts/react/shapes.d.ts +10 -1
- package/dist/charts/react/shapes.js +24 -19
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/canvas.cjs +1 -1
- package/dist/native/charts/src/canvas.js +8 -7
- package/dist/native/charts/src/engine/canvas.cjs +1 -1
- package/dist/native/charts/src/engine/canvas.js +2 -0
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +102 -87
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/hover-rect.cjs +2 -0
- package/dist/native/charts/src/engine/hover-rect.cjs.map +1 -0
- package/dist/native/charts/src/engine/hover-rect.js +47 -0
- package/dist/native/charts/src/engine/hover-rect.js.map +1 -0
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +318 -245
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.js +81 -80
- package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
- package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.js +239 -143
- package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
- package/dist/native/charts/src/engine/tooltip.cjs +2 -0
- package/dist/native/charts/src/engine/tooltip.cjs.map +1 -0
- package/dist/native/charts/src/engine/tooltip.js +164 -0
- package/dist/native/charts/src/engine/tooltip.js.map +1 -0
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +210 -187
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/source/components/Chart/scene.tsx +55 -2
- package/dist/taro/index.js +2026 -1626
- package/dist/uni/charts-canvas.js +1 -0
- package/dist/vue/components/Chart/BulletChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/CalendarHeatmap.vue.d.ts +2 -0
- package/dist/vue/components/Chart/ChordChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/DonutChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/FunnelChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/GaugeChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/PieChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/RadarChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/RadialBarChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/SankeyChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/SunburstChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TreemapChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/props.d.ts +2 -0
- package/dist/vue/components/Chart/props.js +1 -0
- package/dist/vue/components/Chart/props.js.map +1 -1
- package/dist/vue/components/Chart/shape.d.ts +2 -1
- package/dist/vue/components/Chart/shape.js +2 -0
- package/dist/vue/components/Chart/shape.js.map +1 -1
- package/dist/vue/components/Chart/types.d.ts +2 -0
- package/dist/weapp/charts/canvas.js +2576 -1969
- package/dist/weapp/charts/core.js +1 -0
- package/dist/web-components/components/chart/shape-chart.d.ts +9 -7
- package/dist/web-components/components/chart/shape-chart.js +3 -0
- package/dist/web-components/components/chart/shape-chart.js.map +1 -1
- package/dist/web-components/components/chart/shapes-extended.d.ts +6 -6
- package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.cjs","names":["clamp","resolveLocale","shapeLabels","localeFormat","localePercent","resolveWith","inset","layoutPie","layoutRadar","layoutGauge","layoutFunnel","layoutSankey","layoutSunburst","layoutRadialBar","layoutCalendar","layoutBullet","layoutChord","layoutTreemap","toCss","funnelOrder","seriesName","radialBarLabels","resolveSankey","calendarLegend","resolveChord","calendarModel","interpolate","SHAPE_LABELS","font","wrapText","require_color","require_locale","require_overlay","require_labels","require_scene","require_calendar","require_bullet","require_chord","require_funnel","require_gauge","require_pie","require_radar","require_radialBar","require_sankey","require_sunburst","require_treemap","NO_HIDDEN","NO_FOCUS","layoutShapeScene","o","input","bounds","from","t","palette","theme","locale","labels","c","target","start","key","css","i","result","shapeValues","out","hidden","focus","blendValues","to","v","sameValues","a","b","w","legendConfig","config","shapeLegend","color","entries","shown","d","s","g","m","toggleCount","hoverEvent","hover","item","scene","it","k","ind","sameHover","tooltipContent","rows","row","describeItem","describeChart","l","describeScene","LEGEND_ROW","layoutShapeLegend","f","x","e","width","measure","height","top","position","chartHeight","boxes","last","offset","box","r","TIP_MARGIN","TIP_GAP","overlapArea","placeShapeTooltip","fit","y","h","ax","ay","anchor","radar","avoid","vertex","dx","dy","len","candidates","best","bestScore","cx0","cy0","p","score","px","py","label","ox","oy","dist","layoutShapeTooltip","lines","content","text","titleLines","value","line","titleFont","dot","maxTitle","bw","bh","anchorX","anchorY"],"sources":["../../../../../charts/src/engine/shapes/layout.ts"],"sourcesContent":["// Layout of every shape chart type into a ShapeScene, plus what the hosts\n// share: animated values, legend entries, tooltip content, hover events and\n// accessible descriptions. Pure: no DOM, no canvas.\n\nimport { toCss } from \"../color\";\nimport { resolveLocale } from \"../locale\";\nimport { font } from \"../overlay\";\nimport type { ChartTheme } from \"../theme\";\nimport { bulletValues, layoutBullet } from \"./bullet\";\nimport {\n calendarLegend,\n calendarModel,\n calendarValues,\n layoutCalendar,\n} from \"./calendar\";\nimport { chordValues, layoutChord, resolveChord } from \"./chord\";\nimport { funnelOrder, funnelValues, layoutFunnel } from \"./funnel\";\nimport { gaugeValues, layoutGauge } from \"./gauge\";\nimport {\n interpolate,\n localeFormat,\n localePercent,\n SHAPE_LABELS,\n shapeLabels,\n} from \"./labels\";\nimport { layoutPie, pieValues } from \"./pie\";\nimport { layoutRadar, radarValues, seriesName } from \"./radar\";\nimport { layoutRadialBar, radialBarLabels, radialBarValues } from \"./radialBar\";\nimport { layoutSankey, resolveSankey, sankeyValues } from \"./sankey\";\nimport {\n clamp,\n inset,\n resolveWith,\n wrapText,\n type LayoutContext,\n type LayoutResult,\n type MeasureText,\n type ShapeHover,\n type ShapeLegendEntry,\n type ShapeRect,\n type ShapeScene,\n type ShapeTooltipRow,\n} from \"./scene\";\nimport { layoutSunburst, sunburstValues } from \"./sunburst\";\nimport { layoutTreemap, treemapValues } from \"./treemap\";\nimport type {\n ShapeChartOptions,\n ShapeHoverEvent,\n ShapeLegendOptions,\n} from \"./types\";\n\nexport interface ShapeLayoutInput {\n options: ShapeChartOptions;\n theme: ChartTheme;\n /** Size of the whole drawing, CSS pixels */\n width: number;\n height: number;\n /** Area of the chart (legend excluded); the whole drawing by default */\n bounds?: ShapeRect;\n measure: MeasureText;\n /** Hidden slices / stages / series (treemap: top-level nodes) */\n hidden?: ReadonlySet<number>;\n /** Entry animation progress, eased (1 = done) */\n enter?: number;\n /** Values at the start of an update animation (`shapeValues`) */\n from?: ReadonlyMap<string, number> | null;\n /** Update animation progress, eased (1 = done) */\n t?: number;\n /** Sunburst: names from the root to the focused node */\n focus?: readonly string[];\n}\n\nconst NO_HIDDEN: ReadonlySet<number> = new Set();\nconst NO_FOCUS: readonly string[] = [];\n\n/** Lays a shape chart out */\nexport const layoutShapeScene = (input: ShapeLayoutInput): ShapeScene => {\n const { options: o, theme, width, height } = input;\n const bounds = input.bounds ?? { x: 0, y: 0, width, height };\n const from = input.from ?? null;\n const t = clamp(input.t ?? 1, 0, 1);\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n const locale = resolveLocale(o.locale);\n const labels = shapeLabels(o);\n const c: LayoutContext = {\n theme,\n measure: input.measure,\n hidden: input.hidden ?? NO_HIDDEN,\n enter: clamp(input.enter ?? 1, 0, 1),\n value: (key, target) => {\n if (!from || t >= 1) return target;\n const start = from.get(key) ?? 0;\n return start + (target - start) * t;\n },\n format: o.format ?? localeFormat(locale),\n percent: o.percentFormat ?? localePercent(locale),\n labels,\n locale,\n color: (css, i) => resolveWith(theme, css, palette[i % palette.length]),\n area: inset(bounds, o.padding),\n focus: input.focus ?? NO_FOCUS,\n };\n let result: LayoutResult;\n switch (o.type) {\n case \"pie\":\n result = layoutPie(o, c);\n break;\n case \"radar\":\n result = layoutRadar(o, c);\n break;\n case \"gauge\":\n result = layoutGauge(o, c);\n break;\n case \"funnel\":\n result = layoutFunnel(o, c);\n break;\n case \"sankey\":\n result = layoutSankey(o, c);\n break;\n case \"sunburst\":\n result = layoutSunburst(o, c);\n break;\n case \"radialBar\":\n result = layoutRadialBar(o, c);\n break;\n case \"calendarHeatmap\":\n result = layoutCalendar(o, c);\n break;\n case \"bullet\":\n result = layoutBullet(o, c);\n break;\n case \"chord\":\n result = layoutChord(o, c);\n break;\n default:\n result = layoutTreemap(o, c);\n break;\n }\n return { type: o.type, width, height, labels, locale, ...result };\n};\n\n/** Target values of the animated quantities, by key */\nexport const shapeValues = (\n o: ShapeChartOptions,\n hidden: ReadonlySet<number> = NO_HIDDEN,\n focus: readonly string[] = NO_FOCUS,\n): Map<string, number> => {\n const out = new Map<string, number>();\n switch (o.type) {\n case \"pie\":\n pieValues(o, hidden, out);\n break;\n case \"radar\":\n radarValues(o, hidden, out);\n break;\n case \"gauge\":\n gaugeValues(o, hidden, out);\n break;\n case \"funnel\":\n funnelValues(o, hidden, out);\n break;\n case \"sankey\":\n sankeyValues(o, hidden, out);\n break;\n case \"sunburst\":\n sunburstValues(o, hidden, focus, out);\n break;\n case \"radialBar\":\n radialBarValues(o, hidden, out);\n break;\n case \"calendarHeatmap\":\n calendarValues(o, hidden, out);\n break;\n case \"bullet\":\n bulletValues(o, hidden, out);\n break;\n case \"chord\":\n chordValues(o, hidden, out);\n break;\n default:\n treemapValues(o, hidden, out);\n break;\n }\n return out;\n};\n\n/** Values shown at progress `t` of an animation from `from` to `to` */\nexport const blendValues = (\n from: ReadonlyMap<string, number>,\n to: ReadonlyMap<string, number>,\n t: number,\n): Map<string, number> => {\n const out = new Map<string, number>();\n to.forEach((v, key) => {\n const start = from.get(key) ?? 0;\n out.set(key, start + (v - start) * t);\n });\n return out;\n};\n\nexport const sameValues = (\n a: ReadonlyMap<string, number>,\n b: ReadonlyMap<string, number>,\n) => {\n if (a.size !== b.size) return false;\n for (const [key, v] of a) {\n const w = b.get(key);\n if (w === undefined || Math.abs(w - v) > 1e-12) return false;\n }\n return true;\n};\n\n/** Legend position and toggling */\nexport const legendConfig = (\n o: ShapeChartOptions,\n): Required<ShapeLegendOptions> => {\n const config = typeof o.legend === \"object\" ? o.legend : {};\n return {\n position: config.position ?? \"bottom\",\n toggle: config.toggle ?? true,\n };\n};\n\n/** Legend entries, `null` when the legend is hidden */\nexport const shapeLegend = (\n o: ShapeChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<number> = NO_HIDDEN,\n): ShapeLegendEntry[] | null => {\n if (o.legend === false) return null;\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n const color = (css: string | undefined, i: number) =>\n toCss(resolveWith(theme, css, palette[i % palette.length]));\n let entries: ShapeLegendEntry[] = [];\n let shown = o.legend !== undefined;\n switch (o.type) {\n case \"pie\":\n shown = true;\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"funnel\":\n shown = true;\n entries = funnelOrder(o, NO_HIDDEN).map((i) => ({\n index: i,\n name: o.data[i].name,\n color: color(o.data[i].color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"radar\":\n shown ||= o.series.length > 1;\n entries = o.series.map((s, i) => ({\n index: i,\n name: seriesName(o, i, shapeLabels(o)),\n color: color(s.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"treemap\":\n case \"sunburst\":\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"radialBar\":\n shown ||= !radialBarLabels(o);\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"bullet\":\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"sankey\": {\n const g = resolveSankey(o);\n entries = g.names.map((name, i) => ({\n index: i,\n name,\n color: color(g.colors[i], i),\n hidden: hidden.has(i),\n }));\n break;\n }\n case \"calendarHeatmap\":\n shown = true;\n entries = calendarLegend(o, theme, hidden);\n break;\n case \"chord\": {\n shown = true;\n const m = resolveChord(o);\n entries = m.names.map((name, i) => ({\n index: i,\n name,\n color: color(m.colors[i], i),\n hidden: hidden.has(i),\n }));\n break;\n }\n default:\n break;\n }\n return shown && entries.length ? entries : null;\n};\n\n/**\n * Number of toggleable entries (slices, stages, series, top-level nodes,\n * sankey nodes, bars, rows, calendar levels, chord groups)\n */\nexport const toggleCount = (o: ShapeChartOptions): number => {\n switch (o.type) {\n case \"radar\":\n return o.series.length;\n case \"gauge\":\n return 0;\n case \"sankey\":\n return resolveSankey(o).names.length;\n case \"calendarHeatmap\":\n return calendarModel(o)?.count ?? 0;\n case \"chord\":\n return resolveChord(o).names.length;\n default:\n return o.data.length;\n }\n};\n\n/** Event of a hovered item */\nexport const hoverEvent = (\n scene: ShapeScene,\n hover: ShapeHover | null,\n): ShapeHoverEvent | null => {\n if (!hover) return null;\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n if (item.indicators) {\n const k = clamp(hover.indicator ?? 0, 0, item.indicators.length - 1);\n const ind = item.indicators[k];\n return {\n index: item.index,\n indicator: k,\n name: item.name,\n value: ind.value,\n percent: ind.percent,\n color: item.color,\n };\n }\n return {\n index: item.index,\n name: item.name,\n value: item.value,\n percent: item.percent,\n color: item.color,\n ...(item.path ? { path: item.path } : {}),\n ...item.event,\n };\n};\n\nexport const sameHover = (a: ShapeHover | null, b: ShapeHover | null) =>\n a === b || (!!a && !!b && a.index === b.index && a.indicator === b.indicator);\n\nexport interface ShapeTooltipContent {\n title: string;\n color?: string;\n rows: ShapeTooltipRow[];\n}\n\n/** Default tooltip of a hovered item */\nexport const tooltipContent = (\n scene: ShapeScene,\n hover: ShapeHover,\n): ShapeTooltipContent | null => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n const rows = item.indicators\n ? item.rows.map((row, k) =>\n k === (hover.indicator ?? -1) ? { ...row, strong: true } : row,\n )\n : item.rows;\n return {\n title: item.path ? item.path.join(\" / \") : item.name,\n color: item.color,\n rows,\n };\n};\n\n/** Text read by screen readers for a focused item */\nexport const describeItem = (scene: ShapeScene, hover: ShapeHover) => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return \"\";\n if (item.indicators) {\n const k = clamp(hover.indicator ?? 0, 0, item.indicators.length - 1);\n return `${item.name}, ${item.indicators[k].name}: ${item.rows[k]?.value ?? item.indicators[k].value}`;\n }\n const name = item.path ? item.path.join(\" / \") : item.name;\n return `${name}: ${item.rows[0]?.value ?? item.value} (${item.share ?? localePercent(scene.locale)(item.percent)})`;\n};\n\n/** Default accessible name of a chart (in its `locale`) */\nexport const describeChart = (o: ShapeChartOptions) => {\n const l = shapeLabels(o);\n switch (o.type) {\n case \"pie\":\n return o.rose\n ? l.roseChart\n : (o.innerRadius ?? 0) > 0\n ? l.donutChart\n : l.pieChart;\n case \"radar\":\n return l.radarChart;\n case \"gauge\":\n return o.label\n ? interpolate(l.gaugeChartNamed, { label: o.label })\n : l.gaugeChart;\n case \"funnel\":\n return l.funnelChart;\n case \"sankey\":\n return l.sankeyChart;\n case \"sunburst\":\n return l.sunburstChart;\n case \"radialBar\":\n return l.radialBarChart;\n case \"calendarHeatmap\":\n return l.calendarHeatmap;\n case \"bullet\":\n return l.bulletChart;\n case \"chord\":\n return l.chordChart;\n default:\n return l.treemapChart;\n }\n};\n\n/** Text summary of the data (screen readers) */\nexport const describeScene = (scene: ShapeScene) =>\n scene.empty\n ? (scene.labels ?? SHAPE_LABELS.en).noData\n : scene.items\n .slice(0, 12)\n .map((item) =>\n item.indicators\n ? `${item.name}: ${item.indicators\n .map(\n (ind, k) => `${ind.name} ${item.rows[k]?.value ?? ind.value}`,\n )\n .join(\", \")}`\n : describeItem(scene, { index: item.index }),\n )\n .join(\"; \");\n\n// ------------------------------------------------- canvas legend & tooltip\n\nexport interface ShapeLegendBox extends ShapeLegendEntry {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nconst LEGEND_ROW = 20;\n\n/** Centered legend rows drawn on a canvas; `height` includes the gap with the chart */\nexport const layoutShapeLegend = (\n entries: readonly ShapeLegendEntry[],\n width: number,\n position: \"top\" | \"bottom\",\n chartHeight: number,\n theme: ChartTheme,\n measure: MeasureText,\n): { boxes: ShapeLegendBox[]; height: number } => {\n const f = font(theme, 12);\n const gap = 14;\n const rows: ShapeLegendBox[][] = [[]];\n let x = 0;\n for (const e of entries) {\n const w = Math.min(width - 8, 16 + measure(e.name, f));\n let row = rows[rows.length - 1];\n if (row.length && x + gap + w > width - 8) {\n rows.push((row = []));\n x = 0;\n }\n if (row.length) x += gap;\n row.push({ ...e, x, y: 0, width: w, height: LEGEND_ROW });\n x += w;\n }\n const height = rows.length * LEGEND_ROW + 8;\n const top = position === \"top\" ? 2 : chartHeight - height + 6;\n const boxes: ShapeLegendBox[] = [];\n rows.forEach((row, r) => {\n const last = row[row.length - 1];\n const used = last ? last.x + last.width : 0;\n const offset = (width - used) / 2;\n for (const box of row) {\n boxes.push({ ...box, x: box.x + offset, y: top + r * LEGEND_ROW });\n }\n });\n return { boxes, height };\n};\n\nexport interface ShapeTooltipBox {\n x: number;\n y: number;\n width: number;\n height: number;\n padding: number;\n lineHeight: number;\n /** Default content */\n content?: ShapeTooltipContent;\n /** Lines of the content's title (long titles wrap) */\n titleLines?: string[];\n /** Custom text (`tooltip.render` returning a string) */\n text?: string[];\n}\n\n/** Margin between a tooltip and the edges of the drawing */\nconst TIP_MARGIN = 6;\n/** Distance between a tooltip and its anchor */\nconst TIP_GAP = 14;\n\nconst overlapArea = (a: ShapeRect, b: ShapeRect) =>\n Math.max(0, Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x)) *\n Math.max(0, Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y));\n\n/**\n * Top-left corner of a `w` x `h` tooltip anchored at `anchor`, inside a\n * `width` x `height` drawing. Beside the anchor (right, else left) by\n * default; radar tooltips go outward, off the hovered vertex and, when\n * possible, off the indicator labels.\n */\nexport const placeShapeTooltip = (\n scene: ShapeScene | null,\n hover: ShapeHover | null,\n anchor: { x: number; y: number },\n w: number,\n h: number,\n width: number,\n height: number,\n): { x: number; y: number } => {\n const m = TIP_MARGIN;\n const fit = (x: number, y: number) => ({\n x: Math.max(m, Math.min(x, width - w - m)),\n y: Math.max(m, Math.min(y, height - h - m)),\n });\n const { x: ax, y: ay } = anchor;\n const radar = scene?.radar;\n if (!radar || !scene || !hover) {\n let x = ax + 16;\n if (x + w > width - m) x = ax - 16 - w;\n return fit(x, ay - h / 2);\n }\n\n // points the tooltip must not cover: the anchor and the hovered vertex\n const avoid: [number, number][] = [[ax, ay]];\n const item = scene.items.find((it) => it.index === hover.index);\n const vertex =\n item?.indicators && hover.indicator !== undefined\n ? item.indicators[hover.indicator]\n : undefined;\n if (vertex) avoid.push([vertex.x, vertex.y]);\n const labels = radar.labels ?? [];\n // outward direction, from the center through the anchor\n let dx = ax - radar.cx;\n let dy = ay - radar.cy;\n const len = Math.hypot(dx, dy);\n if (len > 1) {\n dx /= len;\n dy /= len;\n } else {\n dx = 1;\n dy = 0;\n }\n const g = TIP_GAP;\n const candidates: [number, number][] = [\n [ax + g, ay - h / 2],\n [ax - g - w, ay - h / 2],\n [ax - w / 2, ay - g - h],\n [ax - w / 2, ay + g],\n [ax + g, ay - g - h],\n [ax + g, ay + g],\n [ax - g - w, ay - g - h],\n [ax - g - w, ay + g],\n ];\n let best = fit(candidates[0][0], candidates[0][1]);\n let bestScore = Infinity;\n for (const [cx0, cy0] of candidates) {\n const p = fit(cx0, cy0);\n const box = { x: p.x, y: p.y, width: w, height: h };\n let score = 0;\n for (const [px, py] of avoid) {\n const covers =\n px > box.x - 8 &&\n px < box.x + w + 8 &&\n py > box.y - 8 &&\n py < box.y + h + 8;\n if (covers) score += 1e6;\n }\n for (const label of labels) score += overlapArea(box, label) * 4;\n const ox = p.x + w / 2 - ax;\n const oy = p.y + h / 2 - ay;\n const dist = Math.hypot(ox, oy) || 1;\n score += dist * 0.5;\n // prefer going outward, and candidates that fit without being pushed in\n score -= ((ox * dx + oy * dy) / dist) * 40;\n score += Math.abs(p.x - cx0) + Math.abs(p.y - cy0);\n if (score < bestScore) {\n bestScore = score;\n best = p;\n }\n }\n return best;\n};\n\n/** Box of a tooltip drawn on a canvas, next to the anchor and inside the drawing */\nexport const layoutShapeTooltip = (\n value: ShapeTooltipContent | string,\n anchorX: number,\n anchorY: number,\n width: number,\n height: number,\n theme: ChartTheme,\n measure: MeasureText,\n scene: ShapeScene | null = null,\n hover: ShapeHover | null = null,\n): ShapeTooltipBox => {\n const padding = 9;\n const lineHeight = 18;\n let w = 0;\n let lines: number;\n let content: ShapeTooltipContent | undefined;\n let text: string[] | undefined;\n let titleLines: string[] | undefined;\n if (typeof value === \"string\") {\n text = value.split(\"\\n\");\n const f = font(theme, 12);\n for (const line of text) w = Math.max(w, measure(line, f));\n lines = text.length;\n } else {\n content = value;\n // long titles (full names of truncated labels) wrap to 3 lines\n const titleFont = font(theme, 12, 600);\n const dot = value.color ? 14 : 0;\n const maxTitle = Math.max(\n 60,\n Math.min(260, width - 16 - padding * 2) - dot,\n );\n titleLines = wrapText(value.title, maxTitle, titleFont, measure, 3);\n if (!titleLines.length) titleLines = [value.title];\n for (const line of titleLines)\n w = Math.max(w, dot + measure(line, titleFont));\n for (const row of value.rows) {\n w = Math.max(\n w,\n (row.color ? 14 : 0) +\n measure(row.name, font(theme, 12)) +\n 16 +\n measure(row.value, font(theme, 12, 600)),\n );\n }\n lines = titleLines.length + value.rows.length;\n }\n const bw = Math.max(96, Math.ceil(w + padding * 2 + 4));\n const bh = lines * lineHeight + padding * 2;\n const { x, y } = placeShapeTooltip(\n scene,\n hover,\n { x: anchorX, y: anchorY },\n bw,\n bh,\n width,\n height,\n );\n return {\n x,\n y,\n width: bw,\n height: bh,\n padding,\n lineHeight,\n ...(content ? { content, titleLines } : {}),\n ...(text ? { text } : {}),\n };\n};\n"],"mappings":"0aAwEA,IAAM8C,EAAiC,IAAI,IACrCC,EAA8B,CAAC,EAGxBC,EAAoB,GAAwC,CACvE,GAAM,CAAE,QAASC,EAAG,QAAO,QAAO,UAAWC,EACvCC,EAASD,EAAM,QAAU,CAAE,EAAG,EAAG,EAAG,EAAG,QAAO,QAAO,EACrDE,EAAOF,EAAM,MAAQ,KACrBG,EAAIrD,EAAAA,MAAMkD,EAAM,GAAK,EAAG,EAAG,CAAC,EAC5BI,EAAUC,EAAM,QAAQ,OAASA,EAAM,QAAU,CAACA,EAAM,OAAO,EAC/DC,EAASvD,EAAAA,cAAcgD,EAAE,MAAM,EAC/BQ,EAASvD,EAAAA,YAAY+C,CAAC,EACtBS,EAAmB,CACvB,QACA,QAASR,EAAM,QACf,OAAQA,EAAM,QAAUJ,EACxB,MAAO9C,EAAAA,MAAMkD,EAAM,OAAS,EAAG,EAAG,CAAC,EACnC,OAAQ,EAAK,IAAW,CACtB,GAAI,CAACE,GAAQC,GAAK,EAAG,OAAOM,EAC5B,IAAMC,EAAQR,EAAK,IAAIS,CAAG,GAAK,EAC/B,OAAOD,GAASD,EAASC,GAASP,CACpC,EACA,OAAQJ,EAAE,QAAU9C,EAAAA,aAAaqD,CAAM,EACvC,QAASP,EAAE,eAAiB7C,EAAAA,cAAcoD,CAAM,EAChD,SACA,SACA,OAAQ,EAAK,IAAMnD,EAAAA,YAAYkD,EAAOO,EAAKR,EAAQS,EAAIT,EAAQ,OAAO,EACtE,KAAMhD,EAAAA,MAAM6C,EAAQF,EAAE,OAAO,EAC7B,MAAOC,EAAM,OAASH,CACxB,EACIiB,EACJ,OAAQf,EAAE,KAAV,CACE,IAAK,MACH,EAAS1C,EAAAA,UAAU0C,EAAGS,CAAC,EACvB,MACF,IAAK,QACH,EAASlD,EAAAA,YAAYyC,EAAGS,CAAC,EACzB,MACF,IAAK,QACH,EAASjD,EAAAA,YAAYwC,EAAGS,CAAC,EACzB,MACF,IAAK,SACH,EAAShD,EAAAA,aAAauC,EAAGS,CAAC,EAC1B,MACF,IAAK,SACH,EAAS/C,EAAAA,aAAasC,EAAGS,CAAC,EAC1B,MACF,IAAK,WACH,EAAS9C,EAAAA,eAAeqC,EAAGS,CAAC,EAC5B,MACF,IAAK,YACH,EAAS7C,EAAAA,gBAAgBoC,EAAGS,CAAC,EAC7B,MACF,IAAK,kBACH,EAAS5C,EAAAA,eAAemC,EAAGS,CAAC,EAC5B,MACF,IAAK,SACH,EAAS3C,EAAAA,aAAakC,EAAGS,CAAC,EAC1B,MACF,IAAK,QACH,EAAS1C,EAAAA,YAAYiC,EAAGS,CAAC,EACzB,MACF,QACE,EAASzC,EAAAA,cAAcgC,EAAGS,CAAC,CAE/B,CACA,MAAO,CAAE,KAAMT,EAAE,KAAM,QAAO,SAAQ,SAAQ,SAAQ,GAAGe,CAAO,CAClE,EAGaC,GACX,EACA,EAA8BnB,EAC9B,EAA2BC,IACH,CACxB,IAAMmB,EAAM,IAAI,IAChB,OAAQjB,EAAE,KAAV,CACE,IAAK,MACHT,EAAA,UAAUS,EAAGkB,EAAQD,CAAG,EACxB,MACF,IAAK,QACHzB,EAAA,YAAYQ,EAAGkB,EAAQD,CAAG,EAC1B,MACF,IAAK,QACH3B,EAAA,YAAYU,EAAGkB,EAAQD,CAAG,EAC1B,MACF,IAAK,SACH5B,EAAA,aAAaW,EAAGkB,EAAQD,CAAG,EAC3B,MACF,IAAK,SACHvB,EAAA,aAAaM,EAAGkB,EAAQD,CAAG,EAC3B,MACF,IAAK,WACHtB,EAAA,eAAeK,EAAGkB,EAAQC,EAAOF,CAAG,EACpC,MACF,IAAK,YACHxB,EAAA,gBAAgBO,EAAGkB,EAAQD,CAAG,EAC9B,MACF,IAAK,kBACH/B,EAAA,eAAec,EAAGkB,EAAQD,CAAG,EAC7B,MACF,IAAK,SACH9B,EAAA,aAAaa,EAAGkB,EAAQD,CAAG,EAC3B,MACF,IAAK,QACH7B,EAAA,YAAYY,EAAGkB,EAAQD,CAAG,EAC1B,MACF,QACErB,EAAA,cAAcI,EAAGkB,EAAQD,CAAG,CAEhC,CACA,OAAOA,CACT,EAGaG,GACX,EACA,EACA,IACwB,CACxB,IAAMH,EAAM,IAAI,IAKhB,OAJAI,EAAG,SAAS,EAAG,IAAQ,CACrB,IAAMV,EAAQR,EAAK,IAAIS,CAAG,GAAK,EAC/BK,EAAI,IAAIL,EAAKD,GAASW,EAAIX,GAASP,CAAC,CACtC,CAAC,EACMa,CACT,EAEaM,GACX,EACA,IACG,CACH,GAAIC,EAAE,OAASC,EAAE,KAAM,MAAO,GAC9B,IAAK,GAAM,CAACb,EAAKU,KAAME,EAAG,CACxB,IAAME,EAAID,EAAE,IAAIb,CAAG,EACnB,GAAIc,IAAM,IAAA,IAAa,KAAK,IAAIA,EAAIJ,CAAC,EAAI,MAAO,MAAO,EACzD,CACA,MAAO,EACT,EAGaK,EACX,GACiC,CACjC,IAAMC,EAAS,OAAO5B,EAAE,QAAW,SAAWA,EAAE,OAAS,CAAC,EAC1D,MAAO,CACL,SAAU4B,EAAO,UAAY,SAC7B,OAAQA,EAAO,QAAU,EAC3B,CACF,EAGaC,GACX,EACA,EACA,EAA8BhC,IACA,CAC9B,GAAIG,EAAE,SAAW,GAAO,OAAO,KAC/B,IAAMK,EAAUC,EAAM,QAAQ,OAASA,EAAM,QAAU,CAACA,EAAM,OAAO,EAC/DwB,GAAS,EAAyB,IACtC7D,EAAAA,MAAMb,EAAAA,YAAYkD,EAAOO,EAAKR,EAAQS,EAAIT,EAAQ,OAAO,CAAC,EACxD0B,EAA8B,CAAC,EAC/BC,EAAQhC,EAAE,SAAW,IAAA,GACzB,OAAQA,EAAE,KAAV,CACE,IAAK,MACH,EAAQ,GACR,EAAUA,EAAE,KAAK,KAAK,EAAG,KAAO,CAC9B,MAAOc,EACP,KAAMmB,EAAE,KACR,MAAOH,EAAMG,EAAE,MAAOnB,CAAC,EACvB,OAAQI,EAAO,IAAIJ,CAAC,CACtB,EAAE,EACF,MACF,IAAK,SACH,EAAQ,GACR,EAAU5C,EAAAA,YAAY8B,EAAGH,CAAS,CAAC,CAAC,IAAK,IAAO,CAC9C,MAAOiB,EACP,KAAMd,EAAE,KAAKc,EAAE,CAAC,KAChB,MAAOgB,EAAM9B,EAAE,KAAKc,EAAE,CAAC,MAAOA,CAAC,EAC/B,OAAQI,EAAO,IAAIJ,CAAC,CACtB,EAAE,EACF,MACF,IAAK,QACHkB,IAAA,EAAUhC,EAAE,OAAO,OAAS,GAC5B,EAAUA,EAAE,OAAO,KAAK,EAAG,KAAO,CAChC,MAAOc,EACP,KAAM3C,EAAAA,WAAW6B,EAAGc,EAAG7D,EAAAA,YAAY+C,CAAC,CAAC,EACrC,MAAO8B,EAAMI,EAAE,MAAOpB,CAAC,EACvB,OAAQI,EAAO,IAAIJ,CAAC,CACtB,EAAE,EACF,MACF,IAAK,UACL,IAAK,WACH,EAAUd,EAAE,KAAK,KAAK,EAAG,KAAO,CAC9B,MAAOc,EACP,KAAMmB,EAAE,KACR,MAAOH,EAAMG,EAAE,MAAOnB,CAAC,EACvB,OAAQI,EAAO,IAAIJ,CAAC,CACtB,EAAE,EACF,MACF,IAAK,YACHkB,IAAA,EAAU,CAAC5D,EAAAA,gBAAgB4B,CAAC,GAC5B,EAAUA,EAAE,KAAK,KAAK,EAAG,KAAO,CAC9B,MAAOc,EACP,KAAMmB,EAAE,KACR,MAAOH,EAAMG,EAAE,MAAOnB,CAAC,EACvB,OAAQI,EAAO,IAAIJ,CAAC,CACtB,EAAE,EACF,MACF,IAAK,SACH,EAAUd,EAAE,KAAK,KAAK,EAAG,KAAO,CAC9B,MAAOc,EACP,KAAMmB,EAAE,KACR,MAAOH,EAAMG,EAAE,MAAOnB,CAAC,EACvB,OAAQI,EAAO,IAAIJ,CAAC,CACtB,EAAE,EACF,MACF,IAAK,SAAU,CACb,IAAMqB,EAAI9D,EAAAA,cAAc2B,CAAC,EACzB,EAAUmC,EAAE,MAAM,KAAK,EAAM,KAAO,CAClC,MAAOrB,EACP,OACA,MAAOgB,EAAMK,EAAE,OAAOrB,GAAIA,CAAC,EAC3B,OAAQI,EAAO,IAAIJ,CAAC,CACtB,EAAE,EACF,KACF,CACA,IAAK,kBACH,EAAQ,GACR,EAAUxC,EAAAA,eAAe0B,EAAGM,EAAOY,CAAM,EACzC,MACF,IAAK,QAAS,CACZ,EAAQ,GACR,IAAMkB,EAAI7D,EAAAA,aAAayB,CAAC,EACxB,EAAUoC,EAAE,MAAM,KAAK,EAAM,KAAO,CAClC,MAAOtB,EACP,OACA,MAAOgB,EAAMM,EAAE,OAAOtB,GAAIA,CAAC,EAC3B,OAAQI,EAAO,IAAIJ,CAAC,CACtB,EAAE,EACF,KACF,CAGF,CACA,OAAOkB,GAASD,EAAQ,OAASA,EAAU,IAC7C,EAMaM,EAAe,GAAiC,CAC3D,OAAQrC,EAAE,KAAV,CACE,IAAK,QACH,OAAOA,EAAE,OAAO,OAClB,IAAK,QACH,MAAO,GACT,IAAK,SACH,OAAO3B,EAAAA,cAAc2B,CAAC,CAAC,CAAC,MAAM,OAChC,IAAK,kBACH,OAAOxB,EAAAA,cAAcwB,CAAC,CAAC,EAAE,OAAS,EACpC,IAAK,QACH,OAAOzB,EAAAA,aAAayB,CAAC,CAAC,CAAC,MAAM,OAC/B,QACE,OAAOA,EAAE,KAAK,MAClB,CACF,EAGasC,GACX,EACA,IAC2B,CAC3B,GAAI,CAACC,EAAO,OAAO,KACnB,IAAMC,EAAOC,EAAM,MAAM,KAAM,GAAOC,EAAG,QAAUH,EAAM,KAAK,EAC9D,GAAI,CAACC,EAAM,OAAO,KAClB,GAAIA,EAAK,WAAY,CACnB,IAAMG,EAAI5F,EAAAA,MAAMwF,EAAM,WAAa,EAAG,EAAGC,EAAK,WAAW,OAAS,CAAC,EAC7DI,EAAMJ,EAAK,WAAWG,GAC5B,MAAO,CACL,MAAOH,EAAK,MACZ,UAAWG,EACX,KAAMH,EAAK,KACX,MAAOI,EAAI,MACX,QAASA,EAAI,QACb,MAAOJ,EAAK,KACd,CACF,CACA,MAAO,CACL,MAAOA,EAAK,MACZ,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,QAASA,EAAK,QACd,MAAOA,EAAK,MACZ,GAAIA,EAAK,KAAO,CAAE,KAAMA,EAAK,IAAK,EAAI,CAAC,EACvC,GAAGA,EAAK,KACV,CACF,EAEaK,GAAa,EAAsB,IAC9CrB,IAAMC,GAAM,CAAC,CAACD,GAAK,CAAC,CAACC,GAAKD,EAAE,QAAUC,EAAE,OAASD,EAAE,YAAcC,EAAE,UASxDqB,GACX,EACA,IAC+B,CAC/B,IAAMN,EAAOC,EAAM,MAAM,KAAM,GAAOC,EAAG,QAAUH,EAAM,KAAK,EAC9D,GAAI,CAACC,EAAM,OAAO,KAClB,IAAMO,EAAOP,EAAK,WACdA,EAAK,KAAK,KAAK,EAAK,IAClBG,KAAOJ,EAAM,WAAa,IAAM,CAAE,GAAGS,EAAK,OAAQ,EAAK,EAAIA,CAC7D,EACAR,EAAK,KACT,MAAO,CACL,MAAOA,EAAK,KAAOA,EAAK,KAAK,KAAK,KAAK,EAAIA,EAAK,KAChD,MAAOA,EAAK,MACZ,MACF,CACF,EAGaS,GAAgB,EAAmB,IAAsB,CACpE,IAAMT,EAAOC,EAAM,MAAM,KAAM,GAAOC,EAAG,QAAUH,EAAM,KAAK,EAC9D,GAAI,CAACC,EAAM,MAAO,GAClB,GAAIA,EAAK,WAAY,CACnB,IAAMG,EAAI5F,EAAAA,MAAMwF,EAAM,WAAa,EAAG,EAAGC,EAAK,WAAW,OAAS,CAAC,EACnE,MAAO,GAAGA,EAAK,KAAK,IAAIA,EAAK,WAAWG,EAAE,CAAC,KAAK,IAAIH,EAAK,KAAKG,EAAE,EAAE,OAASH,EAAK,WAAWG,EAAE,CAAC,OAChG,CAEA,MAAO,GADMH,EAAK,KAAOA,EAAK,KAAK,KAAK,KAAK,EAAIA,EAAK,KACvC,IAAIA,EAAK,KAAK,EAAE,EAAE,OAASA,EAAK,MAAM,IAAIA,EAAK,OAASrF,EAAAA,cAAcsF,EAAM,MAAM,CAAC,CAACD,EAAK,OAAO,EAAE,EACnH,EAGaU,EAAiB,GAAyB,CACrD,IAAMC,EAAIlG,EAAAA,YAAY+C,CAAC,EACvB,OAAQA,EAAE,KAAV,CACE,IAAK,MACH,OAAOA,EAAE,KACLmD,EAAE,WACDnD,EAAE,aAAe,GAAK,EACrBmD,EAAE,WACFA,EAAE,SACV,IAAK,QACH,OAAOA,EAAE,WACX,IAAK,QACH,OAAOnD,EAAE,MACLvB,EAAAA,YAAY0E,EAAE,gBAAiB,CAAE,MAAOnD,EAAE,KAAM,CAAC,EACjDmD,EAAE,WACR,IAAK,SACH,OAAOA,EAAE,YACX,IAAK,SACH,OAAOA,EAAE,YACX,IAAK,WACH,OAAOA,EAAE,cACX,IAAK,YACH,OAAOA,EAAE,eACX,IAAK,kBACH,OAAOA,EAAE,gBACX,IAAK,SACH,OAAOA,EAAE,YACX,IAAK,QACH,OAAOA,EAAE,WACX,QACE,OAAOA,EAAE,YACb,CACF,EAGaC,EAAiB,GAC5BX,EAAM,OACDA,EAAM,QAAU/D,EAAAA,aAAa,GAAA,CAAI,OAClC+D,EAAM,MACH,MAAM,EAAG,EAAE,CAAC,CACZ,IAAK,GACJD,EAAK,WACD,GAAGA,EAAK,KAAK,IAAIA,EAAK,WACnB,KACE,EAAK,IAAM,GAAGI,EAAI,KAAK,GAAGJ,EAAK,KAAKG,EAAE,EAAE,OAASC,EAAI,OACxD,CAAC,CACA,KAAK,IAAI,IACZK,EAAaR,EAAO,CAAE,MAAOD,EAAK,KAAM,CAAC,CAC/C,CAAC,CACA,KAAK,IAAI,EAWZa,EAAa,GAGNC,GACX,EACA,EACA,EACA,EACA,EACA,IACgD,CAChD,IAAMC,EAAI5E,EAAAA,KAAK2B,EAAO,EAAE,EAElByC,EAA2B,CAAC,CAAC,CAAC,EAChCS,EAAI,EACR,IAAK,IAAMC,KAAK1B,EAAS,CACvB,IAAML,EAAI,KAAK,IAAIgC,EAAQ,EAAG,GAAKC,EAAQF,EAAE,KAAMF,CAAC,CAAC,EACjDP,EAAMD,EAAKA,EAAK,OAAS,GACzBC,EAAI,QAAUQ,EAAI,GAAM9B,EAAIgC,EAAQ,IACtCX,EAAK,KAAM,EAAM,CAAC,CAAE,EACpB,EAAI,GAEFC,EAAI,SAAQ,GAAK,IACrBA,EAAI,KAAK,CAAE,GAAGS,EAAG,IAAG,EAAG,EAAG,MAAO/B,EAAG,OAAQ2B,CAAW,CAAC,EACxD,GAAK3B,CACP,CACA,IAAMkC,EAASb,EAAK,OAASM,EAAa,EACpCQ,EAAMC,IAAa,MAAQ,EAAIC,EAAcH,EAAS,EACtDI,EAA0B,CAAC,EASjC,OARAjB,EAAK,SAAS,EAAK,IAAM,CACvB,IAAMkB,EAAOjB,EAAIA,EAAI,OAAS,GAExBkB,GAAUR,GADHO,EAAOA,EAAK,EAAIA,EAAK,MAAQ,IACV,EAChC,IAAK,IAAME,KAAOnB,EAChBgB,EAAM,KAAK,CAAE,GAAGG,EAAK,EAAGA,EAAI,EAAID,EAAQ,EAAGL,EAAMO,EAAIf,CAAW,CAAC,CAErE,CAAC,EACM,CAAE,QAAO,QAAO,CACzB,EAkBMgB,EAAa,EAEbC,EAAU,GAEVC,GAAe,EAAc,IACjC,KAAK,IAAI,EAAG,KAAK,IAAI/C,EAAE,EAAIA,EAAE,MAAOC,EAAE,EAAIA,EAAE,KAAK,EAAI,KAAK,IAAID,EAAE,EAAGC,EAAE,CAAC,CAAC,EACvE,KAAK,IAAI,EAAG,KAAK,IAAID,EAAE,EAAIA,EAAE,OAAQC,EAAE,EAAIA,EAAE,MAAM,EAAI,KAAK,IAAID,EAAE,EAAGC,EAAE,CAAC,CAAC,EAQ9D+C,GACX,EACA,EACA,EACA,EACA,EACA,EACA,IAC6B,CAC7B,IAAMpC,EAAIiC,EACJI,GAAO,EAAW,KAAe,CACrC,EAAG,KAAK,IAAIrC,EAAG,KAAK,IAAIoB,EAAGE,EAAQhC,EAAIU,CAAC,CAAC,EACzC,EAAG,KAAK,IAAIA,EAAG,KAAK,IAAIsC,EAAGd,EAASe,EAAIvC,CAAC,CAAC,CAC5C,GACM,CAAE,EAAGwC,EAAI,EAAGC,GAAOC,EACnBC,EAAQtC,GAAO,MACrB,GAAI,CAACsC,GAAS,CAACtC,GAAS,CAACF,EAAO,CAC9B,IAAIiB,EAAIoB,EAAK,GAEb,OADIpB,EAAI9B,EAAIgC,EAAQtB,IAAG,EAAIwC,EAAK,GAAKlD,GAC9B+C,EAAIjB,EAAGqB,EAAKF,EAAI,CAAC,CAC1B,CAGA,IAAMK,EAA4B,CAAC,CAACJ,EAAIC,CAAE,CAAC,EACrCrC,EAAOC,EAAM,MAAM,KAAM,GAAOC,EAAG,QAAUH,EAAM,KAAK,EACxD0C,EACJzC,GAAM,YAAcD,EAAM,YAAc,IAAA,GACpCC,EAAK,WAAWD,EAAM,WACtB,IAAA,GACF0C,GAAQD,EAAM,KAAK,CAACC,EAAO,EAAGA,EAAO,CAAC,CAAC,EAC3C,IAAMzE,EAASuE,EAAM,QAAU,CAAC,EAE5BG,EAAKN,EAAKG,EAAM,GAChBI,EAAKN,EAAKE,EAAM,GACdK,EAAM,KAAK,MAAMF,EAAIC,CAAE,EACzBC,EAAM,GACR,GAAMA,EACN,GAAMA,IAEN,EAAK,EACL,EAAK,GAEP,IAAMjD,EAAImC,EACJe,EAAiC,CACrC,CAACT,EAAKzC,EAAG0C,EAAKF,EAAI,CAAC,EACnB,CAACC,EAAKzC,EAAIT,EAAGmD,EAAKF,EAAI,CAAC,EACvB,CAACC,EAAKlD,EAAI,EAAGmD,EAAK1C,EAAIwC,CAAC,EACvB,CAACC,EAAKlD,EAAI,EAAGmD,EAAK1C,CAAC,EACnB,CAACyC,EAAKzC,EAAG0C,EAAK1C,EAAIwC,CAAC,EACnB,CAACC,EAAKzC,EAAG0C,EAAK1C,CAAC,EACf,CAACyC,EAAKzC,EAAIT,EAAGmD,EAAK1C,EAAIwC,CAAC,EACvB,CAACC,EAAKzC,EAAIT,EAAGmD,EAAK1C,CAAC,CACrB,EACImD,EAAOb,EAAIY,EAAW,EAAE,CAAC,GAAIA,EAAW,EAAE,CAAC,EAAE,EAC7CE,EAAY,IAChB,IAAK,GAAM,CAACC,EAAKC,KAAQJ,EAAY,CACnC,IAAMK,EAAIjB,EAAIe,EAAKC,CAAG,EAChBtB,EAAM,CAAE,EAAGuB,EAAE,EAAG,EAAGA,EAAE,EAAG,MAAOhE,EAAG,OAAQiD,CAAE,EAC9CgB,EAAQ,EACZ,IAAK,GAAM,CAACC,EAAIC,KAAOb,EAEnBY,EAAKzB,EAAI,EAAI,GACbyB,EAAKzB,EAAI,EAAIzC,EAAI,GACjBmE,EAAK1B,EAAI,EAAI,GACb0B,EAAK1B,EAAI,EAAIQ,EAAI,IACP,GAAS,KAEvB,IAAK,IAAMmB,KAAStF,EAAQ,GAAS+D,EAAYJ,EAAK2B,CAAK,EAAI,EAC/D,IAAMC,EAAKL,EAAE,EAAIhE,EAAI,EAAIkD,EACnBoB,EAAKN,EAAE,EAAIf,EAAI,EAAIE,EACnBoB,EAAO,KAAK,MAAMF,EAAIC,CAAE,GAAK,EACnC,GAASC,EAAO,GAEhB,IAAWF,EAAKb,EAAKc,EAAKb,GAAMc,EAAQ,GACxC,GAAS,KAAK,IAAIP,EAAE,EAAIF,CAAG,EAAI,KAAK,IAAIE,EAAE,EAAID,CAAG,EAC7CE,EAAQJ,IACV,EAAYI,EACZ,EAAOD,EAEX,CACA,OAAOJ,CACT,EAGaY,GACX,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EAA2B,KAC3B,EAA2B,OACP,CACpB,IAEIxE,EAAI,EACJyE,EACAC,EACAC,EACAC,EACJ,GAAI,OAAOC,GAAU,SAAU,CAC7B,EAAOA,EAAM,MAAM;CAAI,EACvB,IAAMhD,EAAI5E,EAAAA,KAAK2B,EAAO,EAAE,EACxB,IAAK,IAAMkG,KAAQH,EAAM,EAAI,KAAK,IAAI3E,EAAGiC,EAAQ6C,EAAMjD,CAAC,CAAC,EACzD,EAAQ8C,EAAK,MACf,KAAO,CACL,EAAUE,EAEV,IAAME,EAAY9H,EAAAA,KAAK2B,EAAO,GAAI,GAAG,EAC/BoG,EAAMH,EAAM,MAAQ,GAAK,EACzBI,EAAW,KAAK,IACpB,GACA,KAAK,IAAI,IAAKjD,EAAQ,GAAK,EAAW,EAAIgD,CAC5C,EACA,EAAa9H,EAAAA,SAAS2H,EAAM,MAAOI,EAAUF,EAAW9C,EAAS,CAAC,EAC7D2C,EAAW,SAAQ,EAAa,CAACC,EAAM,KAAK,GACjD,IAAK,IAAMC,KAAQF,EACjB,EAAI,KAAK,IAAI5E,EAAGgF,EAAM/C,EAAQ6C,EAAMC,CAAS,CAAC,EAChD,IAAK,IAAMzD,KAAOuD,EAAM,KACtB,EAAI,KAAK,IACP7E,GACCsB,EAAI,MAAQ,GAAK,GAChBW,EAAQX,EAAI,KAAMrE,EAAAA,KAAK2B,EAAO,EAAE,CAAC,EACjC,GACAqD,EAAQX,EAAI,MAAOrE,EAAAA,KAAK2B,EAAO,GAAI,GAAG,CAAC,CAC3C,EAEF,EAAQgG,EAAW,OAASC,EAAM,KAAK,MACzC,CACA,IAAMK,EAAK,KAAK,IAAI,GAAI,KAAK,KAAKlF,EAAI,GAAc,CAAC,CAAC,EAChDmF,EAAKV,EAAQ,GAAa,GAC1B,CAAE,IAAG,GAAM3B,EACf/B,EACAF,EACA,CAAE,EAAGuE,EAAS,EAAGC,CAAQ,EACzBH,EACAC,EACAnD,EACAE,CACF,EACA,MAAO,CACL,IACA,EACA,MAAOgD,EACP,OAAQC,EACR,UACA,cACA,GAAIT,EAAU,CAAE,UAAS,YAAW,EAAI,CAAC,EACzC,GAAIC,EAAO,CAAE,MAAK,EAAI,CAAC,CACzB,CACF"}
|
|
1
|
+
{"version":3,"file":"layout.cjs","names":["clamp","resolveLocale","shapeLabels","localeFormat","localePercent","resolveWith","inset","layoutPie","layoutRadar","layoutGauge","layoutFunnel","layoutSankey","layoutSunburst","layoutRadialBar","layoutCalendar","layoutBullet","layoutChord","layoutTreemap","toCss","funnelOrder","seriesName","radialBarLabels","resolveSankey","calendarLegend","resolveChord","calendarModel","interpolate","SHAPE_LABELS","font","unionRect","estimateText","placeTooltip","wrapText","require_tooltip","require_locale","require_color","require_overlay","require_labels","require_scene","require_calendar","require_bullet","require_chord","require_funnel","require_gauge","require_pie","require_radar","require_radialBar","require_sankey","require_sunburst","require_treemap","NO_HIDDEN","NO_FOCUS","layoutShapeScene","o","input","bounds","from","t","palette","theme","locale","labels","c","target","start","key","css","i","result","shapeValues","out","hidden","focus","blendValues","to","v","sameValues","a","b","w","legendConfig","config","shapeLegend","color","entries","shown","d","s","g","m","toggleCount","hoverEvent","hover","item","scene","it","k","ind","sameHover","tooltipContent","rows","row","describeItem","describeChart","l","describeScene","LEGEND_ROW","layoutShapeLegend","f","x","e","width","measure","height","top","position","chartHeight","boxes","last","offset","box","r","TIP_MARGIN","TIP_GAP","TIP_POINTER","overlapArea","arcBox","xs","ys","add","r0","r1","cx","cy","a0","a1","y","itemBox","node","index","p","x0","y0","x1","y1","half","textBox","size","placeShapeTooltip","ax","ay","anchor","fallback","h","fit","keep","vertex","texts","radar","dx","dy","len","candidates","area","best","bestScore","cx0","cy0","score","px","py","text","ox","oy","dist","layoutShapeTooltip","lines","content","titleLines","value","line","titleFont","dot","maxTitle","bw","bh","anchorX","anchorY"],"sources":["../../../../../charts/src/engine/shapes/layout.ts"],"sourcesContent":["// Layout of every shape chart type into a ShapeScene, plus what the hosts\n// share: animated values, legend entries, tooltip content, hover events and\n// accessible descriptions. Pure: no DOM, no canvas.\n\nimport { toCss } from \"../color\";\nimport { resolveLocale } from \"../locale\";\nimport { font } from \"../overlay\";\nimport type { ChartTheme } from \"../theme\";\nimport { placeTooltip, unionRect, type TooltipPlacement } from \"../tooltip\";\nimport { bulletValues, layoutBullet } from \"./bullet\";\nimport {\n calendarLegend,\n calendarModel,\n calendarValues,\n layoutCalendar,\n} from \"./calendar\";\nimport { chordValues, layoutChord, resolveChord } from \"./chord\";\nimport { funnelOrder, funnelValues, layoutFunnel } from \"./funnel\";\nimport { gaugeValues, layoutGauge } from \"./gauge\";\nimport {\n interpolate,\n localeFormat,\n localePercent,\n SHAPE_LABELS,\n shapeLabels,\n} from \"./labels\";\nimport { layoutPie, pieValues } from \"./pie\";\nimport { layoutRadar, radarValues, seriesName } from \"./radar\";\nimport { layoutRadialBar, radialBarLabels, radialBarValues } from \"./radialBar\";\nimport { layoutSankey, resolveSankey, sankeyValues } from \"./sankey\";\nimport {\n clamp,\n estimateText,\n inset,\n resolveWith,\n wrapText,\n type LayoutContext,\n type LayoutResult,\n type MeasureText,\n type ShapeHover,\n type ShapeLegendEntry,\n type ShapeRect,\n type ShapeScene,\n type ShapeTooltipRow,\n} from \"./scene\";\nimport { layoutSunburst, sunburstValues } from \"./sunburst\";\nimport { layoutTreemap, treemapValues } from \"./treemap\";\nimport type {\n ShapeChartOptions,\n ShapeHoverEvent,\n ShapeLegendOptions,\n} from \"./types\";\n\nexport interface ShapeLayoutInput {\n options: ShapeChartOptions;\n theme: ChartTheme;\n /** Size of the whole drawing, CSS pixels */\n width: number;\n height: number;\n /** Area of the chart (legend excluded); the whole drawing by default */\n bounds?: ShapeRect;\n measure: MeasureText;\n /** Hidden slices / stages / series (treemap: top-level nodes) */\n hidden?: ReadonlySet<number>;\n /** Entry animation progress, eased (1 = done) */\n enter?: number;\n /** Values at the start of an update animation (`shapeValues`) */\n from?: ReadonlyMap<string, number> | null;\n /** Update animation progress, eased (1 = done) */\n t?: number;\n /** Sunburst: names from the root to the focused node */\n focus?: readonly string[];\n}\n\nconst NO_HIDDEN: ReadonlySet<number> = new Set();\nconst NO_FOCUS: readonly string[] = [];\n\n/** Lays a shape chart out */\nexport const layoutShapeScene = (input: ShapeLayoutInput): ShapeScene => {\n const { options: o, theme, width, height } = input;\n const bounds = input.bounds ?? { x: 0, y: 0, width, height };\n const from = input.from ?? null;\n const t = clamp(input.t ?? 1, 0, 1);\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n const locale = resolveLocale(o.locale);\n const labels = shapeLabels(o);\n const c: LayoutContext = {\n theme,\n measure: input.measure,\n hidden: input.hidden ?? NO_HIDDEN,\n enter: clamp(input.enter ?? 1, 0, 1),\n value: (key, target) => {\n if (!from || t >= 1) return target;\n const start = from.get(key) ?? 0;\n return start + (target - start) * t;\n },\n format: o.format ?? localeFormat(locale),\n percent: o.percentFormat ?? localePercent(locale),\n labels,\n locale,\n color: (css, i) => resolveWith(theme, css, palette[i % palette.length]),\n area: inset(bounds, o.padding),\n focus: input.focus ?? NO_FOCUS,\n };\n let result: LayoutResult;\n switch (o.type) {\n case \"pie\":\n result = layoutPie(o, c);\n break;\n case \"radar\":\n result = layoutRadar(o, c);\n break;\n case \"gauge\":\n result = layoutGauge(o, c);\n break;\n case \"funnel\":\n result = layoutFunnel(o, c);\n break;\n case \"sankey\":\n result = layoutSankey(o, c);\n break;\n case \"sunburst\":\n result = layoutSunburst(o, c);\n break;\n case \"radialBar\":\n result = layoutRadialBar(o, c);\n break;\n case \"calendarHeatmap\":\n result = layoutCalendar(o, c);\n break;\n case \"bullet\":\n result = layoutBullet(o, c);\n break;\n case \"chord\":\n result = layoutChord(o, c);\n break;\n default:\n result = layoutTreemap(o, c);\n break;\n }\n return { type: o.type, width, height, labels, locale, ...result };\n};\n\n/** Target values of the animated quantities, by key */\nexport const shapeValues = (\n o: ShapeChartOptions,\n hidden: ReadonlySet<number> = NO_HIDDEN,\n focus: readonly string[] = NO_FOCUS,\n): Map<string, number> => {\n const out = new Map<string, number>();\n switch (o.type) {\n case \"pie\":\n pieValues(o, hidden, out);\n break;\n case \"radar\":\n radarValues(o, hidden, out);\n break;\n case \"gauge\":\n gaugeValues(o, hidden, out);\n break;\n case \"funnel\":\n funnelValues(o, hidden, out);\n break;\n case \"sankey\":\n sankeyValues(o, hidden, out);\n break;\n case \"sunburst\":\n sunburstValues(o, hidden, focus, out);\n break;\n case \"radialBar\":\n radialBarValues(o, hidden, out);\n break;\n case \"calendarHeatmap\":\n calendarValues(o, hidden, out);\n break;\n case \"bullet\":\n bulletValues(o, hidden, out);\n break;\n case \"chord\":\n chordValues(o, hidden, out);\n break;\n default:\n treemapValues(o, hidden, out);\n break;\n }\n return out;\n};\n\n/** Values shown at progress `t` of an animation from `from` to `to` */\nexport const blendValues = (\n from: ReadonlyMap<string, number>,\n to: ReadonlyMap<string, number>,\n t: number,\n): Map<string, number> => {\n const out = new Map<string, number>();\n to.forEach((v, key) => {\n const start = from.get(key) ?? 0;\n out.set(key, start + (v - start) * t);\n });\n return out;\n};\n\nexport const sameValues = (\n a: ReadonlyMap<string, number>,\n b: ReadonlyMap<string, number>,\n) => {\n if (a.size !== b.size) return false;\n for (const [key, v] of a) {\n const w = b.get(key);\n if (w === undefined || Math.abs(w - v) > 1e-12) return false;\n }\n return true;\n};\n\n/** Legend position and toggling */\nexport const legendConfig = (\n o: ShapeChartOptions,\n): Required<ShapeLegendOptions> => {\n const config = typeof o.legend === \"object\" ? o.legend : {};\n return {\n position: config.position ?? \"bottom\",\n toggle: config.toggle ?? true,\n };\n};\n\n/** Legend entries, `null` when the legend is hidden */\nexport const shapeLegend = (\n o: ShapeChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<number> = NO_HIDDEN,\n): ShapeLegendEntry[] | null => {\n if (o.legend === false) return null;\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n const color = (css: string | undefined, i: number) =>\n toCss(resolveWith(theme, css, palette[i % palette.length]));\n let entries: ShapeLegendEntry[] = [];\n let shown = o.legend !== undefined;\n switch (o.type) {\n case \"pie\":\n shown = true;\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"funnel\":\n shown = true;\n entries = funnelOrder(o, NO_HIDDEN).map((i) => ({\n index: i,\n name: o.data[i].name,\n color: color(o.data[i].color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"radar\":\n shown ||= o.series.length > 1;\n entries = o.series.map((s, i) => ({\n index: i,\n name: seriesName(o, i, shapeLabels(o)),\n color: color(s.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"treemap\":\n case \"sunburst\":\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"radialBar\":\n shown ||= !radialBarLabels(o);\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"bullet\":\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"sankey\": {\n const g = resolveSankey(o);\n entries = g.names.map((name, i) => ({\n index: i,\n name,\n color: color(g.colors[i], i),\n hidden: hidden.has(i),\n }));\n break;\n }\n case \"calendarHeatmap\":\n shown = true;\n entries = calendarLegend(o, theme, hidden);\n break;\n case \"chord\": {\n shown = true;\n const m = resolveChord(o);\n entries = m.names.map((name, i) => ({\n index: i,\n name,\n color: color(m.colors[i], i),\n hidden: hidden.has(i),\n }));\n break;\n }\n default:\n break;\n }\n return shown && entries.length ? entries : null;\n};\n\n/**\n * Number of toggleable entries (slices, stages, series, top-level nodes,\n * sankey nodes, bars, rows, calendar levels, chord groups)\n */\nexport const toggleCount = (o: ShapeChartOptions): number => {\n switch (o.type) {\n case \"radar\":\n return o.series.length;\n case \"gauge\":\n return 0;\n case \"sankey\":\n return resolveSankey(o).names.length;\n case \"calendarHeatmap\":\n return calendarModel(o)?.count ?? 0;\n case \"chord\":\n return resolveChord(o).names.length;\n default:\n return o.data.length;\n }\n};\n\n/** Event of a hovered item */\nexport const hoverEvent = (\n scene: ShapeScene,\n hover: ShapeHover | null,\n): ShapeHoverEvent | null => {\n if (!hover) return null;\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n if (item.indicators) {\n const k = clamp(hover.indicator ?? 0, 0, item.indicators.length - 1);\n const ind = item.indicators[k];\n return {\n index: item.index,\n indicator: k,\n name: item.name,\n value: ind.value,\n percent: ind.percent,\n color: item.color,\n };\n }\n return {\n index: item.index,\n name: item.name,\n value: item.value,\n percent: item.percent,\n color: item.color,\n ...(item.path ? { path: item.path } : {}),\n ...item.event,\n };\n};\n\nexport const sameHover = (a: ShapeHover | null, b: ShapeHover | null) =>\n a === b || (!!a && !!b && a.index === b.index && a.indicator === b.indicator);\n\nexport interface ShapeTooltipContent {\n title: string;\n color?: string;\n rows: ShapeTooltipRow[];\n}\n\n/** Default tooltip of a hovered item */\nexport const tooltipContent = (\n scene: ShapeScene,\n hover: ShapeHover,\n): ShapeTooltipContent | null => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n const rows = item.indicators\n ? item.rows.map((row, k) =>\n k === (hover.indicator ?? -1) ? { ...row, strong: true } : row,\n )\n : item.rows;\n return {\n title: item.path ? item.path.join(\" / \") : item.name,\n color: item.color,\n rows,\n };\n};\n\n/** Text read by screen readers for a focused item */\nexport const describeItem = (scene: ShapeScene, hover: ShapeHover) => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return \"\";\n if (item.indicators) {\n const k = clamp(hover.indicator ?? 0, 0, item.indicators.length - 1);\n return `${item.name}, ${item.indicators[k].name}: ${item.rows[k]?.value ?? item.indicators[k].value}`;\n }\n const name = item.path ? item.path.join(\" / \") : item.name;\n return `${name}: ${item.rows[0]?.value ?? item.value} (${item.share ?? localePercent(scene.locale)(item.percent)})`;\n};\n\n/** Default accessible name of a chart (in its `locale`) */\nexport const describeChart = (o: ShapeChartOptions) => {\n const l = shapeLabels(o);\n switch (o.type) {\n case \"pie\":\n return o.rose\n ? l.roseChart\n : (o.innerRadius ?? 0) > 0\n ? l.donutChart\n : l.pieChart;\n case \"radar\":\n return l.radarChart;\n case \"gauge\":\n return o.label\n ? interpolate(l.gaugeChartNamed, { label: o.label })\n : l.gaugeChart;\n case \"funnel\":\n return l.funnelChart;\n case \"sankey\":\n return l.sankeyChart;\n case \"sunburst\":\n return l.sunburstChart;\n case \"radialBar\":\n return l.radialBarChart;\n case \"calendarHeatmap\":\n return l.calendarHeatmap;\n case \"bullet\":\n return l.bulletChart;\n case \"chord\":\n return l.chordChart;\n default:\n return l.treemapChart;\n }\n};\n\n/** Text summary of the data (screen readers) */\nexport const describeScene = (scene: ShapeScene) =>\n scene.empty\n ? (scene.labels ?? SHAPE_LABELS.en).noData\n : scene.items\n .slice(0, 12)\n .map((item) =>\n item.indicators\n ? `${item.name}: ${item.indicators\n .map(\n (ind, k) => `${ind.name} ${item.rows[k]?.value ?? ind.value}`,\n )\n .join(\", \")}`\n : describeItem(scene, { index: item.index }),\n )\n .join(\"; \");\n\n// ------------------------------------------------- canvas legend & tooltip\n\nexport interface ShapeLegendBox extends ShapeLegendEntry {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nconst LEGEND_ROW = 20;\n\n/** Centered legend rows drawn on a canvas; `height` includes the gap with the chart */\nexport const layoutShapeLegend = (\n entries: readonly ShapeLegendEntry[],\n width: number,\n position: \"top\" | \"bottom\",\n chartHeight: number,\n theme: ChartTheme,\n measure: MeasureText,\n): { boxes: ShapeLegendBox[]; height: number } => {\n const f = font(theme, 12);\n const gap = 14;\n const rows: ShapeLegendBox[][] = [[]];\n let x = 0;\n for (const e of entries) {\n const w = Math.min(width - 8, 16 + measure(e.name, f));\n let row = rows[rows.length - 1];\n if (row.length && x + gap + w > width - 8) {\n rows.push((row = []));\n x = 0;\n }\n if (row.length) x += gap;\n row.push({ ...e, x, y: 0, width: w, height: LEGEND_ROW });\n x += w;\n }\n const height = rows.length * LEGEND_ROW + 8;\n const top = position === \"top\" ? 2 : chartHeight - height + 6;\n const boxes: ShapeLegendBox[] = [];\n rows.forEach((row, r) => {\n const last = row[row.length - 1];\n const used = last ? last.x + last.width : 0;\n const offset = (width - used) / 2;\n for (const box of row) {\n boxes.push({ ...box, x: box.x + offset, y: top + r * LEGEND_ROW });\n }\n });\n return { boxes, height };\n};\n\nexport interface ShapeTooltipBox {\n x: number;\n y: number;\n width: number;\n height: number;\n padding: number;\n lineHeight: number;\n /** Default content */\n content?: ShapeTooltipContent;\n /** Lines of the content's title (long titles wrap) */\n titleLines?: string[];\n /** Custom text (`tooltip.render` returning a string) */\n text?: string[];\n}\n\n/** Margin between a tooltip and the edges of the drawing */\nconst TIP_MARGIN = 6;\n/** Distance between a tooltip and its anchor */\nconst TIP_GAP = 14;\n/** Half size of the box around the pointer a tooltip keeps off */\nconst TIP_POINTER = 6;\n\nconst overlapArea = (a: ShapeRect, b: ShapeRect) =>\n Math.max(0, Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x)) *\n Math.max(0, Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y));\n\n/** Box of a circle arc (stroke half width included) */\nconst arcBox = (\n cx: number,\n cy: number,\n r0: number,\n r1: number,\n a0: number,\n a1: number,\n): ShapeRect => {\n const xs: number[] = [];\n const ys: number[] = [];\n const add = (a: number) => {\n for (const r of [r0, r1]) {\n xs.push(cx + r * Math.cos(a));\n ys.push(cy + r * Math.sin(a));\n }\n };\n add(a0);\n add(a1);\n // the extreme points of the circle crossed by the arc\n const start = Math.ceil(a0 / (Math.PI / 2));\n for (let k = start; k * (Math.PI / 2) <= a1; k++) add(k * (Math.PI / 2));\n const x = Math.min(...xs);\n const y = Math.min(...ys);\n return { x, y, width: Math.max(...xs) - x, height: Math.max(...ys) - y };\n};\n\n/** Box of the marks of an item (slice, tile, arc, polygon, flow, ...) */\nconst itemBox = (scene: ShapeScene, index: number): ShapeRect | null => {\n let box: ShapeRect | null = null;\n const add = (b: ShapeRect) => {\n box = unionRect(box, b);\n };\n for (const node of scene.nodes) {\n if (node.hit !== index) continue;\n switch (node.kind) {\n case \"rect\":\n add(node);\n break;\n case \"sector\":\n add(arcBox(node.cx, node.cy, node.r0, node.r1, node.a0, node.a1));\n break;\n case \"arc\":\n add(\n arcBox(\n node.cx,\n node.cy,\n node.r - node.width / 2,\n node.r + node.width / 2,\n node.a0,\n node.a1,\n ),\n );\n break;\n case \"polygon\": {\n const p = node.points;\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n for (let i = 0; i + 1 < p.length; i += 2) {\n x0 = Math.min(x0, p[i]);\n x1 = Math.max(x1, p[i]);\n y0 = Math.min(y0, p[i + 1]);\n y1 = Math.max(y1, p[i + 1]);\n }\n if (x1 >= x0) add({ x: x0, y: y0, width: x1 - x0, height: y1 - y0 });\n break;\n }\n case \"circle\":\n add({\n x: node.cx - node.r,\n y: node.cy - node.r,\n width: node.r * 2,\n height: node.r * 2,\n });\n break;\n case \"link\": {\n const half = node.width / 2;\n const y0 = Math.min(node.y0, node.y1) - half;\n add({\n x: Math.min(node.x0, node.x1),\n y: y0,\n width: Math.abs(node.x1 - node.x0),\n height: Math.abs(node.y1 - node.y0) + node.width,\n });\n break;\n }\n default:\n break;\n }\n }\n return box;\n};\n\n/** Approximate box of a text node (unrotated) */\nconst textBox = (node: {\n x: number;\n y: number;\n text: string;\n font: string;\n align: \"left\" | \"center\" | \"right\";\n baseline: \"top\" | \"middle\" | \"bottom\" | \"alphabetic\";\n}): ShapeRect => {\n const size = Number(/(\\d+(?:\\.\\d+)?)px/.exec(node.font)?.[1] ?? 12);\n const width = estimateText(node.text, node.font);\n const x =\n node.align === \"center\"\n ? node.x - width / 2\n : node.align === \"right\"\n ? node.x - width\n : node.x;\n const y =\n node.baseline === \"top\"\n ? node.y\n : node.baseline === \"middle\"\n ? node.y - size / 2\n : node.y - size;\n return { x, y, width, height: size };\n};\n\n/**\n * Top-left corner of a `w` x `h` tooltip anchored at `anchor`, inside a\n * `width` x `height` drawing (or overflowing it into `bounds`, see\n * `placeTooltip`, when the drawing has no room). Candidates around the\n * pointer and around the hovered item are scored: never over the pointer\n * (nor the hovered radar vertex), then covering as little as possible of the\n * hovered item and of the texts, close to the pointer; radar tooltips lean\n * outward.\n */\nexport const placeShapeTooltip = (\n scene: ShapeScene | null,\n hover: ShapeHover | null,\n anchor: { x: number; y: number },\n w: number,\n h: number,\n width: number,\n height: number,\n bounds: ShapeRect | null = null,\n): TooltipPlacement => {\n const m = TIP_MARGIN;\n const { x: ax, y: ay } = anchor;\n const t = TIP_POINTER;\n const fallback = () =>\n placeTooltip({\n anchor,\n size: { width: w, height: h },\n stage: { width, height },\n margin: m,\n avoid: { x: ax - t, y: ay - t, width: t * 2, height: t * 2 },\n bounds,\n gap: 16 - t,\n });\n // tooltips larger than the drawing (sparkline-sized charts) go out of it\n if (!scene || !hover || w + m * 2 > width || h + m * 2 > height)\n return fallback();\n\n const fit = (x: number, y: number) => ({\n x: Math.max(m, Math.min(x, width - w - m)),\n y: Math.max(m, Math.min(y, height - h - m)),\n });\n // points the tooltip must not cover: the pointer and the hovered vertex\n const keep: [number, number][] = [[ax, ay]];\n const item = scene.items.find((it) => it.index === hover.index);\n const vertex =\n item?.indicators && hover.indicator !== undefined\n ? item.indicators[hover.indicator]\n : undefined;\n if (vertex) keep.push([vertex.x, vertex.y]);\n const target = itemBox(scene, hover.index);\n const texts: ShapeRect[] = [...(scene.radar?.labels ?? [])];\n for (const node of scene.nodes)\n if (node.kind === \"text\" && !node.rotate && node.indicator === undefined)\n texts.push(textBox(node));\n\n const radar = scene.radar;\n let dx = 0;\n let dy = 0;\n if (radar) {\n dx = ax - radar.cx;\n dy = ay - radar.cy;\n const len = Math.hypot(dx, dy);\n if (len > 1) {\n dx /= len;\n dy /= len;\n } else {\n dx = 1;\n dy = 0;\n }\n }\n\n const g = TIP_GAP;\n const candidates: [number, number][] = [\n [ax + g, ay - h / 2],\n [ax - g - w, ay - h / 2],\n [ax - w / 2, ay - g - h],\n [ax - w / 2, ay + g],\n [ax + g, ay - g - h],\n [ax + g, ay + g],\n [ax - g - w, ay - g - h],\n [ax - g - w, ay + g],\n ];\n if (target) {\n const gap = 10;\n candidates.push(\n [target.x + target.width + gap, ay - h / 2],\n [target.x - gap - w, ay - h / 2],\n [ax - w / 2, target.y - gap - h],\n [ax - w / 2, target.y + target.height + gap],\n );\n }\n // the free edges of wide or tall drawings (beyond the labels)\n candidates.push(\n [m, ay - h / 2],\n [width - w - m, ay - h / 2],\n [ax - w / 2, m],\n [ax - w / 2, height - h - m],\n );\n const area = w * h;\n let best: { x: number; y: number } | null = null;\n let bestScore = Infinity;\n for (const [cx0, cy0] of candidates) {\n const p = fit(cx0, cy0);\n const box = { x: p.x, y: p.y, width: w, height: h };\n let score = 0;\n for (const [px, py] of keep) {\n if (\n px > box.x - 8 &&\n px < box.x + w + 8 &&\n py > box.y - 8 &&\n py < box.y + h + 8\n )\n score += 1e6;\n }\n // texts weigh most (a hidden label is lost), then the hovered item\n if (target) score += (overlapArea(box, target) / area) * 400;\n for (const text of texts) score += overlapArea(box, text) * 4;\n const ox = p.x + w / 2 - ax;\n const oy = p.y + h / 2 - ay;\n const dist = Math.hypot(ox, oy) || 1;\n score += dist * 0.35;\n if (radar) score -= ((ox * dx + oy * dy) / dist) * 40;\n // candidates that fit without being pushed in\n score += Math.abs(p.x - cx0) + Math.abs(p.y - cy0);\n if (score < bestScore) {\n bestScore = score;\n best = p;\n }\n }\n if (!best || bestScore >= 1e6) return fallback();\n return { ...best, fit: \"stage\" };\n};\n\n/** Box of a tooltip drawn on a canvas, next to the anchor and inside the drawing */\nexport const layoutShapeTooltip = (\n value: ShapeTooltipContent | string,\n anchorX: number,\n anchorY: number,\n width: number,\n height: number,\n theme: ChartTheme,\n measure: MeasureText,\n scene: ShapeScene | null = null,\n hover: ShapeHover | null = null,\n): ShapeTooltipBox => {\n const padding = 9;\n const lineHeight = 18;\n let w = 0;\n let lines: number;\n let content: ShapeTooltipContent | undefined;\n let text: string[] | undefined;\n let titleLines: string[] | undefined;\n if (typeof value === \"string\") {\n text = value.split(\"\\n\");\n const f = font(theme, 12);\n for (const line of text) w = Math.max(w, measure(line, f));\n lines = text.length;\n } else {\n content = value;\n // long titles (full names of truncated labels) wrap to 3 lines\n const titleFont = font(theme, 12, 600);\n const dot = value.color ? 14 : 0;\n const maxTitle = Math.max(\n 60,\n Math.min(260, width - 16 - padding * 2) - dot,\n );\n titleLines = wrapText(value.title, maxTitle, titleFont, measure, 3);\n if (!titleLines.length) titleLines = [value.title];\n for (const line of titleLines)\n w = Math.max(w, dot + measure(line, titleFont));\n for (const row of value.rows) {\n w = Math.max(\n w,\n (row.color ? 14 : 0) +\n measure(row.name, font(theme, 12)) +\n 16 +\n measure(row.value, font(theme, 12, 600)),\n );\n }\n lines = titleLines.length + value.rows.length;\n }\n const bw = Math.max(96, Math.ceil(w + padding * 2 + 4));\n const bh = lines * lineHeight + padding * 2;\n const { x, y } = placeShapeTooltip(\n scene,\n hover,\n { x: anchorX, y: anchorY },\n bw,\n bh,\n width,\n height,\n );\n return {\n x,\n y,\n width: bw,\n height: bh,\n padding,\n lineHeight,\n ...(content ? { content, titleLines } : {}),\n ...(text ? { text } : {}),\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ChartTheme } from '../theme.cjs';
|
|
2
|
+
import { TooltipPlacement } from '../tooltip.cjs';
|
|
2
3
|
import { MeasureText, ShapeHover, ShapeLegendEntry, ShapeRect, ShapeScene, ShapeTooltipRow } from './scene.cjs';
|
|
3
4
|
import { ShapeChartOptions, ShapeHoverEvent, ShapeLegendOptions } from './types.cjs';
|
|
4
5
|
export interface ShapeLayoutInput {
|
|
@@ -80,16 +81,16 @@ export interface ShapeTooltipBox {
|
|
|
80
81
|
}
|
|
81
82
|
/**
|
|
82
83
|
* Top-left corner of a `w` x `h` tooltip anchored at `anchor`, inside a
|
|
83
|
-
* `width` x `height` drawing
|
|
84
|
-
*
|
|
85
|
-
*
|
|
84
|
+
* `width` x `height` drawing (or overflowing it into `bounds`, see
|
|
85
|
+
* `placeTooltip`, when the drawing has no room). Candidates around the
|
|
86
|
+
* pointer and around the hovered item are scored: never over the pointer
|
|
87
|
+
* (nor the hovered radar vertex), then covering as little as possible of the
|
|
88
|
+
* hovered item and of the texts, close to the pointer; radar tooltips lean
|
|
89
|
+
* outward.
|
|
86
90
|
*/
|
|
87
91
|
export declare const placeShapeTooltip: (scene: ShapeScene | null, hover: ShapeHover | null, anchor: {
|
|
88
92
|
x: number;
|
|
89
93
|
y: number;
|
|
90
|
-
}, w: number, h: number, width: number, height: number) =>
|
|
91
|
-
x: number;
|
|
92
|
-
y: number;
|
|
93
|
-
};
|
|
94
|
+
}, w: number, h: number, width: number, height: number, bounds?: ShapeRect | null) => TooltipPlacement;
|
|
94
95
|
/** Box of a tooltip drawn on a canvas, next to the anchor and inside the drawing */
|
|
95
96
|
export declare const layoutShapeTooltip: (value: ShapeTooltipContent | string, anchorX: number, anchorY: number, width: number, height: number, theme: ChartTheme, measure: MeasureText, scene?: ShapeScene | null, hover?: ShapeHover | null) => ShapeTooltipBox;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ChartTheme } from '../theme.js';
|
|
2
|
+
import { TooltipPlacement } from '../tooltip.js';
|
|
2
3
|
import { MeasureText, ShapeHover, ShapeLegendEntry, ShapeRect, ShapeScene, ShapeTooltipRow } from './scene.js';
|
|
3
4
|
import { ShapeChartOptions, ShapeHoverEvent, ShapeLegendOptions } from './types.js';
|
|
4
5
|
export interface ShapeLayoutInput {
|
|
@@ -80,16 +81,16 @@ export interface ShapeTooltipBox {
|
|
|
80
81
|
}
|
|
81
82
|
/**
|
|
82
83
|
* Top-left corner of a `w` x `h` tooltip anchored at `anchor`, inside a
|
|
83
|
-
* `width` x `height` drawing
|
|
84
|
-
*
|
|
85
|
-
*
|
|
84
|
+
* `width` x `height` drawing (or overflowing it into `bounds`, see
|
|
85
|
+
* `placeTooltip`, when the drawing has no room). Candidates around the
|
|
86
|
+
* pointer and around the hovered item are scored: never over the pointer
|
|
87
|
+
* (nor the hovered radar vertex), then covering as little as possible of the
|
|
88
|
+
* hovered item and of the texts, close to the pointer; radar tooltips lean
|
|
89
|
+
* outward.
|
|
86
90
|
*/
|
|
87
91
|
export declare const placeShapeTooltip: (scene: ShapeScene | null, hover: ShapeHover | null, anchor: {
|
|
88
92
|
x: number;
|
|
89
93
|
y: number;
|
|
90
|
-
}, w: number, h: number, width: number, height: number) =>
|
|
91
|
-
x: number;
|
|
92
|
-
y: number;
|
|
93
|
-
};
|
|
94
|
+
}, w: number, h: number, width: number, height: number, bounds?: ShapeRect | null) => TooltipPlacement;
|
|
94
95
|
/** Box of a tooltip drawn on a canvas, next to the anchor and inside the drawing */
|
|
95
96
|
export declare const layoutShapeTooltip: (value: ShapeTooltipContent | string, anchorX: number, anchorY: number, width: number, height: number, theme: ChartTheme, measure: MeasureText, scene?: ShapeScene | null, hover?: ShapeHover | null) => ShapeTooltipBox;
|