{"version":3,"file":"TooltipPlugin2.cjs","sources":["../../../../../src/components/uPlot/plugins/TooltipPlugin2.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { useLayoutEffect, useRef, useReducer, CSSProperties } from 'react';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport uPlot from 'uplot';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { DashboardCursorSync } from '@grafana/schema';\n\nimport { AdHocFilterModel } from '../../../internal';\nimport { useStyles2 } from '../../../themes/ThemeContext';\nimport { RangeSelection1D, RangeSelection2D, OnSelectRangeCallback } from '../../PanelChrome';\nimport { getPortalContainer } from '../../Portal/Portal';\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\n\nimport { CloseButton } from './CloseButton';\n\nexport const DEFAULT_TOOLTIP_WIDTH = undefined;\nexport const TOOLTIP_OFFSET = 10;\n\n// todo: barchart? histogram?\nexport const enum TooltipHoverMode {\n  // Single mode in TimeSeries, Candlestick, Trend, StateTimeline, Heatmap?\n  xOne,\n  // All mode in TimeSeries, Candlestick, Trend, StateTimeline, Heatmap?\n  xAll,\n  // Single mode in XYChart, Heatmap?\n  xyOne,\n}\n\ntype GetDataLinksCallback = (seriesIdx: number, dataIdx: number) => LinkModel[];\ntype GetAdHocFiltersCallback = (seriesIdx: number, dataIdx: number) => AdHocFilterModel[];\n\ninterface TooltipPlugin2Props {\n  config: UPlotConfigBuilder;\n  hoverMode: TooltipHoverMode;\n\n  syncMode?: DashboardCursorSync;\n  syncScope?: string;\n\n  // x only\n  queryZoom?: (range: { from: number; to: number }) => void;\n  // y-only, via shiftKey\n  clientZoom?: boolean;\n\n  onSelectRange?: OnSelectRangeCallback;\n  getDataLinks?: GetDataLinksCallback;\n  getAdHocFilters?: GetAdHocFiltersCallback;\n\n  render: (\n    u: uPlot,\n    dataIdxs: Array<number | null>,\n    seriesIdx: number | null,\n    isPinned: boolean,\n    dismiss: () => void,\n    // selected time range (for annotation triggering)\n    timeRange: TimeRange2 | null,\n    viaSync: boolean,\n    dataLinks: LinkModel[],\n    adHocFilters: AdHocFilterModel[]\n  ) => React.ReactNode;\n\n  maxWidth?: number;\n}\n\ninterface TooltipContainerState {\n  plot?: uPlot | null;\n  style: Partial<CSSProperties>;\n  isHovering: boolean;\n  isPinned: boolean;\n  dismiss: () => void;\n  contents?: React.ReactNode;\n}\n\ninterface TooltipContainerSize {\n  observer: ResizeObserver;\n  width: number;\n  height: number;\n}\n\nexport interface TimeRange2 {\n  from: number;\n  to: number;\n}\n\nfunction mergeState(prevState: TooltipContainerState, nextState: Partial<TooltipContainerState>) {\n  return {\n    ...prevState,\n    ...nextState,\n    style: {\n      ...prevState.style,\n      ...nextState.style,\n    },\n  };\n}\n\nfunction initState(): TooltipContainerState {\n  return {\n    style: { transform: '', pointerEvents: 'none' },\n    isHovering: false,\n    isPinned: false,\n    contents: null,\n    plot: null,\n    dismiss: () => {},\n  };\n}\n\n// min px width that triggers zoom\nconst MIN_ZOOM_DIST = 5;\n\nconst maybeZoomAction = (e?: MouseEvent | null) => e != null && !e.ctrlKey && !e.metaKey;\n\nconst getDataLinksFallback: GetDataLinksCallback = () => [];\nconst getAdHocFiltersFallback: GetAdHocFiltersCallback = () => [];\n\nconst userAgentIsMobile = /Android|iPhone|iPad/i.test(navigator.userAgent);\n\n/**\n * @alpha\n */\nexport const TooltipPlugin2 = ({\n  config,\n  hoverMode,\n  render,\n  clientZoom = false,\n  queryZoom,\n  onSelectRange,\n  maxWidth,\n  syncMode = DashboardCursorSync.Off,\n  syncScope = 'global', // eventsScope\n  getDataLinks = getDataLinksFallback,\n  getAdHocFilters = getAdHocFiltersFallback,\n}: TooltipPlugin2Props) => {\n  const domRef = useRef<HTMLDivElement>(null);\n  const portalRoot = useRef<HTMLElement | null>(null);\n\n  if (portalRoot.current == null) {\n    portalRoot.current = getPortalContainer();\n  }\n\n  const [{ plot, isHovering, isPinned, contents, style, dismiss }, setState] = useReducer(mergeState, null, initState);\n\n  const sizeRef = useRef<TooltipContainerSize | undefined>(undefined);\n  const styles = useStyles2(getStyles, maxWidth);\n\n  const renderRef = useRef(render);\n  renderRef.current = render;\n\n  const getLinksRef = useRef(getDataLinks);\n  getLinksRef.current = getDataLinks;\n\n  const getAdHocFiltersRef = useRef(getAdHocFilters);\n  getAdHocFiltersRef.current = getAdHocFilters;\n\n  useLayoutEffect(() => {\n    sizeRef.current?.observer.disconnect();\n\n    sizeRef.current = {\n      width: 0,\n      height: 0,\n      observer: new ResizeObserver((entries) => {\n        let size = sizeRef.current!;\n\n        for (const entry of entries) {\n          if (entry.borderBoxSize?.length > 0) {\n            size.width = entry.borderBoxSize[0].inlineSize;\n            size.height = entry.borderBoxSize[0].blockSize;\n          } else {\n            size.width = entry.contentRect.width;\n            size.height = entry.contentRect.height;\n          }\n        }\n      }),\n    };\n\n    let yZoomed = false;\n    let yDrag = false;\n\n    let _plot = plot;\n    let _isHovering = isHovering;\n    let _someSeriesIdx = false;\n    let _isPinned = isPinned;\n    let _style = style;\n\n    let plotVisible = false;\n\n    const syncTooltip = syncMode === DashboardCursorSync.Tooltip;\n\n    if (syncMode !== DashboardCursorSync.Off && config.scales[0].props.isTime) {\n      config.setCursor({\n        sync: {\n          key: syncScope,\n          scales: ['x', null],\n        },\n      });\n    }\n\n    const updateHovering = () => {\n      if (viaSync) {\n        _isHovering = plotVisible && _someSeriesIdx && syncTooltip;\n      } else {\n        _isHovering = closestSeriesIdx != null || (hoverMode === TooltipHoverMode.xAll && _someSeriesIdx);\n      }\n    };\n\n    let offsetX = 0;\n    let offsetY = 0;\n\n    let selectedRange: TimeRange2 | null = null;\n    let seriesIdxs: Array<number | null> = [];\n    let closestSeriesIdx: number | null = null;\n    let viaSync = false;\n    let dataLinks: LinkModel[] = [];\n    let adHocFilters: AdHocFilterModel[] = [];\n\n    // for onceClick link rendering during mousemoves we use these pre-generated first links or actions\n    // these will be wrong if the titles have interpolation using the hovered *value*\n    // but this should be quite rare. we'll fix it if someone actually encounters this\n    let persistentLinks: LinkModel[][] = [];\n\n    let pendingRender = false;\n    let pendingPinned = false;\n\n    const scheduleRender = (setPinned = false) => {\n      if (!pendingRender) {\n        // defer unrender for 100ms to reduce flickering in small gaps\n        if (!_isHovering) {\n          setTimeout(_render, 100);\n        } else {\n          queueMicrotask(_render);\n        }\n\n        pendingRender = true;\n      }\n\n      if (setPinned) {\n        pendingPinned = true;\n      }\n    };\n\n    // in some ways this is similar to ClickOutsideWrapper.tsx\n    const downEventOutside = (e: Event) => {\n      if (e instanceof KeyboardEvent) {\n        if (e.key === 'Escape') {\n          e.preventDefault();\n          e.stopPropagation();\n          dismiss();\n        }\n        return;\n      }\n\n      // this tooltip is Portaled, but actions inside it create forms in Modals\n      const isModalOrPortaled = '[role=\"dialog\"], #grafana-portal-container';\n\n      // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n      if ((e.target as HTMLElement).closest(isModalOrPortaled) == null) {\n        dismiss();\n      }\n    };\n\n    const _render = () => {\n      pendingRender = false;\n\n      if (pendingPinned) {\n        _style = { pointerEvents: _isPinned ? 'all' : 'none' };\n\n        // @ts-ignore\n        _plot!.cursor._lock = _isPinned;\n\n        if (_isPinned) {\n          document.addEventListener('mousedown', downEventOutside, true);\n          document.addEventListener('keydown', downEventOutside, true);\n        } else {\n          document.removeEventListener('mousedown', downEventOutside, true);\n          document.removeEventListener('keydown', downEventOutside, true);\n        }\n\n        pendingPinned = false;\n      }\n\n      let state: TooltipContainerState = {\n        style: _style,\n        isPinned: _isPinned,\n        isHovering: _isHovering,\n        contents:\n          _isHovering || selectedRange != null\n            ? renderRef.current(\n                _plot!,\n                seriesIdxs,\n                closestSeriesIdx,\n                _isPinned,\n                dismiss,\n                selectedRange,\n                viaSync,\n                _isPinned ? dataLinks : closestSeriesIdx != null ? persistentLinks[closestSeriesIdx] : [],\n                _isPinned ? adHocFilters : []\n              )\n            : null,\n        dismiss,\n      };\n\n      setState(state);\n\n      // TODO: set u.over.style.cursor = 'pointer' if we hovered a oneClick point\n      // else revert to default...but only when the new pointer is different from prev\n\n      selectedRange = null;\n    };\n\n    const dismiss = () => {\n      let prevIsPinned = _isPinned;\n      _isPinned = false;\n      _isHovering = false;\n      _plot!.setCursor({ left: -10, top: -10 });\n      dataLinks = [];\n      adHocFilters = [];\n\n      scheduleRender(prevIsPinned);\n    };\n\n    config.addHook('init', (u) => {\n      setState({ plot: (_plot = u) });\n\n      // detect shiftKey and mutate drag mode from x-only to y-only\n      if (clientZoom) {\n        u.over.addEventListener(\n          'mousedown',\n          (e) => {\n            if (!maybeZoomAction(e)) {\n              return;\n            }\n\n            if (e.button === 0 && e.shiftKey) {\n              yDrag = true;\n\n              u.cursor.drag!.x = false;\n              u.cursor.drag!.y = true;\n\n              let onUp = (e: MouseEvent) => {\n                u.cursor.drag!.x = true;\n                u.cursor.drag!.y = false;\n                document.removeEventListener('mouseup', onUp, true);\n              };\n\n              document.addEventListener('mouseup', onUp, true);\n            }\n          },\n          true\n        );\n      }\n\n      // add zoom-in cursor during drag-to-zoom interaction\n      if (queryZoom != null || clientZoom) {\n        u.over.addEventListener(\n          'mousedown',\n          (e) => {\n            if (!maybeZoomAction(e)) {\n              return;\n            }\n\n            if (e.button === 0) {\n              u.over.classList.add('zoom-drag');\n\n              let onUp = () => {\n                u.over.classList.remove('zoom-drag');\n                document.removeEventListener('mouseup', onUp, true);\n              };\n\n              document.addEventListener('mouseup', onUp, true);\n            }\n          },\n          true\n        );\n      }\n\n      // this handles pinning, 0-width range selection, and one-click\n      u.over.addEventListener('click', (e) => {\n        if (e.target === u.over) {\n          if (e.ctrlKey || e.metaKey) {\n            let xVal;\n\n            const isXAxisHorizontal = u.scales.x.ori === 0;\n            if (isXAxisHorizontal) {\n              xVal = u.posToVal(u.cursor.left!, 'x');\n            } else {\n              xVal = u.posToVal(u.select.top + u.select.height, 'x');\n            }\n\n            selectedRange = {\n              from: xVal,\n              to: xVal,\n            };\n\n            scheduleRender(false);\n          }\n          // if tooltip visible, not pinned, and within proximity to a series/point\n          else if (_isHovering && !_isPinned && closestSeriesIdx != null) {\n            dataLinks = getLinksRef.current(closestSeriesIdx, seriesIdxs[closestSeriesIdx]!);\n            adHocFilters = getAdHocFiltersRef.current(closestSeriesIdx, seriesIdxs[closestSeriesIdx]!);\n            const oneClickLink = dataLinks.find((dataLink) => dataLink.oneClick === true);\n\n            if (oneClickLink != null) {\n              window.open(oneClickLink.href, oneClickLink.target ?? '_self');\n            } else {\n              setTimeout(() => {\n                _isPinned = true;\n                scheduleRender(true);\n              }, 0);\n            }\n          }\n        }\n      });\n    });\n\n    config.addHook('setSelect', (u) => {\n      const isXAxisHorizontal = u.scales.x.ori === 0;\n\n      if (!viaSync && (clientZoom || queryZoom != null)) {\n        if (maybeZoomAction(u.cursor!.event)) {\n          if (onSelectRange != null) {\n            let selections: RangeSelection2D[] = [];\n\n            const yDrag = Boolean(u.cursor!.drag!.y);\n            const xDrag = Boolean(u.cursor!.drag!.x);\n\n            let xSel = null;\n            let ySels: RangeSelection1D[] = [];\n\n            // get x selection\n            if (xDrag) {\n              xSel = {\n                from: isXAxisHorizontal\n                  ? u.posToVal(u.select.left!, 'x')\n                  : u.posToVal(u.select.top + u.select.height, 'x'),\n                to: isXAxisHorizontal\n                  ? u.posToVal(u.select.left! + u.select.width, 'x')\n                  : u.posToVal(u.select.top, 'x'),\n              };\n            }\n\n            // get y selections\n            if (yDrag) {\n              config.scales.forEach((scale) => {\n                const key = scale.props.scaleKey;\n\n                if (key !== 'x') {\n                  let ySel = {\n                    from: isXAxisHorizontal\n                      ? u.posToVal(u.select.top + u.select.height, key)\n                      : u.posToVal(u.select.left + u.select.width, key),\n                    to: isXAxisHorizontal ? u.posToVal(u.select.top, key) : u.posToVal(u.select.left, key),\n                  };\n\n                  ySels.push(ySel);\n                }\n              });\n            }\n\n            if (xDrag) {\n              if (yDrag) {\n                // x + y\n                selections = ySels.map((ySel) => ({ x: xSel!, y: ySel }));\n              } else {\n                // x only\n                selections = [{ x: xSel! }];\n              }\n            } else {\n              if (yDrag) {\n                // y only\n                selections = ySels.map((ySel) => ({ y: ySel }));\n              }\n            }\n\n            onSelectRange(selections);\n          } else if (clientZoom && yDrag) {\n            if (u.select.height >= MIN_ZOOM_DIST) {\n              for (let key in u.scales!) {\n                if (key !== 'x') {\n                  const maxY = isXAxisHorizontal\n                    ? u.posToVal(u.select.top, key)\n                    : u.posToVal(u.select.left + u.select.width, key);\n                  const minY = isXAxisHorizontal\n                    ? u.posToVal(u.select.top + u.select.height, key)\n                    : u.posToVal(u.select.left, key);\n\n                  u.setScale(key, { min: minY, max: maxY });\n                }\n              }\n\n              yZoomed = true;\n            }\n\n            yDrag = false;\n          } else if (queryZoom != null) {\n            if (u.select.width >= MIN_ZOOM_DIST) {\n              const minX = isXAxisHorizontal\n                ? u.posToVal(u.select.left, 'x')\n                : u.posToVal(u.select.top + u.select.height, 'x');\n              const maxX = isXAxisHorizontal\n                ? u.posToVal(u.select.left + u.select.width, 'x')\n                : u.posToVal(u.select.top, 'x');\n\n              queryZoom({ from: minX, to: maxX });\n\n              yZoomed = false;\n            }\n          }\n        } else {\n          selectedRange = {\n            from: isXAxisHorizontal ? u.posToVal(u.select.left!, 'x') : u.posToVal(u.select.top + u.select.height, 'x'),\n            to: isXAxisHorizontal ? u.posToVal(u.select.left! + u.select.width, 'x') : u.posToVal(u.select.top, 'x'),\n          };\n\n          scheduleRender(true);\n        }\n      }\n\n      // manually hide selected region (since cursor.drag.setScale = false)\n      u.setSelect({ left: 0, width: 0, top: 0, height: 0 }, false);\n    });\n\n    if (clientZoom || queryZoom != null) {\n      config.setCursor({\n        bind: {\n          dblclick: (u) => () => {\n            if (!maybeZoomAction(u.cursor!.event)) {\n              return null;\n            }\n\n            if (clientZoom && yZoomed) {\n              for (let key in u.scales!) {\n                if (key !== 'x') {\n                  // @ts-ignore (this is not typed correctly in uPlot, assigning nulls means auto-scale / reset)\n                  u.setScale(key, { min: null, max: null });\n                }\n              }\n\n              yZoomed = false;\n            } else if (queryZoom != null) {\n              let xScale = u.scales.x;\n\n              const frTs = xScale.min!;\n              const toTs = xScale.max!;\n              const pad = (toTs - frTs) / 2;\n\n              queryZoom({ from: frTs - pad, to: toTs + pad });\n            }\n\n            return null;\n          },\n        },\n      });\n    }\n\n    config.addHook('setData', (u) => {\n      yZoomed = false;\n      yDrag = false;\n\n      if (_isPinned) {\n        dismiss();\n      }\n    });\n\n    // fires on series focus/proximity changes\n    // e.g. to highlight the hovered/closest series\n    // TODO: we only need this for multi/all mode?\n    config.addHook('setSeries', (u, seriesIdx) => {\n      closestSeriesIdx = seriesIdx;\n\n      viaSync = u.cursor.event == null;\n      updateHovering();\n      scheduleRender();\n    });\n\n    // fires on data value hovers/unhovers\n    config.addHook('setLegend', (u) => {\n      seriesIdxs = _plot?.cursor!.idxs!.slice()!;\n      _someSeriesIdx = seriesIdxs.some((v, i) => i > 0 && v != null);\n\n      if (persistentLinks.length === 0) {\n        persistentLinks = seriesIdxs.map((v, seriesIdx) => {\n          if (seriesIdx > 0) {\n            const links = getDataLinks(seriesIdx, seriesIdxs[seriesIdx]!);\n            const oneClickLink = links.find((dataLink) => dataLink.oneClick === true);\n\n            if (oneClickLink) {\n              return [oneClickLink];\n            }\n          }\n\n          return [];\n        });\n      }\n\n      viaSync = u.cursor.event == null;\n      let prevIsHovering = _isHovering;\n      updateHovering();\n\n      if (_isHovering || _isHovering !== prevIsHovering) {\n        scheduleRender();\n      }\n    });\n\n    const scrollbarWidth = 16;\n    let winWid = 0;\n    let winHgt = 0;\n\n    const updateWinSize = () => {\n      _isHovering && !_isPinned && dismiss();\n\n      winWid = window.innerWidth - scrollbarWidth;\n      winHgt = window.innerHeight - scrollbarWidth;\n    };\n\n    const updatePlotVisible = () => {\n      plotVisible =\n        _plot!.rect.bottom <= winHgt && _plot!.rect.top >= 0 && _plot!.rect.left >= 0 && _plot!.rect.right <= winWid;\n    };\n\n    updateWinSize();\n    config.addHook('ready', updatePlotVisible);\n\n    // fires on mousemoves\n    config.addHook('setCursor', (u) => {\n      viaSync = u.cursor.event == null;\n\n      if (!_isHovering) {\n        return;\n      }\n\n      let { left = -10, top = -10 } = u.cursor;\n\n      if (left >= 0 || top >= 0) {\n        let clientX = u.rect.left + left;\n        let clientY = u.rect.top + top;\n\n        let transform = '';\n\n        let { width, height } = sizeRef.current!;\n\n        width += TOOLTIP_OFFSET;\n        height += TOOLTIP_OFFSET;\n\n        if (offsetY !== 0) {\n          if (clientY + height < winHgt || clientY - height < 0) {\n            offsetY = 0;\n          } else if (offsetY !== -height) {\n            offsetY = -height;\n          }\n        } else {\n          if (clientY + height > winHgt && clientY - height >= 0) {\n            offsetY = -height;\n          }\n        }\n\n        if (offsetX !== 0) {\n          if (clientX + width < winWid || clientX - width < 0) {\n            offsetX = 0;\n          } else if (offsetX !== -width) {\n            offsetX = -width;\n          }\n        } else {\n          if (clientX + width > winWid && clientX - width >= 0) {\n            offsetX = -width;\n          }\n        }\n\n        const shiftX = clientX + (offsetX === 0 ? TOOLTIP_OFFSET : -TOOLTIP_OFFSET);\n        const shiftY = clientY + (offsetY === 0 ? TOOLTIP_OFFSET : -TOOLTIP_OFFSET);\n\n        const reflectX = offsetX === 0 ? '' : 'translateX(-100%)';\n        const reflectY = offsetY === 0 ? '' : 'translateY(-100%)';\n\n        // TODO: to a transition only when switching sides\n        // transition: transform 100ms;\n\n        transform = `translateX(${shiftX}px) ${reflectX} translateY(${shiftY}px) ${reflectY}`;\n\n        if (domRef.current != null) {\n          domRef.current.style.transform = transform;\n        } else {\n          _style.transform = transform;\n          scheduleRender();\n        }\n      }\n    });\n\n    const onscroll = (e: Event) => {\n      updatePlotVisible();\n      _isHovering && e.target instanceof Node && e.target.contains(_plot!.root) && dismiss();\n    };\n\n    window.addEventListener('resize', updateWinSize);\n    window.addEventListener('scroll', onscroll, true);\n\n    return () => {\n      sizeRef.current?.observer.disconnect();\n\n      window.removeEventListener('resize', updateWinSize);\n      window.removeEventListener('scroll', onscroll, true);\n\n      // in case this component unmounts while anchored (due to data auto-refresh + re-config)\n      document.removeEventListener('mousedown', downEventOutside, true);\n      document.removeEventListener('keydown', downEventOutside, true);\n    };\n  }, [config]);\n\n  useLayoutEffect(() => {\n    const size = sizeRef.current!;\n\n    if (domRef.current != null) {\n      size.observer.disconnect();\n      size.observer.observe(domRef.current);\n\n      // since the above observer is attached after container is in DOM, we need to manually update sizeRef\n      // and re-trigger a cursor move to do initial positioning math\n      const { width, height } = domRef.current.getBoundingClientRect();\n      size.width = width;\n      size.height = height;\n\n      let event = plot!.cursor.event;\n\n      // if not viaSync, re-dispatch real event\n      if (event != null) {\n        // we expect to re-dispatch mousemove, but may have a different event type, so create a mousemove event and fire that instead\n        // this doesn't work for every mobile device, so fall back to checking the useragent as well\n        const isMobile = event.type !== 'mousemove' || userAgentIsMobile;\n\n        if (isMobile) {\n          event = new MouseEvent('mousemove', {\n            view: window,\n            bubbles: true,\n            cancelable: true,\n            clientX: event.clientX,\n            clientY: event.clientY,\n            screenX: event.screenX,\n            screenY: event.screenY,\n          });\n        }\n\n        // this works around the fact that uPlot does not unset cursor.event (for perf reasons)\n        // so if the last real mouse event was mouseleave and you manually trigger u.setCursor()\n        // it would end up re-dispatching mouseleave\n        const isStaleEvent = isMobile ? false : performance.now() - event.timeStamp > 16;\n\n        !isStaleEvent && plot!.over.dispatchEvent(event);\n      } else {\n        plot!.setCursor(\n          {\n            left: plot!.cursor.left!,\n            top: plot!.cursor.top!,\n          },\n          true\n        );\n      }\n    } else {\n      size.width = 0;\n      size.height = 0;\n    }\n  }, [isHovering]);\n\n  if (plot && isHovering) {\n    return createPortal(\n      <div\n        className={cx(styles.tooltipWrapper, isPinned && styles.pinned)}\n        style={style}\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n        ref={domRef}\n      >\n        {isPinned && <CloseButton onClick={dismiss} />}\n        {contents}\n      </div>,\n      portalRoot.current\n    );\n  }\n\n  return null;\n};\n\nconst getStyles = (theme: GrafanaTheme2, maxWidth?: number) => ({\n  tooltipWrapper: css({\n    top: 0,\n    left: 0,\n    zIndex: theme.zIndex.tooltip,\n    whiteSpace: 'pre',\n    borderRadius: theme.shape.radius.default,\n    position: 'fixed',\n    background: theme.colors.background.elevated,\n    border: `1px solid ${theme.colors.border.weak}`,\n    boxShadow: theme.shadows.z2,\n    userSelect: 'text',\n    maxWidth: maxWidth ?? 'none',\n  }),\n  pinned: css({\n    boxShadow: theme.shadows.z3,\n  }),\n});\n"],"names":["TooltipHoverMode","DashboardCursorSync","useRef","getPortalContainer","useReducer","useStyles2","useLayoutEffect","_a","dismiss","e","yDrag","createPortal","jsxs","cx","jsx","CloseButton","css"],"mappings":"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"}