PluginProbe ʕ •ᴥ•ʔ
Presto Player / trunk
Presto Player vtrunk
4.3.0 4.2.4 4.2.3 4.2.2 4.2.0 4.2.1 trunk 1.10.0 1.10.1 1.10.2 1.11.0 1.12.0 1.13.0 1.14.0 1.14.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.13 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3-beta1 2.3.0 2.3.1 2.3.2 2.3.3 3.0.0 3.0.0-beta1 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.1.0 3.1.1 3.1.2 3.1.3 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4
presto-player / src / admin / dashboard / components / charts / ChartTooltip.js
presto-player / src / admin / dashboard / components / charts Last commit date
ChartActiveDot.js 1 month ago ChartCrosshair.js 1 month ago ChartTooltip.js 1 month ago EngagementAreaChart.js 1 month ago RetentionTooltip.js 1 month ago chartTheme.js 1 month ago index.js 1 month ago
ChartTooltip.js
89 lines
1 import {
2 TOOLTIP_BG,
3 TOOLTIP_BORDER,
4 TOOLTIP_SHADOW,
5 TOOLTIP_RADIUS,
6 TOOLTIP_TEXT_PRIMARY,
7 TOOLTIP_TEXT_SECONDARY,
8 } from "./chartTheme";
9
10 /**
11 * Stripe-inspired chart tooltip.
12 * White bg, multi-layer shadow, stacked date/metric/value layout.
13 *
14 * @param {boolean} active - Whether tooltip is visible (from Recharts)
15 * @param {Array} payload - Data points at cursor position (from Recharts)
16 * @param {string} label - X-axis label at cursor position (from Recharts)
17 * @param {Function} formatter - Optional value formatter (e.g., humanSeconds)
18 * @param {string} metricLabel - Label for the metric (e.g., "Views", "Watch Time")
19 * @param {boolean} showComparison - Whether to show "vs prev" comparison row (deferred — requires API support for previous period data)
20 */
21 const ChartTooltip = ({ active, payload, label, formatter, metricLabel, showComparison = false }) => {
22 if (!active || !payload || payload.length === 0) return null;
23
24 const value = payload[0]?.value;
25 const displayValue = formatter
26 ? formatter(value)
27 : typeof value === "number"
28 ? value.toLocaleString()
29 : value;
30
31 return (
32 <div
33 style={{
34 background: TOOLTIP_BG,
35 border: `1px solid ${TOOLTIP_BORDER}`,
36 borderRadius: `${TOOLTIP_RADIUS}px`,
37 boxShadow: TOOLTIP_SHADOW,
38 padding: "12px 16px",
39 fontVariantNumeric: "tabular-nums",
40 transition: "opacity 100ms ease",
41 }}
42 >
43 {/* Date label */}
44 <div
45 style={{
46 fontSize: "11px",
47 color: TOOLTIP_TEXT_SECONDARY,
48 marginBottom: "6px",
49 }}
50 >
51 {label}
52 </div>
53
54 {/* Metric + Value */}
55 <div
56 style={{
57 display: "flex",
58 justifyContent: "space-between",
59 alignItems: "baseline",
60 gap: "16px",
61 }}
62 >
63 {metricLabel && (
64 <span
65 style={{
66 fontSize: "13px",
67 fontWeight: 500,
68 color: TOOLTIP_TEXT_PRIMARY,
69 }}
70 >
71 {metricLabel}
72 </span>
73 )}
74 <span
75 style={{
76 fontSize: "13px",
77 fontWeight: 600,
78 color: TOOLTIP_TEXT_PRIMARY,
79 }}
80 >
81 {displayValue}
82 </span>
83 </div>
84 </div>
85 );
86 };
87
88 export default ChartTooltip;
89