@grafana/flamegraph
Version:
Grafana flamegraph visualization component
1 lines • 54.4 kB
Source Map (JSON)
{"version":3,"file":"FlameGraphCallTreeContainer.cjs","sources":["../../../src/CallTree/FlameGraphCallTreeContainer.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { memo, useMemo, useState, useRef, useEffect, useCallback } from 'react';\nimport { useTable, useSortBy, useExpanded, type Column, type Row, type UseExpandedRowProps } from 'react-table';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { Button, Icon, IconButton, Tooltip, useStyles2, useTheme2 } from '@grafana/ui';\n\nimport { type GetExtraContextMenuButtonsFunction } from '../FlameGraph/FlameGraphContextMenu';\nimport { type FlameGraphDataContainer } from '../FlameGraph/dataTransform';\nimport { ColorScheme, ColorSchemeDiff, type PaneView, type ViewMode } from '../types';\n\nimport { ActionsCell } from './ActionsCell';\nimport { CallTreeTable } from './CallTreeTable';\nimport { ColorBarCell } from './ColorBarCell';\nimport { DiffCell } from './DiffCell';\nimport { FunctionCellWithExpander } from './FunctionCellWithExpander';\nimport { buildAllCallTreeNodes, buildCallersTree, type CallTreeNode, getInitialExpandedState } from './utils';\n\ntype Props = {\n data: FlameGraphDataContainer;\n onSymbolClick: (symbol: string) => void;\n sandwichItem?: string;\n onSandwich: (str?: string) => void;\n onTableSort?: (sort: string) => void;\n search: string;\n onSearch?: (symbol: string) => void;\n focusedItemIndexes?: number[];\n setFocusedItemIndexes?: (itemIndexes: number[] | undefined) => void;\n getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n viewMode?: ViewMode;\n paneView?: PaneView;\n};\n\nfunction findCallTreeNode(nodes: CallTreeNode[], searchKey: string, byLabel: boolean): CallTreeNode | undefined {\n for (const node of nodes) {\n if (byLabel ? node.label === searchKey : node.id === searchKey) {\n return node;\n }\n if (node.children) {\n const found = findCallTreeNode(node.children, searchKey, byLabel);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n}\n\nconst FlameGraphCallTreeContainer = memo(\n ({\n data,\n onSymbolClick,\n sandwichItem,\n onSandwich,\n search,\n onSearch,\n focusedItemIndexes,\n setFocusedItemIndexes,\n getExtraContextMenuButtons,\n viewMode,\n paneView,\n }: Props) => {\n const [isCompact, setIsCompact] = useState(false);\n const styles = useStyles2(getStyles);\n const theme = useTheme2();\n\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n const lastScrolledMatchRef = useRef<string | undefined>(undefined);\n const tableInstanceRef = useRef<{\n rows: Array<Row<CallTreeNode>>;\n toggleRowExpanded: (id: string[], value?: boolean) => void;\n }>({ rows: [], toggleRowExpanded: () => {} });\n\n const [focusedNodeId, setFocusedNodeId] = useState<string | undefined>(undefined);\n const [callersNodeLabel, setCallersNodeLabel] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (sandwichItem !== undefined) {\n setCallersNodeLabel(sandwichItem);\n setFocusedNodeId(undefined);\n } else {\n setCallersNodeLabel(undefined);\n }\n }, [sandwichItem]);\n\n const searchQuery = search;\n const [currentMatchIndex, setCurrentMatchIndex] = useState<number>(0);\n\n const handleSetFocusMode = useCallback(\n (nodeIdOrLabel: string | undefined, isLabel = false, itemIndexes?: number[]) => {\n if (nodeIdOrLabel === undefined) {\n setFocusedNodeId(undefined);\n setFocusedItemIndexes?.(undefined);\n } else if (isLabel) {\n setFocusedNodeId(`label:${nodeIdOrLabel}`);\n setFocusedItemIndexes?.(itemIndexes);\n } else {\n setFocusedNodeId(nodeIdOrLabel);\n setFocusedItemIndexes?.(itemIndexes);\n }\n\n if (nodeIdOrLabel !== undefined) {\n setCallersNodeLabel(undefined);\n }\n },\n [setFocusedItemIndexes]\n );\n\n const handleSetCallersMode = useCallback(\n (label: string | undefined) => {\n setCallersNodeLabel(label);\n if (label !== undefined) {\n setFocusedNodeId(undefined);\n }\n onSandwich(label);\n },\n [onSandwich]\n );\n\n const allNodes = useMemo(() => buildAllCallTreeNodes(data), [data]);\n\n const { nodes, focusedNode, callersNode } = useMemo(() => {\n let nodesToUse = allNodes;\n let focusedNode: CallTreeNode | undefined;\n let callersTargetNode: CallTreeNode | undefined;\n\n if (focusedNodeId) {\n const isLabelSearch = focusedNodeId.startsWith('label:');\n const searchKey = isLabelSearch ? focusedNodeId.substring(6) : focusedNodeId;\n\n focusedNode = findCallTreeNode(allNodes, searchKey, isLabelSearch);\n if (focusedNode) {\n if (focusedNode.parentId) {\n const parent = findCallTreeNode(allNodes, focusedNode.parentId, false);\n if (parent) {\n const modifiedParent: CallTreeNode = {\n ...parent,\n children: [focusedNode],\n };\n nodesToUse = [modifiedParent];\n } else {\n nodesToUse = [focusedNode];\n }\n } else {\n nodesToUse = [focusedNode];\n }\n }\n }\n\n if (callersNodeLabel) {\n const [callers] = data.getSandwichLevels(callersNodeLabel);\n\n if (callers.length > 0) {\n nodesToUse = buildCallersTree(callers, data);\n callersTargetNode = nodesToUse.length > 0 ? nodesToUse[0] : undefined;\n } else {\n nodesToUse = [];\n callersTargetNode = undefined;\n }\n }\n\n return { nodes: nodesToUse, focusedNode: focusedNode, callersNode: callersTargetNode };\n }, [allNodes, data, focusedNodeId, callersNodeLabel]);\n\n const resolvedFocusNodeId = useMemo(() => {\n if (!focusedNodeId?.startsWith('label:')) {\n return undefined;\n }\n const searchKey = focusedNodeId.substring(6);\n return findCallTreeNode(allNodes, searchKey, true)?.id;\n }, [focusedNodeId, allNodes]);\n\n useEffect(() => {\n if (!focusedNodeId?.startsWith('label:') || !resolvedFocusNodeId) {\n return;\n }\n if (resolvedFocusNodeId !== focusedNodeId) {\n setFocusedNodeId(resolvedFocusNodeId);\n }\n }, [resolvedFocusNodeId, focusedNodeId]);\n\n const depthOffset = useMemo(() => {\n if (focusedNodeId && nodes.length > 0) {\n return nodes[0].depth;\n }\n return 0;\n }, [focusedNodeId, nodes]);\n\n const { searchNodes, searchError } = useMemo(() => {\n if (!searchQuery.trim()) {\n return { searchNodes: [], searchError: undefined };\n }\n\n const MAX_MATCHES = 50;\n const matches: Array<{ id: string; total: number }> = [];\n\n const regexChars = /[.*+?^${}()|[\\]\\\\]/;\n let isRegexQuery = regexChars.test(searchQuery);\n let searchRegex: RegExp | null = null;\n let searchError: string | undefined;\n\n if (isRegexQuery) {\n try {\n searchRegex = new RegExp(searchQuery, 'i');\n } catch (e) {\n searchError = 'Invalid regex pattern';\n return { searchNodes: [], searchError };\n }\n }\n\n const searchFn = (nodesToSearch: CallTreeNode[]) => {\n for (const node of nodesToSearch) {\n if (matches.length >= MAX_MATCHES) {\n break;\n }\n\n let isMatch = false;\n if (searchRegex) {\n isMatch = searchRegex.test(node.label);\n } else {\n isMatch = node.label.toLowerCase().includes(searchQuery.toLowerCase());\n }\n\n if (isMatch) {\n matches.push({ id: node.id, total: node.total });\n }\n\n if (node.children && matches.length < MAX_MATCHES) {\n searchFn(node.children);\n }\n }\n };\n\n searchFn(nodes);\n matches.sort((a, b) => b.total - a.total);\n\n const matchIds = matches.map((m) => m.id);\n\n return { searchNodes: matchIds, searchError };\n }, [searchQuery, nodes]);\n\n useEffect(() => {\n if (!focusedItemIndexes || focusedItemIndexes.length === 0) {\n setFocusedNodeId(undefined);\n return;\n }\n\n const itemIndexesMatch = (a: number[], b: number[]): boolean => {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((val, idx) => val === b[idx]);\n };\n\n const findExactMatch = (nodesToSearch: CallTreeNode[]): string | undefined => {\n for (const node of nodesToSearch) {\n if (itemIndexesMatch(node.levelItem.itemIndexes, focusedItemIndexes)) {\n return node.id;\n }\n if (node.children) {\n const found = findExactMatch(node.children);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n };\n\n const matchedNodeId = findExactMatch(allNodes);\n if (matchedNodeId) {\n setFocusedNodeId(matchedNodeId);\n }\n }, [focusedItemIndexes, allNodes]);\n\n const searchResultKey = searchNodes.join(',');\n useEffect(() => {\n setCurrentMatchIndex(searchNodes.length > 0 ? 0 : -1);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchResultKey]);\n\n const navigateToNextMatch = () => {\n if (searchNodes.length > 0) {\n setCurrentMatchIndex((prev) => (prev + 1) % searchNodes.length);\n }\n };\n\n const navigateToPrevMatch = () => {\n if (searchNodes.length > 0) {\n setCurrentMatchIndex((prev) => (prev - 1 + searchNodes.length) % searchNodes.length);\n }\n };\n\n const currentSearchMatchId = useMemo(() => {\n if (searchNodes.length > 0 && currentMatchIndex >= 0 && currentMatchIndex < searchNodes.length) {\n return searchNodes[currentMatchIndex];\n }\n return undefined;\n }, [searchNodes, currentMatchIndex]);\n\n const searchMatchRowRef = useCallback(\n (node: HTMLTableRowElement | null) => {\n if (node && currentSearchMatchId && currentSearchMatchId !== lastScrolledMatchRef.current) {\n lastScrolledMatchRef.current = currentSearchMatchId;\n const container = scrollContainerRef.current;\n if (container) {\n requestAnimationFrame(() => {\n const rowRect = node.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const rowTopRelativeToContainer = rowRect.top - containerRect.top + container.scrollTop;\n const targetScrollTop = rowTopRelativeToContainer - container.clientHeight / 2 + rowRect.height / 2;\n container.scrollTo({\n top: Math.max(0, targetScrollTop),\n behavior: 'smooth',\n });\n });\n }\n }\n },\n [currentSearchMatchId]\n );\n\n const expandedState = useMemo(() => {\n const baseExpanded = getInitialExpandedState(nodes, 1);\n\n const expandPathToNode = (nodes: CallTreeNode[], targetId: string): boolean => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return true;\n }\n if (node.children && node.children.length > 0) {\n const foundInSubtree = expandPathToNode(node.children, targetId);\n if (foundInSubtree) {\n baseExpanded[node.id] = true;\n return true;\n }\n }\n }\n return false;\n };\n\n if (currentSearchMatchId) {\n expandPathToNode(nodes, currentSearchMatchId);\n }\n\n if (focusedNodeId && nodes.length > 0) {\n const rootNode = nodes[0];\n\n const isLabelSearch = focusedNodeId.startsWith('label:');\n const searchLabel = isLabelSearch ? focusedNodeId.substring(6) : undefined;\n\n if (rootNode.children && rootNode.children.length > 0) {\n baseExpanded['0'] = true;\n }\n\n const isRootTheFocusedNode = isLabelSearch ? rootNode.label === searchLabel : rootNode.id === focusedNodeId;\n\n if (!isRootTheFocusedNode && rootNode.children && rootNode.children.length > 0) {\n baseExpanded['0.0'] = true;\n }\n }\n\n if (callersNodeLabel && callersNode && nodes.length > 0) {\n expandPathToNode(nodes, callersNode.id);\n\n if (callersNode.children && callersNode.children.length > 0) {\n baseExpanded[callersNode.id] = true;\n }\n }\n\n return baseExpanded;\n }, [nodes, focusedNodeId, callersNodeLabel, callersNode, currentSearchMatchId]);\n\n const ACTIONS_WIDTH = 30;\n const COLOR_BAR_WIDTH = 200;\n const SELF_WIDTH = 150;\n const TOTAL_WIDTH = 150;\n const BASELINE_WIDTH = 100;\n const COMPARISON_WIDTH = 100;\n const DIFF_WIDTH = 100;\n const FUNCTION_MIN_WIDTH = 100;\n const FUNCTION_COMPACT_THRESHOLD = 550;\n\n const getFixedColumnsWidth = (isDiff: boolean, compactMode: boolean): number => {\n if (compactMode) {\n return isDiff ? ACTIONS_WIDTH + BASELINE_WIDTH + COMPARISON_WIDTH + DIFF_WIDTH : ACTIONS_WIDTH + TOTAL_WIDTH;\n }\n return isDiff\n ? ACTIONS_WIDTH + COLOR_BAR_WIDTH + BASELINE_WIDTH + COMPARISON_WIDTH + DIFF_WIDTH\n : ACTIONS_WIDTH + COLOR_BAR_WIDTH + SELF_WIDTH + TOTAL_WIDTH;\n };\n\n const isDiff = data.isDiffFlamegraph();\n\n const compactModeThreshold = getFixedColumnsWidth(isDiff, false) + FUNCTION_COMPACT_THRESHOLD;\n\n const getFunctionColumnWidth = (availableWidth: number, compactMode: boolean): number | undefined => {\n if (availableWidth <= 0) {\n return undefined;\n }\n const fixedWidth = getFixedColumnsWidth(isDiff, compactMode);\n return Math.max(availableWidth - fixedWidth, FUNCTION_MIN_WIDTH);\n };\n\n const commonColumns = useMemo<Array<Column<CallTreeNode>>>(() => {\n return [\n {\n Header: '',\n id: 'actions',\n Cell: ({ row }: { row: Row<CallTreeNode> }) => (\n <ActionsCell\n nodeId={row.original.id}\n label={row.original.label}\n itemIndexes={row.original.levelItem.itemIndexes}\n levelItem={row.original.levelItem}\n hasChildren={Boolean(row.original.children?.length)}\n depth={row.original.depth - depthOffset}\n parentId={row.original.parentId}\n onFocus={handleSetFocusMode}\n onShowCallers={handleSetCallersMode}\n onSearch={onSearch}\n focusedNodeId={focusedNodeId}\n callersNodeLabel={callersNodeLabel}\n isSearchMatch={searchNodes?.includes(row.original.id) ?? false}\n actionsCellClass={styles.actionsCell}\n getExtraContextMenuButtons={getExtraContextMenuButtons}\n data={data}\n viewMode={viewMode}\n paneView={paneView}\n search={search}\n />\n ),\n width: ACTIONS_WIDTH,\n minWidth: ACTIONS_WIDTH,\n disableSortBy: true,\n },\n {\n Header: 'Function',\n accessor: 'label',\n Cell: ({ row, value, rowIndex }: { row: Row<CallTreeNode>; value: string; rowIndex?: number }) => (\n <FunctionCellWithExpander\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n row={row as Row<CallTreeNode> & UseExpandedRowProps<CallTreeNode>}\n value={value}\n depth={row.original.depth - depthOffset}\n hasChildren={Boolean(row.original.children?.length)}\n rowIndex={rowIndex}\n rows={tableInstanceRef.current.rows}\n onSymbolClick={onSymbolClick}\n compact={isCompact}\n toggleRowExpanded={tableInstanceRef.current.toggleRowExpanded}\n />\n ),\n minWidth: FUNCTION_MIN_WIDTH,\n },\n ];\n }, [\n callersNodeLabel,\n data,\n depthOffset,\n focusedNodeId,\n getExtraContextMenuButtons,\n handleSetCallersMode,\n handleSetFocusMode,\n isCompact,\n onSearch,\n onSymbolClick,\n paneView,\n search,\n searchNodes,\n styles,\n viewMode,\n ]);\n\n const columns = useMemo<Array<Column<CallTreeNode>>>(() => {\n if (data.isDiffFlamegraph()) {\n const cols: Array<Column<CallTreeNode>> = [...commonColumns];\n\n if (!isCompact) {\n cols.push({\n Header: '',\n id: 'colorBar',\n Cell: ({ row }: { row: Row<CallTreeNode> }) => (\n <ColorBarCell\n node={row.original}\n data={data}\n colorScheme={ColorSchemeDiff.Default}\n theme={theme}\n focusedNode={focusedNode}\n />\n ),\n minWidth: COLOR_BAR_WIDTH,\n width: COLOR_BAR_WIDTH,\n disableSortBy: true,\n });\n }\n\n cols.push(\n {\n Header: 'Baseline',\n accessor: 'totalPercent',\n Cell: ({ value }: { value: number }) => `${value.toFixed(2)}%`,\n sortType: 'basic',\n width: BASELINE_WIDTH,\n minWidth: BASELINE_WIDTH,\n },\n {\n Header: 'Comparison',\n accessor: 'totalPercentRight',\n Cell: ({ value }: { value: number | undefined }) => (value !== undefined ? `${value.toFixed(2)}%` : '-'),\n sortType: 'basic',\n width: COMPARISON_WIDTH,\n minWidth: COMPARISON_WIDTH,\n },\n {\n Header: 'Diff %',\n accessor: 'diffPercent',\n Cell: ({ value }: { value: number | undefined }) => <DiffCell value={value} theme={theme} />,\n sortType: 'basic',\n width: DIFF_WIDTH,\n minWidth: DIFF_WIDTH,\n }\n );\n\n return cols;\n } else {\n const cols: Array<Column<CallTreeNode>> = [...commonColumns];\n\n if (!isCompact) {\n cols.push(\n {\n Header: '',\n id: 'colorBar',\n Cell: ({ row }: { row: Row<CallTreeNode> }) => (\n <ColorBarCell\n node={row.original}\n data={data}\n colorScheme={ColorScheme.PackageBased}\n theme={theme}\n focusedNode={focusedNode}\n />\n ),\n minWidth: COLOR_BAR_WIDTH,\n width: COLOR_BAR_WIDTH,\n disableSortBy: true,\n },\n {\n Header: 'Self',\n accessor: 'self',\n Cell: ({ row }: { row: Row<CallTreeNode> }) => {\n const displaySelf = data.valueDisplayProcessor(row.original.self);\n const formattedValue = displaySelf.suffix ? displaySelf.text + displaySelf.suffix : displaySelf.text;\n return (\n <div className={styles.valueCell}>\n <span className={styles.valueNumber}>{formattedValue}</span>\n <span className={styles.percentNumber}>{row.original.selfPercent.toFixed(2)}%</span>\n </div>\n );\n },\n sortType: 'basic',\n minWidth: SELF_WIDTH,\n width: SELF_WIDTH,\n }\n );\n }\n\n cols.push({\n Header: 'Total',\n accessor: 'total',\n Cell: ({ row }: { row: Row<CallTreeNode> }) => {\n const displayValue = data.valueDisplayProcessor(row.original.total);\n const formattedValue = displayValue.suffix ? displayValue.text + displayValue.suffix : displayValue.text;\n return (\n <div className={styles.valueCell}>\n <span className={styles.valueNumber}>{formattedValue}</span>\n <span className={styles.percentNumber}>{row.original.totalPercent.toFixed(2)}%</span>\n </div>\n );\n },\n sortType: 'basic',\n minWidth: TOTAL_WIDTH,\n width: TOTAL_WIDTH,\n });\n\n return cols;\n }\n }, [commonColumns, data, isCompact, theme, styles, focusedNode]);\n\n // currentSearchMatchId is intentionally in the deps despite not being used in the body.\n // Creating a new array identity forces react-table (with autoResetExpanded: true) to\n // recalculate the expanded state from initialState, which includes the path to the\n // current search match.\n const tableNodes = useMemo(() => {\n return [...nodes];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nodes, currentSearchMatchId]);\n\n const tableInstance = useTable<CallTreeNode>(\n {\n columns,\n data: tableNodes,\n getSubRows: (row) => row.children || [],\n initialState: {\n sortBy: [{ id: 'total', desc: true }],\n expanded: expandedState,\n },\n autoResetExpanded: true,\n autoResetSortBy: false,\n },\n useSortBy,\n useExpanded\n );\n\n tableInstanceRef.current = tableInstance;\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } = tableInstance;\n\n return (\n <div className={styles.container} data-testid=\"callTree\">\n <div className={styles.toolbar}>\n <div className={styles.toolbarLeft}>\n {searchQuery && (\n <div className={styles.searchContainer}>\n {searchNodes.length > 0 && (\n <div className={styles.searchNavigation}>\n <span className={styles.searchCounter}>\n {currentMatchIndex + 1} of {searchNodes.length}\n {searchNodes.length >= 50 && '+'}\n </span>\n <Button\n icon=\"angle-up\"\n fill=\"text\"\n size=\"sm\"\n onClick={navigateToPrevMatch}\n tooltip=\"Previous match\"\n aria-label=\"Previous match\"\n />\n <Button\n icon=\"angle-down\"\n fill=\"text\"\n size=\"sm\"\n onClick={navigateToNextMatch}\n tooltip=\"Next match\"\n aria-label=\"Next match\"\n />\n </div>\n )}\n {searchQuery && searchNodes.length === 0 && !searchError && (\n <span className={styles.searchNoResults}>No matches found</span>\n )}\n {searchError && <span className={styles.searchError}>{searchError}</span>}\n </div>\n )}\n\n {focusedNode && (\n <Tooltip content={focusedNode.label} placement=\"top\">\n <div className={styles.focusedItem}>\n <Icon size=\"sm\" name=\"compress-arrows\" />\n <span className={styles.focusedItemLabel}>\n {focusedNode.label.substring(focusedNode.label.lastIndexOf('/') + 1)}\n </span>\n <IconButton\n className={styles.modePillCloseButton}\n name=\"times\"\n size=\"sm\"\n onClick={() => handleSetFocusMode(undefined)}\n tooltip=\"Clear callees view\"\n aria-label=\"Clear callees view\"\n />\n </div>\n </Tooltip>\n )}\n\n {callersNode && (\n <Tooltip content={callersNodeLabel || ''} placement=\"top\">\n <div className={styles.callersItem}>\n <Icon size=\"sm\" name=\"expand-arrows-alt\" />\n <span className={styles.callersItemLabel}>\n {(callersNodeLabel || '').substring((callersNodeLabel || '').lastIndexOf('/') + 1)}\n </span>\n <IconButton\n className={styles.modePillCloseButton}\n name=\"times\"\n size=\"sm\"\n onClick={() => handleSetCallersMode(undefined)}\n tooltip=\"Clear callers view\"\n aria-label=\"Clear callers view\"\n />\n </div>\n </Tooltip>\n )}\n </div>\n </div>\n\n <div style={{ flex: 1, minHeight: 0, overflow: 'hidden' }}>\n <AutoSizer>\n {({ width, height }) => (\n <CallTreeTable\n width={width}\n height={height}\n compactModeThreshold={compactModeThreshold}\n isCompact={isCompact}\n setIsCompact={setIsCompact}\n getFunctionColumnWidth={getFunctionColumnWidth}\n getTableProps={getTableProps}\n getTableBodyProps={getTableBodyProps}\n headerGroups={headerGroups}\n rows={rows}\n prepareRow={prepareRow}\n currentSearchMatchId={currentSearchMatchId}\n searchMatchRowRef={searchMatchRowRef}\n scrollContainerRef={scrollContainerRef}\n focusedNodeId={focusedNodeId}\n callersNodeLabel={callersNodeLabel}\n />\n )}\n </AutoSizer>\n </div>\n </div>\n );\n }\n);\n\nFlameGraphCallTreeContainer.displayName = 'FlameGraphCallTreeContainer';\n\nexport default FlameGraphCallTreeContainer;\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n container: css({\n width: '100%',\n height: '100%',\n backgroundColor: theme.colors.background.primary,\n display: 'flex',\n flexDirection: 'column',\n }),\n toolbar: css({\n display: 'flex',\n alignItems: 'center',\n paddingTop: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n gap: theme.spacing(1),\n flexWrap: 'wrap',\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n '&:not(:has(> :not(:empty)))': {\n display: 'none',\n },\n }),\n toolbarLeft: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n }),\n searchContainer: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n flexWrap: 'wrap',\n }),\n searchNavigation: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n padding: `0 ${theme.spacing(1)}`,\n }),\n searchCounter: css({\n fontSize: theme.typography.bodySmall.fontSize,\n color: theme.colors.text.secondary,\n whiteSpace: 'nowrap',\n }),\n searchNoResults: css({\n fontSize: theme.typography.bodySmall.fontSize,\n color: theme.colors.text.secondary,\n fontStyle: 'italic',\n }),\n searchError: css({\n fontSize: theme.typography.bodySmall.fontSize,\n color: theme.colors.error.text,\n }),\n actionsCell: css({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '20px',\n }),\n valueCell: css({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n fontVariantNumeric: 'tabular-nums',\n height: '20px',\n }),\n valueNumber: css({\n flex: '1 1 auto',\n textAlign: 'right',\n whiteSpace: 'nowrap',\n minWidth: '60px',\n }),\n percentNumber: css({\n flex: '0 0 60px',\n width: '60px',\n textAlign: 'right',\n color: theme.colors.text.secondary,\n whiteSpace: 'nowrap',\n }),\n focusedItem: css({\n display: 'inline-flex',\n alignItems: 'center',\n background: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n padding: theme.spacing(0.5, 1),\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n lineHeight: theme.typography.bodySmall.lineHeight,\n color: theme.colors.text.secondary,\n }),\n focusedItemLabel: css({\n maxWidth: '200px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n marginLeft: theme.spacing(0.5),\n }),\n callersItem: css({\n display: 'inline-flex',\n alignItems: 'center',\n background: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n padding: theme.spacing(0.5, 1),\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n lineHeight: theme.typography.bodySmall.lineHeight,\n color: theme.colors.text.secondary,\n }),\n callersItemLabel: css({\n maxWidth: '200px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n marginLeft: theme.spacing(0.5),\n }),\n modePillCloseButton: css({\n verticalAlign: 'text-bottom',\n margin: theme.spacing(0, 0.5),\n }),\n };\n}\n"],"names":["memo","useState","useStyles2","useTheme2","useRef","useEffect","useCallback","useMemo","buildAllCallTreeNodes","focusedNode","buildCallersTree","searchError","getInitialExpandedState","nodes","isDiff","jsx","ActionsCell","FunctionCellWithExpander","ColorBarCell","ColorSchemeDiff","DiffCell","ColorScheme","jsxs","useTable","useSortBy","useExpanded","Button","Tooltip","Icon","IconButton","AutoSizer","CallTreeTable","css"],"mappings":"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