{"version":3,"file":"FlameGraphContainer.cjs","sources":["../../src/FlameGraphContainer.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport uFuzzy from '@leeoniya/ufuzzy';\nimport { useCallback, useEffect, useMemo, useState, useRef } from 'react';\nimport * as React from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\nimport { type DataFrame, type GrafanaTheme2, escapeStringForRegex } from '@grafana/data';\nimport { ThemeContext } from '@grafana/ui';\n\nimport FlameGraph from './FlameGraph/FlameGraph';\nimport { type GetExtraContextMenuButtonsFunction } from './FlameGraph/FlameGraphContextMenu';\nimport { CollapsedMap, FlameGraphDataContainer } from './FlameGraph/dataTransform';\nimport FlameGraphHeader from './FlameGraphHeader';\nimport FlameGraphPane from './FlameGraphPane';\nimport FlameGraphTopTableContainer from './TopTable/FlameGraphTopTableContainer';\nimport {\n  MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH,\n  MIN_WIDTH_FOR_SPLIT_VIEW,\n  FLAMEGRAPH_CONTAINER_HEIGHT,\n} from './constants';\nimport { useColorScheme } from './hooks';\nimport { type ClickedItemData, PaneView, SelectedView, type TextAlign, ViewMode } from './types';\nimport { getAssistantContextFromDataFrame } from './utils';\n\nconst ufuzzy = new uFuzzy();\n\nexport type Props = {\n  /**\n   * DataFrame with the profile data. The dataFrame needs to have the following fields:\n   * label: string - the label of the node\n   * level: number - the nesting level of the node\n   * value: number - the total value of the node\n   * self: number - the self value of the node\n   * Optionally if it represents diff of 2 different profiles it can also have fields:\n   * valueRight: number - the total value of the node in the right profile\n   * selfRight: number - the self value of the node in the right profile\n   */\n  data?: DataFrame;\n\n  /**\n   * Whether the header should be sticky and be always visible on the top when scrolling.\n   */\n  stickyHeader?: boolean;\n\n  /**\n   * Provides a theme for the visualization on which colors and some sizes are based.\n   */\n  getTheme: () => GrafanaTheme2;\n\n  /**\n   * Various interaction hooks that can be used to report on the interaction.\n   */\n  onTableSymbolClick?: (symbol: string) => void;\n  onViewSelected?: (view: string) => void;\n  onTextAlignSelected?: (align: string) => void;\n  onTableSort?: (sort: string) => void;\n\n  /**\n   * Elements that will be shown in the header on the right side of the header buttons. Useful for additional\n   * functionality.\n   */\n  extraHeaderElements?: React.ReactNode;\n\n  /**\n   * Extra buttons that will be shown in the context menu when user clicks on a Node.\n   */\n  getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n\n  /**\n   * If true the flamegraph will be rendered on top of the table.\n   */\n  vertical?: boolean;\n\n  /**\n   * If true only the flamegraph will be rendered.\n   */\n  showFlameGraphOnly?: boolean;\n\n  /**\n   * Disable behaviour where similar items in the same stack will be collapsed into single item.\n   */\n  disableCollapsing?: boolean;\n  /**\n   * Whether or not to keep any focused item when the profile data changes.\n   */\n  keepFocusOnDataChange?: boolean;\n\n  /**\n   * If true, the assistant button will be shown in the header if available.\n   * This is needed mainly for Profiles Drilldown where in some cases we need to hide the button to show alternative\n   * option to use AI.\n   * @default true\n   */\n  showAnalyzeWithAssistant?: boolean;\n\n  /**\n   * Enable the new pane-based UI with call tree support.\n   */\n  enableNewUI?: boolean;\n};\n\nconst FlameGraphContainer = ({\n  data,\n  onTableSymbolClick,\n  onViewSelected,\n  onTextAlignSelected,\n  onTableSort,\n  getTheme,\n  stickyHeader,\n  extraHeaderElements,\n  vertical,\n  showFlameGraphOnly,\n  disableCollapsing,\n  keepFocusOnDataChange,\n  getExtraContextMenuButtons,\n  showAnalyzeWithAssistant = true,\n  enableNewUI,\n}: Props) => {\n  const theme = useMemo(() => getTheme(), [getTheme]);\n\n  if (enableNewUI) {\n    return (\n      <NewUIContainer\n        data={data}\n        onTableSymbolClick={onTableSymbolClick}\n        onViewSelected={onViewSelected}\n        onTextAlignSelected={onTextAlignSelected}\n        onTableSort={onTableSort}\n        theme={theme}\n        stickyHeader={stickyHeader}\n        extraHeaderElements={extraHeaderElements}\n        vertical={vertical}\n        showFlameGraphOnly={showFlameGraphOnly}\n        disableCollapsing={disableCollapsing}\n        keepFocusOnDataChange={keepFocusOnDataChange}\n        getExtraContextMenuButtons={getExtraContextMenuButtons}\n        showAnalyzeWithAssistant={showAnalyzeWithAssistant}\n      />\n    );\n  }\n\n  return (\n    <LegacyContainer\n      data={data}\n      onTableSymbolClick={onTableSymbolClick}\n      onViewSelected={onViewSelected}\n      onTextAlignSelected={onTextAlignSelected}\n      onTableSort={onTableSort}\n      theme={theme}\n      stickyHeader={stickyHeader}\n      extraHeaderElements={extraHeaderElements}\n      vertical={vertical}\n      showFlameGraphOnly={showFlameGraphOnly}\n      disableCollapsing={disableCollapsing}\n      keepFocusOnDataChange={keepFocusOnDataChange}\n      getExtraContextMenuButtons={getExtraContextMenuButtons}\n      showAnalyzeWithAssistant={showAnalyzeWithAssistant}\n    />\n  );\n};\n\ntype InternalProps = {\n  data?: DataFrame;\n  onTableSymbolClick?: (symbol: string) => void;\n  onViewSelected?: (view: string) => void;\n  onTextAlignSelected?: (align: string) => void;\n  onTableSort?: (sort: string) => void;\n  theme: GrafanaTheme2;\n  stickyHeader?: boolean;\n  extraHeaderElements?: React.ReactNode;\n  vertical?: boolean;\n  showFlameGraphOnly?: boolean;\n  disableCollapsing?: boolean;\n  keepFocusOnDataChange?: boolean;\n  getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n  showAnalyzeWithAssistant: boolean;\n};\n\nconst LegacyContainer = ({\n  data,\n  onTableSymbolClick,\n  onViewSelected,\n  onTextAlignSelected,\n  onTableSort,\n  theme,\n  stickyHeader,\n  extraHeaderElements,\n  vertical,\n  showFlameGraphOnly,\n  disableCollapsing,\n  keepFocusOnDataChange,\n  getExtraContextMenuButtons,\n  showAnalyzeWithAssistant,\n}: InternalProps) => {\n  const [focusedItemData, setFocusedItemData] = useState<ClickedItemData>();\n\n  const [rangeMin, setRangeMin] = useState(0);\n  const [rangeMax, setRangeMax] = useState(1);\n  const [search, setSearch] = useState('');\n  const [selectedView, setSelectedView] = useState(SelectedView.Both);\n  const [sizeRef, { width: containerWidth }] = useMeasure<HTMLDivElement>();\n  const [textAlign, setTextAlign] = useState<TextAlign>('left');\n  // This is a label of the item because in sandwich view we group all items by label and present a merged graph\n  const [sandwichItem, setSandwichItem] = useState<string>();\n  const [collapsedMap, setCollapsedMap] = useState(new CollapsedMap());\n\n  // Use refs to hold the latest callback values to prevent unnecessary re-renders\n  const onTableSymbolClickRef = useRef(onTableSymbolClick);\n  const onTableSortRef = useRef(onTableSort);\n\n  // Update refs when props change\n  onTableSymbolClickRef.current = onTableSymbolClick;\n  onTableSortRef.current = onTableSort;\n\n  const dataContainer = useMemo((): FlameGraphDataContainer | undefined => {\n    if (!data) {\n      return;\n    }\n\n    const container = new FlameGraphDataContainer(data, { collapsing: !disableCollapsing }, theme);\n    setCollapsedMap(container.getCollapsedMap());\n    return container;\n  }, [data, theme, disableCollapsing]);\n  const [colorScheme, setColorScheme] = useColorScheme(dataContainer);\n  const styles = getStyles(theme);\n  const matchedLabels = useLabelSearch(search, dataContainer);\n\n  // If user resizes window with both as the selected view\n  useEffect(() => {\n    if (\n      containerWidth > 0 &&\n      containerWidth < MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH &&\n      selectedView === SelectedView.Both &&\n      !vertical\n    ) {\n      setSelectedView(SelectedView.FlameGraph);\n    }\n  }, [selectedView, setSelectedView, containerWidth, vertical]);\n\n  const resetFocus = useCallback(() => {\n    setFocusedItemData(undefined);\n    setRangeMin(0);\n    setRangeMax(1);\n  }, [setFocusedItemData, setRangeMax, setRangeMin]);\n\n  const resetSandwich = useCallback(() => {\n    setSandwichItem(undefined);\n  }, [setSandwichItem]);\n\n  useEffect(() => {\n    if (!keepFocusOnDataChange) {\n      resetFocus();\n      resetSandwich();\n      return;\n    }\n\n    if (dataContainer && focusedItemData) {\n      const item = dataContainer.getNodesWithLabel(focusedItemData.label)?.[0];\n\n      if (item) {\n        setFocusedItemData({ ...focusedItemData, item });\n\n        const levels = dataContainer.getLevels();\n        const totalViewTicks = levels.length ? levels[0][0].value : 0;\n        setRangeMin(item.start / totalViewTicks);\n        setRangeMax((item.start + item.value) / totalViewTicks);\n      } else {\n        setFocusedItemData({\n          ...focusedItemData,\n          item: {\n            start: 0,\n            value: 0,\n            itemIndexes: [],\n            children: [],\n            level: 0,\n          },\n        });\n\n        setRangeMin(0);\n        setRangeMax(1);\n      }\n    }\n  }, [dataContainer, keepFocusOnDataChange]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const onSymbolClick = useCallback(\n    (symbol: string) => {\n      const anchored = `^${escapeStringForRegex(symbol)}$`;\n\n      if (search === anchored) {\n        setSearch('');\n      } else {\n        onTableSymbolClickRef.current?.(symbol);\n        setSearch(anchored);\n        resetFocus();\n      }\n    },\n    [setSearch, resetFocus, search]\n  );\n\n  // Memoize methods to prevent unnecessary re-renders of FlameGraphTopTableContainer\n  const onSearch = useCallback(\n    (str: string) => {\n      if (!str) {\n        setSearch('');\n        return;\n      }\n      setSearch(`^${escapeStringForRegex(str)}$`);\n    },\n    [setSearch]\n  );\n  const onSandwich = useCallback(\n    (label: string) => {\n      resetFocus();\n      setSandwichItem(label);\n    },\n    [resetFocus, setSandwichItem]\n  );\n  const onTableSortStable = useCallback((sort: string) => {\n    onTableSortRef.current?.(sort);\n  }, []);\n\n  if (!dataContainer) {\n    return null;\n  }\n\n  const flameGraph = (\n    <FlameGraph\n      data={dataContainer}\n      rangeMin={rangeMin}\n      rangeMax={rangeMax}\n      matchedLabels={matchedLabels}\n      setRangeMin={setRangeMin}\n      setRangeMax={setRangeMax}\n      onItemFocused={(data) => setFocusedItemData(data)}\n      focusedItemData={focusedItemData}\n      textAlign={textAlign}\n      sandwichItem={sandwichItem}\n      onSandwich={onSandwich}\n      onFocusPillClick={resetFocus}\n      onSandwichPillClick={resetSandwich}\n      colorScheme={colorScheme}\n      showFlameGraphOnly={showFlameGraphOnly}\n      collapsing={!disableCollapsing}\n      getExtraContextMenuButtons={getExtraContextMenuButtons}\n      selectedView={selectedView}\n      search={search}\n      collapsedMap={collapsedMap}\n      setCollapsedMap={setCollapsedMap}\n    />\n  );\n\n  const table = (\n    <FlameGraphTopTableContainer\n      data={dataContainer}\n      onSymbolClick={onSymbolClick}\n      search={search}\n      matchedLabels={matchedLabels}\n      sandwichItem={sandwichItem}\n      onSandwich={setSandwichItem}\n      onSearch={onSearch}\n      onTableSort={onTableSortStable}\n      colorScheme={colorScheme}\n    />\n  );\n\n  let body;\n  if (showFlameGraphOnly || selectedView === SelectedView.FlameGraph) {\n    body = flameGraph;\n  } else if (selectedView === SelectedView.TopTable) {\n    body = <div className={styles.tableContainer}>{table}</div>;\n  } else if (selectedView === SelectedView.Both) {\n    if (vertical) {\n      body = (\n        <div>\n          <div className={styles.verticalGraphContainer}>{flameGraph}</div>\n          <div className={styles.verticalTableContainer}>{table}</div>\n        </div>\n      );\n    } else {\n      body = (\n        <div className={styles.horizontalContainer}>\n          <div className={styles.horizontalTableContainer}>{table}</div>\n          <div className={styles.horizontalGraphContainer}>{flameGraph}</div>\n        </div>\n      );\n    }\n  }\n\n  return (\n    // We add the theme context to bridge the gap if this is rendered in non grafana environment where the context\n    // isn't already provided.\n    <ThemeContext.Provider value={theme}>\n      <div ref={sizeRef} className={styles.container}>\n        {!showFlameGraphOnly && (\n          <FlameGraphHeader\n            search={search}\n            setSearch={setSearch}\n            selectedView={selectedView}\n            setSelectedView={(view) => {\n              setSelectedView(view);\n              onViewSelected?.(view);\n            }}\n            containerWidth={containerWidth}\n            onReset={() => {\n              resetFocus();\n              resetSandwich();\n            }}\n            textAlign={textAlign}\n            onTextAlignChange={(align) => {\n              setTextAlign(align);\n              onTextAlignSelected?.(align);\n            }}\n            showResetButton={Boolean(focusedItemData || sandwichItem)}\n            colorScheme={colorScheme}\n            onColorSchemeChange={setColorScheme}\n            stickyHeader={Boolean(stickyHeader)}\n            extraHeaderElements={extraHeaderElements}\n            vertical={vertical}\n            isDiffMode={dataContainer.isDiffFlamegraph()}\n            setCollapsedMap={setCollapsedMap}\n            collapsedMap={collapsedMap}\n            assistantContext={data && showAnalyzeWithAssistant ? getAssistantContextFromDataFrame(data) : undefined}\n          />\n        )}\n\n        <div className={styles.body}>{body}</div>\n      </div>\n    </ThemeContext.Provider>\n  );\n};\n\nconst NewUIContainer = ({\n  data,\n  onTableSymbolClick,\n  onViewSelected,\n  onTextAlignSelected,\n  onTableSort,\n  theme,\n  stickyHeader,\n  extraHeaderElements,\n  vertical,\n  showFlameGraphOnly,\n  disableCollapsing,\n  keepFocusOnDataChange,\n  getExtraContextMenuButtons,\n  showAnalyzeWithAssistant,\n}: InternalProps) => {\n  const [search, setSearch] = useState('');\n  const [viewMode, setViewMode] = useState<ViewMode>(ViewMode.Split);\n  const [leftPaneView, setLeftPaneView] = useState<PaneView>(PaneView.TopTable);\n  const [rightPaneView, setRightPaneView] = useState<PaneView>(PaneView.FlameGraph);\n  const [singleView, setSingleView] = useState<PaneView>(PaneView.FlameGraph);\n  const [panesSwapped, setPanesSwapped] = useState(false);\n  const [sizeRef, { width: containerWidth }] = useMeasure<HTMLDivElement>();\n  const [resetKey, setResetKey] = useState(0);\n  const [focusedItemIndexes, setFocusedItemIndexes] = useState<number[] | undefined>(undefined);\n  const [sharedSandwichItem, setSharedSandwichItem] = useState<string | undefined>(undefined);\n\n  const canShowSplitView = containerWidth > 0 && (containerWidth >= MIN_WIDTH_FOR_SPLIT_VIEW || Boolean(vertical));\n\n  const onTableSymbolClickRef = useRef(onTableSymbolClick);\n  const onTextAlignSelectedRef = useRef(onTextAlignSelected);\n  const onTableSortRef = useRef(onTableSort);\n\n  useEffect(() => {\n    onTableSymbolClickRef.current = onTableSymbolClick;\n    onTextAlignSelectedRef.current = onTextAlignSelected;\n    onTableSortRef.current = onTableSort;\n  });\n\n  const stableOnTableSymbolClick = useCallback((symbol: string) => {\n    onTableSymbolClickRef.current?.(symbol);\n  }, []);\n\n  const stableOnTextAlignSelected = useCallback((align: string) => {\n    onTextAlignSelectedRef.current?.(align);\n  }, []);\n\n  const stableOnTableSort = useCallback((sort: string) => {\n    onTableSortRef.current?.(sort);\n  }, []);\n\n  const dataContainer = useMemo((): FlameGraphDataContainer | undefined => {\n    if (!data) {\n      return;\n    }\n\n    return new FlameGraphDataContainer(data, { collapsing: !disableCollapsing }, theme);\n  }, [data, theme, disableCollapsing]);\n\n  const styles = getStyles(theme);\n  const matchedLabels = useLabelSearch(search, dataContainer);\n\n  const effectiveViewMode = canShowSplitView ? viewMode : ViewMode.Single;\n\n  const prevViewMode = usePrevious(viewMode);\n  useEffect(() => {\n    if (prevViewMode === undefined) {\n      return;\n    }\n    if (prevViewMode === ViewMode.Split && viewMode === ViewMode.Single) {\n      setSingleView(rightPaneView);\n    } else if (prevViewMode === ViewMode.Single && viewMode === ViewMode.Split) {\n      setRightPaneView(singleView);\n    }\n  }, [viewMode, prevViewMode, rightPaneView, singleView]);\n\n  if (!dataContainer) {\n    return null;\n  }\n\n  const commonPaneProps = {\n    dataContainer,\n    search,\n    matchedLabels,\n    onTableSymbolClick: stableOnTableSymbolClick,\n    onTextAlignSelected: stableOnTextAlignSelected,\n    onTableSort: stableOnTableSort,\n    showFlameGraphOnly,\n    disableCollapsing,\n    getExtraContextMenuButtons,\n    setSearch,\n    resetKey,\n    keepFocusOnDataChange,\n    focusedItemIndexes,\n    setFocusedItemIndexes,\n  };\n\n  let body;\n  if (showFlameGraphOnly) {\n    body = (\n      <FlameGraphPane\n        {...commonPaneProps}\n        paneView={PaneView.FlameGraph}\n        viewMode={effectiveViewMode}\n        paneViewForContextMenu={PaneView.FlameGraph}\n        sharedSandwichItem={sharedSandwichItem}\n        setSharedSandwichItem={setSharedSandwichItem}\n      />\n    );\n  } else if (effectiveViewMode === ViewMode.Single) {\n    body = (\n      <FlameGraphPane\n        {...commonPaneProps}\n        paneView={singleView}\n        viewMode={ViewMode.Single}\n        paneViewForContextMenu={singleView}\n        sharedSandwichItem={sharedSandwichItem}\n        setSharedSandwichItem={setSharedSandwichItem}\n      />\n    );\n  } else {\n    const shouldSyncSandwich = leftPaneView !== rightPaneView;\n\n    const leftPane = (\n      <FlameGraphPane\n        {...commonPaneProps}\n        key=\"left-pane\"\n        paneView={leftPaneView}\n        viewMode={ViewMode.Split}\n        paneViewForContextMenu={leftPaneView}\n        sharedSandwichItem={shouldSyncSandwich ? sharedSandwichItem : undefined}\n        setSharedSandwichItem={shouldSyncSandwich ? setSharedSandwichItem : undefined}\n      />\n    );\n\n    const rightPane = (\n      <FlameGraphPane\n        {...commonPaneProps}\n        key=\"right-pane\"\n        paneView={rightPaneView}\n        viewMode={ViewMode.Split}\n        paneViewForContextMenu={rightPaneView}\n        sharedSandwichItem={shouldSyncSandwich ? sharedSandwichItem : undefined}\n        setSharedSandwichItem={shouldSyncSandwich ? setSharedSandwichItem : undefined}\n      />\n    );\n\n    if (vertical) {\n      body = (\n        <div className={styles.verticalContainer}>\n          <div className={styles.verticalPaneContainer} style={{ order: panesSwapped ? 2 : 1 }}>\n            {leftPane}\n          </div>\n          <div className={styles.verticalPaneContainer} style={{ order: panesSwapped ? 1 : 2 }}>\n            {rightPane}\n          </div>\n        </div>\n      );\n    } else {\n      body = (\n        <div className={styles.horizontalContainer}>\n          <div className={styles.horizontalPaneContainer} style={{ order: panesSwapped ? 2 : 1 }}>\n            {leftPane}\n          </div>\n          <div className={styles.horizontalPaneContainer} style={{ order: panesSwapped ? 1 : 2 }}>\n            {rightPane}\n          </div>\n        </div>\n      );\n    }\n  }\n\n  return (\n    <ThemeContext.Provider value={theme}>\n      <div ref={sizeRef} className={styles.container}>\n        {!showFlameGraphOnly && (\n          <FlameGraphHeader\n            enableNewUI={true}\n            search={search}\n            setSearch={setSearch}\n            viewMode={viewMode}\n            setViewMode={(mode) => {\n              setViewMode(mode);\n              onViewSelected?.(mode === ViewMode.Split ? 'split' : singleView);\n            }}\n            canShowSplitView={canShowSplitView}\n            containerWidth={containerWidth}\n            leftPaneView={panesSwapped ? rightPaneView : leftPaneView}\n            setLeftPaneView={panesSwapped ? setRightPaneView : setLeftPaneView}\n            rightPaneView={panesSwapped ? leftPaneView : rightPaneView}\n            setRightPaneView={panesSwapped ? setLeftPaneView : setRightPaneView}\n            singleView={singleView}\n            setSingleView={(view) => {\n              setSingleView(view);\n              if (viewMode === ViewMode.Single) {\n                onViewSelected?.(view);\n              }\n            }}\n            onSwapPanes={() => setPanesSwapped((s) => !s)}\n            onReset={() => {\n              setSearch('');\n              setFocusedItemIndexes(undefined);\n              setSharedSandwichItem(undefined);\n              setResetKey((k) => k + 1);\n            }}\n            showResetButton={Boolean(search)}\n            stickyHeader={Boolean(stickyHeader)}\n            extraHeaderElements={extraHeaderElements}\n            assistantContext={data && showAnalyzeWithAssistant ? getAssistantContextFromDataFrame(data) : undefined}\n          />\n        )}\n\n        <div className={styles.body}>{body}</div>\n      </div>\n    </ThemeContext.Provider>\n  );\n};\n\n/**\n * Based on the search string it does a fuzzy search over all the unique labels, so we can highlight them later.\n */\nexport function useLabelSearch(\n  search: string | undefined,\n  data: FlameGraphDataContainer | undefined\n): Set<string> | undefined {\n  return useMemo(() => {\n    if (!search || !data) {\n      // In this case undefined means there was no search so no attempt to\n      // highlighting anything should be made.\n      return undefined;\n    }\n\n    return labelSearch(search, data);\n  }, [search, data]);\n}\n\nexport function labelSearch(search: string, data: FlameGraphDataContainer): Set<string> {\n  const foundLabels = new Set<string>();\n  const terms = search.split(',');\n\n  const regexFilter = (labels: string[], pattern: string): boolean => {\n    let regex: RegExp;\n    try {\n      regex = new RegExp(pattern);\n    } catch (e) {\n      return false;\n    }\n\n    let foundMatch = false;\n    for (let label of labels) {\n      if (!regex.test(label)) {\n        continue;\n      }\n\n      foundLabels.add(label);\n      foundMatch = true;\n    }\n    return foundMatch;\n  };\n\n  const fuzzyFilter = (labels: string[], term: string): boolean => {\n    let idxs = ufuzzy.filter(labels, term);\n    if (!idxs) {\n      return false;\n    }\n\n    let foundMatch = false;\n    for (let idx of idxs) {\n      foundLabels.add(labels[idx]);\n      foundMatch = true;\n    }\n    return foundMatch;\n  };\n\n  for (let term of terms) {\n    if (!term) {\n      continue;\n    }\n\n    const found = regexFilter(data.getUniqueLabels(), term);\n    if (!found) {\n      fuzzyFilter(data.getUniqueLabels(), term);\n    }\n  }\n\n  return foundLabels;\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    container: css({\n      label: 'container',\n      overflow: 'auto',\n      height: '100%',\n      display: 'flex',\n      flex: '1 1 0',\n      flexDirection: 'column',\n      minHeight: 0,\n      gap: theme.spacing(1),\n    }),\n    body: css({\n      label: 'body',\n      flexGrow: 1,\n    }),\n\n    tableContainer: css({\n      // This is not ideal for dashboard panel where it creates a double scroll. In a panel it should be 100% but then\n      // in explore we need a specific height.\n      height: FLAMEGRAPH_CONTAINER_HEIGHT,\n    }),\n\n    horizontalContainer: css({\n      label: 'horizontalContainer',\n      display: 'flex',\n      minHeight: 0,\n      flexDirection: 'row',\n      columnGap: theme.spacing(1),\n      width: '100%',\n    }),\n\n    horizontalGraphContainer: css({\n      flexBasis: '50%',\n    }),\n\n    horizontalTableContainer: css({\n      flexBasis: '50%',\n      maxHeight: FLAMEGRAPH_CONTAINER_HEIGHT,\n    }),\n\n    verticalGraphContainer: css({\n      marginBottom: theme.spacing(1),\n    }),\n\n    verticalTableContainer: css({\n      height: FLAMEGRAPH_CONTAINER_HEIGHT,\n    }),\n\n    verticalContainer: css({\n      label: 'verticalContainer',\n      display: 'flex',\n      flexDirection: 'column',\n    }),\n\n    horizontalPaneContainer: css({\n      label: 'horizontalPaneContainer',\n      flexBasis: '50%',\n      maxHeight: FLAMEGRAPH_CONTAINER_HEIGHT,\n      minWidth: 0,\n      overflow: 'auto',\n    }),\n\n    verticalPaneContainer: css({\n      label: 'verticalPaneContainer',\n      marginBottom: theme.spacing(1),\n      height: FLAMEGRAPH_CONTAINER_HEIGHT,\n    }),\n  };\n}\n\nexport default FlameGraphContainer;\n"],"names":["uFuzzy","useMemo","jsx","data","useState","SelectedView","useMeasure","CollapsedMap","useRef","FlameGraphDataContainer","useColorScheme","useEffect","MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH","useCallback","escapeStringForRegex","FlameGraphTopTableContainer","jsxs","ThemeContext","FlameGraphHeader","getAssistantContextFromDataFrame","ViewMode","PaneView","MIN_WIDTH_FOR_SPLIT_VIEW","usePrevious","createElement","css","FLAMEGRAPH_CONTAINER_HEIGHT"],"mappings":"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"}