{"version":3,"file":"components/Charts/TreeMap.mjs","sources":["../../../src/components/Charts/TreeMap.tsx"],"sourcesContent":["import React, { useEffect, useState, memo, useMemo, useCallback } from 'react';\nimport EChartsReactCore from 'echarts-for-react/esm/core';\nimport * as echarts from 'echarts/core';\nimport { TreemapChart, type TreemapSeriesOption } from 'echarts/charts';\nimport {\n  TooltipComponent,\n  TitleComponent,\n  type TooltipComponentOption,\n  type TitleComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { Alert, Checkbox, Radio, Input } from 'antd';\nimport {\n  LeftOutlined,\n  RightOutlined,\n  SearchOutlined,\n  FullscreenOutlined,\n  FullscreenExitOutlined,\n} from '@ant-design/icons';\nimport type { ComposeOption, EChartsType } from 'echarts/core';\nimport { formatSize, useThemeToken } from 'src/utils';\nimport { SDK } from '@rsdoctor/types';\nimport { ServerAPIProvider } from 'src/components/Manifest';\nimport { ModuleAnalyzeComponent } from '../../pages/ModuleAnalyze';\nimport Styles from './treemap.module.scss';\nimport { TREE_COLORS } from './constants';\nimport { isJavaScriptAsset } from '../../utils/assets';\nimport type {\n  CallbackDataParams,\n  ECElementEvent,\n} from 'echarts/types/dist/shared';\nimport {\n  calculateTreeNodeTotalSize,\n  calculateTreeNodesTotalSize,\n  type TreeMapSizeType,\n} from './treeMapSize';\n\ntype TreeMapOption = ComposeOption<\n  TreemapSeriesOption | TooltipComponentOption | TitleComponentOption\n>;\n\ntype TreemapDataNode = NonNullable<TreemapSeriesOption['data']>[number] & {\n  path?: string;\n  sourceSize?: number;\n  bundledSize?: number;\n  gzipSize?: number;\n  moduleId?: string | number;\n};\n\necharts.use([TreemapChart, TooltipComponent, TitleComponent, CanvasRenderer]);\n\nexport type TreeNode = {\n  name: string;\n  value?: number;\n  children?: TreeNode[];\n  path?: string;\n  sourceSize?: number;\n  bundledSize?: number;\n  gzipSize?: number;\n  id?: string | number;\n};\n\nexport type SizeType = TreeMapSizeType;\n\ninterface TreeMapProps {\n  treeData: TreeNode[];\n  sizeType: SizeType;\n  style?: React.CSSProperties;\n  onChartClick?: (params: ECElementEvent) => void;\n  highlightNodeId?: number;\n  centerNodeId?: number;\n  rootPath?: string;\n}\n\nfunction hashString(str: string): number {\n  let hash = 5381;\n  for (let i = 0; i < str.length; i++) {\n    hash = (hash << 5) + hash + str.charCodeAt(i);\n  }\n  return hash >>> 0;\n}\n\nfunction blendWithWhite(hex: string, ratio: number): string {\n  const r = parseInt(hex.slice(1, 3), 16);\n  const g = parseInt(hex.slice(3, 5), 16);\n  const b = parseInt(hex.slice(5, 7), 16);\n\n  const blendedR = Math.round(r * ratio + 255 * (1 - ratio));\n  const blendedG = Math.round(g * ratio + 255 * (1 - ratio));\n  const blendedB = Math.round(b * ratio + 255 * (1 - ratio));\n\n  return `#${blendedR.toString(16).padStart(2, '0')}${blendedG.toString(16).padStart(2, '0')}${blendedB.toString(16).padStart(2, '0')}`;\n}\n\nfunction getLuminance(hex: string): number {\n  const r = parseInt(hex.slice(1, 3), 16) / 255;\n  const g = parseInt(hex.slice(3, 5), 16) / 255;\n  const b = parseInt(hex.slice(5, 7), 16) / 255;\n\n  const [rs, gs, bs] = [r, g, b].map((val) => {\n    return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n  });\n\n  return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\nfunction isDarkColor(hex: string): boolean {\n  return getLuminance(hex) < 0.4;\n}\n\nfunction getLevelOption(gapColor: string) {\n  return [\n    {\n      itemStyle: {\n        borderWidth: 0,\n        gapWidth: 4,\n        gapColor,\n      },\n    },\n    {\n      itemStyle: {\n        borderColorAlpha: [1, 0.3],\n        borderWidth: 5,\n        gapWidth: 4,\n        gapColor,\n      },\n      upperLabel: {\n        show: true,\n        color: '#ffffff',\n        fontSize: 12,\n        height: 30,\n      },\n    },\n  ];\n}\n\nexport const TreeMap: React.FC<TreeMapProps> = memo(\n  ({\n    treeData,\n    sizeType,\n    onChartClick,\n    highlightNodeId,\n    centerNodeId,\n    rootPath,\n  }) => {\n    const [option, setOption] = useState<TreeMapOption | null>(null);\n    const chartRef = React.useRef<EChartsReactCore | null>(null);\n    const chartDataRef = React.useRef<TreemapDataNode[]>([]);\n    const clickTimeoutRef = React.useRef<number | null>(null);\n    const themeToken = useThemeToken();\n\n    useEffect(() => {\n      if (!treeData) return;\n      function convert(\n        node: TreeNode,\n        index = 0,\n        level = 0,\n        parentColor?: string,\n        siblingIndex = 0,\n        siblingCount = 1,\n        chunkPath?: string,\n      ): TreemapDataNode {\n        const baseColor =\n          parentColor || TREE_COLORS[index % TREE_COLORS.length];\n\n        // For level 0 (chunk level), use the chunk's path/name as chunkPath\n        const currentChunkPath =\n          level === 0 ? node.path || node.name || '' : chunkPath || '';\n\n        const children = node.children?.map((c, childIndex) =>\n          convert(\n            c,\n            index,\n            level + 1,\n            baseColor,\n            childIndex,\n            node.children?.length || 0,\n            currentChunkPath,\n          ),\n        );\n\n        let val = 0;\n        if (sizeType === 'stat') val = node.sourceSize || 0;\n        else if (sizeType === 'parsed') val = node.bundledSize || 0;\n        else if (sizeType === 'gzip') val = node.gzipSize || 0;\n        else if (sizeType === 'value') val = node.value || 0;\n\n        // Include chunk path in nodeId for non-root nodes to ensure uniqueness across chunks\n        const nodeIdString =\n          level === 0\n            ? node.path || node.name || ''\n            : `${currentChunkPath}::${node.path || node.name || ''}`;\n        const nodeId = hashString(nodeIdString);\n        const isHighlighted = highlightNodeId === nodeId;\n\n        const baseColorRatio =\n          level === 0 ? 1 : Math.max(0.35, 1 - level * 0.15);\n        const baseBorderRatio =\n          level === 0 ? 1 : Math.max(0.4, 1 - level * 0.15);\n\n        const siblingGradientRange = 0.15;\n        const siblingRatio =\n          siblingCount > 1\n            ? 1 - (siblingIndex / (siblingCount - 1)) * siblingGradientRange\n            : 1;\n\n        const colorRatio = baseColorRatio * siblingRatio;\n        const borderRatio = baseBorderRatio * siblingRatio;\n\n        const nodeColor = isHighlighted\n          ? '#fff5f5'\n          : level === 0\n            ? blendWithWhite(baseColor, 0.8)\n            : blendWithWhite(baseColor, colorRatio);\n\n        const nodeBorderColor = isHighlighted\n          ? '#ff4d4f'\n          : level === 0\n            ? baseColor\n            : blendWithWhite(baseColor, borderRatio);\n\n        const isDark = isDarkColor(nodeColor);\n        const textColor = isDark ? '#ffffff' : '#000000';\n        const textBorderColor = isDark\n          ? 'rgba(255, 255, 255, 0.2)'\n          : 'rgba(0, 0, 0, 0.1)';\n\n        const result: TreemapDataNode = {\n          id: nodeId,\n          name: node.name,\n          value: val,\n          path: node.path || node.name,\n          sourceSize:\n            node.sourceSize ?? (sizeType === 'stat' ? val : undefined),\n          bundledSize:\n            node.bundledSize ?? (sizeType === 'parsed' ? val : undefined),\n          gzipSize: node.gzipSize ?? (sizeType === 'gzip' ? val : undefined),\n          moduleId: node.id,\n          itemStyle: {\n            borderWidth: isHighlighted ? 4 : 1,\n            color: nodeColor,\n            borderColor: nodeBorderColor,\n            ...(level === 0 && { gapWidth: 2 }),\n          },\n          label: {\n            show: true,\n            color: textColor,\n            textBorderColor: textBorderColor,\n            textBorderWidth: 1,\n          },\n          upperLabel:\n            level === 0\n              ? undefined\n              : {\n                  show: true,\n                  color: textColor,\n                },\n        };\n\n        if (children && children.length > 0) {\n          result.children = children;\n        }\n\n        if (isHighlighted) {\n          result.emphasis = {\n            itemStyle: {\n              borderColor: '#ff4d4f',\n              borderWidth: 4,\n              color: '#fff5f5',\n            },\n          };\n        } else {\n          // Keep the same color on hover/click to prevent color change\n          result.emphasis = {\n            itemStyle: {\n              color: nodeColor,\n              borderColor: nodeBorderColor,\n              borderWidth: isHighlighted ? 4 : 1,\n            },\n          };\n        }\n\n        return result;\n      }\n\n      const data = treeData\n        .map((item, index) =>\n          convert(item, index, 0, undefined, index, treeData.length, undefined),\n        )\n        .filter(\n          (item) =>\n            (typeof item.value === 'number' ? item.value > 0 : false) ||\n            (item.children && item.children.length > 0),\n        );\n\n      chartDataRef.current = data;\n\n      const textColor = themeToken.colorText;\n      setOption({\n        color: TREE_COLORS,\n        tooltip: {\n          padding: 10,\n          backgroundColor: themeToken.colorBgElevated,\n          borderColor: themeToken.colorBorder,\n          borderWidth: 1,\n          textStyle: {\n            color: textColor,\n          },\n          confine: true,\n          extraCssText: 'max-width: 450px; word-wrap: break-word;',\n          position: function (pos, _params, _dom, _rect, size) {\n            const obj: { top: number; left?: number; right?: number } = {\n              top: pos[1] + 10,\n            };\n            if (pos[0] < size.viewSize[0] / 2) {\n              obj.left = pos[0] + 10;\n            } else {\n              obj.right = size.viewSize[0] - pos[0] + 10;\n            }\n            return obj;\n          },\n          formatter: function (info) {\n            const node =\n              (info as CallbackDataParams & { data?: TreemapDataNode }).data ||\n              {};\n            let path =\n              typeof node.path === 'string'\n                ? node.path\n                : typeof node.name === 'string'\n                  ? node.name\n                  : String(node.name ?? '');\n\n            if (rootPath && path) {\n              const normalizedRoot = rootPath\n                .replace(/\\\\/g, '/')\n                .replace(/\\/$/, '');\n              const normalizedPath = path.replace(/\\\\/g, '/');\n              if (normalizedPath.startsWith(normalizedRoot + '/')) {\n                path = normalizedPath.slice(normalizedRoot.length + 1);\n              } else if (normalizedPath === normalizedRoot) {\n                path = '';\n              }\n            }\n\n            const sourceSize =\n              typeof node.sourceSize === 'number' && node.sourceSize > 0\n                ? node.sourceSize\n                : typeof node.value === 'number' &&\n                    node.value > 0 &&\n                    sizeType === 'stat'\n                  ? node.value\n                  : undefined;\n            const bundledSize =\n              typeof node.bundledSize === 'number' && node.bundledSize > 0\n                ? node.bundledSize\n                : undefined;\n            const gzipSize =\n              typeof node.gzipSize === 'number' && node.gzipSize > 0\n                ? node.gzipSize\n                : undefined;\n\n            function makeRow(label: string, value: string, color: string) {\n              return `<div class=\"${Styles['tooltip-row']}\">\n                    <span class=\"${Styles['tooltip-label']}\" style=\"color: ${color};\">${label}</span>\n                    <span style=\"color: ${color};\">${value}</span>\n                </div>`;\n            }\n\n            const rows = [];\n            if (sourceSize !== undefined && sourceSize > 0) {\n              rows.push(\n                makeRow('Stat size', formatSize(sourceSize), '#43c6d9'),\n              );\n            }\n            if (bundledSize !== undefined && bundledSize > 0) {\n              rows.push(\n                makeRow('Parsed size', formatSize(bundledSize), '#5b8ff9'),\n              );\n            }\n            if (gzipSize !== undefined && gzipSize > 0) {\n              rows.push(\n                makeRow('Gzipped size', formatSize(gzipSize), '#f2b84b'),\n              );\n            }\n\n            return `\n                <div style=\"font-family: sans-serif; font-size: 12px; line-height: 1.5;\">\n                  <div style=\"margin-bottom: 6px; max-width: 400px; word-wrap: break-word; overflow-wrap: break-word; word-break: break-all; white-space: normal; color: ${textColor};\">${echarts.format.encodeHTML(path)}</div>\n                  ${rows.join('')}\n                </div>\n              `;\n          },\n        },\n        series: [\n          {\n            type: 'treemap',\n            label: {\n              show: true,\n              formatter: '{b}',\n              fontSize: 12,\n              position: 'inside',\n              fontWeight: 'normal',\n              textBorderWidth: 1,\n              padding: [4, 8, 4, 8],\n            },\n            upperLabel: {\n              show: true,\n              height: 30,\n              fontSize: 12,\n              fontWeight: 'normal',\n              padding: [0, 0, 0, 4],\n            },\n            levels: getLevelOption(themeToken.colorBgContainer),\n            data: data,\n            breadcrumb: {\n              show: true,\n              left: 'center',\n              top: 'bottom',\n              height: 22,\n              emptyItemWidth: 25,\n              itemStyle: {\n                color: '#999',\n                borderColor: 'transparent',\n                borderWidth: 0,\n                borderRadius: 0,\n                textStyle: {\n                  fontFamily: 'sans-serif',\n                  fontSize: 12,\n                  color: 'white',\n                },\n              },\n              emphasis: {\n                itemStyle: {\n                  color: '#333',\n                },\n              },\n            },\n            roam: true,\n            nodeClick: false,\n            zoomToNodeRatio: 0.7,\n            animationDurationUpdate: 500,\n            width: '100%',\n            height: '100%',\n            top: -10,\n            bottom: 30,\n            left: 0,\n            right: 0,\n            scaleLimit: {\n              min: 0.5,\n              max: 5,\n            },\n          },\n        ],\n      });\n    }, [treeData, sizeType, highlightNodeId, rootPath, themeToken]);\n\n    useEffect(() => {\n      if (centerNodeId && chartRef.current && option) {\n        const chartInstance =\n          chartRef.current.getEchartsInstance() as unknown as EChartsType;\n        if (chartInstance) {\n          const findNodeInfo = (\n            data: TreemapDataNode[],\n            targetId: number,\n            path: string[] = [],\n          ): { name: string; path: string[] } | null => {\n            for (const item of data) {\n              const itemName =\n                typeof item.name === 'string'\n                  ? item.name\n                  : String(item.name ?? '');\n              const currentPath = [...path, itemName];\n              if (item.id === targetId) {\n                return { name: itemName, path: currentPath };\n              }\n              if (item.children) {\n                const found = findNodeInfo(\n                  item.children,\n                  targetId,\n                  currentPath,\n                );\n                if (found) return found;\n              }\n            }\n            return null;\n          };\n\n          setTimeout(() => {\n            const nodeInfo = findNodeInfo(chartDataRef.current, centerNodeId);\n            if (!nodeInfo) return;\n            const nodeName = nodeInfo.name;\n\n            try {\n              chartInstance.dispatchAction({\n                type: 'highlight',\n                seriesIndex: 0,\n                name: nodeName,\n              });\n            } catch (e) {\n              console.error('Failed to highlight node with name:', nodeName, e);\n            }\n\n            const zoomStrategies: Array<() => void> = [\n              () =>\n                chartInstance.dispatchAction({\n                  type: 'treemapZoomToNode',\n                  seriesIndex: 0,\n                  targetNodeId: String(centerNodeId),\n                }),\n              () =>\n                chartInstance.dispatchAction({\n                  type: 'treemapZoomToNode',\n                  seriesIndex: 0,\n                  name: nodeName,\n                }),\n              () =>\n                chartInstance.dispatchAction({\n                  type: 'treemapZoomToNode',\n                  seriesIndex: 0,\n                  name: nodeInfo.path.join('/'),\n                }),\n              () =>\n                nodeInfo.path.length > 0 &&\n                chartInstance.dispatchAction({\n                  type: 'treemapZoomToNode',\n                  seriesIndex: 0,\n                  name: nodeInfo.path[nodeInfo.path.length - 1],\n                }),\n            ];\n\n            for (const strategy of zoomStrategies) {\n              try {\n                strategy();\n                return;\n              } catch (e) {\n                console.error(\n                  'Failed to zoom to node with id:',\n                  centerNodeId,\n                  e,\n                );\n              }\n            }\n\n            console.warn('Failed to zoom to node with id:', centerNodeId);\n          }, 200);\n        }\n      }\n    }, [centerNodeId, option]);\n\n    useEffect(() => {\n      return () => {\n        if (clickTimeoutRef.current) {\n          window.clearTimeout(clickTimeoutRef.current);\n        }\n      };\n    }, []);\n\n    return option ? (\n      <div className={Styles['chart-container']}>\n        <Alert\n          message=\"If parsed size lacks detailed module information, you can enable sourceMap when RSDOCTOR = true. This is because Rsdoctor relies on SourceMap to obtain Parsed Size. Rspack provides SourceMap information to Rsdoctor by default without affecting the build output.\"\n          type=\"info\"\n          showIcon\n          style={{ marginBottom: 0 }}\n        />\n        <div\n          style={{\n            flex: 1,\n          }}\n        >\n          <EChartsReactCore\n            ref={chartRef}\n            option={option}\n            echarts={echarts}\n            onEvents={{\n              click: (params: ECElementEvent) => {\n                // Delay to differentiate from double-click; only zoom on single click\n                if (clickTimeoutRef.current) {\n                  window.clearTimeout(clickTimeoutRef.current);\n                }\n                clickTimeoutRef.current = window.setTimeout(() => {\n                  if (chartRef.current) {\n                    const instance =\n                      chartRef.current.getEchartsInstance() as unknown as EChartsType;\n                    const data = params?.data as TreemapDataNode | undefined;\n                    if (instance && data?.id !== undefined) {\n                      instance.dispatchAction({\n                        type: 'treemapZoomToNode',\n                        seriesIndex: 0,\n                        targetNodeId: String(data.id),\n                      });\n                    }\n                  }\n                }, 180);\n              },\n              dblclick: (params: ECElementEvent) => {\n                // Double click: cancel pending single-click action and trigger analyze\n                if (clickTimeoutRef.current) {\n                  window.clearTimeout(clickTimeoutRef.current);\n                  clickTimeoutRef.current = null;\n                }\n                onChartClick?.(params);\n              },\n            }}\n            style={{\n              width: '100%',\n              height: '100%',\n            }}\n          />\n        </div>\n      </div>\n    ) : null;\n  },\n);\n\nexport const AssetTreemapWithFilter: React.FC<{\n  treeData: TreeNode[];\n  onChartClick?: (params: ECElementEvent) => void;\n  bundledSize?: boolean;\n}> = ({ treeData, onChartClick, bundledSize = true }) => {\n  return (\n    <ServerAPIProvider api={SDK.ServerAPI.API.GetProjectInfo}>\n      {(projectInfo) => {\n        return (\n          <AssetTreemapWithFilterInner\n            treeData={treeData}\n            onChartClick={onChartClick}\n            bundledSize={bundledSize}\n            rootPath={projectInfo.root}\n          />\n        );\n      }}\n    </ServerAPIProvider>\n  );\n};\n\nconst AssetTreemapWithFilterInner: React.FC<{\n  treeData: TreeNode[];\n  onChartClick?: (params: ECElementEvent) => void;\n  bundledSize?: boolean;\n  rootPath: string;\n}> = ({ treeData, onChartClick, bundledSize = true, rootPath }) => {\n  const assetNames = useMemo(\n    () => treeData.map((item) => item.name),\n    [treeData],\n  );\n\n  const [checkedAssets, setCheckedAssets] = useState<string[]>(assetNames);\n  const [collapsed, setCollapsed] = useState(false);\n  const [sizeType, setSizeType] = useState<SizeType>(\n    bundledSize ? 'parsed' : 'stat',\n  );\n  const [searchQuery, setSearchQuery] = useState('');\n  const [isFullscreen, setIsFullscreen] = useState(false);\n  const [highlightNodeId, setHighlightNodeId] = useState<number | undefined>();\n  const [centerNodeId, setCenterNodeId] = useState<number | undefined>();\n  const [moduleId, setModuleId] = useState<string | number>('');\n  const [showAnalyze, setShowAnalyze] = useState(false);\n  const [chunkSearchQuery, setChunkSearchQuery] = useState('');\n  const [showOnlyJavaScriptAssets, setShowOnlyJavaScriptAssets] =\n    useState(false);\n\n  const containerRef = React.useRef<HTMLDivElement>(null);\n\n  const visibleAssetNames = useMemo(() => {\n    if (!showOnlyJavaScriptAssets) {\n      return assetNames;\n    }\n\n    return assetNames.filter(isJavaScriptAsset);\n  }, [assetNames, showOnlyJavaScriptAssets]);\n\n  const visibleAssetNamesKey = useMemo(\n    () => visibleAssetNames.join('\\0'),\n    [visibleAssetNames],\n  );\n  const previousVisibleAssetNamesKeyRef = React.useRef<string | undefined>(\n    undefined,\n  );\n\n  useEffect(() => {\n    if (previousVisibleAssetNamesKeyRef.current === visibleAssetNamesKey) {\n      return;\n    }\n\n    previousVisibleAssetNamesKeyRef.current = visibleAssetNamesKey;\n    setCheckedAssets(visibleAssetNames);\n  }, [visibleAssetNames, visibleAssetNamesKey]);\n\n  const handleChartClick = useCallback(\n    (params: ECElementEvent) => {\n      onChartClick?.(params);\n      const data = params.data as TreemapDataNode | undefined;\n      const moduleId = data?.moduleId;\n      if (moduleId !== undefined) {\n        setModuleId(moduleId);\n        setShowAnalyze(true);\n      }\n    },\n    [onChartClick],\n  );\n\n  const enterFullscreen = () => {\n    if (!containerRef.current) return;\n    const el = containerRef.current as HTMLElement & {\n      webkitRequestFullscreen?: () => void;\n      mozRequestFullScreen?: () => void;\n      msRequestFullscreen?: () => void;\n    };\n    if (el.requestFullscreen) {\n      el.requestFullscreen()\n        .then(() => setIsFullscreen(true))\n        .catch((err: unknown) =>\n          console.error('Failed to enter fullscreen:', err),\n        );\n    } else if (el.webkitRequestFullscreen) {\n      try {\n        el.webkitRequestFullscreen();\n        setIsFullscreen(true);\n      } catch (err) {\n        console.error('Failed to enter fullscreen (webkit):', err);\n      }\n    } else if (el.mozRequestFullScreen) {\n      try {\n        el.mozRequestFullScreen();\n        setIsFullscreen(true);\n      } catch (err) {\n        console.error('Failed to enter fullscreen (moz):', err);\n      }\n    } else if (el.msRequestFullscreen) {\n      try {\n        el.msRequestFullscreen();\n        setIsFullscreen(true);\n      } catch (err) {\n        console.error('Failed to enter fullscreen (ms):', err);\n      }\n    } else {\n      console.error('Fullscreen API is not supported in this browser.');\n    }\n  };\n\n  const exitFullscreen = () => {\n    document\n      .exitFullscreen()\n      .then(() => setIsFullscreen(false))\n      .catch((err) => console.error('Failed to exit fullscreen:', err));\n  };\n\n  const toggleFullscreen = () => {\n    if (isFullscreen) {\n      exitFullscreen();\n    } else {\n      enterFullscreen();\n    }\n  };\n\n  useEffect(() => {\n    const handleFullscreenChange = () => {\n      setIsFullscreen(!!document.fullscreenElement);\n    };\n    document.addEventListener('fullscreenchange', handleFullscreenChange);\n    return () => {\n      document.removeEventListener('fullscreenchange', handleFullscreenChange);\n    };\n  }, []);\n\n  const filteredTreeData = useMemo(() => {\n    let filtered = treeData.filter(\n      (item) =>\n        visibleAssetNames.includes(item.name) &&\n        checkedAssets.includes(item.name),\n    );\n\n    if (chunkSearchQuery.trim()) {\n      const searchLower = chunkSearchQuery.toLowerCase();\n      filtered = filtered.filter((item) =>\n        item.name.toLowerCase().includes(searchLower),\n      );\n    }\n\n    return filtered;\n  }, [treeData, checkedAssets, chunkSearchQuery, visibleAssetNames]);\n\n  const searchResults = useMemo(() => {\n    if (!searchQuery.trim()) return [];\n\n    const regex = new RegExp(searchQuery, 'i');\n    const results: Array<{ path: string; nodeId: number }> = [];\n\n    const collectMatchingPaths = (node: TreeNode, chunkPath?: string) => {\n      // For chunk level (root of filteredTreeData), use its path/name as chunkPath\n      const currentChunkPath = chunkPath || node.path || node.name || '';\n\n      if (node.path && regex.test(node.path)) {\n        // Use the same nodeId calculation as in convert function\n        const nodeIdString = chunkPath\n          ? `${chunkPath}::${node.path}`\n          : node.path;\n        const nodeId = hashString(nodeIdString);\n        results.push({ path: node.path, nodeId });\n      }\n      if (node.children) {\n        node.children.forEach((child) =>\n          collectMatchingPaths(child, currentChunkPath),\n        );\n      }\n    };\n\n    filteredTreeData.forEach((chunk) => collectMatchingPaths(chunk));\n    return results;\n  }, [filteredTreeData, searchQuery]);\n\n  const handleSearchResultClick = (nodeId: number) => {\n    setHighlightNodeId(nodeId);\n    setCenterNodeId(nodeId);\n  };\n\n  const removeRootPath = (filepath: string): string => {\n    if (!rootPath || !filepath) return filepath;\n    const normalizedRoot = rootPath.replace(/\\\\/g, '/').replace(/\\/$/, '');\n    const normalizedPath = filepath.replace(/\\\\/g, '/');\n\n    if (normalizedPath.startsWith(normalizedRoot + '/')) {\n      return normalizedPath.slice(normalizedRoot.length + 1);\n    } else if (normalizedPath === normalizedRoot) {\n      return '';\n    }\n    return filepath;\n  };\n\n  const getChunkSize = (name: string, type?: SizeType) => {\n    const node = treeData.find((n) => n.name === name);\n    if (!node) return 0;\n    const sizeTypeToUse = type || sizeType;\n    return calculateTreeNodeTotalSize(node, sizeTypeToUse);\n  };\n\n  const allAssetsSize = useMemo(\n    () => calculateTreeNodesTotalSize(filteredTreeData, sizeType),\n    [filteredTreeData, sizeType],\n  );\n\n  return (\n    <div className={Styles.treemap} ref={containerRef}>\n      <button\n        className={Styles['fullscreen-button']}\n        onClick={toggleFullscreen}\n        title={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n        aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n      >\n        {isFullscreen ? <FullscreenExitOutlined /> : <FullscreenOutlined />}\n      </button>\n\n      <div className={`${Styles.sidebar} ${collapsed ? Styles.collapsed : ''}`}>\n        <div\n          className={`${Styles['sidebar-toggle']} ${collapsed ? Styles.collapsed : ''}`}\n          onClick={() => setCollapsed(!collapsed)}\n        >\n          {collapsed ? <RightOutlined /> : <LeftOutlined />}\n        </div>\n        <div className={Styles['sidebar-content']}>\n          <div>\n            <h4>Treemap sizes</h4>\n            <Radio.Group\n              value={sizeType}\n              onChange={(e) => setSizeType(e.target.value)}\n              size=\"small\"\n              buttonStyle=\"solid\"\n            >\n              <Radio.Button value=\"stat\">Stat</Radio.Button>\n              <Radio.Button value=\"parsed\">Parsed</Radio.Button>\n              <Radio.Button value=\"gzip\">Gzipped</Radio.Button>\n            </Radio.Group>\n          </div>\n\n          <div>\n            <h4>Show chunks</h4>\n            <Input\n              placeholder=\"Search chunks\"\n              value={chunkSearchQuery}\n              onChange={(e) => setChunkSearchQuery(e.target.value)}\n              suffix={<SearchOutlined style={{ color: '#ccc' }} />}\n              allowClear\n              size=\"small\"\n              style={{ marginBottom: 8 }}\n            />\n            <div className={Styles['chunk-item']}>\n              <Checkbox\n                indeterminate={\n                  checkedAssets.length > 0 &&\n                  checkedAssets.length < visibleAssetNames.length\n                }\n                checked={\n                  visibleAssetNames.length > 0 &&\n                  checkedAssets.length === visibleAssetNames.length\n                }\n                onChange={(e) =>\n                  setCheckedAssets(e.target.checked ? visibleAssetNames : [])\n                }\n                className={Styles['all-none-checkbox']}\n              >\n                All\n              </Checkbox>\n              <span className={Styles['size-tag']}>\n                {formatSize(allAssetsSize)}\n              </span>\n            </div>\n            <Checkbox\n              checked={showOnlyJavaScriptAssets}\n              onChange={(e) => {\n                setShowOnlyJavaScriptAssets(e.target.checked);\n              }}\n              className={Styles['all-none-checkbox']}\n            >\n              JS only\n            </Checkbox>\n            <div\n              className={Styles['chunk-list']}\n              style={{ maxHeight: 180, overflowY: 'auto' }}\n            >\n              {visibleAssetNames\n                .filter((name) =>\n                  name.toLowerCase().includes(chunkSearchQuery.toLowerCase()),\n                )\n                .map((name) => (\n                  <div\n                    key={name}\n                    className={Styles['chunk-item']}\n                    style={{ height: 15, lineHeight: '15px' }}\n                  >\n                    <Checkbox\n                      checked={checkedAssets.includes(name)}\n                      onChange={(e) => {\n                        if (e.target.checked) {\n                          setCheckedAssets([...checkedAssets, name]);\n                        } else {\n                          setCheckedAssets(\n                            checkedAssets.filter((a) => a !== name),\n                          );\n                        }\n                      }}\n                    >\n                      <span title={name}>{name}</span>\n                    </Checkbox>\n                    <span className={Styles['size-tag']}>\n                      {formatSize(getChunkSize(name, sizeType))}\n                    </span>\n                  </div>\n                ))}\n            </div>\n          </div>\n\n          <div>\n            <h4>Search modules</h4>\n            <Input\n              placeholder=\"Enter regexp\"\n              value={searchQuery}\n              onChange={(e) => {\n                setSearchQuery(e.target.value);\n                setHighlightNodeId(undefined);\n                setCenterNodeId(undefined);\n              }}\n              suffix={<SearchOutlined style={{ color: '#ccc' }} />}\n              allowClear\n              size=\"small\"\n            />\n            {searchQuery.trim() && searchResults.length > 0 && (\n              <div className={Styles['search-results']}>\n                <div className={Styles['search-results-header']}>\n                  Found {searchResults.length} file\n                  {searchResults.length > 1 ? 's' : ''}\n                </div>\n                <div className={Styles['search-results-list']}>\n                  {searchResults.map((result, index) => {\n                    const displayPath = removeRootPath(result.path);\n                    return (\n                      <div\n                        key={index}\n                        className={Styles['search-result-item']}\n                        onClick={() => handleSearchResultClick(result.nodeId)}\n                        title={result.path}\n                      >\n                        {displayPath || result.path}\n                      </div>\n                    );\n                  })}\n                </div>\n              </div>\n            )}\n            {searchQuery.trim() && searchResults.length === 0 && (\n              <div className={Styles['search-results-empty']}>\n                No files found matching \"{searchQuery}\"\n              </div>\n            )}\n          </div>\n        </div>\n      </div>\n\n      <div className={Styles['chart-wrapper']}>\n        <TreeMap\n          treeData={filteredTreeData}\n          sizeType={sizeType}\n          onChartClick={handleChartClick}\n          highlightNodeId={highlightNodeId}\n          centerNodeId={centerNodeId}\n          rootPath={rootPath}\n        />\n        {moduleId ? (\n          <ServerAPIProvider\n            api={SDK.ServerAPI.API.GetAllModuleGraph}\n            body={{}}\n          >\n            {(modules) => (\n              <ModuleAnalyzeComponent\n                cwd={rootPath}\n                moduleId={moduleId}\n                modules={modules}\n                show={showAnalyze}\n                setShow={setShowAnalyze}\n              />\n            )}\n          </ServerAPIProvider>\n        ) : null}\n      </div>\n    </div>\n  );\n};\n"],"names":["echarts","TreemapChart","TooltipComponent","TitleComponent","CanvasRenderer","hashString","str","hash","i","blendWithWhite","hex","ratio","r","parseInt","g","b","blendedR","Math","blendedG","blendedB","getLuminance","rs","gs","bs","val","isDarkColor","getLevelOption","gapColor","TreeMap","memo","treeData","sizeType","onChartClick","highlightNodeId","centerNodeId","rootPath","option","setOption","useState","chartRef","React","chartDataRef","clickTimeoutRef","themeToken","useThemeToken","useEffect","convert","node","index","level","parentColor","siblingIndex","siblingCount","chunkPath","baseColor","TREE_COLORS","currentChunkPath","children","c","childIndex","nodeIdString","nodeId","isHighlighted","baseColorRatio","baseBorderRatio","siblingGradientRange","siblingRatio","colorRatio","borderRatio","nodeColor","nodeBorderColor","isDark","textColor","textBorderColor","result","undefined","data","item","pos","_params","_dom","_rect","size","obj","info","path","String","normalizedRoot","normalizedPath","sourceSize","bundledSize","gzipSize","makeRow","label","value","color","Styles","rows","formatSize","chartInstance","findNodeInfo","targetId","itemName","currentPath","found","setTimeout","nodeInfo","nodeName","e","console","zoomStrategies","strategy","window","Alert","EChartsReactCore","params","instance","AssetTreemapWithFilter","ServerAPIProvider","SDK","projectInfo","AssetTreemapWithFilterInner","assetNames","useMemo","checkedAssets","setCheckedAssets","collapsed","setCollapsed","setSizeType","searchQuery","setSearchQuery","isFullscreen","setIsFullscreen","setHighlightNodeId","setCenterNodeId","moduleId","setModuleId","showAnalyze","setShowAnalyze","chunkSearchQuery","setChunkSearchQuery","showOnlyJavaScriptAssets","setShowOnlyJavaScriptAssets","containerRef","visibleAssetNames","isJavaScriptAsset","visibleAssetNamesKey","previousVisibleAssetNamesKeyRef","handleChartClick","useCallback","enterFullscreen","el","err","exitFullscreen","document","toggleFullscreen","handleFullscreenChange","filteredTreeData","filtered","searchLower","searchResults","regex","RegExp","results","collectMatchingPaths","child","chunk","handleSearchResultClick","removeRootPath","filepath","getChunkSize","name","type","n","sizeTypeToUse","calculateTreeNodeTotalSize","allAssetsSize","calculateTreeNodesTotalSize","FullscreenExitOutlined","FullscreenOutlined","RightOutlined","LeftOutlined","Radio","Input","SearchOutlined","Checkbox","a","displayPath","modules","ModuleAnalyzeComponent"],"mappings":"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"}