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":"scene.js","names":["annotationRect","annotationLine","annotationTitleLayout","annotationTextBox","_Fragment","SHAPE_BUDGET","C","lineHeightOf","size","slack","measureChartText","text","o","label","lh","pad","w","top","valign","y","horizontal","align","x","frameWidth","Text","extra","key","box","View","color","dot","cx","d","cy","segment","dx","x2","x1","dy","y2","y1","length","width","dashRuns","pattern","dash","v","period","a","b","runs","scale","max","out","at","i","step","dashedLine","start","run","axis","from","crisp","arrowViews","arrow","pts","k","p","q","x0","ox","y0","oy","tip","b0","b1","half","clear","style","baseX","baseY","right","down","thin","stride","lx","ly","areaStrips","transposed","points","plot","frame","n","forward","xs","ys","bs","bottom","baseline","to","column","j","left","c","mid","t","h","primitiveLimits","scene","visible","s","lines","scatters","perLine","maxDots","drawData","primitives","scenePrimitives","options","dotsLeft","barsLeft","total","r","count","radius","stroke","css","toCss","alpha","drawBackground","layout","scales","bottomAxis","model","leftAxis","bottomTicks","leftTicks","bottomPx","leftPx","fs","theme","rectOf","grid","py","px","line","tick","title","lastRight","lastBottom","y2Ticks","ramp","bar","stops","part","l","e","swatch","drawForeground","fw","halo","labelHeight","along","annotations","where","lineOf","areaTitleLayout","weight","muted","textBox","pointColor","clip","drawStatic","Fragment","family","drawHover","background","hover","StyleSheet","m","grow","inset","dragging","customTooltip","font","row","lineHeight","tooltipCard","padding","content"],"sources":["../../../../../native/src/components/Chart/scene.tsx"],"sourcesContent":["// Draws a chart scene (`ChartController.getScene()`) with plain views: no\n// canvas, SVG or native drawing module. The engine already resolves every\n// position in pixels; this file only turns them into absolutely positioned\n// <View> / <Text> elements, keeping the number of views bounded by the size\n// of the chart (lines decimated per column, dots merged per cell, bars\n// merged per pixel column), whatever the size of the data.\n\nimport type { ReactElement, ReactNode } from \"react\";\nimport {\n StyleSheet,\n Text,\n View,\n type TextStyle,\n type ViewStyle,\n} from \"react-native\";\nimport {\n annotationLine,\n annotationRect,\n annotationTextBox,\n annotationTitleLayout,\n scenePrimitives,\n toCss,\n type ChartPrimitive,\n type ChartRect,\n type ChartScene,\n} from \"@minerva/charts/canvas\";\nimport { part } from \"../../internal/parts\";\nimport { measureChartText } from \"./measure\";\n\ntype Rgba = ChartScene[\"theme\"][\"text\"];\n\n/** Upper bounds of the views drawn for the data of a chart */\nexport const SHAPE_BUDGET = {\n /** Points of all the lines (one view per segment) */\n linePoints: 1200,\n /** Dots of one scatter series before they are merged per cell */\n dotsPerSeries: 800,\n /** Dots of all the series */\n dots: 2000,\n /** Bars of one series before neighbors are merged per pixel column */\n barsPerSeries: 600,\n /** Bars of all the series */\n bars: 1500,\n /** Vertical strips filling one area */\n areaColumns: 200,\n /** Dashes of one dashed line */\n dashes: 200,\n} as const;\n\nconst C = \"chart\";\n\n// ------------------------------------------------------------------ text\n\ninterface TextOptions {\n size: number;\n color: string;\n weight?: number;\n family?: string;\n /** Halo color: keeps the text readable over the data */\n halo?: string;\n}\n\ntype Align = \"left\" | \"center\" | \"right\";\ntype VAlign = \"top\" | \"middle\" | \"bottom\";\n\nconst lineHeightOf = (size: number) => Math.ceil(size * 1.35);\n\n/** Box wide enough for the estimated width (the real one may differ) */\nconst slack = (text: string, o: TextOptions) =>\n Math.ceil(\n measureChartText(text, `${o.weight ?? 400} ${o.size}px sans-serif`) * 1.4 +\n o.size * 2,\n );\n\n/**\n * A one-line text anchored at (x, y) of a container `frameWidth` wide:\n * `left` starts there, `right` ends there, `center` is centered on it;\n * `top` / `bottom` place the em box like the canvas text baselines\n */\nfunction label(\n key: string,\n text: string,\n x: number,\n y: number,\n align: Align,\n valign: VAlign,\n o: TextOptions,\n frameWidth: number,\n extra?: TextStyle,\n): ReactElement {\n const lh = lineHeightOf(o.size);\n const pad = (lh - o.size) / 2;\n const w = slack(text, o);\n const top =\n valign === \"top\"\n ? y - pad\n : valign === \"bottom\"\n ? y - lh + pad\n : y - lh / 2;\n const horizontal: TextStyle =\n align === \"left\"\n ? { left: x, width: w }\n : align === \"right\"\n ? { right: frameWidth - x, width: w }\n : { left: x - w / 2, width: w };\n return (\n <Text\n key={key}\n numberOfLines={1}\n style={[\n {\n position: \"absolute\",\n top,\n ...horizontal,\n textAlign: align,\n fontSize: o.size,\n lineHeight: lh,\n color: o.color,\n fontWeight: String(o.weight ?? 400) as TextStyle[\"fontWeight\"],\n includeFontPadding: false,\n ...(o.family ? { fontFamily: o.family } : null),\n ...(o.halo\n ? {\n textShadowColor: o.halo,\n textShadowRadius: 3,\n textShadowOffset: { width: 0, height: 0 },\n }\n : null),\n },\n extra,\n ]}\n >\n {text}\n </Text>\n );\n}\n\n// ---------------------------------------------------------------- shapes\n\nconst box = (\n key: string,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n extra?: ViewStyle,\n): ReactElement => (\n <View\n key={key}\n style={[\n {\n position: \"absolute\",\n left: x,\n top: y,\n width,\n height,\n backgroundColor: color,\n },\n extra,\n ]}\n />\n);\n\nconst dot = (\n key: string,\n cx: number,\n cy: number,\n d: number,\n color: string,\n extra?: ViewStyle,\n) =>\n box(key, cx - d / 2, cy - d / 2, d, d, color, {\n borderRadius: d / 2,\n ...extra,\n });\n\n/** A straight stroke: one view, rotated around its center */\nconst segment = (\n key: string,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n width: number,\n color: string,\n) => {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const length = Math.hypot(dx, dy) + width;\n return box(\n key,\n (x1 + x2) / 2 - length / 2,\n (y1 + y2) / 2 - width / 2,\n length,\n width,\n color,\n {\n borderRadius: width / 2,\n transform: [{ rotate: `${Math.atan2(dy, dx)}rad` }],\n },\n );\n};\n\n/** Dash runs `[start, length]` along a line (canvas `setLineDash` pattern) */\nexport function dashRuns(\n length: number,\n dash: readonly number[],\n max: number = SHAPE_BUDGET.dashes,\n): [number, number][] {\n let pattern = dash.filter((v) => Number.isFinite(v) && v >= 0);\n // odd patterns repeat twice, like the canvas\n if (pattern.length % 2) pattern = [...pattern, ...pattern];\n const period = pattern.reduce((a, b) => a + b, 0);\n if (!pattern.length || period <= 0) return [[0, length]];\n const runs = (length / period) * (pattern.length / 2);\n const scale = runs > max ? runs / max : 1;\n const out: [number, number][] = [];\n let at = 0;\n for (let i = 0; at < length; i = (i + 1) % pattern.length) {\n const step = pattern[i] * scale;\n if (i % 2 === 0 && step > 0) out.push([at, Math.min(step, length - at)]);\n at += Math.max(step, 0.5);\n }\n return out;\n}\n\nconst dashedLine = (\n key: string,\n axis: \"x\" | \"y\",\n at: number,\n from: number,\n length: number,\n width: number,\n color: string,\n dash: readonly number[],\n) =>\n dashRuns(length, dash).map(([start, run], i) =>\n axis === \"y\"\n ? box(`${key}-${i}`, from + start, at, run, width, color)\n : box(`${key}-${i}`, at, from + start, width, run, color),\n );\n\nconst crisp = (v: number, width = 1) => Math.round(v) + 0.5 - width / 2;\n\n/**\n * Views of an elbow arrow (relative to `ox`, `oy`): a thin box per leg (the\n * legs are horizontal or vertical) and a triangle made of borders\n */\nexport const arrowViews = (\n key: string,\n arrow: ChartScene[\"arrows\"][number],\n ox: number,\n oy: number,\n): ReactElement[] => {\n const out: ReactElement[] = [];\n const w = arrow.width;\n const pts = arrow.points;\n for (let k = 1; k < pts.length; k++) {\n const p = pts[k - 1]!;\n const q = pts[k]!;\n const x0 = Math.min(p.x, q.x) - ox;\n const y0 = Math.min(p.y, q.y) - oy;\n // legs overlap by half a width so the corners are closed\n out.push(\n p.y === q.y\n ? box(\n `${key}-${k}`,\n x0 - w / 2,\n y0 - w / 2,\n Math.abs(q.x - p.x) + w,\n w,\n arrow.color,\n )\n : box(\n `${key}-${k}`,\n x0 - w / 2,\n y0 - w / 2,\n w,\n Math.abs(q.y - p.y) + w,\n arrow.color,\n ),\n );\n }\n const [tip, b0, b1] = arrow.head;\n const length = Math.hypot(\n tip.x - (b0.x + b1.x) / 2,\n tip.y - (b0.y + b1.y) / 2,\n );\n const half = Math.hypot(b1.x - b0.x, b1.y - b0.y) / 2;\n const clear = \"transparent\";\n const style: ViewStyle = { position: \"absolute\", width: 0, height: 0 };\n const baseX = (b0.x + b1.x) / 2;\n const baseY = (b0.y + b1.y) / 2;\n if (Math.abs(tip.x - baseX) >= Math.abs(tip.y - baseY)) {\n const right = tip.x > baseX;\n Object.assign(style, {\n left: (right ? baseX : tip.x) - ox,\n top: tip.y - half - oy,\n borderTopWidth: half,\n borderBottomWidth: half,\n borderTopColor: clear,\n borderBottomColor: clear,\n ...(right\n ? { borderLeftWidth: length, borderLeftColor: arrow.color }\n : { borderRightWidth: length, borderRightColor: arrow.color }),\n });\n } else {\n const down = tip.y > baseY;\n Object.assign(style, {\n left: tip.x - half - ox,\n top: (down ? baseY : tip.y) - oy,\n borderLeftWidth: half,\n borderRightWidth: half,\n borderLeftColor: clear,\n borderRightColor: clear,\n ...(down\n ? { borderTopWidth: length, borderTopColor: arrow.color }\n : { borderBottomWidth: length, borderBottomColor: arrow.color }),\n });\n }\n out.push(<View key={`${key}-head`} style={style} />);\n return out;\n};\n\n// ------------------------------------------------------------------ data\n\n/** Thins a run of interleaved points to `max` points and drops sub-pixel steps */\nfunction thin(run: readonly number[], max: number): number[] {\n const n = run.length / 2;\n const stride = n > max ? Math.ceil(n / max) : 1;\n const out: number[] = [];\n for (let i = 0; i < n; i += stride) {\n const x = run[i * 2];\n const y = run[i * 2 + 1];\n const k = out.length;\n if (k && Math.hypot(x - out[k - 2], y - out[k - 1]) < 1.5) continue;\n out.push(x, y);\n }\n const lx = run[n * 2 - 2];\n const ly = run[n * 2 - 1];\n const k = out.length;\n if (n > 1 && (out[k - 2] !== lx || out[k - 1] !== ly)) out.push(lx, ly);\n return out;\n}\n\n/**\n * Vertical strips between the line and the baseline (or the stack below),\n * one per column; horizontal strips, one per row, for horizontal charts\n */\nfunction areaStrips(\n key: string,\n points: readonly number[],\n baseline: number,\n color: string,\n opacity: number,\n frame: ChartRect,\n /** Y pixel (x pixel when `transposed`) of the bottom edge under every point */\n bottom?: readonly number[],\n /** Horizontal charts: the area grows from the left edge */\n transposed = false,\n): ReactElement[] {\n // horizontal charts are filled like vertical ones with x and y swapped\n const run = transposed\n ? points.map((_, i) => points[i % 2 ? i - 1 : i + 1])\n : points;\n const plot = transposed\n ? { x: frame.y, y: frame.x, width: frame.height, height: frame.width }\n : frame;\n const n = run.length / 2;\n if (n < 2) return [];\n // left to right (reversed axes list their points right to left)\n const forward = run[0] <= run[n * 2 - 2];\n const at = (i: number) => (forward ? i : n - 1 - i);\n const xs = (i: number) => run[at(i) * 2];\n const ys = (i: number) => run[at(i) * 2 + 1];\n const bs = (i: number) => (bottom ? bottom[at(i)] : baseline);\n const from = Math.max(plot.x, xs(0));\n const to = Math.min(plot.x + plot.width, xs(n - 1));\n if (to <= from) return [];\n const column = Math.max(2, plot.width / SHAPE_BUDGET.areaColumns);\n const out: ReactElement[] = [];\n let j = 0;\n for (let left = Math.floor(from), c = 0; left < to; c++) {\n const right = Math.min(Math.ceil(to), Math.round(left + column));\n const mid = (left + right) / 2;\n while (j < n - 2 && xs(j + 1) < mid) j++;\n const x0 = xs(j);\n const x1 = xs(j + 1);\n const t = x1 === x0 ? 0 : Math.max(0, Math.min(1, (mid - x0) / (x1 - x0)));\n const y = ys(j) + (ys(j + 1) - ys(j)) * t;\n const b = bs(j) + (bs(j + 1) - bs(j)) * t;\n if (Number.isFinite(y) && Number.isFinite(b)) {\n const top = Math.min(y, b);\n const h = Math.abs(b - y);\n out.push(\n transposed\n ? box(\n `${key}-${c}`,\n top - plot.y,\n left - plot.x,\n h,\n right - left,\n color,\n {\n opacity,\n },\n )\n : box(\n `${key}-${c}`,\n left - plot.x,\n top - plot.y,\n right - left,\n h,\n color,\n {\n opacity,\n },\n ),\n );\n }\n left = right;\n }\n return out;\n}\n\n/** Limits of `scenePrimitives` for the views budget */\nexport function primitiveLimits(scene: ChartScene) {\n const { plot } = scene.layout;\n const visible = scene.model.series.filter((s) => !s.hidden);\n const lines = visible.filter(\n (s) => s.type === \"line\" || s.type === \"area\",\n ).length;\n const scatters = visible.filter((s) => s.type === \"scatter\").length;\n const perLine = Math.max(150, SHAPE_BUDGET.linePoints / Math.max(1, lines));\n const maxDots = Math.max(\n 100,\n Math.min(\n SHAPE_BUDGET.dotsPerSeries,\n SHAPE_BUDGET.dots / Math.max(1, scatters),\n ),\n );\n return {\n perLine,\n options: {\n // decimation keeps up to 4 points per column\n columnWidth: Math.max(3, (plot.width * 4) / perLine),\n maxDots,\n maxBars: SHAPE_BUDGET.barsPerSeries,\n dotCell: Math.max(\n 4,\n Math.sqrt((plot.width * plot.height) / maxDots) * 1.15 + 1,\n ),\n },\n };\n}\n\nfunction drawData(scene: ChartScene): ReactElement[] {\n const { plot } = scene.layout;\n const { perLine, options } = primitiveLimits(scene);\n const primitives: ChartPrimitive[] = scenePrimitives(scene, options);\n const ox = plot.x;\n const oy = plot.y;\n const out: ReactElement[] = [];\n let dotsLeft: number = SHAPE_BUDGET.dots;\n let barsLeft: number = SHAPE_BUDGET.bars;\n primitives.forEach((p, k) => {\n const key = `${p.kind}${p.seriesIndex}-${k}`;\n if (p.kind === \"area\") {\n p.segments.forEach((run, r) =>\n out.push(\n ...areaStrips(\n `${key}-${r}`,\n run,\n p.baseline,\n p.color,\n p.opacity,\n plot,\n p.bottoms?.[r],\n p.horizontal,\n ),\n ),\n );\n return;\n }\n if (p.kind === \"line\") {\n let total = 0;\n for (const run of p.segments) total += run.length / 2;\n p.segments.forEach((run, r) => {\n const pts = thin(\n run,\n Math.max(\n 2,\n Math.round((perLine * run.length) / 2 / Math.max(1, total)),\n ),\n );\n if (pts.length === 2) {\n out.push(\n dot(\n `${key}-${r}`,\n pts[0] - ox,\n pts[1] - oy,\n p.width * 1.5,\n p.color,\n ),\n );\n return;\n }\n for (let i = 0; i + 3 < pts.length; i += 2) {\n out.push(\n segment(\n `${key}-${r}-${i}`,\n pts[i] - ox,\n pts[i + 1] - oy,\n pts[i + 2] - ox,\n pts[i + 3] - oy,\n p.width,\n p.color,\n ),\n );\n }\n });\n return;\n }\n if (p.kind === \"bars\") {\n const count = p.rects.length / 4;\n const stride =\n count > barsLeft ? Math.ceil(count / Math.max(1, barsLeft)) : 1;\n for (let i = 0; i < count; i += stride) {\n const [x, y, w, h] = p.rects.slice(i * 4, i * 4 + 4);\n const radius = Math.min(p.radius ?? 0, w / 2, h / 2);\n out.push(\n box(\n `${key}-${i}`,\n x - ox,\n y - oy,\n Math.max(w, 0.5),\n h,\n p.colors?.[i] ?? p.color,\n radius > 0.5 || p.opacity !== undefined\n ? {\n ...(radius > 0.5 ? { borderRadius: radius } : null),\n ...(p.opacity !== undefined ? { opacity: p.opacity } : null),\n }\n : undefined,\n ),\n );\n }\n barsLeft = Math.max(0, barsLeft - Math.ceil(count / stride));\n return;\n }\n const count = p.dots.length / 3;\n const stride =\n count > dotsLeft ? Math.ceil(count / Math.max(1, dotsLeft)) : 1;\n const stroke = p.stroke ?? 0;\n for (let i = 0; i < count; i += stride) {\n const color = p.colors[i] ?? \"#888\";\n out.push(\n dot(\n `${key}-${i}`,\n p.dots[i * 3] - ox,\n p.dots[i * 3 + 1] - oy,\n p.dots[i * 3 + 2],\n // rings (hollow box plot outliers): the border only\n p.opacity > 0 ? color : \"transparent\",\n stroke > 0 && p.opacity < 1\n ? { borderWidth: stroke, borderColor: color, opacity: 1 }\n : { opacity: p.opacity },\n ),\n );\n }\n dotsLeft = Math.max(0, dotsLeft - Math.ceil(count / stride));\n });\n return out;\n}\n\n// ------------------------------------------------------------ background\n\nconst css = (c: Rgba, alpha?: number) => toCss(c, alpha);\n\nfunction drawBackground(scene: ChartScene, family?: string): ReactElement[] {\n const { width, theme, model, layout, annotations } = scene;\n const { plot, scales, y2Ticks } = layout;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const horizontal = scales.horizontal;\n const bottomAxis = horizontal ? model.y : model.x;\n const leftAxis = horizontal ? model.x : model.y;\n const bottomTicks = horizontal ? layout.yTicks : layout.xTicks;\n const leftTicks = horizontal ? layout.xTicks : layout.yTicks;\n const bottomPx = horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = horizontal ? scales.xToPx : scales.yToPx;\n const fs = theme.fontSize;\n const out: ReactElement[] = [];\n\n annotations.forEach((a, i) => {\n if (a.type !== \"rect\") return;\n const r = annotationRect(a, scales);\n if (r.width <= 0 || r.height <= 0) return;\n out.push(\n box(`area-${i}`, r.x, r.y, r.width, r.height, css(a.color, a.opacity)),\n );\n });\n\n const grid = css(theme.grid);\n if (leftAxis.grid) {\n leftTicks.values.forEach((v, i) => {\n const py = leftPx(v);\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) return;\n out.push(box(`ygrid-${i}`, plot.x, crisp(py), plot.width, 1, grid));\n });\n }\n if (bottomAxis.grid) {\n bottomTicks.values.forEach((v, i) => {\n const px = bottomPx(v);\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) return;\n out.push(box(`xgrid-${i}`, crisp(px), plot.y, 1, plot.height, grid));\n });\n }\n\n const line = Math.ceil(fs * 1.4);\n const tick: TextOptions = { size: fs, color: css(theme.textMuted), family };\n const title: TextOptions = {\n size: fs + 1,\n weight: 500,\n color: css(theme.text, 0.8),\n family,\n };\n const bottom = plot.y + plot.height;\n\n if (bottomAxis.visible) {\n out.push(\n box(\"xaxis\", plot.x, crisp(bottom), plot.width, 1, css(theme.axis)),\n );\n let lastRight = -Infinity;\n bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] ?? \"\" }))\n .sort((a, b) => a.px - b.px)\n .forEach(({ px, text }, i) => {\n if (!text || px < plot.x - 0.5 || px > plot.x + plot.width + 0.5)\n return;\n const w = measureChartText(text, `400 ${fs}px sans-serif`);\n const left = Math.max(0, Math.min(width - w, px - w / 2));\n if (left < lastRight + 6) return;\n lastRight = left + w;\n out.push(\n label(\n `xtick-${i}`,\n text,\n left + w / 2,\n bottom + 7,\n \"center\",\n \"top\",\n tick,\n width,\n ),\n );\n });\n if (bottomAxis.title)\n out.push(\n label(\n \"xtitle\",\n bottomAxis.title,\n plot.x + plot.width / 2,\n bottom + line + 10,\n \"center\",\n \"top\",\n title,\n width,\n ),\n );\n }\n\n if (leftAxis.visible) {\n let lastBottom = -Infinity;\n leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] ?? \"\" }))\n .sort((a, b) => a.py - b.py)\n .forEach(({ py, text }, i) => {\n if (!text || py < plot.y - 0.5 || py > plot.y + plot.height + 0.5)\n return;\n // category rows of horizontal charts never overlap\n if (horizontal) {\n if (py - (fs + 2) / 2 < lastBottom) return;\n lastBottom = py + (fs + 2) / 2;\n }\n out.push(\n label(\n `ytick-${i}`,\n text,\n plot.x - 8,\n py,\n \"right\",\n \"middle\",\n tick,\n width,\n ),\n );\n });\n if (leftAxis.title)\n out.push(\n label(\n \"ytitle\",\n leftAxis.title,\n line / 2 + 4,\n plot.y + plot.height / 2,\n \"center\",\n \"middle\",\n title,\n width,\n {\n transform: [{ rotate: \"-90deg\" }],\n },\n ),\n );\n }\n\n const y2 = horizontal ? null : model.y2;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n const text = y2Ticks.labels[i];\n if (!text || py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n out.push(\n label(\n `y2tick-${i}`,\n text,\n right + 8,\n py,\n \"left\",\n \"middle\",\n tick,\n width,\n ),\n );\n });\n if (y2.title)\n out.push(\n label(\n \"y2title\",\n y2.title,\n width - line / 2 - 4,\n plot.y + plot.height / 2,\n \"center\",\n \"middle\",\n title,\n width,\n {\n transform: [{ rotate: \"90deg\" }],\n },\n ),\n );\n }\n\n const ramp = scene.legend?.colors;\n if (ramp) {\n // visual map: the ramp in even steps, the values at its ends\n const { bar, stops } = ramp;\n const step = bar.width / Math.max(1, stops.length);\n out.push(\n <View\n key=\"color-legend\"\n {...part(C, \"color-legend\")}\n style={{\n position: \"absolute\",\n left: bar.x,\n top: bar.y,\n width: bar.width,\n height: bar.height,\n borderRadius: bar.height / 2,\n overflow: \"hidden\",\n flexDirection: \"row\",\n }}\n >\n {stops.map((c, k) => (\n <View\n key={k}\n style={{ width: step, height: bar.height, backgroundColor: c }}\n />\n ))}\n </View>,\n );\n ramp.ticks.forEach((t, k) =>\n out.push(\n box(\n `color-tick-${k}`,\n Math.round(t),\n bar.y - 2,\n 1,\n bar.height + 4,\n css(theme.text, 0.35),\n ),\n ),\n );\n ramp.labels.forEach((l, k) =>\n out.push(\n label(\n `color-label-${k}`,\n l.text,\n l.x,\n l.y,\n l.align,\n \"middle\",\n { size: 11, color: css(theme.textMuted), family },\n width,\n ),\n ),\n );\n }\n\n if (scene.legend) {\n for (const e of scene.legend.entries) {\n // coordinates relative to the entry box\n const cy = e.box.height / 2;\n const swatch =\n e.shape === \"dot\"\n ? dot(\"swatch\", 5, cy, 8, e.color)\n : e.shape === \"line\"\n ? box(\"swatch\", 0, cy - 1, 10, 2, e.color)\n : box(\"swatch\", 1, cy - 4, 8, 8, e.color);\n out.push(\n <View\n key={`legend-${e.id}`}\n style={{\n position: \"absolute\",\n left: e.box.x,\n top: e.box.y,\n width: e.box.width,\n height: e.box.height,\n opacity: e.hidden ? 0.45 : 1,\n }}\n {...part(C, \"legend-item\", { hidden: e.hidden })}\n >\n {swatch}\n {label(\n \"name\",\n e.name,\n 14,\n cy,\n \"left\",\n \"middle\",\n { size: 12, color: css(theme.textMuted), family },\n e.box.width,\n e.hidden ? { textDecorationLine: \"line-through\" } : undefined,\n )}\n </View>,\n );\n }\n }\n return out;\n}\n\n// ------------------------------------------------------------ foreground\n\nfunction drawForeground(scene: ChartScene, family?: string): ReactElement[] {\n const { theme, annotations, layout } = scene;\n const { plot, scales } = layout;\n const fs = theme.fontSize;\n const ox = plot.x;\n const oy = plot.y;\n const fw = plot.width;\n const halo = css(theme.background, 0.9);\n const labelHeight = fs + 4;\n const out: ReactElement[] = [];\n\n // waterfall connectors: thin dashed lines between the bars\n scene.connectors.forEach((c, i) => {\n const along = c.y0 === c.y1;\n out.push(\n ...(along\n ? dashedLine(\n `connector-${i}`,\n \"y\",\n crisp(c.y0, c.width) - oy,\n Math.min(c.x0, c.x1) - ox,\n Math.abs(c.x1 - c.x0),\n c.width,\n c.color,\n c.dash,\n )\n : dashedLine(\n `connector-${i}`,\n \"x\",\n crisp(c.x0, c.width) - ox,\n Math.min(c.y0, c.y1) - oy,\n Math.abs(c.y1 - c.y0),\n c.width,\n c.color,\n c.dash,\n )),\n );\n });\n\n // dependency arrows (Gantt charts): axis-aligned legs and a border triangle\n scene.arrows.forEach((a, i) => {\n out.push(...arrowViews(`arrow-${i}`, a, ox, oy));\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"line\") return;\n const color = css(a.color);\n const where = annotationLine(a, scales);\n if (!where.vertical) {\n const py = where.at;\n out.push(\n ...dashedLine(\n `line-${i}`,\n \"y\",\n crisp(py, a.width) - oy,\n 0,\n plot.width,\n a.width,\n color,\n a.dash,\n ),\n );\n if (a.label)\n out.push(\n label(\n `line-label-${i}`,\n a.label,\n plot.width - 6,\n py - 3 - oy,\n \"right\",\n \"bottom\",\n { size: fs, weight: 500, color, halo, family },\n fw,\n ),\n );\n } else {\n const px = where.at;\n out.push(\n ...dashedLine(\n `line-${i}`,\n \"x\",\n crisp(px, a.width) - ox,\n 0,\n plot.height,\n a.width,\n color,\n a.dash,\n ),\n );\n if (a.label)\n out.push(\n label(\n `line-label-${i}`,\n a.label,\n px + 5 - ox,\n 5,\n \"left\",\n \"top\",\n { size: fs, weight: 500, color, halo, family },\n fw,\n ),\n );\n }\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"rect\") return;\n const title = annotationTitleLayout(\n a,\n annotationRect(a, scales),\n fs,\n (text, size, weight) =>\n measureChartText(text, `${weight} ${size}px sans-serif`),\n );\n if (!title) return;\n const color = css(a.labelColor);\n const muted = css(theme.textMuted);\n title.parts.forEach((p, k) => {\n const key = `area-${p.kind}-${i}-${k}`;\n const cy = p.y + p.height / 2 - oy;\n if (p.kind === \"badge\") {\n const h = p.height - 2;\n out.push(\n box(\n `${key}-pill`,\n p.x - ox,\n cy - h / 2,\n p.width,\n h,\n css(a.labelColor, 0.16),\n { borderRadius: h / 2 },\n ),\n label(\n key,\n p.text,\n p.x - ox + p.width / 2,\n cy,\n \"center\",\n \"middle\",\n { size: p.size, weight: p.weight, color, family },\n fw,\n ),\n );\n return;\n }\n out.push(\n label(\n p.kind === \"label\" ? `area-label-${i}` : key,\n p.text,\n p.x - ox,\n cy,\n \"left\",\n \"middle\",\n {\n size: p.size,\n weight: p.weight,\n color: p.kind === \"label\" ? color : muted,\n family,\n },\n fw,\n ),\n );\n });\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"text\" || !a.text) return;\n const w = measureChartText(a.text, `${a.weight} ${fs}px sans-serif`);\n const b = annotationTextBox(a, scales, w, labelHeight);\n out.push(\n label(\n `text-${i}`,\n a.text,\n b.x - ox,\n b.y + b.height / 2 - oy,\n \"left\",\n \"middle\",\n { size: fs, weight: a.weight, color: css(a.color), halo, family },\n fw,\n ),\n );\n });\n\n const pointColor = css(theme.text, 0.85);\n scene.pointLabels.forEach(({ label: l, box: b }, i) => {\n // inside a bar: its contrasting color, no halo, cut at the end of the bar\n const bar = l.placement === \"inside\" ? l.bar : undefined;\n out.push(\n label(\n `point-label-${i}`,\n l.text,\n b.x - ox,\n b.y + b.height / 2 - oy,\n \"left\",\n \"middle\",\n l.color\n ? { size: fs, color: l.color, family }\n : { size: fs, color: pointColor, halo, family },\n fw,\n bar\n ? { width: Math.max(b.width, bar.x + bar.width - 6 - b.x) }\n : undefined,\n ),\n );\n });\n return out;\n}\n\nconst clip = (plot: ChartRect): ViewStyle => ({\n position: \"absolute\",\n left: plot.x,\n top: plot.y,\n width: plot.width,\n height: plot.height,\n overflow: \"hidden\",\n});\n\n/**\n * Everything but the hover state: axes, grid, legend, annotations, data and\n * labels (cached by the caller while the model, view and size are the same)\n */\nexport function drawStatic(scene: ChartScene, family?: string): ReactNode {\n const { plot } = scene.layout;\n return (\n <>\n {drawBackground(scene, family)}\n <View key=\"data\" style={clip(plot)} {...part(C, \"data\")}>\n {drawData(scene)}\n </View>\n <View key=\"labels\" style={clip(plot)} {...part(C, \"labels\")}>\n {drawForeground(scene, family)}\n </View>\n </>\n );\n}\n\n/** Crosshair, highlighted points, dragged point and the default tooltip */\nexport function drawHover(\n scene: ChartScene,\n family: string | undefined,\n customTooltip: boolean,\n): ReactNode {\n const { theme, layout, hover, dragging } = scene;\n const { plot } = layout;\n const background = css(theme.background);\n const out: ReactElement[] = [];\n if (hover && hover.crosshairY !== null) {\n out.push(\n <View\n key=\"crosshair-y\"\n style={StyleSheet.absoluteFill}\n {...part(C, \"crosshair\")}\n >\n {dashedLine(\n \"dash\",\n \"y\",\n Math.round(hover.crosshairY),\n plot.x,\n plot.width,\n 1,\n css(theme.textMuted, 0.55),\n [3, 3],\n )}\n </View>,\n );\n }\n if (hover && hover.crosshairX !== null) {\n out.push(\n <View\n key=\"crosshair\"\n style={StyleSheet.absoluteFill}\n {...part(C, \"crosshair\")}\n >\n {dashedLine(\n \"dash\",\n \"x\",\n Math.round(hover.crosshairX),\n plot.y,\n plot.height,\n 1,\n css(theme.textMuted, 0.55),\n [3, 3],\n )}\n </View>,\n );\n }\n hover?.marks.forEach((m, i) => {\n if (m.kind === \"band\") {\n out.push(\n box(`mark-${i}`, m.x, m.y, m.width, m.height, css(theme.text, 0.05), {\n borderRadius: 6,\n }),\n );\n return;\n }\n if (m.kind === \"guide\") {\n // the row / column of the hovered heatmap cell\n out.push(\n box(`mark-${i}`, m.x, m.y, m.width, m.height, css(theme.text, 0.06)),\n );\n return;\n }\n if (m.kind === \"cell\") {\n // lifted: a little larger, a shadow, a ring inside its edge\n const grow = Math.min(3, m.width * 0.06, m.height * 0.06);\n const inset = Math.min(2, m.width / 5, m.height / 5);\n out.push(\n box(\n `mark-${i}`,\n m.x - grow,\n m.y - grow,\n m.width + grow * 2,\n m.height + grow * 2,\n m.color,\n {\n borderRadius: Math.max(2, m.radius),\n shadowColor: \"#0f172a\",\n shadowOpacity: 0.45,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 3 },\n elevation: 4,\n },\n ),\n );\n if (m.width > 8 && m.height > 8)\n out.push(\n box(\n `ring-${i}`,\n m.x - grow + inset,\n m.y - grow + inset,\n m.width + (grow - inset) * 2,\n m.height + (grow - inset) * 2,\n \"transparent\",\n {\n borderRadius: Math.max(1, m.radius - inset / 2),\n borderWidth: 1.5,\n borderColor: m.ring,\n },\n ),\n );\n return;\n }\n // soft halo, then the dot with a thin ring in the background color\n out.push(\n dot(`halo-${i}`, m.x, m.y, m.size + 8, m.halo),\n dot(`mark-${i}`, m.x, m.y, m.size, m.color, {\n borderWidth: 2,\n borderColor: background,\n }),\n );\n });\n if (dragging) {\n out.push(\n <View key=\"drag\" {...part(C, \"drag\")} style={StyleSheet.absoluteFill}>\n {dot(\n \"ghost\",\n dragging.x,\n dragging.y,\n dragging.size + 2,\n dragging.color,\n {\n opacity: 0.85,\n borderWidth: 2,\n borderColor: background,\n },\n )}\n </View>,\n );\n }\n const tip = hover?.tooltip;\n if (tip && !customTooltip) {\n const { box: b, lineHeight, padding, content } = tip;\n const text = css(theme.text);\n const muted = css(theme.textMuted);\n const font = (weight: number, color: string): TextStyle => ({\n fontSize: 12,\n lineHeight,\n color,\n fontWeight: String(weight) as TextStyle[\"fontWeight\"],\n includeFontPadding: false,\n ...(family ? { fontFamily: family } : null),\n });\n const swatch = (color: string) => (\n <View\n style={{\n width: 8,\n height: 8,\n borderRadius: 4,\n marginRight: 6,\n backgroundColor: color,\n }}\n />\n );\n const row: ViewStyle = {\n height: lineHeight,\n flexDirection: \"row\",\n alignItems: \"center\",\n };\n out.push(\n <View\n key=\"tooltip\"\n {...part(C, \"tooltip\")}\n style={[\n tooltipCard(scene),\n {\n left: b.x,\n top: b.y,\n width: b.width,\n height: b.height,\n paddingHorizontal: padding + 1,\n paddingVertical: padding - 1,\n },\n ]}\n >\n {tip.text\n ? tip.text.map((t, i) => (\n <Text key={i} numberOfLines={1} style={font(400, text)}>\n {t}\n </Text>\n ))\n : [\n <View key=\"title\" style={row}>\n {content.titleColor ? swatch(content.titleColor) : null}\n <Text\n numberOfLines={1}\n style={[font(600, text), { flexShrink: 1 }]}\n >\n {content.title}\n </Text>\n </View>,\n ...(content.subtitle\n ? [\n <View key=\"subtitle\" style={row}>\n <Text\n numberOfLines={1}\n style={[\n font(400, muted),\n {\n fontSize: 11,\n paddingLeft: content.titleColor ? 14 : 0,\n },\n ]}\n >\n {content.subtitle}\n </Text>\n </View>,\n ]\n : []),\n // a label column (after the swatch column) and right-aligned values\n ...content.rows.map((r, i) => (\n <View key={i} style={row}>\n {tip.swatchWidth > 0 ? (\n <View style={{ width: tip.swatchWidth }}>\n {r.color ? swatch(r.color) : null}\n </View>\n ) : null}\n <Text\n numberOfLines={1}\n style={[font(400, muted), { flexShrink: 1 }]}\n >\n {r.name}\n </Text>\n <Text\n numberOfLines={1}\n style={[\n font(600, text),\n {\n flexGrow: 1,\n marginLeft: 16,\n textAlign: \"right\",\n fontVariant: [\"tabular-nums\"],\n },\n ]}\n >\n {r.value}\n </Text>\n </View>\n )),\n ]}\n </View>,\n );\n }\n return out;\n}\n\n/** Look of the tooltips (default and `renderTooltip` content) */\nexport const tooltipCard = (scene: ChartScene): ViewStyle => ({\n position: \"absolute\",\n backgroundColor: css(scene.theme.background),\n borderColor: css(scene.theme.axis),\n borderWidth: 1,\n borderRadius: 8,\n shadowColor: \"#0f172a\",\n shadowOpacity: 0.18,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 6 },\n elevation: 6,\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scene.js","names":["annotationRect","annotationLine","annotationTitleLayout","annotationTextBox","_Fragment","SHAPE_BUDGET","C","lineHeightOf","size","slack","measureChartText","text","o","label","lh","pad","w","top","valign","y","horizontal","align","x","frameWidth","Text","extra","key","box","View","color","dot","cx","d","cy","segment","dx","x2","x1","dy","y2","y1","length","width","dashRuns","pattern","dash","v","period","a","b","runs","scale","max","out","at","i","step","dashedLine","start","run","axis","from","crisp","arrowViews","arrow","pts","k","p","q","x0","ox","y0","oy","tip","b0","b1","half","clear","style","baseX","baseY","right","down","thin","stride","lx","ly","areaStrips","transposed","points","plot","frame","n","forward","xs","ys","bs","bottom","baseline","to","column","j","left","c","mid","t","h","primitiveLimits","scene","visible","s","lines","scatters","perLine","maxDots","drawData","primitives","scenePrimitives","options","dotsLeft","barsLeft","total","r","count","radius","stroke","css","toCss","alpha","drawBackground","layout","scales","bottomAxis","model","leftAxis","bottomTicks","leftTicks","bottomPx","leftPx","fs","theme","rectOf","grid","py","px","line","tick","title","lastRight","lastBottom","y2Ticks","ramp","bar","stops","part","l","e","swatch","drawForeground","fw","halo","labelHeight","along","annotations","where","lineOf","areaTitleLayout","weight","muted","textBox","pointColor","clip","drawStatic","Fragment","family","drawHover","background","hover","StyleSheet","veiled","m","liftedBarRect","grow","inset","dragging","customTooltip","font","row","lineHeight","tooltipCard","padding","content"],"sources":["../../../../../native/src/components/Chart/scene.tsx"],"sourcesContent":["// Draws a chart scene (`ChartController.getScene()`) with plain views: no\n// canvas, SVG or native drawing module. The engine already resolves every\n// position in pixels; this file only turns them into absolutely positioned\n// <View> / <Text> elements, keeping the number of views bounded by the size\n// of the chart (lines decimated per column, dots merged per cell, bars\n// merged per pixel column), whatever the size of the data.\n\nimport type { ReactElement, ReactNode } from \"react\";\nimport {\n StyleSheet,\n Text,\n View,\n type TextStyle,\n type ViewStyle,\n} from \"react-native\";\nimport {\n annotationLine,\n annotationRect,\n annotationTextBox,\n annotationTitleLayout,\n liftedBarRect,\n scenePrimitives,\n toCss,\n type ChartPrimitive,\n type ChartRect,\n type ChartScene,\n} from \"@minerva/charts/canvas\";\nimport { part } from \"../../internal/parts\";\nimport { measureChartText } from \"./measure\";\n\ntype Rgba = ChartScene[\"theme\"][\"text\"];\n\n/** Upper bounds of the views drawn for the data of a chart */\nexport const SHAPE_BUDGET = {\n /** Points of all the lines (one view per segment) */\n linePoints: 1200,\n /** Dots of one scatter series before they are merged per cell */\n dotsPerSeries: 800,\n /** Dots of all the series */\n dots: 2000,\n /** Bars of one series before neighbors are merged per pixel column */\n barsPerSeries: 600,\n /** Bars of all the series */\n bars: 1500,\n /** Vertical strips filling one area */\n areaColumns: 200,\n /** Dashes of one dashed line */\n dashes: 200,\n} as const;\n\nconst C = \"chart\";\n\n// ------------------------------------------------------------------ text\n\ninterface TextOptions {\n size: number;\n color: string;\n weight?: number;\n family?: string;\n /** Halo color: keeps the text readable over the data */\n halo?: string;\n}\n\ntype Align = \"left\" | \"center\" | \"right\";\ntype VAlign = \"top\" | \"middle\" | \"bottom\";\n\nconst lineHeightOf = (size: number) => Math.ceil(size * 1.35);\n\n/** Box wide enough for the estimated width (the real one may differ) */\nconst slack = (text: string, o: TextOptions) =>\n Math.ceil(\n measureChartText(text, `${o.weight ?? 400} ${o.size}px sans-serif`) * 1.4 +\n o.size * 2,\n );\n\n/**\n * A one-line text anchored at (x, y) of a container `frameWidth` wide:\n * `left` starts there, `right` ends there, `center` is centered on it;\n * `top` / `bottom` place the em box like the canvas text baselines\n */\nfunction label(\n key: string,\n text: string,\n x: number,\n y: number,\n align: Align,\n valign: VAlign,\n o: TextOptions,\n frameWidth: number,\n extra?: TextStyle,\n): ReactElement {\n const lh = lineHeightOf(o.size);\n const pad = (lh - o.size) / 2;\n const w = slack(text, o);\n const top =\n valign === \"top\"\n ? y - pad\n : valign === \"bottom\"\n ? y - lh + pad\n : y - lh / 2;\n const horizontal: TextStyle =\n align === \"left\"\n ? { left: x, width: w }\n : align === \"right\"\n ? { right: frameWidth - x, width: w }\n : { left: x - w / 2, width: w };\n return (\n <Text\n key={key}\n numberOfLines={1}\n style={[\n {\n position: \"absolute\",\n top,\n ...horizontal,\n textAlign: align,\n fontSize: o.size,\n lineHeight: lh,\n color: o.color,\n fontWeight: String(o.weight ?? 400) as TextStyle[\"fontWeight\"],\n includeFontPadding: false,\n ...(o.family ? { fontFamily: o.family } : null),\n ...(o.halo\n ? {\n textShadowColor: o.halo,\n textShadowRadius: 3,\n textShadowOffset: { width: 0, height: 0 },\n }\n : null),\n },\n extra,\n ]}\n >\n {text}\n </Text>\n );\n}\n\n// ---------------------------------------------------------------- shapes\n\nconst box = (\n key: string,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n extra?: ViewStyle,\n): ReactElement => (\n <View\n key={key}\n style={[\n {\n position: \"absolute\",\n left: x,\n top: y,\n width,\n height,\n backgroundColor: color,\n },\n extra,\n ]}\n />\n);\n\nconst dot = (\n key: string,\n cx: number,\n cy: number,\n d: number,\n color: string,\n extra?: ViewStyle,\n) =>\n box(key, cx - d / 2, cy - d / 2, d, d, color, {\n borderRadius: d / 2,\n ...extra,\n });\n\n/** A straight stroke: one view, rotated around its center */\nconst segment = (\n key: string,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n width: number,\n color: string,\n) => {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const length = Math.hypot(dx, dy) + width;\n return box(\n key,\n (x1 + x2) / 2 - length / 2,\n (y1 + y2) / 2 - width / 2,\n length,\n width,\n color,\n {\n borderRadius: width / 2,\n transform: [{ rotate: `${Math.atan2(dy, dx)}rad` }],\n },\n );\n};\n\n/** Dash runs `[start, length]` along a line (canvas `setLineDash` pattern) */\nexport function dashRuns(\n length: number,\n dash: readonly number[],\n max: number = SHAPE_BUDGET.dashes,\n): [number, number][] {\n let pattern = dash.filter((v) => Number.isFinite(v) && v >= 0);\n // odd patterns repeat twice, like the canvas\n if (pattern.length % 2) pattern = [...pattern, ...pattern];\n const period = pattern.reduce((a, b) => a + b, 0);\n if (!pattern.length || period <= 0) return [[0, length]];\n const runs = (length / period) * (pattern.length / 2);\n const scale = runs > max ? runs / max : 1;\n const out: [number, number][] = [];\n let at = 0;\n for (let i = 0; at < length; i = (i + 1) % pattern.length) {\n const step = pattern[i] * scale;\n if (i % 2 === 0 && step > 0) out.push([at, Math.min(step, length - at)]);\n at += Math.max(step, 0.5);\n }\n return out;\n}\n\nconst dashedLine = (\n key: string,\n axis: \"x\" | \"y\",\n at: number,\n from: number,\n length: number,\n width: number,\n color: string,\n dash: readonly number[],\n) =>\n dashRuns(length, dash).map(([start, run], i) =>\n axis === \"y\"\n ? box(`${key}-${i}`, from + start, at, run, width, color)\n : box(`${key}-${i}`, at, from + start, width, run, color),\n );\n\nconst crisp = (v: number, width = 1) => Math.round(v) + 0.5 - width / 2;\n\n/**\n * Views of an elbow arrow (relative to `ox`, `oy`): a thin box per leg (the\n * legs are horizontal or vertical) and a triangle made of borders\n */\nexport const arrowViews = (\n key: string,\n arrow: ChartScene[\"arrows\"][number],\n ox: number,\n oy: number,\n): ReactElement[] => {\n const out: ReactElement[] = [];\n const w = arrow.width;\n const pts = arrow.points;\n for (let k = 1; k < pts.length; k++) {\n const p = pts[k - 1]!;\n const q = pts[k]!;\n const x0 = Math.min(p.x, q.x) - ox;\n const y0 = Math.min(p.y, q.y) - oy;\n // legs overlap by half a width so the corners are closed\n out.push(\n p.y === q.y\n ? box(\n `${key}-${k}`,\n x0 - w / 2,\n y0 - w / 2,\n Math.abs(q.x - p.x) + w,\n w,\n arrow.color,\n )\n : box(\n `${key}-${k}`,\n x0 - w / 2,\n y0 - w / 2,\n w,\n Math.abs(q.y - p.y) + w,\n arrow.color,\n ),\n );\n }\n const [tip, b0, b1] = arrow.head;\n const length = Math.hypot(\n tip.x - (b0.x + b1.x) / 2,\n tip.y - (b0.y + b1.y) / 2,\n );\n const half = Math.hypot(b1.x - b0.x, b1.y - b0.y) / 2;\n const clear = \"transparent\";\n const style: ViewStyle = { position: \"absolute\", width: 0, height: 0 };\n const baseX = (b0.x + b1.x) / 2;\n const baseY = (b0.y + b1.y) / 2;\n if (Math.abs(tip.x - baseX) >= Math.abs(tip.y - baseY)) {\n const right = tip.x > baseX;\n Object.assign(style, {\n left: (right ? baseX : tip.x) - ox,\n top: tip.y - half - oy,\n borderTopWidth: half,\n borderBottomWidth: half,\n borderTopColor: clear,\n borderBottomColor: clear,\n ...(right\n ? { borderLeftWidth: length, borderLeftColor: arrow.color }\n : { borderRightWidth: length, borderRightColor: arrow.color }),\n });\n } else {\n const down = tip.y > baseY;\n Object.assign(style, {\n left: tip.x - half - ox,\n top: (down ? baseY : tip.y) - oy,\n borderLeftWidth: half,\n borderRightWidth: half,\n borderLeftColor: clear,\n borderRightColor: clear,\n ...(down\n ? { borderTopWidth: length, borderTopColor: arrow.color }\n : { borderBottomWidth: length, borderBottomColor: arrow.color }),\n });\n }\n out.push(<View key={`${key}-head`} style={style} />);\n return out;\n};\n\n// ------------------------------------------------------------------ data\n\n/** Thins a run of interleaved points to `max` points and drops sub-pixel steps */\nfunction thin(run: readonly number[], max: number): number[] {\n const n = run.length / 2;\n const stride = n > max ? Math.ceil(n / max) : 1;\n const out: number[] = [];\n for (let i = 0; i < n; i += stride) {\n const x = run[i * 2];\n const y = run[i * 2 + 1];\n const k = out.length;\n if (k && Math.hypot(x - out[k - 2], y - out[k - 1]) < 1.5) continue;\n out.push(x, y);\n }\n const lx = run[n * 2 - 2];\n const ly = run[n * 2 - 1];\n const k = out.length;\n if (n > 1 && (out[k - 2] !== lx || out[k - 1] !== ly)) out.push(lx, ly);\n return out;\n}\n\n/**\n * Vertical strips between the line and the baseline (or the stack below),\n * one per column; horizontal strips, one per row, for horizontal charts\n */\nfunction areaStrips(\n key: string,\n points: readonly number[],\n baseline: number,\n color: string,\n opacity: number,\n frame: ChartRect,\n /** Y pixel (x pixel when `transposed`) of the bottom edge under every point */\n bottom?: readonly number[],\n /** Horizontal charts: the area grows from the left edge */\n transposed = false,\n): ReactElement[] {\n // horizontal charts are filled like vertical ones with x and y swapped\n const run = transposed\n ? points.map((_, i) => points[i % 2 ? i - 1 : i + 1])\n : points;\n const plot = transposed\n ? { x: frame.y, y: frame.x, width: frame.height, height: frame.width }\n : frame;\n const n = run.length / 2;\n if (n < 2) return [];\n // left to right (reversed axes list their points right to left)\n const forward = run[0] <= run[n * 2 - 2];\n const at = (i: number) => (forward ? i : n - 1 - i);\n const xs = (i: number) => run[at(i) * 2];\n const ys = (i: number) => run[at(i) * 2 + 1];\n const bs = (i: number) => (bottom ? bottom[at(i)] : baseline);\n const from = Math.max(plot.x, xs(0));\n const to = Math.min(plot.x + plot.width, xs(n - 1));\n if (to <= from) return [];\n const column = Math.max(2, plot.width / SHAPE_BUDGET.areaColumns);\n const out: ReactElement[] = [];\n let j = 0;\n for (let left = Math.floor(from), c = 0; left < to; c++) {\n const right = Math.min(Math.ceil(to), Math.round(left + column));\n const mid = (left + right) / 2;\n while (j < n - 2 && xs(j + 1) < mid) j++;\n const x0 = xs(j);\n const x1 = xs(j + 1);\n const t = x1 === x0 ? 0 : Math.max(0, Math.min(1, (mid - x0) / (x1 - x0)));\n const y = ys(j) + (ys(j + 1) - ys(j)) * t;\n const b = bs(j) + (bs(j + 1) - bs(j)) * t;\n if (Number.isFinite(y) && Number.isFinite(b)) {\n const top = Math.min(y, b);\n const h = Math.abs(b - y);\n out.push(\n transposed\n ? box(\n `${key}-${c}`,\n top - plot.y,\n left - plot.x,\n h,\n right - left,\n color,\n {\n opacity,\n },\n )\n : box(\n `${key}-${c}`,\n left - plot.x,\n top - plot.y,\n right - left,\n h,\n color,\n {\n opacity,\n },\n ),\n );\n }\n left = right;\n }\n return out;\n}\n\n/** Limits of `scenePrimitives` for the views budget */\nexport function primitiveLimits(scene: ChartScene) {\n const { plot } = scene.layout;\n const visible = scene.model.series.filter((s) => !s.hidden);\n const lines = visible.filter(\n (s) => s.type === \"line\" || s.type === \"area\",\n ).length;\n const scatters = visible.filter((s) => s.type === \"scatter\").length;\n const perLine = Math.max(150, SHAPE_BUDGET.linePoints / Math.max(1, lines));\n const maxDots = Math.max(\n 100,\n Math.min(\n SHAPE_BUDGET.dotsPerSeries,\n SHAPE_BUDGET.dots / Math.max(1, scatters),\n ),\n );\n return {\n perLine,\n options: {\n // decimation keeps up to 4 points per column\n columnWidth: Math.max(3, (plot.width * 4) / perLine),\n maxDots,\n maxBars: SHAPE_BUDGET.barsPerSeries,\n dotCell: Math.max(\n 4,\n Math.sqrt((plot.width * plot.height) / maxDots) * 1.15 + 1,\n ),\n },\n };\n}\n\nfunction drawData(scene: ChartScene): ReactElement[] {\n const { plot } = scene.layout;\n const { perLine, options } = primitiveLimits(scene);\n const primitives: ChartPrimitive[] = scenePrimitives(scene, options);\n const ox = plot.x;\n const oy = plot.y;\n const out: ReactElement[] = [];\n let dotsLeft: number = SHAPE_BUDGET.dots;\n let barsLeft: number = SHAPE_BUDGET.bars;\n primitives.forEach((p, k) => {\n const key = `${p.kind}${p.seriesIndex}-${k}`;\n if (p.kind === \"area\") {\n p.segments.forEach((run, r) =>\n out.push(\n ...areaStrips(\n `${key}-${r}`,\n run,\n p.baseline,\n p.color,\n p.opacity,\n plot,\n p.bottoms?.[r],\n p.horizontal,\n ),\n ),\n );\n return;\n }\n if (p.kind === \"line\") {\n let total = 0;\n for (const run of p.segments) total += run.length / 2;\n p.segments.forEach((run, r) => {\n const pts = thin(\n run,\n Math.max(\n 2,\n Math.round((perLine * run.length) / 2 / Math.max(1, total)),\n ),\n );\n if (pts.length === 2) {\n out.push(\n dot(\n `${key}-${r}`,\n pts[0] - ox,\n pts[1] - oy,\n p.width * 1.5,\n p.color,\n ),\n );\n return;\n }\n for (let i = 0; i + 3 < pts.length; i += 2) {\n out.push(\n segment(\n `${key}-${r}-${i}`,\n pts[i] - ox,\n pts[i + 1] - oy,\n pts[i + 2] - ox,\n pts[i + 3] - oy,\n p.width,\n p.color,\n ),\n );\n }\n });\n return;\n }\n if (p.kind === \"bars\") {\n const count = p.rects.length / 4;\n const stride =\n count > barsLeft ? Math.ceil(count / Math.max(1, barsLeft)) : 1;\n for (let i = 0; i < count; i += stride) {\n const [x, y, w, h] = p.rects.slice(i * 4, i * 4 + 4);\n const radius = Math.min(p.radius ?? 0, w / 2, h / 2);\n out.push(\n box(\n `${key}-${i}`,\n x - ox,\n y - oy,\n Math.max(w, 0.5),\n h,\n p.colors?.[i] ?? p.color,\n radius > 0.5 || p.opacity !== undefined\n ? {\n ...(radius > 0.5 ? { borderRadius: radius } : null),\n ...(p.opacity !== undefined ? { opacity: p.opacity } : null),\n }\n : undefined,\n ),\n );\n }\n barsLeft = Math.max(0, barsLeft - Math.ceil(count / stride));\n return;\n }\n const count = p.dots.length / 3;\n const stride =\n count > dotsLeft ? Math.ceil(count / Math.max(1, dotsLeft)) : 1;\n const stroke = p.stroke ?? 0;\n for (let i = 0; i < count; i += stride) {\n const color = p.colors[i] ?? \"#888\";\n out.push(\n dot(\n `${key}-${i}`,\n p.dots[i * 3] - ox,\n p.dots[i * 3 + 1] - oy,\n p.dots[i * 3 + 2],\n // rings (hollow box plot outliers): the border only\n p.opacity > 0 ? color : \"transparent\",\n stroke > 0 && p.opacity < 1\n ? { borderWidth: stroke, borderColor: color, opacity: 1 }\n : { opacity: p.opacity },\n ),\n );\n }\n dotsLeft = Math.max(0, dotsLeft - Math.ceil(count / stride));\n });\n return out;\n}\n\n// ------------------------------------------------------------ background\n\nconst css = (c: Rgba, alpha?: number) => toCss(c, alpha);\n\nfunction drawBackground(scene: ChartScene, family?: string): ReactElement[] {\n const { width, theme, model, layout, annotations } = scene;\n const { plot, scales, y2Ticks } = layout;\n // horizontal charts: the value axis along the bottom, the x axis on the left\n const horizontal = scales.horizontal;\n const bottomAxis = horizontal ? model.y : model.x;\n const leftAxis = horizontal ? model.x : model.y;\n const bottomTicks = horizontal ? layout.yTicks : layout.xTicks;\n const leftTicks = horizontal ? layout.xTicks : layout.yTicks;\n const bottomPx = horizontal ? scales.yToPx : scales.xToPx;\n const leftPx = horizontal ? scales.xToPx : scales.yToPx;\n const fs = theme.fontSize;\n const out: ReactElement[] = [];\n\n annotations.forEach((a, i) => {\n if (a.type !== \"rect\") return;\n const r = annotationRect(a, scales);\n if (r.width <= 0 || r.height <= 0) return;\n out.push(\n box(`area-${i}`, r.x, r.y, r.width, r.height, css(a.color, a.opacity)),\n );\n });\n\n const grid = css(theme.grid);\n if (leftAxis.grid) {\n leftTicks.values.forEach((v, i) => {\n const py = leftPx(v);\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) return;\n out.push(box(`ygrid-${i}`, plot.x, crisp(py), plot.width, 1, grid));\n });\n }\n if (bottomAxis.grid) {\n bottomTicks.values.forEach((v, i) => {\n const px = bottomPx(v);\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) return;\n out.push(box(`xgrid-${i}`, crisp(px), plot.y, 1, plot.height, grid));\n });\n }\n\n const line = Math.ceil(fs * 1.4);\n const tick: TextOptions = { size: fs, color: css(theme.textMuted), family };\n const title: TextOptions = {\n size: fs + 1,\n weight: 500,\n color: css(theme.text, 0.8),\n family,\n };\n const bottom = plot.y + plot.height;\n\n if (bottomAxis.visible) {\n out.push(\n box(\"xaxis\", plot.x, crisp(bottom), plot.width, 1, css(theme.axis)),\n );\n let lastRight = -Infinity;\n bottomTicks.values\n .map((v, i) => ({ px: bottomPx(v), text: bottomTicks.labels[i] ?? \"\" }))\n .sort((a, b) => a.px - b.px)\n .forEach(({ px, text }, i) => {\n if (!text || px < plot.x - 0.5 || px > plot.x + plot.width + 0.5)\n return;\n const w = measureChartText(text, `400 ${fs}px sans-serif`);\n const left = Math.max(0, Math.min(width - w, px - w / 2));\n if (left < lastRight + 6) return;\n lastRight = left + w;\n out.push(\n label(\n `xtick-${i}`,\n text,\n left + w / 2,\n bottom + 7,\n \"center\",\n \"top\",\n tick,\n width,\n ),\n );\n });\n if (bottomAxis.title)\n out.push(\n label(\n \"xtitle\",\n bottomAxis.title,\n plot.x + plot.width / 2,\n bottom + line + 10,\n \"center\",\n \"top\",\n title,\n width,\n ),\n );\n }\n\n if (leftAxis.visible) {\n let lastBottom = -Infinity;\n leftTicks.values\n .map((v, i) => ({ py: leftPx(v), text: leftTicks.labels[i] ?? \"\" }))\n .sort((a, b) => a.py - b.py)\n .forEach(({ py, text }, i) => {\n if (!text || py < plot.y - 0.5 || py > plot.y + plot.height + 0.5)\n return;\n // category rows of horizontal charts never overlap\n if (horizontal) {\n if (py - (fs + 2) / 2 < lastBottom) return;\n lastBottom = py + (fs + 2) / 2;\n }\n out.push(\n label(\n `ytick-${i}`,\n text,\n plot.x - 8,\n py,\n \"right\",\n \"middle\",\n tick,\n width,\n ),\n );\n });\n if (leftAxis.title)\n out.push(\n label(\n \"ytitle\",\n leftAxis.title,\n line / 2 + 4,\n plot.y + plot.height / 2,\n \"center\",\n \"middle\",\n title,\n width,\n {\n transform: [{ rotate: \"-90deg\" }],\n },\n ),\n );\n }\n\n const y2 = horizontal ? null : model.y2;\n if (y2 && y2Ticks && y2.visible) {\n const right = plot.x + plot.width;\n y2Ticks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n const text = y2Ticks.labels[i];\n if (!text || py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n out.push(\n label(\n `y2tick-${i}`,\n text,\n right + 8,\n py,\n \"left\",\n \"middle\",\n tick,\n width,\n ),\n );\n });\n if (y2.title)\n out.push(\n label(\n \"y2title\",\n y2.title,\n width - line / 2 - 4,\n plot.y + plot.height / 2,\n \"center\",\n \"middle\",\n title,\n width,\n {\n transform: [{ rotate: \"90deg\" }],\n },\n ),\n );\n }\n\n const ramp = scene.legend?.colors;\n if (ramp) {\n // visual map: the ramp in even steps, the values at its ends\n const { bar, stops } = ramp;\n const step = bar.width / Math.max(1, stops.length);\n out.push(\n <View\n key=\"color-legend\"\n {...part(C, \"color-legend\")}\n style={{\n position: \"absolute\",\n left: bar.x,\n top: bar.y,\n width: bar.width,\n height: bar.height,\n borderRadius: bar.height / 2,\n overflow: \"hidden\",\n flexDirection: \"row\",\n }}\n >\n {stops.map((c, k) => (\n <View\n key={k}\n style={{ width: step, height: bar.height, backgroundColor: c }}\n />\n ))}\n </View>,\n );\n ramp.ticks.forEach((t, k) =>\n out.push(\n box(\n `color-tick-${k}`,\n Math.round(t),\n bar.y - 2,\n 1,\n bar.height + 4,\n css(theme.text, 0.35),\n ),\n ),\n );\n ramp.labels.forEach((l, k) =>\n out.push(\n label(\n `color-label-${k}`,\n l.text,\n l.x,\n l.y,\n l.align,\n \"middle\",\n { size: 11, color: css(theme.textMuted), family },\n width,\n ),\n ),\n );\n }\n\n if (scene.legend) {\n for (const e of scene.legend.entries) {\n // coordinates relative to the entry box\n const cy = e.box.height / 2;\n const swatch =\n e.shape === \"dot\"\n ? dot(\"swatch\", 5, cy, 8, e.color)\n : e.shape === \"line\"\n ? box(\"swatch\", 0, cy - 1, 10, 2, e.color)\n : box(\"swatch\", 1, cy - 4, 8, 8, e.color);\n out.push(\n <View\n key={`legend-${e.id}`}\n style={{\n position: \"absolute\",\n left: e.box.x,\n top: e.box.y,\n width: e.box.width,\n height: e.box.height,\n opacity: e.hidden ? 0.45 : 1,\n }}\n {...part(C, \"legend-item\", { hidden: e.hidden })}\n >\n {swatch}\n {label(\n \"name\",\n e.name,\n 14,\n cy,\n \"left\",\n \"middle\",\n { size: 12, color: css(theme.textMuted), family },\n e.box.width,\n e.hidden ? { textDecorationLine: \"line-through\" } : undefined,\n )}\n </View>,\n );\n }\n }\n return out;\n}\n\n// ------------------------------------------------------------ foreground\n\nfunction drawForeground(scene: ChartScene, family?: string): ReactElement[] {\n const { theme, annotations, layout } = scene;\n const { plot, scales } = layout;\n const fs = theme.fontSize;\n const ox = plot.x;\n const oy = plot.y;\n const fw = plot.width;\n const halo = css(theme.background, 0.9);\n const labelHeight = fs + 4;\n const out: ReactElement[] = [];\n\n // waterfall connectors: thin dashed lines between the bars\n scene.connectors.forEach((c, i) => {\n const along = c.y0 === c.y1;\n out.push(\n ...(along\n ? dashedLine(\n `connector-${i}`,\n \"y\",\n crisp(c.y0, c.width) - oy,\n Math.min(c.x0, c.x1) - ox,\n Math.abs(c.x1 - c.x0),\n c.width,\n c.color,\n c.dash,\n )\n : dashedLine(\n `connector-${i}`,\n \"x\",\n crisp(c.x0, c.width) - ox,\n Math.min(c.y0, c.y1) - oy,\n Math.abs(c.y1 - c.y0),\n c.width,\n c.color,\n c.dash,\n )),\n );\n });\n\n // dependency arrows (Gantt charts): axis-aligned legs and a border triangle\n scene.arrows.forEach((a, i) => {\n out.push(...arrowViews(`arrow-${i}`, a, ox, oy));\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"line\") return;\n const color = css(a.color);\n const where = annotationLine(a, scales);\n if (!where.vertical) {\n const py = where.at;\n out.push(\n ...dashedLine(\n `line-${i}`,\n \"y\",\n crisp(py, a.width) - oy,\n 0,\n plot.width,\n a.width,\n color,\n a.dash,\n ),\n );\n if (a.label)\n out.push(\n label(\n `line-label-${i}`,\n a.label,\n plot.width - 6,\n py - 3 - oy,\n \"right\",\n \"bottom\",\n { size: fs, weight: 500, color, halo, family },\n fw,\n ),\n );\n } else {\n const px = where.at;\n out.push(\n ...dashedLine(\n `line-${i}`,\n \"x\",\n crisp(px, a.width) - ox,\n 0,\n plot.height,\n a.width,\n color,\n a.dash,\n ),\n );\n if (a.label)\n out.push(\n label(\n `line-label-${i}`,\n a.label,\n px + 5 - ox,\n 5,\n \"left\",\n \"top\",\n { size: fs, weight: 500, color, halo, family },\n fw,\n ),\n );\n }\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"rect\") return;\n const title = annotationTitleLayout(\n a,\n annotationRect(a, scales),\n fs,\n (text, size, weight) =>\n measureChartText(text, `${weight} ${size}px sans-serif`),\n );\n if (!title) return;\n const color = css(a.labelColor);\n const muted = css(theme.textMuted);\n title.parts.forEach((p, k) => {\n const key = `area-${p.kind}-${i}-${k}`;\n const cy = p.y + p.height / 2 - oy;\n if (p.kind === \"badge\") {\n const h = p.height - 2;\n out.push(\n box(\n `${key}-pill`,\n p.x - ox,\n cy - h / 2,\n p.width,\n h,\n css(a.labelColor, 0.16),\n { borderRadius: h / 2 },\n ),\n label(\n key,\n p.text,\n p.x - ox + p.width / 2,\n cy,\n \"center\",\n \"middle\",\n { size: p.size, weight: p.weight, color, family },\n fw,\n ),\n );\n return;\n }\n out.push(\n label(\n p.kind === \"label\" ? `area-label-${i}` : key,\n p.text,\n p.x - ox,\n cy,\n \"left\",\n \"middle\",\n {\n size: p.size,\n weight: p.weight,\n color: p.kind === \"label\" ? color : muted,\n family,\n },\n fw,\n ),\n );\n });\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"text\" || !a.text) return;\n const w = measureChartText(a.text, `${a.weight} ${fs}px sans-serif`);\n const b = annotationTextBox(a, scales, w, labelHeight);\n out.push(\n label(\n `text-${i}`,\n a.text,\n b.x - ox,\n b.y + b.height / 2 - oy,\n \"left\",\n \"middle\",\n { size: fs, weight: a.weight, color: css(a.color), halo, family },\n fw,\n ),\n );\n });\n\n const pointColor = css(theme.text, 0.85);\n scene.pointLabels.forEach(({ label: l, box: b }, i) => {\n // inside a bar: its contrasting color, no halo, cut at the end of the bar\n const bar = l.placement === \"inside\" ? l.bar : undefined;\n out.push(\n label(\n `point-label-${i}`,\n l.text,\n b.x - ox,\n b.y + b.height / 2 - oy,\n \"left\",\n \"middle\",\n l.color\n ? { size: fs, color: l.color, family }\n : { size: fs, color: pointColor, halo, family },\n fw,\n bar\n ? { width: Math.max(b.width, bar.x + bar.width - 6 - b.x) }\n : undefined,\n ),\n );\n });\n return out;\n}\n\nconst clip = (plot: ChartRect): ViewStyle => ({\n position: \"absolute\",\n left: plot.x,\n top: plot.y,\n width: plot.width,\n height: plot.height,\n overflow: \"hidden\",\n});\n\n/**\n * Everything but the hover state: axes, grid, legend, annotations, data and\n * labels (cached by the caller while the model, view and size are the same)\n */\nexport function drawStatic(scene: ChartScene, family?: string): ReactNode {\n const { plot } = scene.layout;\n return (\n <>\n {drawBackground(scene, family)}\n <View key=\"data\" style={clip(plot)} {...part(C, \"data\")}>\n {drawData(scene)}\n </View>\n <View key=\"labels\" style={clip(plot)} {...part(C, \"labels\")}>\n {drawForeground(scene, family)}\n </View>\n </>\n );\n}\n\n/** Crosshair, highlighted points, dragged point and the default tooltip */\nexport function drawHover(\n scene: ChartScene,\n family: string | undefined,\n customTooltip: boolean,\n): ReactNode {\n const { theme, layout, hover, dragging } = scene;\n const { plot } = layout;\n const background = css(theme.background);\n const out: ReactElement[] = [];\n if (hover && hover.crosshairY !== null) {\n out.push(\n <View\n key=\"crosshair-y\"\n style={StyleSheet.absoluteFill}\n {...part(C, \"crosshair\")}\n >\n {dashedLine(\n \"dash\",\n \"y\",\n Math.round(hover.crosshairY),\n plot.x,\n plot.width,\n 1,\n css(theme.textMuted, 0.55),\n [3, 3],\n )}\n </View>,\n );\n }\n if (hover && hover.crosshairX !== null) {\n out.push(\n <View\n key=\"crosshair\"\n style={StyleSheet.absoluteFill}\n {...part(C, \"crosshair\")}\n >\n {dashedLine(\n \"dash\",\n \"x\",\n Math.round(hover.crosshairX),\n plot.y,\n plot.height,\n 1,\n css(theme.textMuted, 0.55),\n [3, 3],\n )}\n </View>,\n );\n }\n let veiled = false;\n hover?.marks.forEach((m, i) => {\n if (m.kind === \"band\") {\n out.push(\n box(`mark-${i}`, m.x, m.y, m.width, m.height, css(theme.text, 0.05), {\n borderRadius: 6,\n }),\n );\n return;\n }\n if (m.kind === \"guide\") {\n // the row / column of the hovered heatmap cell\n out.push(\n box(`mark-${i}`, m.x, m.y, m.width, m.height, css(theme.text, 0.06)),\n );\n return;\n }\n if (m.kind === \"bar\") {\n // the plot behind lifted bars is veiled so the hovered one stands out\n if (!veiled) {\n veiled = true;\n out.push(\n box(\n \"veil\",\n plot.x,\n plot.y,\n plot.width,\n plot.height,\n css(theme.background, 0.42),\n ),\n );\n }\n // lifted: thicker across (never longer: the length is the value), a\n // shadow and a ring inside its edge\n const r = liftedBarRect(m);\n if (m.backdrop)\n out.push(\n box(\n `under-${i}`,\n r.x,\n r.y,\n r.width,\n r.height,\n css(theme.background),\n {\n borderRadius: m.radius,\n },\n ),\n );\n out.push(\n box(`mark-${i}`, r.x, r.y, r.width, r.height, m.color, {\n borderRadius: m.radius,\n ...(m.ring\n ? {\n borderWidth: m.backdrop ? 2 : 1.5,\n borderColor: m.ring,\n shadowColor: \"#0f172a\",\n shadowOpacity: 0.4,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 3 },\n elevation: 4,\n }\n : null),\n }),\n );\n return;\n }\n if (m.kind === \"cell\") {\n // lifted: a little larger, a shadow, a ring inside its edge\n const grow = Math.min(3, m.width * 0.06, m.height * 0.06);\n const inset = Math.min(2, m.width / 5, m.height / 5);\n out.push(\n box(\n `mark-${i}`,\n m.x - grow,\n m.y - grow,\n m.width + grow * 2,\n m.height + grow * 2,\n m.color,\n {\n borderRadius: Math.max(2, m.radius),\n shadowColor: \"#0f172a\",\n shadowOpacity: 0.45,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 3 },\n elevation: 4,\n },\n ),\n );\n if (m.width > 8 && m.height > 8)\n out.push(\n box(\n `ring-${i}`,\n m.x - grow + inset,\n m.y - grow + inset,\n m.width + (grow - inset) * 2,\n m.height + (grow - inset) * 2,\n \"transparent\",\n {\n borderRadius: Math.max(1, m.radius - inset / 2),\n borderWidth: 2,\n borderColor: m.ring,\n },\n ),\n );\n return;\n }\n // soft halo, then the dot with a thin ring in the background color\n out.push(\n dot(`halo-${i}`, m.x, m.y, m.size + 8, m.halo),\n dot(`mark-${i}`, m.x, m.y, m.size, m.color, {\n borderWidth: 2,\n borderColor: background,\n }),\n );\n });\n if (dragging) {\n out.push(\n <View key=\"drag\" {...part(C, \"drag\")} style={StyleSheet.absoluteFill}>\n {dot(\n \"ghost\",\n dragging.x,\n dragging.y,\n dragging.size + 2,\n dragging.color,\n {\n opacity: 0.85,\n borderWidth: 2,\n borderColor: background,\n },\n )}\n </View>,\n );\n }\n const tip = hover?.tooltip;\n if (tip && !customTooltip) {\n const { box: b, lineHeight, padding, content } = tip;\n const text = css(theme.text);\n const muted = css(theme.textMuted);\n const font = (weight: number, color: string): TextStyle => ({\n fontSize: 12,\n lineHeight,\n color,\n fontWeight: String(weight) as TextStyle[\"fontWeight\"],\n includeFontPadding: false,\n ...(family ? { fontFamily: family } : null),\n });\n const swatch = (color: string) => (\n <View\n style={{\n width: 8,\n height: 8,\n borderRadius: 4,\n marginRight: 6,\n backgroundColor: color,\n }}\n />\n );\n const row: ViewStyle = {\n height: lineHeight,\n flexDirection: \"row\",\n alignItems: \"center\",\n };\n out.push(\n <View\n key=\"tooltip\"\n {...part(C, \"tooltip\")}\n style={[\n tooltipCard(scene),\n {\n left: b.x,\n top: b.y,\n width: b.width,\n height: b.height,\n paddingHorizontal: padding + 1,\n paddingVertical: padding - 1,\n },\n ]}\n >\n {tip.text\n ? tip.text.map((t, i) => (\n <Text key={i} numberOfLines={1} style={font(400, text)}>\n {t}\n </Text>\n ))\n : [\n <View key=\"title\" style={row}>\n {content.titleColor ? swatch(content.titleColor) : null}\n <Text\n numberOfLines={1}\n style={[font(600, text), { flexShrink: 1 }]}\n >\n {content.title}\n </Text>\n </View>,\n ...(content.subtitle\n ? [\n <View key=\"subtitle\" style={row}>\n <Text\n numberOfLines={1}\n style={[\n font(400, muted),\n {\n fontSize: 11,\n paddingLeft: content.titleColor ? 14 : 0,\n },\n ]}\n >\n {content.subtitle}\n </Text>\n </View>,\n ]\n : []),\n // a label column (after the swatch column) and right-aligned values\n ...content.rows.map((r, i) => (\n <View key={i} style={row}>\n {tip.swatchWidth > 0 ? (\n <View style={{ width: tip.swatchWidth }}>\n {r.color ? swatch(r.color) : null}\n </View>\n ) : null}\n <Text\n numberOfLines={1}\n style={[font(400, muted), { flexShrink: 1 }]}\n >\n {r.name}\n </Text>\n <Text\n numberOfLines={1}\n style={[\n font(600, text),\n {\n flexGrow: 1,\n marginLeft: 16,\n textAlign: \"right\",\n fontVariant: [\"tabular-nums\"],\n },\n ]}\n >\n {r.value}\n </Text>\n </View>\n )),\n ]}\n </View>,\n );\n }\n return out;\n}\n\n/** Look of the tooltips (default and `renderTooltip` content) */\nexport const tooltipCard = (scene: ChartScene): ViewStyle => ({\n position: \"absolute\",\n // translucent: the marks behind stay visible (no backdrop blur on native)\n backgroundColor: css(scene.theme.background, 0.9),\n borderColor: css(scene.theme.axis),\n borderWidth: 1,\n borderRadius: 8,\n shadowColor: \"#0f172a\",\n shadowOpacity: 0.18,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 6 },\n elevation: 6,\n});\n"],"mappings":";;;;;;;;;;AAiCA,IAAaK,IAAe;CAE1B,YAAY;CAEZ,eAAe;CAEf,MAAM;CAEN,eAAe;CAEf,MAAM;CAEN,aAAa;CAEb,QAAQ;AACV,GAEMC,IAAI,SAgBJC,KAAgB,MAAiB,KAAK,KAAKC,IAAO,IAAI,GAGtDC,KAAS,GAAc,MAC3B,KAAK,KACHC,EAAiBC,GAAM,GAAGC,EAAE,UAAU,IAAI,GAAGA,EAAE,KAAK,cAAc,IAAI,MACpEA,EAAE,OAAO,CACb;AAOF,SAASC,EACP,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACc;CACd,IAAMC,IAAKP,EAAa,EAAE,IAAI,GACxBQ,KAAOD,IAAK,EAAE,QAAQ,GACtBE,IAAIP,EAAME,GAAM,CAAC,GACjBM,IACJC,MAAW,QACPC,IAAIJ,IACJG,MAAW,WACTC,IAAIL,IAAKC,IACTI,IAAIL,IAAK,GACXM,IACJC,MAAU,SACN;EAAE,MAAMC;EAAG,OAAON;CAAE,IACpBK,MAAU,UACR;EAAE,OAAOE,IAAaD;EAAG,OAAON;CAAE,IAClC;EAAE,MAAMM,IAAIN,IAAI;EAAG,OAAOA;CAAE;CACpC,OACE,kBAACQ,GAAD;EAEE,eAAe;EACf,OAAO,CACL;GACE,UAAU;GACV;GACA,GAAGJ;GACH,WAAWC;GACX,UAAU,EAAE;GACZ,YAAYP;GACZ,OAAO,EAAE;GACT,YAAY,OAAO,EAAE,UAAU,GAAG;GAClC,oBAAoB;GACpB,GAAI,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,IAAI;GAC1C,GAAI,EAAE,OACF;IACE,iBAAiB,EAAE;IACnB,kBAAkB;IAClB,kBAAkB;KAAE,OAAO;KAAG,QAAQ;IAAE;GAC1C,IACA;EACN,GACAW,CACF;EAEC,UAAAd;CACG,GA1BCe,CA0BD;AAEV;AAIA,IAAMC,KACJ,GACA,GACA,GACA,GACA,GACA,GACA,MAEA,kBAACC,GAAD,EAEE,OAAO,CACL;CACE,UAAU;CACV,MAAMN;CACN,KAAKH;CACL;CACA;CACA,iBAAiBU;AACnB,GACAJ,CACF,EACD,GAZMC,CAYN,GAGGI,KACJ,GACA,GACA,GACA,GACA,GACA,MAEAH,EAAID,GAAKK,IAAKC,IAAI,GAAGC,IAAKD,IAAI,GAAGA,GAAGA,GAAGH,GAAO;CAC5C,cAAcG,IAAI;CAClB,GAAGP;AACL,CAAC,GAGGS,KACJ,GACA,GACA,GACA,GACA,GACA,GACA,MACG;CACH,IAAMC,IAAKC,IAAKC,GACVC,IAAKC,IAAKC,GACVC,IAAS,KAAK,MAAMN,GAAIG,CAAE,IAAII;CACpC,OAAOf,EACLD,IACCW,IAAKD,KAAM,IAAIK,IAAS,IACxBD,IAAKD,KAAM,IAAIG,IAAQ,GACxBD,GACAC,GACAb,GACA;EACE,cAAca,IAAQ;EACtB,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,MAAMJ,GAAIH,CAAE,EAAE,KAAK,CAAC;CACpD,CACF;AACF;AAGA,SAAgBQ,EACd,GACA,GACA,IAActC,EAAa,QACP;CACpB,IAAIuC,IAAUC,EAAK,QAAQ,MAAM,OAAO,SAASC,CAAC,KAAKA,KAAK,CAAC;CAE7D,AAAIF,EAAQ,SAAS,MAAG,IAAU,CAAC,GAAGA,GAAS,GAAGA,CAAO;CACzD,IAAMG,IAASH,EAAQ,QAAQ,GAAG,MAAMI,IAAIC,GAAG,CAAC;CAChD,IAAI,CAACL,EAAQ,UAAUG,KAAU,GAAG,OAAO,CAAC,CAAC,GAAGN,CAAM,CAAC;CACvD,IAAMS,IAAQT,IAASM,KAAWH,EAAQ,SAAS,IAC7CO,IAAQD,IAAOE,IAAMF,IAAOE,IAAM,GAClCC,IAA0B,CAAC,GAC7BC,IAAK;CACT,KAAK,IAAIC,IAAI,GAAGD,IAAKb,GAAQ,KAAKc,IAAI,KAAKX,EAAQ,QAAQ;EACzD,IAAMY,IAAOZ,EAAQW,KAAKJ;EAE1B,AADII,IAAI,KAAM,KAAKC,IAAO,KAAGH,EAAI,KAAK,CAACC,GAAI,KAAK,IAAIE,GAAMf,IAASa,CAAE,CAAC,CAAC,GACvE,KAAM,KAAK,IAAIE,GAAM,EAAG;CAC1B;CACA,OAAOH;AACT;AAEA,IAAMI,KACJ,GACA,GACA,GACA,GACA,GACA,GACA,GACA,MAEAd,EAASF,GAAQI,CAAI,CAAC,CAAC,KAAK,CAACa,GAAOC,IAAM,MACxCC,MAAS,MACLjC,EAAI,GAAGD,EAAI,GAAG6B,KAAKM,IAAOH,GAAOJ,GAAIK,GAAKjB,GAAOb,CAAK,IACtDF,EAAI,GAAGD,EAAI,GAAG6B,KAAKD,GAAIO,IAAOH,GAAOhB,GAAOiB,GAAK9B,CAAK,CAC5D,GAEIiC,KAAS,GAAW,IAAQ,MAAM,KAAK,MAAMhB,CAAC,IAAI,KAAMJ,IAAQ,GAMzDqB,KACX,GACA,GACA,GACA,MACmB;CACnB,IAAMV,IAAsB,CAAC,GACvBrC,IAAIgD,EAAM,OACVC,IAAMD,EAAM;CAClB,KAAK,IAAIE,IAAI,GAAGA,IAAID,EAAI,QAAQ,KAAK;EACnC,IAAME,IAAIF,EAAIC,IAAI,IACZE,IAAIH,EAAIC,IACRG,IAAK,KAAK,IAAIF,EAAE,GAAGC,EAAE,CAAC,IAAIE,GAC1BC,IAAK,KAAK,IAAIJ,EAAE,GAAGC,EAAE,CAAC,IAAII;EAEhC,EAAI,KACFL,EAAE,MAAMC,EAAE,IACNzC,EACE,GAAGD,EAAI,GAAGwC,KACVG,IAAKrD,IAAI,GACTuD,IAAKvD,IAAI,GACT,KAAK,IAAIoD,EAAE,IAAID,EAAE,CAAC,IAAInD,GACtBA,GACAgD,EAAM,KACR,IACArC,EACE,GAAGD,EAAI,GAAGwC,KACVG,IAAKrD,IAAI,GACTuD,IAAKvD,IAAI,GACTA,GACA,KAAK,IAAIoD,EAAE,IAAID,EAAE,CAAC,IAAInD,GACtBgD,EAAM,KACR,CACN;CACF;CACA,IAAM,CAACS,GAAKC,GAAIC,KAAMX,EAAM,MACtBvB,IAAS,KAAK,MAClBgC,EAAI,KAAKC,EAAG,IAAIC,EAAG,KAAK,GACxBF,EAAI,KAAKC,EAAG,IAAIC,EAAG,KAAK,CAC1B,GACMC,IAAO,KAAK,MAAMD,EAAG,IAAID,EAAG,GAAGC,EAAG,IAAID,EAAG,CAAC,IAAI,GAC9CG,IAAQ,eACRC,IAAmB;EAAE,UAAU;EAAY,OAAO;EAAG,QAAQ;CAAE,GAC/DC,KAASL,EAAG,IAAIC,EAAG,KAAK,GACxBK,KAASN,EAAG,IAAIC,EAAG,KAAK;CAC9B,IAAI,KAAK,IAAIF,EAAI,IAAIM,CAAK,KAAK,KAAK,IAAIN,EAAI,IAAIO,CAAK,GAAG;EACtD,IAAMC,IAAQR,EAAI,IAAIM;EACtB,OAAO,OAAOD,GAAO;GACnB,OAAOG,IAAQF,IAAQN,EAAI,KAAKH;GAChC,KAAKG,EAAI,IAAIG,IAAOJ;GACpB,gBAAgBI;GAChB,mBAAmBA;GACnB,gBAAgBC;GAChB,mBAAmBA;GACnB,GAAII,IACA;IAAE,iBAAiBxC;IAAQ,iBAAiBuB,EAAM;GAAM,IACxD;IAAE,kBAAkBvB;IAAQ,kBAAkBuB,EAAM;GAAM;EAChE,CAAC;CACH,OAAO;EACL,IAAMkB,IAAOT,EAAI,IAAIO;EACrB,OAAO,OAAOF,GAAO;GACnB,MAAML,EAAI,IAAIG,IAAON;GACrB,MAAMY,IAAOF,IAAQP,EAAI,KAAKD;GAC9B,iBAAiBI;GACjB,kBAAkBA;GAClB,iBAAiBC;GACjB,kBAAkBA;GAClB,GAAIK,IACA;IAAE,gBAAgBzC;IAAQ,gBAAgBuB,EAAM;GAAM,IACtD;IAAE,mBAAmBvB;IAAQ,mBAAmBuB,EAAM;GAAM;EAClE,CAAC;CACH;CAEA,OADAX,EAAI,KAAK,kBAACzB,GAAD,EAAiC,SAAQ,GAA9B,GAAGF,EAAI,MAAuB,CAAC,GAC5C2B;AACT;AAKA,SAAS8B,EAAK,GAAwB,GAAuB;CAC3D,IAAM,IAAIxB,EAAI,SAAS,GACjByB,IAAS,IAAIhC,IAAM,KAAK,KAAK,IAAIA,CAAG,IAAI,GACxCC,IAAgB,CAAC;CACvB,KAAK,IAAIE,IAAI,GAAGA,IAAI,GAAG,KAAK6B,GAAQ;EAClC,IAAM9D,IAAIqC,EAAIJ,IAAI,IACZpC,IAAIwC,EAAIJ,IAAI,IAAI,IAChBW,IAAIb,EAAI;EACd,AAAIa,KAAK,KAAK,MAAM5C,IAAI+B,EAAIa,IAAI,IAAI/C,IAAIkC,EAAIa,IAAI,EAAE,IAAI,OACtDb,EAAI,KAAK/B,GAAGH,CAAC;CACf;CACA,IAAMkE,IAAK1B,EAAI,IAAI,IAAI,IACjB2B,IAAK3B,EAAI,IAAI,IAAI,IACjBO,IAAIb,EAAI;CAEd,OADI,IAAI,MAAMA,EAAIa,IAAI,OAAOmB,KAAMhC,EAAIa,IAAI,OAAOoB,MAAKjC,EAAI,KAAKgC,GAAIC,CAAE,GAC/DjC;AACT;AAMA,SAASkC,EACP,GACA,GACA,GACA,GACA,GACA,GAEA,GAEA,IAAa,IACG;CAEhB,IAAM5B,IAAM6B,IACRC,EAAO,KAAK,GAAG,MAAMA,EAAOlC,IAAI,IAAIA,IAAI,IAAIA,IAAI,EAAE,IAClDkC,GACEC,IAAOF,IACT;EAAE,GAAGG,EAAM;EAAG,GAAGA,EAAM;EAAG,OAAOA,EAAM;EAAQ,QAAQA,EAAM;CAAM,IACnEA,GACEC,IAAIjC,EAAI,SAAS;CACvB,IAAIiC,IAAI,GAAG,OAAO,CAAC;CAEnB,IAAMC,IAAUlC,EAAI,MAAMA,EAAIiC,IAAI,IAAI,IAChCtC,KAAM,MAAeuC,IAAUtC,IAAIqC,IAAI,IAAIrC,GAC3CuC,KAAM,MAAcnC,EAAIL,EAAGC,CAAC,IAAI,IAChCwC,KAAM,MAAcpC,EAAIL,EAAGC,CAAC,IAAI,IAAI,IACpCyC,KAAM,MAAeC,IAASA,EAAO3C,EAAGC,CAAC,KAAK2C,GAC9CrC,IAAO,KAAK,IAAI6B,EAAK,GAAGI,EAAG,CAAC,CAAC,GAC7BK,IAAK,KAAK,IAAIT,EAAK,IAAIA,EAAK,OAAOI,EAAGF,IAAI,CAAC,CAAC;CAClD,IAAIO,KAAMtC,GAAM,OAAO,CAAC;CACxB,IAAMuC,IAAS,KAAK,IAAI,GAAGV,EAAK,QAAQrF,EAAa,WAAW,GAC1DgD,IAAsB,CAAC,GACzBgD,IAAI;CACR,KAAK,IAAIC,IAAO,KAAK,MAAMzC,CAAI,GAAG0C,IAAI,GAAGD,IAAOH,GAAI,KAAK;EACvD,IAAMlB,IAAQ,KAAK,IAAI,KAAK,KAAKkB,CAAE,GAAG,KAAK,MAAMG,IAAOF,CAAM,CAAC,GACzDI,KAAOF,IAAOrB,KAAS;EAC7B,OAAOoB,IAAIT,IAAI,KAAKE,EAAGO,IAAI,CAAC,IAAIG,IAAK;EACrC,IAAMnC,IAAKyB,EAAGO,CAAC,GACThE,IAAKyD,EAAGO,IAAI,CAAC,GACbI,IAAIpE,MAAOgC,IAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAImC,IAAMnC,MAAOhC,IAAKgC,EAAG,CAAC,GACnElD,IAAI4E,EAAGM,CAAC,KAAKN,EAAGM,IAAI,CAAC,IAAIN,EAAGM,CAAC,KAAKI,GAClCxD,IAAI+C,EAAGK,CAAC,KAAKL,EAAGK,IAAI,CAAC,IAAIL,EAAGK,CAAC,KAAKI;EACxC,IAAI,OAAO,SAAStF,CAAC,KAAK,OAAO,SAAS8B,CAAC,GAAG;GAC5C,IAAMhC,IAAM,KAAK,IAAIE,GAAG8B,CAAC,GACnByD,IAAI,KAAK,IAAIzD,IAAI9B,CAAC;GACxB,EAAI,KACFqE,IACI7D,EACE,GAAGD,EAAI,GAAG6E,KACVtF,IAAMyE,EAAK,GACXY,IAAOZ,EAAK,GACZgB,GACAzB,IAAQqB,GACRzE,GACA,EACE,WACF,CACF,IACAF,EACE,GAAGD,EAAI,GAAG6E,KACVD,IAAOZ,EAAK,GACZzE,IAAMyE,EAAK,GACXT,IAAQqB,GACRI,GACA7E,GACA,EACE,WACF,CACF,CACN;EACF;EACA,IAAOoD;CACT;CACA,OAAO5B;AACT;AAGA,SAAgBsD,EAAgB,GAAmB;CACjD,IAAM,EAAE,YAASC,EAAM,QACjBC,IAAUD,EAAM,MAAM,OAAO,QAAQ,MAAM,CAACE,EAAE,MAAM,GACpDC,IAAQF,EAAQ,QACnB,MAAMC,EAAE,SAAS,UAAUA,EAAE,SAAS,MACzC,CAAC,CAAC,QACIE,IAAWH,EAAQ,QAAQ,MAAMC,EAAE,SAAS,SAAS,CAAC,CAAC,QACvDG,IAAU,KAAK,IAAI,KAAK5G,EAAa,aAAa,KAAK,IAAI,GAAG0G,CAAK,CAAC,GACpEG,IAAU,KAAK,IACnB,KACA,KAAK,IACH7G,EAAa,eACbA,EAAa,OAAO,KAAK,IAAI,GAAG2G,CAAQ,CAC1C,CACF;CACA,OAAO;EACL;EACA,SAAS;GAEP,aAAa,KAAK,IAAI,GAAItB,EAAK,QAAQ,IAAKuB,CAAO;GACnD;GACA,SAAS5G,EAAa;GACtB,SAAS,KAAK,IACZ,GACA,KAAK,KAAMqF,EAAK,QAAQA,EAAK,SAAUwB,CAAO,IAAI,OAAO,CAC3D;EACF;CACF;AACF;AAEA,SAASC,EAAS,GAAmC;CACnD,IAAM,EAAE,YAASP,EAAM,QACjB,EAAE,YAAS,eAAYD,EAAgBC,CAAK,GAC5CQ,IAA+BC,EAAgBT,GAAOU,CAAO,GAC7DhD,IAAKoB,EAAK,GACVlB,IAAKkB,EAAK,GACVrC,IAAsB,CAAC,GACzBkE,IAAmBlH,EAAa,MAChCmH,IAAmBnH,EAAa;CA4GpC,OA3GA+G,EAAW,SAAS,GAAG,MAAM;EAC3B,IAAM1F,IAAM,GAAGyC,EAAE,OAAOA,EAAE,YAAY,GAAGD;EACzC,IAAIC,EAAE,SAAS,QAAQ;GACrB,EAAE,SAAS,SAAS,GAAK,MACvBd,EAAI,KACF,GAAGkC,EACD,GAAG7D,EAAI,GAAG,KACViC,GACAQ,EAAE,UACFA,EAAE,OACFA,EAAE,SACFuB,GACAvB,EAAE,UAAU,IACZA,EAAE,UACJ,CACF,CACF;GACA;EACF;EACA,IAAIA,EAAE,SAAS,QAAQ;GACrB,IAAIsD,IAAQ;GACZ,KAAK,IAAM9D,KAAOQ,EAAE,UAAU,KAASR,EAAI,SAAS;GACpD,EAAE,SAAS,SAAS,GAAK,MAAM;IAC7B,IAAMM,IAAMkB,EACVxB,GACA,KAAK,IACH,GACA,KAAK,MAAOsD,IAAUtD,EAAI,SAAU,IAAI,KAAK,IAAI,GAAG8D,CAAK,CAAC,CAC5D,CACF;IACA,IAAIxD,EAAI,WAAW,GAAG;KACpB,EAAI,KACFnC,EACE,GAAGJ,EAAI,GAAGgG,KACVzD,EAAI,KAAKK,GACTL,EAAI,KAAKO,GACTL,EAAE,QAAQ,KACVA,EAAE,KACJ,CACF;KACA;IACF;IACA,KAAK,IAAIZ,IAAI,GAAGA,IAAI,IAAIU,EAAI,QAAQ,KAAK,GACvC,EAAI,KACF/B,EACE,GAAGR,EAAI,GAAGgG,EAAE,GAAGnE,KACfU,EAAIV,KAAKe,GACTL,EAAIV,IAAI,KAAKiB,GACbP,EAAIV,IAAI,KAAKe,GACbL,EAAIV,IAAI,KAAKiB,GACbL,EAAE,OACFA,EAAE,KACJ,CACF;GAEJ,CAAC;GACD;EACF;EACA,IAAIA,EAAE,SAAS,QAAQ;GACrB,IAAMwD,IAAQxD,EAAE,MAAM,SAAS,GACzBiB,IACJuC,IAAQH,IAAW,KAAK,KAAKG,IAAQ,KAAK,IAAI,GAAGH,CAAQ,CAAC,IAAI;GAChE,KAAK,IAAIjE,IAAI,GAAGA,IAAIoE,GAAO,KAAKvC,GAAQ;IACtC,IAAM,CAAC9D,GAAGH,GAAGH,GAAG0F,KAAKvC,EAAE,MAAM,MAAMZ,IAAI,GAAGA,IAAI,IAAI,CAAC,GAC7CqE,IAAS,KAAK,IAAIzD,EAAE,UAAU,GAAGnD,IAAI,GAAG0F,IAAI,CAAC;IACnD,EAAI,KACF/E,EACE,GAAGD,EAAI,GAAG6B,KACVjC,IAAIgD,GACJnD,IAAIqD,GACJ,KAAK,IAAIxD,GAAG,EAAG,GACf0F,GACAvC,EAAE,SAASZ,MAAMY,EAAE,OACnByD,IAAS,MAAOzD,EAAE,YAAY,KAAA,IAC1B;KACE,GAAIyD,IAAS,KAAM,EAAE,cAAcA,EAAO,IAAI;KAC9C,GAAIzD,EAAE,YAAY,KAAA,IAAqC,OAAzB,EAAE,SAASA,EAAE,QAAQ;IACrD,IACA,KAAA,CACN,CACF;GACF;GACA,IAAW,KAAK,IAAI,GAAGqD,IAAW,KAAK,KAAKG,IAAQvC,CAAM,CAAC;GAC3D;EACF;EACA,IAAMuC,IAAQxD,EAAE,KAAK,SAAS,GACxBiB,IACJuC,IAAQJ,IAAW,KAAK,KAAKI,IAAQ,KAAK,IAAI,GAAGJ,CAAQ,CAAC,IAAI,GAC1DM,IAAS1D,EAAE,UAAU;EAC3B,KAAK,IAAIZ,IAAI,GAAGA,IAAIoE,GAAO,KAAKvC,GAAQ;GACtC,IAAMvD,IAAQsC,EAAE,OAAOZ,MAAM;GAC7B,EAAI,KACFzB,EACE,GAAGJ,EAAI,GAAG6B,KACVY,EAAE,KAAKZ,IAAI,KAAKe,GAChBH,EAAE,KAAKZ,IAAI,IAAI,KAAKiB,GACpBL,EAAE,KAAKZ,IAAI,IAAI,IAEfY,EAAE,UAAU,IAAItC,IAAQ,eACxBgG,IAAS,KAAK1D,EAAE,UAAU,IACtB;IAAE,aAAa0D;IAAQ,aAAahG;IAAO,SAAS;GAAE,IACtD,EAAE,SAASsC,EAAE,QAAQ,CAC3B,CACF;EACF;EACA,IAAW,KAAK,IAAI,GAAGoD,IAAW,KAAK,KAAKI,IAAQvC,CAAM,CAAC;CAC7D,CAAC,GACM/B;AACT;AAIA,IAAMyE,KAAO,GAAS,MAAmBC,EAAMxB,GAAGyB,CAAK;AAEvD,SAASC,EAAe,GAAmB,GAAiC;CAC1E,IAAM,EAAE,UAAO,UAAO,UAAO,WAAQ,mBAAgBrB,GAC/C,EAAE,SAAM,WAAQ,eAAYsB,GAE5B9G,IAAa+G,EAAO,YACpBC,IAAahH,IAAaiH,EAAM,IAAIA,EAAM,GAC1CC,IAAWlH,IAAaiH,EAAM,IAAIA,EAAM,GACxCE,IAAcnH,IAAa8G,EAAO,SAASA,EAAO,QAClDM,IAAYpH,IAAa8G,EAAO,SAASA,EAAO,QAChDO,IAAWrH,IAAa+G,EAAO,QAAQA,EAAO,OAC9CO,IAAStH,IAAa+G,EAAO,QAAQA,EAAO,OAC5CQ,IAAKC,EAAM,UACXvF,IAAsB,CAAC;CAE7B,EAAY,SAAS,GAAG,MAAM;EAC5B,IAAIL,EAAE,SAAS,QAAQ;EACvB,IAAM0E,IAAI1H,EAAegD,GAAGmF,CAAM;EAClC,AAAIT,EAAE,SAAS,KAAKA,EAAE,UAAU,KAChCrE,EAAI,KACF1B,EAAI,QAAQ4B,KAAKmE,EAAE,GAAGA,EAAE,GAAGA,EAAE,OAAOA,EAAE,QAAQI,EAAI9E,EAAE,OAAOA,EAAE,OAAO,CAAC,CACvE;CACF,CAAC;CAED,IAAM8F,IAAOhB,EAAIc,EAAM,IAAI;CAQ3B,AAPIN,EAAS,QACXE,EAAU,OAAO,SAAS,GAAG,MAAM;EACjC,IAAMO,IAAKL,EAAO5F,CAAC;EACnB,AAAIiG,IAAKrD,EAAK,IAAI,KAAKqD,IAAKrD,EAAK,IAAIA,EAAK,SAAS,KACnDrC,EAAI,KAAK1B,EAAI,SAAS4B,KAAKmC,EAAK,GAAG5B,EAAMiF,CAAE,GAAGrD,EAAK,OAAO,GAAGoD,CAAI,CAAC;CACpE,CAAC,GAECV,EAAW,QACbG,EAAY,OAAO,SAAS,GAAG,MAAM;EACnC,IAAMS,IAAKP,EAAS3F,CAAC;EACrB,AAAIkG,IAAKtD,EAAK,IAAI,KAAKsD,IAAKtD,EAAK,IAAIA,EAAK,QAAQ,KAClDrC,EAAI,KAAK1B,EAAI,SAAS4B,KAAKO,EAAMkF,CAAE,GAAGtD,EAAK,GAAG,GAAGA,EAAK,QAAQoD,CAAI,CAAC;CACrE,CAAC;CAGH,IAAMG,IAAO,KAAK,KAAKN,IAAK,GAAG,GACzBO,IAAoB;EAAE,MAAMP;EAAI,OAAOb,EAAIc,EAAM,SAAS;EAAG;CAAO,GACpEO,IAAqB;EACzB,MAAMR,IAAK;EACX,QAAQ;EACR,OAAOb,EAAIc,EAAM,MAAM,EAAG;EAC1B;CACF,GACM3C,IAASP,EAAK,IAAIA,EAAK;CAE7B,IAAI0C,EAAW,SAAS;EACtB,EAAI,KACFzG,EAAI,SAAS+D,EAAK,GAAG5B,EAAMmC,CAAM,GAAGP,EAAK,OAAO,GAAGoC,EAAIc,EAAM,IAAI,CAAC,CACpE;EACA,IAAIQ,IAAY;EAwBhB,AAvBAb,EAAY,OACT,KAAK,GAAG,OAAO;GAAE,IAAIE,EAAS3F,CAAC;GAAG,MAAMyF,EAAY,OAAOhF,MAAM;EAAG,EAAE,CAAC,CACvE,MAAM,GAAG,MAAMP,EAAE,KAAKC,EAAE,EAAE,CAAC,CAC3B,SAAS,EAAE,OAAI,WAAQ,MAAM;GAC5B,IAAI,CAACtC,KAAQqI,IAAKtD,EAAK,IAAI,MAAOsD,IAAKtD,EAAK,IAAIA,EAAK,QAAQ,IAC3D;GACF,IAAM1E,IAAIN,EAAiBC,GAAM,OAAOgI,EAAG,cAAc,GACnDrC,IAAO,KAAK,IAAI,GAAG,KAAK,IAAI5D,IAAQ1B,GAAGgI,IAAKhI,IAAI,CAAC,CAAC;GACxD,AAAIsF,IAAO8C,IAAY,MACvB,IAAY9C,IAAOtF,GACnBqC,EAAI,KACFxC,EACE,SAAS,KACTF,GACA2F,IAAOtF,IAAI,GACXiF,IAAS,GACT,UACA,OACAiD,GACAxG,CACF,CACF;EACF,CAAC,GACC0F,EAAW,SACb/E,EAAI,KACFxC,EACE,UACAuH,EAAW,OACX1C,EAAK,IAAIA,EAAK,QAAQ,GACtBO,IAASgD,IAAO,IAChB,UACA,OACAE,GACAzG,CACF,CACF;CACJ;CAEA,IAAI4F,EAAS,SAAS;EACpB,IAAIe,IAAa;EAyBjB,AAxBAb,EAAU,OACP,KAAK,GAAG,OAAO;GAAE,IAAIE,EAAO5F,CAAC;GAAG,MAAM0F,EAAU,OAAOjF,MAAM;EAAG,EAAE,CAAC,CACnE,MAAM,GAAG,MAAMP,EAAE,KAAKC,EAAE,EAAE,CAAC,CAC3B,SAAS,EAAE,OAAI,WAAQ,MAAM;GAC5B,IAAI,GAACtC,KAAQoI,IAAKrD,EAAK,IAAI,MAAOqD,IAAKrD,EAAK,IAAIA,EAAK,SAAS,KAG9D;QAAItE,GAAY;KACd,IAAI2H,KAAMJ,IAAK,KAAK,IAAIU,GAAY;KACpC,IAAaN,KAAMJ,IAAK,KAAK;IAC/B;IACA,EAAI,KACF9H,EACE,SAAS,KACTF,GACA+E,EAAK,IAAI,GACTqD,GACA,SACA,UACAG,GACAxG,CACF,CACF;GAZA;EAaF,CAAC,GACC4F,EAAS,SACXjF,EAAI,KACFxC,EACE,UACAyH,EAAS,OACTW,IAAO,IAAI,GACXvD,EAAK,IAAIA,EAAK,SAAS,GACvB,UACA,UACAyD,GACAzG,GACA,EACE,WAAW,CAAC,EAAE,QAAQ,SAAS,CAAC,EAClC,CACF,CACF;CACJ;CAEA,IAAMH,IAAKnB,IAAa,OAAOiH,EAAM;CACrC,IAAI9F,KAAM+G,KAAW/G,EAAG,SAAS;EAC/B,IAAM0C,IAAQS,EAAK,IAAIA,EAAK;EAkB5B,AAjBA4D,EAAQ,OAAO,SAAS,GAAG,MAAM;GAC/B,IAAMP,IAAKZ,EAAO,MAAMrF,CAAC,GACnBnC,IAAO2I,EAAQ,OAAO/F;GAC5B,AAAI,CAAC5C,KAAQoI,IAAKrD,EAAK,IAAI,MAAOqD,IAAKrD,EAAK,IAAIA,EAAK,SAAS,MAC9DrC,EAAI,KACFxC,EACE,UAAU0C,KACV5C,GACAsE,IAAQ,GACR8D,GACA,QACA,UACAG,GACAxG,CACF,CACF;EACF,CAAC,GACGH,EAAG,SACLc,EAAI,KACFxC,EACE,WACA0B,EAAG,OACHG,IAAQuG,IAAO,IAAI,GACnBvD,EAAK,IAAIA,EAAK,SAAS,GACvB,UACA,UACAyD,GACAzG,GACA,EACE,WAAW,CAAC,EAAE,QAAQ,QAAQ,CAAC,EACjC,CACF,CACF;CACJ;CAEA,IAAM6G,IAAO3C,EAAM,QAAQ;CAC3B,IAAI2C,GAAM;EAER,IAAM,EAAE,QAAK,aAAUA,GACjB/F,IAAOgG,EAAI,QAAQ,KAAK,IAAI,GAAGC,EAAM,MAAM;EAoCjD,AAnCApG,EAAI,KACF,kBAACzB,GAAD;GAEE,GAAI8H,EAAKpJ,GAAG,cAAc;GAC1B,OAAO;IACL,UAAU;IACV,MAAMkJ,EAAI;IACV,KAAKA,EAAI;IACT,OAAOA,EAAI;IACX,QAAQA,EAAI;IACZ,cAAcA,EAAI,SAAS;IAC3B,UAAU;IACV,eAAe;GACjB;GAEC,UAAAC,EAAM,KAAK,GAAG,MACb,kBAAC7H,GAAD,EAEE,OAAO;IAAE,OAAO4B;IAAM,QAAQgG,EAAI;IAAQ,iBAAiBjD;GAAE,EAC9D,GAFMrC,CAEN,CACF;EACG,GAnBA,cAmBA,CACR,GACAqF,EAAK,MAAM,SAAS,GAAG,MACrBlG,EAAI,KACF1B,EACE,cAAcuC,KACd,KAAK,MAAMuC,CAAC,GACZ+C,EAAI,IAAI,GACR,GACAA,EAAI,SAAS,GACb1B,EAAIc,EAAM,MAAM,GAAI,CACtB,CACF,CACF,GACAW,EAAK,OAAO,SAAS,GAAG,MACtBlG,EAAI,KACFxC,EACE,eAAeqD,KACfyF,EAAE,MACFA,EAAE,GACFA,EAAE,GACFA,EAAE,OACF,UACA;GAAE,MAAM;GAAI,OAAO7B,EAAIc,EAAM,SAAS;GAAG;EAAO,GAChDlG,CACF,CACF,CACF;CACF;CAEA,IAAIkE,EAAM,QACR,KAAK,IAAMgD,KAAKhD,EAAM,OAAO,SAAS;EAEpC,IAAM3E,IAAK2H,EAAE,IAAI,SAAS,GACpBC,IACJD,EAAE,UAAU,QACR9H,EAAI,UAAU,GAAGG,GAAI,GAAG2H,EAAE,KAAK,IAC/BA,EAAE,UAAU,SACVjI,EAAI,UAAU,GAAGM,IAAK,GAAG,IAAI,GAAG2H,EAAE,KAAK,IACvCjI,EAAI,UAAU,GAAGM,IAAK,GAAG,GAAG,GAAG2H,EAAE,KAAK;EAC9C,EAAI,KACF,kBAAChI,GAAD;GAEE,OAAO;IACL,UAAU;IACV,MAAMgI,EAAE,IAAI;IACZ,KAAKA,EAAE,IAAI;IACX,OAAOA,EAAE,IAAI;IACb,QAAQA,EAAE,IAAI;IACd,SAASA,EAAE,SAAS,MAAO;GAC7B;GACA,GAAIF,EAAKpJ,GAAG,eAAe,EAAE,QAAQsJ,EAAE,OAAO,CAAC;GAVjD,UAAA,CAYGC,GACAhJ,EACC,QACA+I,EAAE,MACF,IACA3H,GACA,QACA,UACA;IAAE,MAAM;IAAI,OAAO6F,EAAIc,EAAM,SAAS;IAAG;GAAO,GAChDgB,EAAE,IAAI,OACNA,EAAE,SAAS,EAAE,oBAAoB,eAAe,IAAI,KAAA,CACtD,CACI;EAvBC,GAAA,UAAUA,EAAE,IAuBb,CACR;CACF;CAEF,OAAOvG;AACT;AAIA,SAASyG,EAAe,GAAmB,GAAiC;CAC1E,IAAM,EAAE,UAAO,gBAAa,cAAWlD,GACjC,EAAE,SAAM,cAAWsB,GACnBS,IAAKC,EAAM,UACXtE,IAAKoB,EAAK,GACVlB,IAAKkB,EAAK,GACVqE,IAAKrE,EAAK,OACVsE,IAAOlC,EAAIc,EAAM,YAAY,EAAG,GAChCqB,IAActB,IAAK,GACnBtF,IAAsB,CAAC;CA4J7B,AAzJAuD,EAAM,WAAW,SAAS,GAAG,MAAM;EACjC,IAAMsD,IAAQ3D,EAAE,OAAOA,EAAE;EACzB,EAAI,KACF,GAAI2D,IACAzG,EACE,aAAaF,KACb,KACAO,EAAMyC,EAAE,IAAIA,EAAE,KAAK,IAAI/B,GACvB,KAAK,IAAI+B,EAAE,IAAIA,EAAE,EAAE,IAAIjC,GACvB,KAAK,IAAIiC,EAAE,KAAKA,EAAE,EAAE,GACpBA,EAAE,OACFA,EAAE,OACFA,EAAE,IACJ,IACA9C,EACE,aAAaF,KACb,KACAO,EAAMyC,EAAE,IAAIA,EAAE,KAAK,IAAIjC,GACvB,KAAK,IAAIiC,EAAE,IAAIA,EAAE,EAAE,IAAI/B,GACvB,KAAK,IAAI+B,EAAE,KAAKA,EAAE,EAAE,GACpBA,EAAE,OACFA,EAAE,OACFA,EAAE,IACJ,CACN;CACF,CAAC,GAGDK,EAAM,OAAO,SAAS,GAAG,MAAM;EAC7B,EAAI,KAAK,GAAG7C,EAAW,SAASR,KAAKP,GAAGsB,GAAIE,CAAE,CAAC;CACjD,CAAC,GAED2F,EAAY,SAAS,GAAG,MAAM;EAC5B,IAAInH,EAAE,SAAS,QAAQ;EACvB,IAAMnB,IAAQiG,EAAI9E,EAAE,KAAK,GACnBoH,IAAQnK,EAAe+C,GAAGmF,CAAM;EACtC,IAAKiC,EAAM,UA2BJ;GACL,IAAMpB,IAAKoB,EAAM;GAajB,AAZA/G,EAAI,KACF,GAAGI,EACD,QAAQF,KACR,KACAO,EAAMkF,GAAIhG,EAAE,KAAK,IAAIsB,GACrB,GACAoB,EAAK,QACL1C,EAAE,OACFnB,GACAmB,EAAE,IACJ,CACF,GACIA,EAAE,SACJK,EAAI,KACFxC,EACE,cAAc0C,KACdP,EAAE,OACFgG,IAAK,IAAI1E,GACT,GACA,QACA,OACA;IAAE,MAAMqE;IAAI,QAAQ;IAAK;IAAO;IAAM;GAAO,GAC7CoB,CACF,CACF;EACJ,OAtDqB;GACnB,IAAMhB,IAAKqB,EAAM;GAajB,AAZA/G,EAAI,KACF,GAAGI,EACD,QAAQF,KACR,KACAO,EAAMiF,GAAI/F,EAAE,KAAK,IAAIwB,GACrB,GACAkB,EAAK,OACL1C,EAAE,OACFnB,GACAmB,EAAE,IACJ,CACF,GACIA,EAAE,SACJK,EAAI,KACFxC,EACE,cAAc0C,KACdP,EAAE,OACF0C,EAAK,QAAQ,GACbqD,IAAK,IAAIvE,GACT,SACA,UACA;IAAE,MAAMmE;IAAI,QAAQ;IAAK;IAAO;IAAM;GAAO,GAC7CoB,CACF,CACF;EACJ;CA4BF,CAAC,GAEDI,EAAY,SAAS,GAAG,MAAM;EAC5B,IAAInH,EAAE,SAAS,QAAQ;EACvB,IAAMmG,IAAQjJ,EACZ8C,GACAhD,EAAegD,GAAGmF,CAAM,GACxBQ,IACC,GAAM,GAAM,MACXjI,EAAiBC,GAAM,GAAG4J,EAAO,GAAG/J,EAAK,cAAc,CAC3D;EACA,IAAI,CAAC2I,GAAO;EACZ,IAAMtH,IAAQiG,EAAI9E,EAAE,UAAU,GACxBwH,IAAQ1C,EAAIc,EAAM,SAAS;EACjC,EAAM,MAAM,SAAS,GAAG,MAAM;GAC5B,IAAMlH,IAAM,QAAQyC,EAAE,KAAK,GAAGZ,EAAE,GAAGW,KAC7BjC,IAAKkC,EAAE,IAAIA,EAAE,SAAS,IAAIK;GAChC,IAAIL,EAAE,SAAS,SAAS;IACtB,IAAMuC,IAAIvC,EAAE,SAAS;IACrB,EAAI,KACFxC,EACE,GAAGD,EAAI,QACPyC,EAAE,IAAIG,GACNrC,IAAKyE,IAAI,GACTvC,EAAE,OACFuC,GACAoB,EAAI9E,EAAE,YAAY,GAAI,GACtB,EAAE,cAAc0D,IAAI,EAAE,CACxB,GACA7F,EACEa,GACAyC,EAAE,MACFA,EAAE,IAAIG,IAAKH,EAAE,QAAQ,GACrBlC,GACA,UACA,UACA;KAAE,MAAMkC,EAAE;KAAM,QAAQA,EAAE;KAAQ;KAAO;IAAO,GAChD4F,CACF,CACF;IACA;GACF;GACA,EAAI,KACFlJ,EACEsD,EAAE,SAAS,UAAU,cAAcZ,MAAM7B,GACzCyC,EAAE,MACFA,EAAE,IAAIG,GACNrC,GACA,QACA,UACA;IACE,MAAMkC,EAAE;IACR,QAAQA,EAAE;IACV,OAAOA,EAAE,SAAS,UAAUtC,IAAQ2I;IACpC;GACF,GACAT,CACF,CACF;EACF,CAAC;CACH,CAAC,GAEDI,EAAY,SAAS,GAAG,MAAM;EAC5B,IAAInH,EAAE,SAAS,UAAU,CAACA,EAAE,MAAM;EAClC,IAAMhC,IAAIN,EAAiBsC,EAAE,MAAM,GAAGA,EAAE,OAAO,GAAG2F,EAAG,cAAc,GAC7D1F,IAAI9C,EAAkB6C,GAAGmF,GAAQnH,GAAGiJ,CAAW;EACrD,EAAI,KACFpJ,EACE,QAAQ0C,KACRP,EAAE,MACFC,EAAE,IAAIqB,GACNrB,EAAE,IAAIA,EAAE,SAAS,IAAIuB,GACrB,QACA,UACA;GAAE,MAAMmE;GAAI,QAAQ3F,EAAE;GAAQ,OAAO8E,EAAI9E,EAAE,KAAK;GAAG;GAAM;EAAO,GAChE+G,CACF,CACF;CACF,CAAC;CAED,IAAMW,IAAa5C,EAAIc,EAAM,MAAM,GAAI;CAsBvC,OArBAhC,EAAM,YAAY,SAAS,EAAE,OAAO+C,GAAG,KAAK1G,KAAK,MAAM;EAErD,IAAMuG,IAAMG,EAAE,cAAc,WAAWA,EAAE,MAAM,KAAA;EAC/C,EAAI,KACF9I,EACE,eAAe0C,KACfoG,EAAE,MACF1G,EAAE,IAAIqB,GACNrB,EAAE,IAAIA,EAAE,SAAS,IAAIuB,GACrB,QACA,UACAmF,EAAE,QACE;GAAE,MAAMhB;GAAI,OAAOgB,EAAE;GAAO;EAAO,IACnC;GAAE,MAAMhB;GAAI,OAAO+B;GAAY;GAAM;EAAO,GAChDX,GACAP,IACI,EAAE,OAAO,KAAK,IAAIvG,EAAE,OAAOuG,EAAI,IAAIA,EAAI,QAAQ,IAAIvG,EAAE,CAAC,EAAE,IACxD,KAAA,CACN,CACF;CACF,CAAC,GACMI;AACT;AAEA,IAAMsH,KAAQ,OAAgC;CAC5C,UAAU;CACV,MAAMjF,EAAK;CACX,KAAKA,EAAK;CACV,OAAOA,EAAK;CACZ,QAAQA,EAAK;CACb,UAAU;AACZ;AAMA,SAAgBkF,EAAW,GAAmB,GAA4B;CACxE,IAAM,EAAE,YAAShE,EAAM;CACvB,OACE,kBAAAxG,GAAA,EAAA,UAAA;EACG6H,EAAerB,GAAOkE,CAAM;EAC7B,kBAAClJ,GAAD;GAAiB,OAAO+I,EAAKjF,CAAI;GAAG,GAAIgE,EAAKpJ,GAAG,MAAM;GACnD,UAAA6G,EAASP,CAAK;EACX,GAFI,MAEJ;EACN,kBAAChF,GAAD;GAAmB,OAAO+I,EAAKjF,CAAI;GAAG,GAAIgE,EAAKpJ,GAAG,QAAQ;GACvD,UAAAwJ,EAAelD,GAAOkE,CAAM;EACzB,GAFI,QAEJ;CACN,EAAA,CAAA;AAEN;AAGA,SAAgBC,EACd,GACA,GACA,GACW;CACX,IAAM,EAAE,UAAO,WAAQ,UAAO,gBAAanE,GACrC,EAAE,YAASsB,GACX8C,IAAalD,EAAIc,EAAM,UAAU,GACjCvF,IAAsB,CAAC;CAqB7B,AApBI4H,KAASA,EAAM,eAAe,QAChC5H,EAAI,KACF,kBAACzB,GAAD;EAEE,OAAOsJ,EAAW;EAClB,GAAIxB,EAAKpJ,GAAG,WAAW;EAEtB,UAAAmD,EACC,QACA,KACA,KAAK,MAAMwH,EAAM,UAAU,GAC3BvF,EAAK,GACLA,EAAK,OACL,GACAoC,EAAIc,EAAM,WAAW,GAAI,GACzB,CAAC,GAAG,CAAC,CACP;CACI,GAdA,aAcA,CACR,GAEEqC,KAASA,EAAM,eAAe,QAChC5H,EAAI,KACF,kBAACzB,GAAD;EAEE,OAAOsJ,EAAW;EAClB,GAAIxB,EAAKpJ,GAAG,WAAW;EAEtB,UAAAmD,EACC,QACA,KACA,KAAK,MAAMwH,EAAM,UAAU,GAC3BvF,EAAK,GACLA,EAAK,QACL,GACAoC,EAAIc,EAAM,WAAW,GAAI,GACzB,CAAC,GAAG,CAAC,CACP;CACI,GAdA,WAcA,CACR;CAEF,IAAIuC,IAAS;CAoHb,AAnHAF,GAAO,MAAM,SAAS,GAAG,MAAM;EAC7B,IAAIG,EAAE,SAAS,QAAQ;GACrB,EAAI,KACFzJ,EAAI,QAAQ4B,KAAK6H,EAAE,GAAGA,EAAE,GAAGA,EAAE,OAAOA,EAAE,QAAQtD,EAAIc,EAAM,MAAM,GAAI,GAAG,EACnE,cAAc,EAChB,CAAC,CACH;GACA;EACF;EACA,IAAIwC,EAAE,SAAS,SAAS;GAEtB,EAAI,KACFzJ,EAAI,QAAQ4B,KAAK6H,EAAE,GAAGA,EAAE,GAAGA,EAAE,OAAOA,EAAE,QAAQtD,EAAIc,EAAM,MAAM,GAAI,CAAC,CACrE;GACA;EACF;EACA,IAAIwC,EAAE,SAAS,OAAO;GAEpB,AAAKD,MACH,IAAS,IACT9H,EAAI,KACF1B,EACE,QACA+D,EAAK,GACLA,EAAK,GACLA,EAAK,OACLA,EAAK,QACLoC,EAAIc,EAAM,YAAY,GAAI,CAC5B,CACF;GAIF,IAAMlB,IAAI2D,EAAcD,CAAC;GAezB,AAdIA,EAAE,YACJ/H,EAAI,KACF1B,EACE,SAAS4B,KACTmE,EAAE,GACFA,EAAE,GACFA,EAAE,OACFA,EAAE,QACFI,EAAIc,EAAM,UAAU,GACpB,EACE,cAAcwC,EAAE,OAClB,CACF,CACF,GACF/H,EAAI,KACF1B,EAAI,QAAQ4B,KAAKmE,EAAE,GAAGA,EAAE,GAAGA,EAAE,OAAOA,EAAE,QAAQ0D,EAAE,OAAO;IACrD,cAAcA,EAAE;IAChB,GAAIA,EAAE,OACF;KACE,aAAaA,EAAE,WAAW,IAAI;KAC9B,aAAaA,EAAE;KACf,aAAa;KACb,eAAe;KACf,cAAc;KACd,cAAc;MAAE,OAAO;MAAG,QAAQ;KAAE;KACpC,WAAW;IACb,IACA;GACN,CAAC,CACH;GACA;EACF;EACA,IAAIA,EAAE,SAAS,QAAQ;GAErB,IAAME,IAAO,KAAK,IAAI,GAAGF,EAAE,QAAQ,KAAMA,EAAE,SAAS,GAAI,GAClDG,IAAQ,KAAK,IAAI,GAAGH,EAAE,QAAQ,GAAGA,EAAE,SAAS,CAAC;GAmBnD,AAlBA/H,EAAI,KACF1B,EACE,QAAQ4B,KACR6H,EAAE,IAAIE,GACNF,EAAE,IAAIE,GACNF,EAAE,QAAQE,IAAO,GACjBF,EAAE,SAASE,IAAO,GAClBF,EAAE,OACF;IACE,cAAc,KAAK,IAAI,GAAGA,EAAE,MAAM;IAClC,aAAa;IACb,eAAe;IACf,cAAc;IACd,cAAc;KAAE,OAAO;KAAG,QAAQ;IAAE;IACpC,WAAW;GACb,CACF,CACF,GACIA,EAAE,QAAQ,KAAKA,EAAE,SAAS,KAC5B/H,EAAI,KACF1B,EACE,QAAQ4B,KACR6H,EAAE,IAAIE,IAAOC,GACbH,EAAE,IAAIE,IAAOC,GACbH,EAAE,SAASE,IAAOC,KAAS,GAC3BH,EAAE,UAAUE,IAAOC,KAAS,GAC5B,eACA;IACE,cAAc,KAAK,IAAI,GAAGH,EAAE,SAASG,IAAQ,CAAC;IAC9C,aAAa;IACb,aAAaH,EAAE;GACjB,CACF,CACF;GACF;EACF;EAEA,EAAI,KACFtJ,EAAI,QAAQyB,KAAK6H,EAAE,GAAGA,EAAE,GAAGA,EAAE,OAAO,GAAGA,EAAE,IAAI,GAC7CtJ,EAAI,QAAQyB,KAAK6H,EAAE,GAAGA,EAAE,GAAGA,EAAE,MAAMA,EAAE,OAAO;GAC1C,aAAa;GACb,aAAaJ;EACf,CAAC,CACH;CACF,CAAC,GACGQ,KACFnI,EAAI,KACF,kBAACzB,GAAD;EAAiB,GAAI8H,EAAKpJ,GAAG,MAAM;EAAG,OAAO4K,EAAW;EACrD,UAAApJ,EACC,SACA0J,EAAS,GACTA,EAAS,GACTA,EAAS,OAAO,GAChBA,EAAS,OACT;GACE,SAAS;GACT,aAAa;GACb,aAAaR;EACf,CACF;CACI,GAbI,MAaJ,CACR;CAEF,IAAMvG,IAAMwG,GAAO;CACnB,IAAIxG,KAAO,CAACgH,GAAe;EACzB,IAAM,EAAE,KAAKxI,GAAG,eAAY,YAAS,eAAYwB,GAC3C9D,IAAOmH,EAAIc,EAAM,IAAI,GACrB4B,IAAQ1C,EAAIc,EAAM,SAAS,GAC3B8C,KAAQ,GAAgB,OAA8B;GAC1D,UAAU;GACV;GACA;GACA,YAAY,OAAOnB,CAAM;GACzB,oBAAoB;GACpB,GAAIO,IAAS,EAAE,YAAYA,EAAO,IAAI;EACxC,IACMjB,KAAU,MACd,kBAACjI,GAAD,EACE,OAAO;GACL,OAAO;GACP,QAAQ;GACR,cAAc;GACd,aAAa;GACb,iBAAiBC;EACnB,EACD,CAAA,GAEG8J,IAAiB;GACrB,QAAQC;GACR,eAAe;GACf,YAAY;EACd;EACA,EAAI,KACF,kBAAChK,GAAD;GAEE,GAAI8H,EAAKpJ,GAAG,SAAS;GACrB,OAAO,CACLuL,EAAYjF,CAAK,GACjB;IACE,MAAM3D,EAAE;IACR,KAAKA,EAAE;IACP,OAAOA,EAAE;IACT,QAAQA,EAAE;IACV,mBAAmB6I,IAAU;IAC7B,iBAAiBA,IAAU;GAC7B,CACF;GAEC,UAAArH,EAAI,OACDA,EAAI,KAAK,KAAK,GAAG,MACf,kBAACjD,GAAD;IAAc,eAAe;IAAG,OAAOkK,EAAK,KAAK/K,CAAI;IAClD,UAAA8F;GACG,GAFKlD,CAEL,CACP,IACD;IACE,kBAAC3B,GAAD;KAAkB,OAAO+J;KAAzB,UAAA,CACGI,EAAQ,aAAalC,EAAOkC,EAAQ,UAAU,IAAI,MACnD,kBAACvK,GAAD;MACE,eAAe;MACf,OAAO,CAACkK,EAAK,KAAK/K,CAAI,GAAG,EAAE,YAAY,EAAE,CAAC;MAEzC,UAAAoL,EAAQ;KACL,CAAA,CACF;IARI,GAAA,OAQJ;IACN,GAAIA,EAAQ,WACR,CACE,kBAACnK,GAAD;KAAqB,OAAO+J;KAC1B,UAAA,kBAACnK,GAAD;MACE,eAAe;MACf,OAAO,CACLkK,EAAK,KAAKlB,CAAK,GACf;OACE,UAAU;OACV,aAAauB,EAAQ,aAAa,KAAK;MACzC,CACF;MAEC,UAAAA,EAAQ;KACL,CAAA;IACF,GAbI,UAaJ,CACR,IACA,CAAC;IAEL,GAAGA,EAAQ,KAAK,KAAK,GAAG,MACtB,kBAACnK,GAAD;KAAc,OAAO+J;KAArB,UAAA;MACGlH,EAAI,cAAc,IACjB,kBAAC7C,GAAD;OAAM,OAAO,EAAE,OAAO6C,EAAI,YAAY;OACnC,UAAAiD,EAAE,QAAQmC,EAAOnC,EAAE,KAAK,IAAI;MACzB,CAAA,IACJ;MACJ,kBAAClG,GAAD;OACE,eAAe;OACf,OAAO,CAACkK,EAAK,KAAKlB,CAAK,GAAG,EAAE,YAAY,EAAE,CAAC;OAE1C,UAAA9C,EAAE;MACC,CAAA;MACN,kBAAClG,GAAD;OACE,eAAe;OACf,OAAO,CACLkK,EAAK,KAAK/K,CAAI,GACd;QACE,UAAU;QACV,YAAY;QACZ,WAAW;QACX,aAAa,CAAC,cAAc;OAC9B,CACF;OAEC,UAAA+G,EAAE;MACC,CAAA;KACF;IA1BK,GAAAnE,CA0BL,CACP;GACH;EACA,GA/EA,SA+EA,CACR;CACF;CACA,OAAOF;AACT;AAGA,IAAawI,KAAe,OAAkC;CAC5D,UAAU;CAEV,iBAAiB/D,EAAIlB,EAAM,MAAM,YAAY,EAAG;CAChD,aAAakB,EAAIlB,EAAM,MAAM,IAAI;CACjC,aAAa;CACb,cAAc;CACd,aAAa;CACb,eAAe;CACf,cAAc;CACd,cAAc;EAAE,OAAO;EAAG,QAAQ;CAAE;CACpC,WAAW;AACb"}
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
annotationRect,
|
|
19
19
|
annotationTextBox,
|
|
20
20
|
annotationTitleLayout,
|
|
21
|
+
liftedBarRect,
|
|
21
22
|
scenePrimitives,
|
|
22
23
|
toCss,
|
|
23
24
|
type ChartPrimitive,
|
|
@@ -1138,6 +1139,7 @@ export function drawHover(
|
|
|
1138
1139
|
</View>,
|
|
1139
1140
|
);
|
|
1140
1141
|
}
|
|
1142
|
+
let veiled = false;
|
|
1141
1143
|
hover?.marks.forEach((m, i) => {
|
|
1142
1144
|
if (m.kind === "band") {
|
|
1143
1145
|
out.push(
|
|
@@ -1154,6 +1156,56 @@ export function drawHover(
|
|
|
1154
1156
|
);
|
|
1155
1157
|
return;
|
|
1156
1158
|
}
|
|
1159
|
+
if (m.kind === "bar") {
|
|
1160
|
+
// the plot behind lifted bars is veiled so the hovered one stands out
|
|
1161
|
+
if (!veiled) {
|
|
1162
|
+
veiled = true;
|
|
1163
|
+
out.push(
|
|
1164
|
+
box(
|
|
1165
|
+
"veil",
|
|
1166
|
+
plot.x,
|
|
1167
|
+
plot.y,
|
|
1168
|
+
plot.width,
|
|
1169
|
+
plot.height,
|
|
1170
|
+
css(theme.background, 0.42),
|
|
1171
|
+
),
|
|
1172
|
+
);
|
|
1173
|
+
}
|
|
1174
|
+
// lifted: thicker across (never longer: the length is the value), a
|
|
1175
|
+
// shadow and a ring inside its edge
|
|
1176
|
+
const r = liftedBarRect(m);
|
|
1177
|
+
if (m.backdrop)
|
|
1178
|
+
out.push(
|
|
1179
|
+
box(
|
|
1180
|
+
`under-${i}`,
|
|
1181
|
+
r.x,
|
|
1182
|
+
r.y,
|
|
1183
|
+
r.width,
|
|
1184
|
+
r.height,
|
|
1185
|
+
css(theme.background),
|
|
1186
|
+
{
|
|
1187
|
+
borderRadius: m.radius,
|
|
1188
|
+
},
|
|
1189
|
+
),
|
|
1190
|
+
);
|
|
1191
|
+
out.push(
|
|
1192
|
+
box(`mark-${i}`, r.x, r.y, r.width, r.height, m.color, {
|
|
1193
|
+
borderRadius: m.radius,
|
|
1194
|
+
...(m.ring
|
|
1195
|
+
? {
|
|
1196
|
+
borderWidth: m.backdrop ? 2 : 1.5,
|
|
1197
|
+
borderColor: m.ring,
|
|
1198
|
+
shadowColor: "#0f172a",
|
|
1199
|
+
shadowOpacity: 0.4,
|
|
1200
|
+
shadowRadius: 6,
|
|
1201
|
+
shadowOffset: { width: 0, height: 3 },
|
|
1202
|
+
elevation: 4,
|
|
1203
|
+
}
|
|
1204
|
+
: null),
|
|
1205
|
+
}),
|
|
1206
|
+
);
|
|
1207
|
+
return;
|
|
1208
|
+
}
|
|
1157
1209
|
if (m.kind === "cell") {
|
|
1158
1210
|
// lifted: a little larger, a shadow, a ring inside its edge
|
|
1159
1211
|
const grow = Math.min(3, m.width * 0.06, m.height * 0.06);
|
|
@@ -1187,7 +1239,7 @@ export function drawHover(
|
|
|
1187
1239
|
"transparent",
|
|
1188
1240
|
{
|
|
1189
1241
|
borderRadius: Math.max(1, m.radius - inset / 2),
|
|
1190
|
-
borderWidth:
|
|
1242
|
+
borderWidth: 2,
|
|
1191
1243
|
borderColor: m.ring,
|
|
1192
1244
|
},
|
|
1193
1245
|
),
|
|
@@ -1340,7 +1392,8 @@ export function drawHover(
|
|
|
1340
1392
|
/** Look of the tooltips (default and `renderTooltip` content) */
|
|
1341
1393
|
export const tooltipCard = (scene: ChartScene): ViewStyle => ({
|
|
1342
1394
|
position: "absolute",
|
|
1343
|
-
|
|
1395
|
+
// translucent: the marks behind stay visible (no backdrop blur on native)
|
|
1396
|
+
backgroundColor: css(scene.theme.background, 0.9),
|
|
1344
1397
|
borderColor: css(scene.theme.axis),
|
|
1345
1398
|
borderWidth: 1,
|
|
1346
1399
|
borderRadius: 8,
|