diff --git a/client/src/Components/design-elements/Dot.tsx b/client/src/Components/design-elements/Dot.tsx index 541e90812..ff97de9b4 100644 --- a/client/src/Components/design-elements/Dot.tsx +++ b/client/src/Components/design-elements/Dot.tsx @@ -1,18 +1,28 @@ import type { CSSProperties } from "react"; +export const DotSizes = ["xs", "sm", "md", "lg"] as const; +export type DotSize = (typeof DotSizes)[number]; + +const DOT_SIZE_PX: Record = { + xs: "2px", + sm: "4px", + md: "8px", + lg: "12px", +}; + interface DotProps { color?: string; - size?: string; + size?: DotSize; style?: CSSProperties; } -export const Dot = ({ color = "gray", size = "4px", style }: DotProps) => { +export const Dot = ({ color = "gray", size = "sm", style }: DotProps) => { return ( @@ -128,6 +128,8 @@ export const HistogramDetails = ({ range: string; }) => { const [showTimingPhases, setShowTimingPhases] = useState(false); + const [hoveredPhase, setHoveredPhase] = useState(null); + const { t } = useTranslation(); const theme = useTheme(); const uiTimezone = useSelector((state: RootState) => state.ui.timezone); @@ -267,6 +269,7 @@ export const HistogramDetails = ({ {hasTimingPhases && showTimingPhases && PHASE_KEYS.map((key) => { + const dimmed = hoveredPhase !== null && hoveredPhase !== key; return ( ); })} + + {showTimingPhases ? ( + PHASE_KEYS.map((key) => { + return ( + setHoveredPhase(key)} + onMouseLeave={() => setHoveredPhase(null)} + > + + {t(PHASE_LABEL_KEYS[key])} + + ); + }) + ) : ( + setHoveredPhase("avgResponseTime")} + onMouseLeave={() => setHoveredPhase(null)} + > + + + {t("common.charts.labels.totalResponseTime")} + + + )} + ); }; diff --git a/client/src/locales/en.json b/client/src/locales/en.json index 82d144b1c..ce7f74dfb 100644 --- a/client/src/locales/en.json +++ b/client/src/locales/en.json @@ -70,6 +70,7 @@ "low": "Low", "responseTime": "Response time", "timingPhases": "Timing phases", + "totalResponseTime": "Total response time", "uptime": "Uptime" }, "histogram": {