From f5797e389ecd22ef13ce6549da2577012e7d89dd Mon Sep 17 00:00:00 2001 From: Ian Reynolds Date: Sun, 16 Jul 2023 20:58:24 -0400 Subject: [PATCH] fix: Make sure SZ tooltip doesn't resize viewport --- common/components/maps/LineMap.tsx | 16 ++++++++++++--- modules/slowzones/map/SlowZonesMap.tsx | 10 ++++------ .../slowzones/map/SlowZonesTooltip.module.css | 7 ++++++- modules/slowzones/map/SlowZonesTooltip.tsx | 20 +++++++++++++++---- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/common/components/maps/LineMap.tsx b/common/components/maps/LineMap.tsx index a59bded2c..efe886220 100644 --- a/common/components/maps/LineMap.tsx +++ b/common/components/maps/LineMap.tsx @@ -33,9 +33,11 @@ export type SegmentRenderOptions = { labels?: SegmentLabel[]; }; +export type TooltipSide = 'left' | 'right' | 'top'; + type TooltipRenderer = (props: { segmentLocation: SegmentLocation; - isHorizontal: boolean; + side: TooltipSide; }) => React.ReactNode; type TooltipOptions = { @@ -247,9 +249,12 @@ export const LineMap: React.FC = ({ }; const renderTooltip = () => { + const tooltipX = tooltipViewportCoordinates?.x; + const tooltipOnRightSide = tooltipX && tooltipX / window.innerWidth <= 0.5; + const tooltipSide = isHorizontal ? 'top' : tooltipOnRightSide ? 'right' : 'left'; const tooltipContents = tooltipSegmentLocation && - tooltip?.render({ segmentLocation: tooltipSegmentLocation, isHorizontal }); + tooltip?.render({ segmentLocation: tooltipSegmentLocation, side: tooltipSide }); if (tooltipViewportCoordinates && tooltipContents) { const { x, y } = viewportCoordsToContainer(tooltipViewportCoordinates); return ( @@ -258,7 +263,12 @@ export const LineMap: React.FC = ({ style={{ left: x, top: y, - transform: isHorizontal ? `translateY(-100%) translateX(-50%)` : `translateY(-50%)`, + transform: + tooltipSide === 'top' + ? `translate(-50%, -100%)` + : tooltipSide === 'left' + ? `translate(-100%, -50%)` + : `translateY(-50%)`, }} > {tooltipContents} diff --git a/modules/slowzones/map/SlowZonesMap.tsx b/modules/slowzones/map/SlowZonesMap.tsx index 56c6e5cb9..18df154f1 100644 --- a/modules/slowzones/map/SlowZonesMap.tsx +++ b/modules/slowzones/map/SlowZonesMap.tsx @@ -6,7 +6,7 @@ import { LineMap, createDefaultDiagramForLine } from '../../../common/components import type { SlowZoneResponse, SpeedRestriction } from '../../../common/types/dataPoints'; import type { SlowZonesLineName } from '../types'; -import type { SegmentLabel } from '../../../common/components/maps/LineMap'; +import type { SegmentLabel, TooltipSide } from '../../../common/components/maps/LineMap'; import { getSlowZoneOpacity } from '../../../common/utils/slowZoneUtils'; import { useDelimitatedRoute } from '../../../common/utils/router'; import { segmentSlowZones } from './segment'; @@ -120,11 +120,11 @@ export const SlowZonesMap: React.FC = ({ const renderSlowZonesTooltip = (options: { segmentLocation: SegmentLocation; - isHorizontal: boolean; + side: TooltipSide; }) => { const { segmentLocation: { fromStationId, toStationId }, - isHorizontal, + side, } = options; const slowSegment = segments.find( (seg) => @@ -132,9 +132,7 @@ export const SlowZonesMap: React.FC = ({ seg.segmentLocation.toStationId === toStationId ); if (slowSegment) { - return ( - - ); + return ; } return null; diff --git a/modules/slowzones/map/SlowZonesTooltip.module.css b/modules/slowzones/map/SlowZonesTooltip.module.css index 111b99e16..575c13c8d 100644 --- a/modules/slowzones/map/SlowZonesTooltip.module.css +++ b/modules/slowzones/map/SlowZonesTooltip.module.css @@ -5,8 +5,9 @@ --tooltip-background: white; } -.vertical { +.reverseVertical { flex-direction: row; + flex-direction: row-reverse; } .horizontal { @@ -24,6 +25,10 @@ border-right: 8px solid white; } +.triangleReverse { + transform: scaleX(-1); +} + .triangleHorizontal { width: 0; height: 0; diff --git a/modules/slowzones/map/SlowZonesTooltip.tsx b/modules/slowzones/map/SlowZonesTooltip.tsx index 921169f48..7a163481d 100644 --- a/modules/slowzones/map/SlowZonesTooltip.tsx +++ b/modules/slowzones/map/SlowZonesTooltip.tsx @@ -5,6 +5,7 @@ import { getParentStationForStopId } from '../../../common/utils/stations'; import { BasicWidgetDataLayout } from '../../../common/components/widgets/internal/BasicWidgetDataLayout'; import { DeltaTimeWidgetValue } from '../../../common/types/basicWidgets'; +import type { TooltipSide } from '../../../common/components/maps/LineMap'; import type { SlowZoneResponse, SpeedRestriction } from '../../../common/types/dataPoints'; import { prettyDate } from '../../../common/utils/date'; @@ -16,8 +17,8 @@ import styles from './SlowZonesTooltip.module.css'; interface SlowZonesTooltipProps { segment: SlowZonesSegment; - isHorizontal: boolean; color: string; + side: TooltipSide; } const getOrderedStationNames = (slowZones: ByDirection) => { @@ -44,11 +45,13 @@ const getOrderedStationNames = (slowZones: ByDirection) => { export const SlowZonesTooltip: React.FC = (props) => { const { - isHorizontal, + side, color, segment: { slowZones, speedRestrictions }, } = props; + const isHorizontal = side === 'top'; + const { fromStationName, toStationName } = useMemo( () => getOrderedStationNames(slowZones)!, [slowZones] @@ -125,9 +128,18 @@ export const SlowZonesTooltip: React.FC = (props) => { return (
-
+
{fromStationName} — {toStationName}