@rsdoctor/components 1.5.17 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/components/Alert/ecma-version-check_module.css +1 -1
  2. package/dist/components/Alert/ecma-version-check_module.css.map +1 -1
  3. package/dist/components/Alerts/bundle-alert.d.ts +1 -1
  4. package/dist/components/Alerts/bundle-alert.mjs +82 -73
  5. package/dist/components/Alerts/bundle-alert.mjs.map +1 -1
  6. package/dist/components/Alerts/bundle.mjs +1 -2
  7. package/dist/components/Alerts/bundle.mjs.map +1 -1
  8. package/dist/components/Alerts/collapse-cjs-require.mjs +6 -14
  9. package/dist/components/Alerts/collapse-cjs-require.mjs.map +1 -1
  10. package/dist/components/Alerts/collapse-cross-chunks.mjs +3 -8
  11. package/dist/components/Alerts/collapse-cross-chunks.mjs.map +1 -1
  12. package/dist/components/Alerts/collapse-esm-cjs.mjs +6 -10
  13. package/dist/components/Alerts/collapse-esm-cjs.mjs.map +1 -1
  14. package/dist/components/Alerts/collapse-module-mixed-chunks.mjs +5 -12
  15. package/dist/components/Alerts/collapse-module-mixed-chunks.mjs.map +1 -1
  16. package/dist/components/Alerts/collapse-side-effects-only-imports.mjs +5 -12
  17. package/dist/components/Alerts/collapse-side-effects-only-imports.mjs.map +1 -1
  18. package/dist/components/Alerts/collapse.mjs +3 -10
  19. package/dist/components/Alerts/collapse.mjs.map +1 -1
  20. package/dist/components/Alerts/collapse_module.css +1 -1
  21. package/dist/components/Alerts/collapse_module.css.map +1 -1
  22. package/dist/components/Alerts/index.module.mjs +7 -0
  23. package/dist/components/Alerts/index.module.mjs.map +1 -0
  24. package/dist/components/Alerts/index_module.css +9 -0
  25. package/dist/components/Alerts/index_module.css.map +1 -0
  26. package/dist/components/Alerts/list.d.ts +1 -0
  27. package/dist/components/Alerts/list.mjs +13 -8
  28. package/dist/components/Alerts/list.mjs.map +1 -1
  29. package/dist/components/Alerts/list.module.mjs +2 -1
  30. package/dist/components/Alerts/list.module.mjs.map +1 -1
  31. package/dist/components/Alerts/list_module.css +8 -0
  32. package/dist/components/Alerts/list_module.css.map +1 -1
  33. package/dist/components/Card/size_module.css +0 -2
  34. package/dist/components/Card/size_module.css.map +1 -1
  35. package/dist/components/Charts/TimelineCharts/index.mjs +63 -39
  36. package/dist/components/Charts/TimelineCharts/index.mjs.map +1 -1
  37. package/dist/components/Charts/TreeMap.mjs +124 -107
  38. package/dist/components/Charts/TreeMap.mjs.map +1 -1
  39. package/dist/components/Charts/index.mjs +3 -1
  40. package/dist/components/Charts/index.mjs.map +1 -1
  41. package/dist/components/Charts/treemap_module.css +6 -5
  42. package/dist/components/Charts/treemap_module.css.map +1 -1
  43. package/dist/components/FileTree/index.css +0 -1
  44. package/dist/components/FileTree/index.css.map +1 -1
  45. package/dist/components/FileTree/index.mjs +3 -4
  46. package/dist/components/FileTree/index.mjs.map +1 -1
  47. package/dist/components/Keyword/style_module.css +0 -1
  48. package/dist/components/Keyword/style_module.css.map +1 -1
  49. package/dist/components/Layout/header.mjs +22 -6
  50. package/dist/components/Layout/header.mjs.map +1 -1
  51. package/dist/components/Layout/header.module.mjs +0 -1
  52. package/dist/components/Layout/header.module.mjs.map +1 -1
  53. package/dist/components/Layout/header_module.css +0 -6
  54. package/dist/components/Layout/header_module.css.map +1 -1
  55. package/dist/components/Layout/index.mjs +27 -8
  56. package/dist/components/Layout/index.mjs.map +1 -1
  57. package/dist/components/Layout/menus.mjs +3 -1
  58. package/dist/components/Layout/menus.mjs.map +1 -1
  59. package/dist/components/Layout/rsdoctor-title-logo-dark.mjs +2 -0
  60. package/dist/components/Loader/Analysis/files.mjs +16 -17
  61. package/dist/components/Loader/Analysis/files.mjs.map +1 -1
  62. package/dist/components/Loader/Analysis/style_module.css +13 -14
  63. package/dist/components/Loader/Analysis/style_module.css.map +1 -1
  64. package/dist/components/Loader/executions.mjs +5 -13
  65. package/dist/components/Loader/executions.mjs.map +1 -1
  66. package/dist/components/Opener/ide.mjs +36 -2
  67. package/dist/components/Opener/ide.mjs.map +1 -1
  68. package/dist/components/Overall/DataSummary.mjs +21 -20
  69. package/dist/components/Overall/DataSummary.mjs.map +1 -1
  70. package/dist/components/Overall/DataSummary.module.mjs +1 -12
  71. package/dist/components/Overall/DataSummary.module.mjs.map +1 -1
  72. package/dist/components/Overall/DataSummary_module.css +7 -72
  73. package/dist/components/Overall/DataSummary_module.css.map +1 -1
  74. package/dist/components/Overall/bundle_module.css +1 -4
  75. package/dist/components/Overall/bundle_module.css.map +1 -1
  76. package/dist/components/Overall/list_module.css +0 -2
  77. package/dist/components/Overall/list_module.css.map +1 -1
  78. package/dist/components/Overall/overview_module.css +1 -2
  79. package/dist/components/Overall/overview_module.css.map +1 -1
  80. package/dist/components/base/CodeViewer/index.d.ts +1 -1
  81. package/dist/components/base/CodeViewer/index.mjs +5 -3
  82. package/dist/components/base/CodeViewer/index.mjs.map +1 -1
  83. package/dist/components/base/CodeViewer/interface.d.ts +1 -2
  84. package/dist/components/base/DiffViewer/index.d.ts +1 -1
  85. package/dist/components/base/DiffViewer/index.mjs +4 -1
  86. package/dist/components/base/DiffViewer/index.mjs.map +1 -1
  87. package/dist/components/base/DiffViewer/interface.d.ts +1 -2
  88. package/dist/pages/BundleSize/components/asset-path.d.ts +7 -0
  89. package/dist/pages/BundleSize/components/asset-path.mjs +9 -0
  90. package/dist/pages/BundleSize/components/asset-path.mjs.map +1 -0
  91. package/dist/pages/BundleSize/components/asset-path.test.d.ts +1 -0
  92. package/dist/pages/BundleSize/components/asset-path.test.mjs +27 -0
  93. package/dist/pages/BundleSize/components/asset-path.test.mjs.map +1 -0
  94. package/dist/pages/BundleSize/components/asset_module.css +7 -5
  95. package/dist/pages/BundleSize/components/asset_module.css.map +1 -1
  96. package/dist/pages/BundleSize/components/card_module.css +2 -2
  97. package/dist/pages/BundleSize/components/card_module.css.map +1 -1
  98. package/dist/pages/BundleSize/components/cards.mjs +5 -6
  99. package/dist/pages/BundleSize/components/cards.mjs.map +1 -1
  100. package/dist/pages/BundleSize/components/index.mjs +15 -11
  101. package/dist/pages/BundleSize/components/index.mjs.map +1 -1
  102. package/dist/pages/BundleSize/components/index.module.mjs +1 -6
  103. package/dist/pages/BundleSize/components/index.module.mjs.map +1 -1
  104. package/dist/pages/BundleSize/components/index_module.css +0 -37
  105. package/dist/pages/BundleSize/components/index_module.css.map +1 -1
  106. package/dist/pages/BundleSize/components/search-modal.mjs +5 -5
  107. package/dist/pages/BundleSize/components/search-modal.mjs.map +1 -1
  108. package/dist/pages/BundleSize/components/search-modal.module.mjs +10 -0
  109. package/dist/pages/BundleSize/components/search-modal.module.mjs.map +1 -0
  110. package/dist/pages/BundleSize/components/search-modal_module.css +39 -0
  111. package/dist/pages/BundleSize/components/search-modal_module.css.map +1 -0
  112. package/dist/pages/BundleSize/components/tree-graph.mjs +32 -15
  113. package/dist/pages/BundleSize/components/tree-graph.mjs.map +1 -1
  114. package/dist/pages/ModuleAnalyze/components/fileTreeCom.css +6 -2
  115. package/dist/pages/ModuleAnalyze/components/fileTreeCom.css.map +1 -1
  116. package/dist/pages/ModuleAnalyze/index.css +4 -6
  117. package/dist/pages/ModuleAnalyze/index.css.map +1 -1
  118. package/dist/pages/ModuleAnalyze/index.mjs +3 -4
  119. package/dist/pages/ModuleAnalyze/index.mjs.map +1 -1
  120. package/dist/pages/WebpackLoaders/Analysis/index.mjs +3 -3
  121. package/dist/pages/WebpackLoaders/Analysis/index.mjs.map +1 -1
  122. package/dist/pages/WebpackLoaders/Overall/index.mjs +1 -1
  123. package/dist/pages/WebpackLoaders/Overall/index.mjs.map +1 -1
  124. package/dist/static/image/rsdoctor-title-logo-dark.png +0 -0
  125. package/dist/utils/assets.d.ts +1 -0
  126. package/dist/utils/assets.mjs +17 -0
  127. package/dist/utils/assets.mjs.map +1 -0
  128. package/dist/utils/assets.test.d.ts +1 -0
  129. package/dist/utils/assets.test.mjs +22 -0
  130. package/dist/utils/assets.test.mjs.map +1 -0
  131. package/dist/utils/hooks.d.ts +1 -0
  132. package/dist/utils/hooks.mjs +6 -1
  133. package/dist/utils/hooks.mjs.map +1 -1
  134. package/package.json +8 -8
@@ -1 +1 @@
1
- {"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 } 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 type {\n CallbackDataParams,\n ECElementEvent,\n} from 'echarts/types/dist/shared';\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 = 'stat' | 'parsed' | 'gzip' | 'value';\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() {\n return [\n {\n itemStyle: {\n borderWidth: 0,\n gapWidth: 4,\n gapColor: '#ffffff',\n },\n },\n {\n itemStyle: {\n borderColorAlpha: [1, 0.3],\n borderWidth: 5,\n gapWidth: 4,\n gapColor: '#ffffff',\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 style,\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\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 setOption({\n color: TREE_COLORS,\n tooltip: {\n padding: 10,\n backgroundColor: '#fff',\n borderColor: '#eee',\n borderWidth: 1,\n textStyle: {\n color: 'rgba(0, 0, 0, 0.8)',\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 } as TooltipComponentOption['position'],\n formatter: function (\n info: CallbackDataParams & { data?: TreemapDataNode },\n ) {\n const node = info.data || {};\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), '#52c41a'),\n );\n }\n if (bundledSize !== undefined && bundledSize > 0) {\n rows.push(\n makeRow('Parsed size', formatSize(bundledSize), '#d96420'),\n );\n }\n if (gzipSize !== undefined && gzipSize > 0) {\n rows.push(\n makeRow('Gzipped size', formatSize(gzipSize), '#1677ff'),\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: rgba(0, 0, 0, 0.8);\">${echarts.format.encodeHTML(path)}</div>\n ${rows.join('')}\n </div>\n `;\n },\n } as TooltipComponentOption,\n series: [\n {\n type: 'treemap',\n itemStyle: {\n gapColor: '#ffffff',\n },\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(),\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 },\n emphasis: {\n itemStyle: {\n color: '#333',\n },\n },\n textStyle: {\n fontFamily: 'sans-serif',\n fontSize: 12,\n color: '#666',\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 zoomLimit: {\n min: 0.5,\n max: 5,\n },\n } as TreemapSeriesOption,\n ],\n });\n }, [treeData, sizeType, highlightNodeId, rootPath]);\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']} style={style}>\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 <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 ) : 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\n const containerRef = React.useRef<HTMLDivElement>(null);\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 = useCallback(() => {\n if (containerRef.current) {\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\n const exitFullscreen = useCallback(() => {\n document\n .exitFullscreen()\n .then(() => setIsFullscreen(false))\n .catch((err) => console.error('Failed to exit fullscreen:', err));\n }, []);\n\n const toggleFullscreen = useCallback(() => {\n if (isFullscreen) {\n exitFullscreen();\n } else {\n enterFullscreen();\n }\n }, [isFullscreen, enterFullscreen, exitFullscreen]);\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((item) => checkedAssets.includes(item.name));\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]);\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 = useCallback((nodeId: number) => {\n setHighlightNodeId(nodeId);\n setCenterNodeId(nodeId);\n }, []);\n\n const removeRootPath = useCallback(\n (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 [rootPath],\n );\n\n const getSize = useCallback((node: TreeNode, type?: SizeType) => {\n if (type === 'stat') return node.sourceSize || 0;\n if (type === 'parsed') return node.bundledSize || 0;\n if (type === 'gzip') return node.gzipSize || 0;\n if (type === 'value') return node.value || 0;\n if (node.value) return node.value;\n return 0;\n }, []);\n\n const calculateNodeTotalSize = useCallback(\n (node: TreeNode, type: SizeType): number => {\n let size = getSize(node, type);\n\n if (node.children && node.children.length > 0) {\n const childrenSize = node.children.reduce(\n (sum, child) => sum + calculateNodeTotalSize(child, type),\n 0,\n );\n if (size === 0 || (!node.path && childrenSize > 0)) {\n size = childrenSize;\n }\n }\n\n return size;\n },\n [getSize],\n );\n\n const getChunkSize = useCallback(\n (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 calculateNodeTotalSize(node, sizeTypeToUse);\n },\n [treeData, sizeType, calculateNodeTotalSize],\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 <Checkbox\n indeterminate={\n checkedAssets.length > 0 &&\n checkedAssets.length < assetNames.length\n }\n checked={checkedAssets.length === assetNames.length}\n onChange={(e) =>\n setCheckedAssets(e.target.checked ? assetNames : [])\n }\n className={Styles['all-none-checkbox']}\n >\n All\n </Checkbox>\n <div\n className={Styles['chunk-list']}\n style={{ maxHeight: 180, overflowY: 'auto' }}\n >\n {assetNames\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 style={{ width: '100%', height: '100%' }}\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","TreeMap","memo","treeData","sizeType","style","onChartClick","highlightNodeId","centerNodeId","rootPath","option","setOption","useState","chartRef","React","chartDataRef","clickTimeoutRef","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","containerRef","handleChartClick","useCallback","enterFullscreen","el","err","exitFullscreen","document","toggleFullscreen","handleFullscreenChange","filteredTreeData","filtered","searchLower","searchResults","regex","RegExp","results","collectMatchingPaths","child","chunk","handleSearchResultClick","removeRootPath","filepath","getSize","type","calculateNodeTotalSize","childrenSize","sum","getChunkSize","name","n","sizeTypeToUse","FullscreenExitOutlined","FullscreenOutlined","RightOutlined","LeftOutlined","Radio","Input","SearchOutlined","Checkbox","a","displayPath","modules","ModuleAnalyzeComponent"],"mappings":"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"}
1
+ {"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';\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 = 'stat' | 'parsed' | 'gzip' | 'value';\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() {\n return [\n {\n itemStyle: {\n borderWidth: 0,\n gapWidth: 4,\n gapColor: '#ffffff',\n },\n },\n {\n itemStyle: {\n borderColorAlpha: [1, 0.3],\n borderWidth: 5,\n gapWidth: 4,\n gapColor: '#ffffff',\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), '#52c41a'),\n );\n }\n if (bundledSize !== undefined && bundledSize > 0) {\n rows.push(\n makeRow('Parsed size', formatSize(bundledSize), '#d96420'),\n );\n }\n if (gzipSize !== undefined && gzipSize > 0) {\n rows.push(\n makeRow('Gzipped size', formatSize(gzipSize), '#1677ff'),\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(),\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 getSize = (node: TreeNode, type?: SizeType) => {\n if (type === 'stat') return node.sourceSize || 0;\n if (type === 'parsed') return node.bundledSize || 0;\n if (type === 'gzip') return node.gzipSize || 0;\n if (type === 'value') return node.value || 0;\n if (node.value) return node.value;\n return 0;\n };\n\n const calculateNodeTotalSize = (node: TreeNode, type: SizeType): number => {\n let size = getSize(node, type);\n\n if (node.children && node.children.length > 0) {\n const childrenSize = node.children.reduce(\n (sum, child) => sum + calculateNodeTotalSize(child, type),\n 0,\n );\n if (size === 0 || (!node.path && childrenSize > 0)) {\n size = childrenSize;\n }\n }\n\n return size;\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 calculateNodeTotalSize(node, sizeTypeToUse);\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 <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 <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","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","getSize","type","calculateNodeTotalSize","childrenSize","sum","getChunkSize","name","n","sizeTypeToUse","FullscreenExitOutlined","FullscreenOutlined","RightOutlined","LeftOutlined","Radio","Input","SearchOutlined","Checkbox","a","displayPath","modules","ModuleAnalyzeComponent"],"mappings":"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"}
@@ -6,6 +6,7 @@ import { ServerAPIProvider, withServerAPI } from "../Manifest/index.mjs";
6
6
  import { LoaderExecutionsChart } from "./loader.mjs";
7
7
  import { filterLoader } from "../../utils/loader.mjs";
8
8
  import { Space } from "antd";
9
+ import { useTheme } from "../../utils/index.mjs";
9
10
  const LoaderChartBase = ({ project })=>{
10
11
  const { root: cwd } = project;
11
12
  const [store, setStore] = useState({
@@ -14,6 +15,7 @@ const LoaderChartBase = ({ project })=>{
14
15
  layer: ''
15
16
  });
16
17
  const [dimension] = useState(0);
18
+ const { theme } = useTheme();
17
19
  return /*#__PURE__*/ jsxs(Space, {
18
20
  direction: "vertical",
19
21
  style: {
@@ -34,7 +36,7 @@ const LoaderChartBase = ({ project })=>{
34
36
  return 0 === dimension ? /*#__PURE__*/ jsx(LoaderExecutionsChart, {
35
37
  loaders: loaders,
36
38
  cwd: cwd
37
- }) : /*#__PURE__*/ jsx(Fragment, {});
39
+ }, theme) : /*#__PURE__*/ jsx(Fragment, {});
38
40
  }
39
41
  })
40
42
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"components/Charts/index.mjs","sources":["../../../src/components/Charts/index.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { SDK } from '@rsdoctor/types';\nimport { ISelectLoaderProps, LoaderCommonSelect } from '../Select';\nimport { ServerAPIProvider, withServerAPI } from '../Manifest';\nimport { LoaderExecutionsChart } from './loader';\nimport { filterLoader } from 'src/utils/loader';\nimport { Space } from 'antd';\n\nenum ChartDimension {\n Loader,\n Process,\n}\n\nexport const LoaderChartBase: React.FC<{\n project: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetProjectInfo>;\n}> = ({ project }) => {\n const { root: cwd } = project;\n const [store, setStore] = useState({\n filename: '',\n loaders: [] as string[],\n layer: '',\n } as ISelectLoaderProps);\n // @ts-ignore\n const [dimension] = useState<ChartDimension>(ChartDimension.Loader);\n\n return (\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetLoaderNames}>\n {(loaderNames) => (\n <LoaderCommonSelect onChange={setStore} loaderNames={loaderNames} />\n )}\n </ServerAPIProvider>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetLoaderChartData}>\n {(res) => {\n const loaders = res.filter((el) =>\n filterLoader(\n el.resource,\n el.loader,\n store.filename,\n store.loaders,\n el.layer,\n store?.layer,\n ),\n );\n return dimension === ChartDimension.Loader ? (\n <LoaderExecutionsChart loaders={loaders} cwd={cwd} />\n ) : (\n // <ProcessExecutionsChart loaders={loaders} cwd={cwd} pid={pid} />\n <></>\n );\n }}\n </ServerAPIProvider>\n </Space>\n );\n};\n\nexport const LoaderChart = withServerAPI({\n api: SDK.ServerAPI.API.GetProjectInfo,\n responsePropName: 'project',\n Component: LoaderChartBase,\n});\n"],"names":["LoaderChartBase","project","cwd","store","setStore","useState","dimension","Space","ServerAPIProvider","SDK","loaderNames","LoaderCommonSelect","res","loaders","el","filterLoader","LoaderExecutionsChart","LoaderChart","withServerAPI"],"mappings":";;;;;;;;AAaO,MAAMA,kBAER,CAAC,EAAEC,OAAO,EAAE;IACf,MAAM,EAAE,MAAMC,GAAG,EAAE,GAAGD;IACtB,MAAM,CAACE,OAAOC,SAAS,GAAGC,SAAS;QACjC,UAAU;QACV,SAAS,EAAE;QACX,OAAO;IACT;IAEA,MAAM,CAACC,UAAU,GAAGD,SAAQA;IAE5B,OAAO,WAAP,GACE,KAACE,OAAKA;QAAC,WAAU;QAAW,OAAO;YAAE,OAAO;QAAO;;0BACjD,IAACC,mBAAiBA;gBAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;0BACrD,CAACC,cAAAA,WAAAA,GACA,IAACC,oBAAkBA;wBAAC,UAAUP;wBAAU,aAAaM;;;0BAGzD,IAACF,mBAAiBA;gBAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,kBAAkB;0BACzD,CAACG;oBACA,MAAMC,UAAUD,IAAI,MAAM,CAAC,CAACE,KAC1BC,aACED,GAAG,QAAQ,EACXA,GAAG,MAAM,EACTX,MAAM,QAAQ,EACdA,MAAM,OAAO,EACbW,GAAG,KAAK,EACRX,OAAO;oBAGX,OAAOG,AAAc,MAAdA,YAAAA,WAAAA,GACL,IAACU,uBAAqBA;wBAAC,SAASH;wBAAS,KAAKX;uCAG9C;gBAEJ;;;;AAIR;AAEO,MAAMe,cAAcC,cAAc;IACvC,KAAKT,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;IACrC,kBAAkB;IAClB,WAAWT;AACb"}
1
+ {"version":3,"file":"components/Charts/index.mjs","sources":["../../../src/components/Charts/index.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { SDK } from '@rsdoctor/types';\nimport { ISelectLoaderProps, LoaderCommonSelect } from '../Select';\nimport { ServerAPIProvider, withServerAPI } from '../Manifest';\nimport { LoaderExecutionsChart } from './loader';\nimport { filterLoader } from 'src/utils/loader';\nimport { Space } from 'antd';\nimport { useTheme } from 'src/utils';\n\nenum ChartDimension {\n Loader,\n Process,\n}\n\nexport const LoaderChartBase: React.FC<{\n project: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetProjectInfo>;\n}> = ({ project }) => {\n const { root: cwd } = project;\n const [store, setStore] = useState({\n filename: '',\n loaders: [] as string[],\n layer: '',\n } as ISelectLoaderProps);\n // @ts-ignore\n const [dimension] = useState<ChartDimension>(ChartDimension.Loader);\n\n const { theme } = useTheme();\n return (\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetLoaderNames}>\n {(loaderNames) => (\n <LoaderCommonSelect onChange={setStore} loaderNames={loaderNames} />\n )}\n </ServerAPIProvider>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetLoaderChartData}>\n {(res) => {\n const loaders = res.filter((el) =>\n filterLoader(\n el.resource,\n el.loader,\n store.filename,\n store.loaders,\n el.layer,\n store?.layer,\n ),\n );\n return dimension === ChartDimension.Loader ? (\n <LoaderExecutionsChart\n // changing the theme breaks the chart. force rerender on every theme change.\n key={theme}\n loaders={loaders}\n cwd={cwd}\n />\n ) : (\n // <ProcessExecutionsChart loaders={loaders} cwd={cwd} pid={pid} />\n <></>\n );\n }}\n </ServerAPIProvider>\n </Space>\n );\n};\n\nexport const LoaderChart = withServerAPI({\n api: SDK.ServerAPI.API.GetProjectInfo,\n responsePropName: 'project',\n Component: LoaderChartBase,\n});\n"],"names":["LoaderChartBase","project","cwd","store","setStore","useState","dimension","theme","useTheme","Space","ServerAPIProvider","SDK","loaderNames","LoaderCommonSelect","res","loaders","el","filterLoader","LoaderExecutionsChart","LoaderChart","withServerAPI"],"mappings":";;;;;;;;;AAcO,MAAMA,kBAER,CAAC,EAAEC,OAAO,EAAE;IACf,MAAM,EAAE,MAAMC,GAAG,EAAE,GAAGD;IACtB,MAAM,CAACE,OAAOC,SAAS,GAAGC,SAAS;QACjC,UAAU;QACV,SAAS,EAAE;QACX,OAAO;IACT;IAEA,MAAM,CAACC,UAAU,GAAGD,SAAQA;IAE5B,MAAM,EAAEE,KAAK,EAAE,GAAGC;IAClB,OAAO,WAAP,GACE,KAACC,OAAKA;QAAC,WAAU;QAAW,OAAO;YAAE,OAAO;QAAO;;0BACjD,IAACC,mBAAiBA;gBAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;0BACrD,CAACC,cAAAA,WAAAA,GACA,IAACC,oBAAkBA;wBAAC,UAAUT;wBAAU,aAAaQ;;;0BAGzD,IAACF,mBAAiBA;gBAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,kBAAkB;0BACzD,CAACG;oBACA,MAAMC,UAAUD,IAAI,MAAM,CAAC,CAACE,KAC1BC,aACED,GAAG,QAAQ,EACXA,GAAG,MAAM,EACTb,MAAM,QAAQ,EACdA,MAAM,OAAO,EACba,GAAG,KAAK,EACRb,OAAO;oBAGX,OAAOG,AAAc,MAAdA,YAAAA,WAAAA,GACL,IAACY,uBAAqBA;wBAGpB,SAASH;wBACT,KAAKb;uBAFAK,S,cAMP;gBAEJ;;;;AAIR;AAEO,MAAMY,cAAcC,cAAc;IACvC,KAAKT,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;IACrC,kBAAkB;IAClB,WAAWX;AACb"}
@@ -1,6 +1,5 @@
1
1
  .treemap-DOrYiA {
2
- background-color: #fff;
3
- border: 2px solid #e8e8e8;
2
+ border: 2px solid var(--color-border-secondary);
4
3
  flex-direction: row;
5
4
  height: calc(100vh - 100px);
6
5
  display: flex;
@@ -40,9 +39,9 @@
40
39
  }
41
40
 
42
41
  .sidebar-Pww0Wm {
42
+ background-color: var(--color-bg-box-elevated);
43
+ border-right: 1px solid var(--color-border-secondary);
43
44
  z-index: 10;
44
- background-color: #f6f6f6;
45
- border-right: 1px solid #e8e8e8;
46
45
  flex-direction: column;
47
46
  width: 300px;
48
47
  min-width: 300px;
@@ -69,7 +68,6 @@
69
68
  }
70
69
 
71
70
  .sidebar-content-WuURH8 h4 {
72
- color: #333;
73
71
  margin: 0 0 10px;
74
72
  font-size: 14px;
75
73
  font-weight: bold;
@@ -77,6 +75,7 @@
77
75
 
78
76
  .sidebar-toggle-NaGZQP {
79
77
  z-index: 20;
78
+ color: #000;
80
79
  cursor: pointer;
81
80
  background: #fff;
82
81
  border: 1px solid #ccc;
@@ -101,8 +100,10 @@
101
100
  }
102
101
 
103
102
  .chart-container-gPlZC7 {
103
+ flex-direction: column;
104
104
  width: 100%;
105
105
  height: 100%;
106
+ display: flex;
106
107
  position: relative;
107
108
  }
108
109
 
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./src/components/Charts/treemap.module.scss"],"names":[],"mappings":"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","sourcesContent":[".treemap{display:flex;flex-direction:row;height:calc(100vh - 100px);position:relative;overflow:hidden;border:2px solid #e8e8e8;background-color:#fff}.treemap :global .ant-checkbox-wrapper{font-weight:400;font-size:12px;user-select:none}.treemap:fullscreen,.treemap:-webkit-full-screen,.treemap:-moz-full-screen,.treemap:-ms-fullscreen{height:100vh;width:100vw;border:none}.sidebar{width:300px;min-width:300px;background-color:#f6f6f6;border-right:1px solid #e8e8e8;display:flex;flex-direction:column;transition:transform .3s ease;z-index:10;height:100%;position:relative;overflow:visible}.sidebar.collapsed{transform:translateX(-100%);position:absolute;left:0}.sidebar-content{padding:15px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:20px}.sidebar-content h4{margin:0 0 10px 0;font-size:14px;font-weight:bold;color:#333}.sidebar-toggle{position:absolute;top:10px;right:10px;z-index:20;background:#fff;border:1px solid #ccc;border-radius:4px;padding:5px;cursor:pointer;transition:right .3s ease}.sidebar-toggle.collapsed{right:-40px}.chart-wrapper{flex:1;position:relative;height:100%;width:100%;overflow:hidden}.chart-container{position:relative;width:100%;height:100%}.fullscreen-button{position:absolute;top:10px;right:10px;z-index:100;background:hsla(0,0%,100%,.9);border:1px solid #d9d9d9;border-radius:4px;padding:8px 12px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:16px;color:#333;box-shadow:0 2px 8px rgba(0,0,0,.15);transition:all .3s ease}.fullscreen-button:hover{background:#fff;border-color:#40a9ff;color:#40a9ff;box-shadow:0 4px 12px rgba(0,0,0,.2)}.fullscreen-button:active{transform:scale(0.95)}.chunk-list{display:flex;flex-direction:column;gap:6px}.chunk-item{display:flex;justify-content:space-between;align-items:center;font-size:12px}.chunk-item :global .ant-checkbox-wrapper{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.size-tag{color:#999;font-size:11px;margin-left:8px;white-space:nowrap}.search-box{margin-bottom:10px}.tooltip-row{font-size:12px;display:flex;justify-content:space-between;margin-top:4px}.tooltip-label{font-weight:bold;margin-right:10px;color:#333}.search-results{margin-top:10px;max-height:300px;overflow-y:auto;border:1px solid #e8e8e8;border-radius:4px;background-color:#fff}.search-results-header{padding:8px 12px;font-size:12px;font-weight:bold;color:#666;background-color:#f5f5f5;border-bottom:1px solid #e8e8e8}.search-results-list{max-height:250px;overflow-y:auto}.search-result-item{padding:8px 12px;font-size:12px;color:#333;cursor:pointer;border-bottom:1px solid #f0f0f0;word-break:break-all;transition:background-color .2s}.search-result-item:hover{background-color:#e6f7ff}.search-result-item:last-child{border-bottom:none}.search-results-empty{margin-top:10px;padding:8px 12px;font-size:12px;color:#999;text-align:center}.all-none-checkbox{margin-bottom:6px}"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./src/components/Charts/treemap.module.scss"],"names":[],"mappings":"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","sourcesContent":[".treemap{display:flex;flex-direction:row;height:calc(100vh - 100px);position:relative;overflow:hidden;border:2px solid var(--color-border-secondary)}.treemap :global .ant-checkbox-wrapper{font-weight:400;font-size:12px;user-select:none}.treemap:fullscreen,.treemap:-webkit-full-screen,.treemap:-moz-full-screen,.treemap:-ms-fullscreen{height:100vh;width:100vw;border:none}.sidebar{width:300px;min-width:300px;background-color:var(--color-bg-box-elevated);border-right:1px solid var(--color-border-secondary);display:flex;flex-direction:column;transition:transform .3s ease;z-index:10;height:100%;position:relative;overflow:visible}.sidebar.collapsed{transform:translateX(-100%);position:absolute;left:0}.sidebar-content{padding:15px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:20px}.sidebar-content h4{margin:0 0 10px 0;font-size:14px;font-weight:bold}.sidebar-toggle{position:absolute;top:10px;right:10px;z-index:20;background:#fff;color:#000;border:1px solid #ccc;border-radius:4px;padding:5px;cursor:pointer;transition:right .3s ease}.sidebar-toggle.collapsed{right:-40px}.chart-wrapper{flex:1;position:relative;height:100%;width:100%;overflow:hidden}.chart-container{display:flex;flex-direction:column;position:relative;width:100%;height:100%}.fullscreen-button{position:absolute;top:10px;right:10px;z-index:100;background:hsla(0,0%,100%,.9);border:1px solid #d9d9d9;border-radius:4px;padding:8px 12px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:16px;color:#333;box-shadow:0 2px 8px rgba(0,0,0,.15);transition:all .3s ease}.fullscreen-button:hover{background:#fff;border-color:#40a9ff;color:#40a9ff;box-shadow:0 4px 12px rgba(0,0,0,.2)}.fullscreen-button:active{transform:scale(0.95)}.chunk-list{display:flex;flex-direction:column;gap:6px}.chunk-item{display:flex;justify-content:space-between;align-items:center;font-size:12px}.chunk-item :global .ant-checkbox-wrapper{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.size-tag{color:#999;font-size:11px;margin-left:8px;white-space:nowrap}.search-box{margin-bottom:10px}.tooltip-row{font-size:12px;display:flex;justify-content:space-between;margin-top:4px}.tooltip-label{font-weight:bold;margin-right:10px;color:#333}.search-results{margin-top:10px;max-height:300px;overflow-y:auto;border:1px solid #e8e8e8;border-radius:4px;background-color:#fff}.search-results-header{padding:8px 12px;font-size:12px;font-weight:bold;color:#666;background-color:#f5f5f5;border-bottom:1px solid #e8e8e8}.search-results-list{max-height:250px;overflow-y:auto}.search-result-item{padding:8px 12px;font-size:12px;color:#333;cursor:pointer;border-bottom:1px solid #f0f0f0;word-break:break-all;transition:background-color .2s}.search-result-item:hover{background-color:#e6f7ff}.search-result-item:last-child{border-bottom:none}.search-results-empty{margin-top:10px;padding:8px 12px;font-size:12px;color:#999;text-align:center}.all-none-checkbox{margin-bottom:6px}"],"sourceRoot":""}
@@ -19,7 +19,6 @@
19
19
  }
20
20
 
21
21
  .rc-tree .rc-tree-treenode .rc-tree-node-content-wrapper {
22
- color: #000000d9;
23
22
  box-sizing: border-box;
24
23
  vertical-align: top;
25
24
  cursor: pointer;
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./src/components/FileTree/index.scss"],"names":[],"mappings":"AAAA;EACE,uBAAuB;EACvB,SAAS;AACX;;AAHiD;EAM/C,mBAAmB;EACnB,UAAU;EACV,mBAAmB;EACnB,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,gBAAgB;EAChB,aAAa;AACf;;AAd6L;EAiB3L,qBAAqB;AACvB;;AAlByP;EAqBvP,gBAAgB;EAChB,sBAAsB;EACtB,mBAAmB;EACnB,eAAe;EACf,SAAS;EACT,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,qBAAqB;EACrB,kBAAkB;AACpB;;AAhCkf;EAmChf,aAAa;AACf;;AApCqiB;EAuCniB,cAAc;AAChB;;AAxC8lB;EA2C5lB,cAAc;EACd,mBAAmB;AACrB;;AA7CuwB;EAgDrwB,qBAAqB;EACrB,kBAAkB;AACpB;;AAlDo2B;EAqDl2B,qBAAqB;AACvB;;AAtD05B;EAyDx5B,sBAAsB;EACtB,SAAS;EACT,qBAAqB;AACvB;;AA5Dg/B;EA+D9+B,WAAW;EACX,qBAAqB;AACvB;;AAjEujC;EAoErjC,yBAAyB;EACzB,oBAAoB;AACtB;;AAtEsoC;EAyEpoC,wBAAwB;AAC1B;;AA1E+rC;EA6E7rC,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB","sourcesContent":[".rc-tree{margin:0;border:1px solid rgba(0,0,0,0)}.rc-tree .rc-tree-treenode{display:flex;align-items:center;margin:0;padding:0;line-height:24px;white-space:nowrap;list-style:none;outline:0}.rc-tree .rc-tree-treenode:hover{background:rgba(0,0,0,.04)}.rc-tree .rc-tree-treenode .rc-tree-node-content-wrapper{position:relative;display:inline-block;margin:0;padding:0 4px;font-size:14px;font-weight:400;color:rgba(0,0,0,.85);box-sizing:border-box;text-decoration:none;vertical-align:top;cursor:pointer}.rc-tree .rc-tree-treenode-child-tree{display:none}.rc-tree .rc-tree-treenode-child-tree-open{display:block}.rc-tree .rc-tree-treenode-treenode-disabled>span:not(.rc-tree-switcher),.rc-tree .rc-tree-treenode>a,.rc-tree .rc-tree-treenode>a span{color:#767676;cursor:not-allowed}.rc-tree .rc-tree-treenode-treenode-selected{background:rgba(5,145,255,.3);border-radius:4px}.rc-tree .rc-tree-treenode-title{display:inline-block}.rc-tree .rc-tree-treenode-indent{display:inline-block;height:0;vertical-align:bottom}.rc-tree .rc-tree-treenode-indent-unit{display:inline-block;width:14px}.file-tree-switcher-arrow{transform:rotate(0deg);transition:transform .3s ease}.file-tree-switcher-arrow-expand{transform:rotate(90deg)}.file-icon{display:inline-block;padding:2px 0;margin-left:8px}"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./src/components/FileTree/index.scss"],"names":[],"mappings":"AAAA;EACE,uBAAuB;EACvB,SAAS;AACX;;AAHiD;EAM/C,mBAAmB;EACnB,UAAU;EACV,mBAAmB;EACnB,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,gBAAgB;EAChB,aAAa;AACf;;AAd6L;EAiB3L,qBAAqB;AACvB;;AAlByP;EAqBvP,sBAAsB;EACtB,mBAAmB;EACnB,eAAe;EACf,SAAS;EACT,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,qBAAqB;EACrB,qBAAqB;EACrB,kBAAkB;AACpB;;AA/B4d;EAkC1d,aAAa;AACf;;AAnC+gB;EAsC7gB,cAAc;AAChB;;AAvCwkB;EA0CtkB,cAAc;EACd,mBAAmB;AACrB;;AA5CivB;EA+C/uB,qBAAqB;EACrB,kBAAkB;AACpB;;AAjD80B;EAoD50B,qBAAqB;AACvB;;AArDo4B;EAwDl4B,sBAAsB;EACtB,SAAS;EACT,qBAAqB;AACvB;;AA3D09B;EA8Dx9B,WAAW;EACX,qBAAqB;AACvB;;AAhEiiC;EAmE/hC,yBAAyB;EACzB,oBAAoB;AACtB;;AArEgnC;EAwE9mC,wBAAwB;AAC1B;;AAzEyqC;EA4EvqC,gBAAgB;EAChB,cAAc;EACd,qBAAqB;AACvB","sourcesContent":[".rc-tree{margin:0;border:1px solid rgba(0,0,0,0)}.rc-tree .rc-tree-treenode{display:flex;align-items:center;margin:0;padding:0;line-height:24px;white-space:nowrap;list-style:none;outline:0}.rc-tree .rc-tree-treenode:hover{background:rgba(0,0,0,.04)}.rc-tree .rc-tree-treenode .rc-tree-node-content-wrapper{position:relative;display:inline-block;margin:0;padding:0 4px;font-size:14px;font-weight:400;box-sizing:border-box;text-decoration:none;vertical-align:top;cursor:pointer}.rc-tree .rc-tree-treenode-child-tree{display:none}.rc-tree .rc-tree-treenode-child-tree-open{display:block}.rc-tree .rc-tree-treenode-treenode-disabled>span:not(.rc-tree-switcher),.rc-tree .rc-tree-treenode>a,.rc-tree .rc-tree-treenode>a span{color:#767676;cursor:not-allowed}.rc-tree .rc-tree-treenode-treenode-selected{background:rgba(5,145,255,.3);border-radius:4px}.rc-tree .rc-tree-treenode-title{display:inline-block}.rc-tree .rc-tree-treenode-indent{display:inline-block;height:0;vertical-align:bottom}.rc-tree .rc-tree-treenode-indent-unit{display:inline-block;width:14px}.file-tree-switcher-arrow{transform:rotate(0deg);transition:transform .3s ease}.file-tree-switcher-arrow-expand{transform:rotate(90deg)}.file-icon{display:inline-block;padding:2px 0;margin-left:8px}"],"sourceRoot":""}
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import "react";
3
- import { Space, theme } from "antd";
3
+ import { Space } from "antd";
4
4
  import { FileOutlined, FolderOpenTwoTone, FolderTwoTone, RightOutlined } from "@ant-design/icons";
5
5
  import rc_tree from "rc-tree";
6
6
  import css from "../../common/svg/files/css.mjs";
@@ -9,9 +9,8 @@ import files_image from "../../common/svg/files/image.mjs";
9
9
  import js from "../../common/svg/files/js.mjs";
10
10
  import unkown_file from "../../common/svg/files/unkown-file.mjs";
11
11
  import "./index.css";
12
- import { useTheme } from "../../utils/index.mjs";
12
+ import { useTheme, useThemeToken } from "../../utils/index.mjs";
13
13
  import path from "path";
14
- const { useToken: useToken } = theme;
15
14
  function getFileType(filename) {
16
15
  const extension = path.extname(filename).slice(1).toLowerCase();
17
16
  switch(extension){
@@ -63,7 +62,7 @@ function getFileCom(filename) {
63
62
  }
64
63
  const FileTree = (props)=>{
65
64
  const { isDark } = useTheme();
66
- const { token } = useToken();
65
+ const token = useThemeToken();
67
66
  const color = isDark ? token.colorWhite : token.colorText;
68
67
  const style = {
69
68
  fontSize: token.fontSize
@@ -1 +1 @@
1
- {"version":3,"file":"components/FileTree/index.mjs","sources":["../../../src/components/FileTree/index.tsx"],"sourcesContent":["import React from 'react';\nimport { Space, theme } from 'antd';\nimport {\n FileOutlined,\n FolderOpenTwoTone,\n FolderTwoTone,\n RightOutlined,\n} from '@ant-design/icons';\nimport Tree, { TreeProps } from 'rc-tree';\nimport CSSIcon from 'src/common/svg/files/css.svg';\nimport HtmlIcon from 'src/common/svg/files/html.svg';\nimport IMGIcon from 'src/common/svg/files/image.svg';\nimport JSIcon from 'src/common/svg/files/js.svg';\nimport FileIcon from 'src/common/svg/files/unkown-file.svg';\n\nimport './index.sass';\nimport { useTheme } from '../../utils';\nimport path from 'path';\n\nconst { useToken } = theme;\n\nfunction getFileType(filename: string) {\n const extension = path.extname(filename).slice(1).toLowerCase();\n\n switch (extension) {\n case 'js':\n case 'jsx':\n case 'ts':\n case 'mjs':\n case 'cjs':\n case 'mts':\n case 'cts':\n return <JSIcon />;\n case 'tsx':\n return <FileIcon />;\n case 'css':\n case 'scss':\n case 'sass':\n case 'less':\n case 'styl':\n case 'stylus':\n return <CSSIcon />;\n case 'html':\n return <HtmlIcon />;\n case 'png':\n case 'jpg':\n case 'jpeg':\n case 'gif':\n case 'svg':\n case 'bmp':\n case 'webp':\n case 'ico':\n case 'apng':\n case 'avif':\n case 'tif':\n case 'tiff':\n case 'jfif':\n case 'pjpeg':\n case 'pjp':\n return <IMGIcon />;\n default:\n return <FileIcon />;\n }\n}\n\nexport function getFileCom(filename: string) {\n const fileIcon = getFileType(filename);\n return <div className=\"file-icon\">{fileIcon}</div>;\n}\n\nexport const FileTree: React.FC<Partial<TreeProps>> = (props) => {\n const { isDark } = useTheme();\n\n const { token } = useToken();\n const color = isDark ? token.colorWhite : token.colorText;\n const style = { fontSize: token.fontSize };\n\n return (\n <Tree\n checkable={false}\n selectable={true}\n switcherIcon={({ data, expanded }) => {\n if (data?.children) {\n return (\n <Space style={{ color }}>\n <RightOutlined\n twoToneColor={color}\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n style={style}\n />\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (data?.key && typeof data.key === 'string') {\n return getFileCom(data.key);\n }\n return <FileOutlined />;\n }}\n expandAction=\"click\"\n {...props}\n />\n );\n};\n"],"names":["useToken","theme","getFileType","filename","extension","path","JSIcon","FileIcon","CSSIcon","HtmlIcon","IMGIcon","getFileCom","fileIcon","FileTree","props","isDark","useTheme","token","color","style","Tree","data","expanded","Space","RightOutlined","FolderOpenTwoTone","FolderTwoTone","FileOutlined"],"mappings":";;;;;;;;;;;;;AAmBA,MAAM,EAAEA,UAAAA,QAAQ,EAAE,GAAGC;AAErB,SAASC,YAAYC,QAAgB;IACnC,MAAMC,YAAYC,KAAK,OAAO,CAACF,UAAU,KAAK,CAAC,GAAG,WAAW;IAE7D,OAAQC;QACN,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO,WAAP,GAAO,IAACE,IAAMA,CAAAA;QAChB,KAAK;YACH,OAAO,WAAP,GAAO,IAACC,aAAQA,CAAAA;QAClB,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO,WAAP,GAAO,IAACC,KAAOA,CAAAA;QACjB,KAAK;YACH,OAAO,WAAP,GAAO,IAACC,MAAQA,CAAAA;QAClB,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO,WAAP,GAAO,IAACC,aAAOA,CAAAA;QACjB;YACE,OAAO,WAAP,GAAO,IAACH,aAAQA,CAAAA;IACpB;AACF;AAEO,SAASI,WAAWR,QAAgB;IACzC,MAAMS,WAAWV,YAAYC;IAC7B,OAAO,WAAP,GAAO,IAAC;QAAI,WAAU;kBAAaS;;AACrC;AAEO,MAAMC,WAAyC,CAACC;IACrD,MAAM,EAAEC,MAAM,EAAE,GAAGC;IAEnB,MAAM,EAAEC,KAAK,EAAE,GAAGjB;IAClB,MAAMkB,QAAQH,SAASE,MAAM,UAAU,GAAGA,MAAM,SAAS;IACzD,MAAME,QAAQ;QAAE,UAAUF,MAAM,QAAQ;IAAC;IAEzC,OAAO,WAAP,GACE,IAACG,SAAIA;QACH,WAAW;QACX,YAAY;QACZ,cAAc,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAE;YAC/B,IAAID,MAAM,UACR,OAAO,WAAP,GACE,KAACE,OAAKA;gBAAC,OAAO;oBAAEL;gBAAM;;kCACpB,IAACM,eAAaA;wBACZ,cAAcN;wBACd,WAAW,CAAC,yBAAyB,EAAEI,WAAW,oCAAoC,IAAI;wBAC1F,OAAOH;;oBAERG,WAAW,WAAXA,GAAW,IAACG,mBAAiBA,CAAAA,KAAAA,WAAAA,GAAM,IAACC,eAAaA,CAAAA;;;YAIxD,IAAIL,MAAM,OAAO,AAAoB,YAApB,OAAOA,KAAK,GAAG,EAC9B,OAAOV,WAAWU,KAAK,GAAG;YAE5B,OAAO,WAAP,GAAO,IAACM,cAAYA,CAAAA;QACtB;QACA,cAAa;QACZ,GAAGb,KAAK;;AAGf"}
1
+ {"version":3,"file":"components/FileTree/index.mjs","sources":["../../../src/components/FileTree/index.tsx"],"sourcesContent":["import React from 'react';\nimport { Space } from 'antd';\nimport {\n FileOutlined,\n FolderOpenTwoTone,\n FolderTwoTone,\n RightOutlined,\n} from '@ant-design/icons';\nimport Tree, { TreeProps } from 'rc-tree';\nimport CSSIcon from 'src/common/svg/files/css.svg';\nimport HtmlIcon from 'src/common/svg/files/html.svg';\nimport IMGIcon from 'src/common/svg/files/image.svg';\nimport JSIcon from 'src/common/svg/files/js.svg';\nimport FileIcon from 'src/common/svg/files/unkown-file.svg';\n\nimport './index.sass';\nimport { useTheme, useThemeToken } from '../../utils';\nimport path from 'path';\n\nfunction getFileType(filename: string) {\n const extension = path.extname(filename).slice(1).toLowerCase();\n\n switch (extension) {\n case 'js':\n case 'jsx':\n case 'ts':\n case 'mjs':\n case 'cjs':\n case 'mts':\n case 'cts':\n return <JSIcon />;\n case 'tsx':\n return <FileIcon />;\n case 'css':\n case 'scss':\n case 'sass':\n case 'less':\n case 'styl':\n case 'stylus':\n return <CSSIcon />;\n case 'html':\n return <HtmlIcon />;\n case 'png':\n case 'jpg':\n case 'jpeg':\n case 'gif':\n case 'svg':\n case 'bmp':\n case 'webp':\n case 'ico':\n case 'apng':\n case 'avif':\n case 'tif':\n case 'tiff':\n case 'jfif':\n case 'pjpeg':\n case 'pjp':\n return <IMGIcon />;\n default:\n return <FileIcon />;\n }\n}\n\nexport function getFileCom(filename: string) {\n const fileIcon = getFileType(filename);\n return <div className=\"file-icon\">{fileIcon}</div>;\n}\n\nexport const FileTree: React.FC<Partial<TreeProps>> = (props) => {\n const { isDark } = useTheme();\n\n const token = useThemeToken();\n const color = isDark ? token.colorWhite : token.colorText;\n const style = { fontSize: token.fontSize };\n\n return (\n <Tree\n checkable={false}\n selectable={true}\n switcherIcon={({ data, expanded }) => {\n if (data?.children) {\n return (\n <Space style={{ color }}>\n <RightOutlined\n twoToneColor={color}\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n style={style}\n />\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (data?.key && typeof data.key === 'string') {\n return getFileCom(data.key);\n }\n return <FileOutlined />;\n }}\n expandAction=\"click\"\n {...props}\n />\n );\n};\n"],"names":["getFileType","filename","extension","path","JSIcon","FileIcon","CSSIcon","HtmlIcon","IMGIcon","getFileCom","fileIcon","FileTree","props","isDark","useTheme","token","useThemeToken","color","style","Tree","data","expanded","Space","RightOutlined","FolderOpenTwoTone","FolderTwoTone","FileOutlined"],"mappings":";;;;;;;;;;;;;AAmBA,SAASA,YAAYC,QAAgB;IACnC,MAAMC,YAAYC,KAAK,OAAO,CAACF,UAAU,KAAK,CAAC,GAAG,WAAW;IAE7D,OAAQC;QACN,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO,WAAP,GAAO,IAACE,IAAMA,CAAAA;QAChB,KAAK;YACH,OAAO,WAAP,GAAO,IAACC,aAAQA,CAAAA;QAClB,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO,WAAP,GAAO,IAACC,KAAOA,CAAAA;QACjB,KAAK;YACH,OAAO,WAAP,GAAO,IAACC,MAAQA,CAAAA;QAClB,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH,OAAO,WAAP,GAAO,IAACC,aAAOA,CAAAA;QACjB;YACE,OAAO,WAAP,GAAO,IAACH,aAAQA,CAAAA;IACpB;AACF;AAEO,SAASI,WAAWR,QAAgB;IACzC,MAAMS,WAAWV,YAAYC;IAC7B,OAAO,WAAP,GAAO,IAAC;QAAI,WAAU;kBAAaS;;AACrC;AAEO,MAAMC,WAAyC,CAACC;IACrD,MAAM,EAAEC,MAAM,EAAE,GAAGC;IAEnB,MAAMC,QAAQC;IACd,MAAMC,QAAQJ,SAASE,MAAM,UAAU,GAAGA,MAAM,SAAS;IACzD,MAAMG,QAAQ;QAAE,UAAUH,MAAM,QAAQ;IAAC;IAEzC,OAAO,WAAP,GACE,IAACI,SAAIA;QACH,WAAW;QACX,YAAY;QACZ,cAAc,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAE;YAC/B,IAAID,MAAM,UACR,OAAO,WAAP,GACE,KAACE,OAAKA;gBAAC,OAAO;oBAAEL;gBAAM;;kCACpB,IAACM,eAAaA;wBACZ,cAAcN;wBACd,WAAW,CAAC,yBAAyB,EAAEI,WAAW,oCAAoC,IAAI;wBAC1F,OAAOH;;oBAERG,WAAW,WAAXA,GAAW,IAACG,mBAAiBA,CAAAA,KAAAA,WAAAA,GAAM,IAACC,eAAaA,CAAAA;;;YAIxD,IAAIL,MAAM,OAAO,AAAoB,YAApB,OAAOA,KAAK,GAAG,EAC9B,OAAOX,WAAWW,KAAK,GAAG;YAE5B,OAAO,WAAP,GAAO,IAACM,cAAYA,CAAAA;QACtB;QACA,cAAa;QACZ,GAAGd,KAAK;;AAGf"}
@@ -1,5 +1,4 @@
1
1
  .text-QI6k9S {
2
- color: #000000d9;
3
2
  font-size: 14px;
4
3
  font-weight: 400;
5
4
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./src/components/Keyword/style.module.scss"],"names":[],"mappings":"AAAA;EACE,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AAClB","sourcesContent":[".text{font-size:14px;font-weight:400;color:rgba(0,0,0,.85)}"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./src/components/Keyword/style.module.scss"],"names":[],"mappings":"AAAA;EACE,eAAe;EACf,gBAAgB;AAClB","sourcesContent":[".text{font-size:14px;font-weight:400}"],"sourceRoot":""}
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { TranslationOutlined } from "@ant-design/icons";
3
- import { Col, Dropdown, Layout, Row } from "antd";
3
+ import { Col, Dropdown, Layout, Row, Switch } from "antd";
4
4
  import "react";
5
- import { Language } from "../../constants.mjs";
5
+ import { Language, Theme } from "../../constants.mjs";
6
6
  import { useI18n, useTheme } from "../../utils/index.mjs";
7
7
  import { OverlayAlertsWithButton } from "../Alerts/index.mjs";
8
8
  import { BuilderSelect } from "./builder-select.mjs";
@@ -10,11 +10,12 @@ import { Menus } from "./menus.mjs";
10
10
  import { Client } from "@rsdoctor/types";
11
11
  import { useNavigate } from "react-router-dom";
12
12
  import header_module from "./header.module.mjs";
13
- import clsx from "clsx";
13
+ import rsdoctor_title_logo_dark from "./rsdoctor-title-logo-dark.mjs";
14
+ const logoLight = 'https://assets.rspack.rs/rsdoctor/rsdoctor-title-logo.png';
14
15
  const Header = ({ enableRoutes })=>{
15
16
  const { i18n } = useI18n();
16
17
  const navigate = useNavigate();
17
- const { isDark } = useTheme();
18
+ const { setTheme, isLight, isDark } = useTheme();
18
19
  const languages = [
19
20
  {
20
21
  value: Language.Cn,
@@ -26,7 +27,7 @@ const Header = ({ enableRoutes })=>{
26
27
  }
27
28
  ];
28
29
  return /*#__PURE__*/ jsx(Layout.Header, {
29
- className: clsx(header_module.root, isDark && header_module.rootDark),
30
+ className: header_module.root,
30
31
  children: /*#__PURE__*/ jsxs(Row, {
31
32
  className: header_module.innerRoot,
32
33
  children: [
@@ -38,7 +39,7 @@ const Header = ({ enableRoutes })=>{
38
39
  /*#__PURE__*/ jsx("img", {
39
40
  width: "1604",
40
41
  height: "380",
41
- src: "https://assets.rspack.rs/rsdoctor/rsdoctor-title-logo.png",
42
+ src: isLight ? logoLight : rsdoctor_title_logo_dark,
42
43
  className: header_module.rsdoctorLogo,
43
44
  alt: "logo",
44
45
  onClick: ()=>{
@@ -63,6 +64,21 @@ const Header = ({ enableRoutes })=>{
63
64
  /*#__PURE__*/ jsx(Col, {
64
65
  children: /*#__PURE__*/ jsx(OverlayAlertsWithButton, {})
65
66
  }),
67
+ /*#__PURE__*/ jsx(Col, {
68
+ children: /*#__PURE__*/ jsx(Switch, {
69
+ className: "header-switch",
70
+ checkedChildren: "\uD83C\uDF1B",
71
+ unCheckedChildren: "\uD83C\uDF1E",
72
+ checked: isDark,
73
+ onChange: (checked)=>{
74
+ setTheme(checked ? Theme.Dark : Theme.Light);
75
+ },
76
+ style: {
77
+ border: `1px solid ${isLight ? '#ddd' : '#fff'}`,
78
+ background: isLight ? '#eee' : '#141414'
79
+ }
80
+ })
81
+ }),
66
82
  /*#__PURE__*/ jsx(Col, {
67
83
  children: /*#__PURE__*/ jsx(Dropdown, {
68
84
  overlayStyle: {
@@ -1 +1 @@
1
- {"version":3,"file":"components/Layout/header.mjs","sources":["../../../src/components/Layout/header.tsx"],"sourcesContent":["import { TranslationOutlined } from '@ant-design/icons';\nimport { Col, Dropdown, Layout, Row } from 'antd';\nimport React from 'react';\nimport { Language } from '../../constants';\nimport { useI18n, useTheme } from '../../utils';\nimport { OverlayAlertsWithButton } from '../Alerts';\nimport { BuilderSelect } from './builder-select';\nimport { Menus } from './menus';\nimport { Client } from '@rsdoctor/types';\nimport { useNavigate } from 'react-router-dom';\nimport styles from './header.module.scss';\nimport clsx from 'clsx';\n\nexport interface HeaderProps {\n enableRoutes?: string[];\n}\n\nexport const Header: React.FC<HeaderProps> = ({ enableRoutes }) => {\n const { i18n } = useI18n();\n\n const navigate = useNavigate();\n const { isDark } = useTheme();\n const languages = [\n { value: Language.Cn, label: '中文' },\n { value: Language.En, label: 'English' },\n ];\n\n return (\n <Layout.Header className={clsx(styles.root, isDark && styles.rootDark)}>\n <Row className={styles.innerRoot}>\n <Col className={styles.leftCol}>\n <div className={styles.leftColInner}>\n <img\n width=\"1604\"\n height=\"380\"\n src=\"https://assets.rspack.rs/rsdoctor/rsdoctor-title-logo.png\"\n className={styles.rsdoctorLogo}\n alt=\"logo\"\n onClick={() => {\n if (\n location.hash.includes(\n Client.RsdoctorClientRoutes.Uploader,\n ) &&\n location.pathname.includes('/preview')\n ) {\n location.href = 'http://rsdoctor.rs';\n } else {\n navigate(Client.RsdoctorClientRoutes.Home);\n }\n }}\n />\n <BuilderSelect />\n </div>\n </Col>\n <Menus\n key={enableRoutes ? JSON.stringify(enableRoutes) : 'default'}\n style={{ transition: 'none' }}\n />\n\n <Col className={styles.rightCol}>\n <Row className={styles.rightColInner}>\n <Col>\n <OverlayAlertsWithButton />\n </Col>\n\n {/* <Col> TODO: dark mode has some error need fix.\n <Switch\n className=\"header-switch\"\n checkedChildren=\"🌛\"\n unCheckedChildren=\"🌞\"\n checked={isDark}\n onChange={(checked) => {\n setTheme(checked ? Theme.Dark : Theme.Light);\n }}\n style={{ border: `1px solid ${isLight ? '#ddd' : '#fff'}`, background: isLight ? '#eee' : '#141414' }}\n />\n </Col> */}\n <Col>\n <Dropdown\n overlayStyle={{ zIndex: 1000 }}\n menu={{\n items: languages.map((e) => ({\n label: e.label,\n key: e.value,\n onClick() {\n i18n.changeLanguage(e.value);\n },\n })),\n selectedKeys: [i18n.language],\n }}\n >\n <TranslationOutlined className={styles.translationsIcon} />\n </Dropdown>\n </Col>\n </Row>\n </Col>\n </Row>\n </Layout.Header>\n );\n};\n"],"names":["Header","enableRoutes","i18n","useI18n","navigate","useNavigate","isDark","useTheme","languages","Language","Layout","clsx","styles","Row","Col","location","Client","BuilderSelect","Menus","JSON","OverlayAlertsWithButton","Dropdown","e","TranslationOutlined"],"mappings":";;;;;;;;;;;;;AAiBO,MAAMA,SAAgC,CAAC,EAAEC,YAAY,EAAE;IAC5D,MAAM,EAAEC,IAAI,EAAE,GAAGC;IAEjB,MAAMC,WAAWC;IACjB,MAAM,EAAEC,MAAM,EAAE,GAAGC;IACnB,MAAMC,YAAY;QAChB;YAAE,OAAOC,SAAS,EAAE;YAAE,OAAO;QAAK;QAClC;YAAE,OAAOA,SAAS,EAAE;YAAE,OAAO;QAAU;KACxC;IAED,OAAO,WAAP,GACE,IAACC,OAAO,MAAM;QAAC,WAAWC,KAAKC,cAAAA,IAAW,EAAEN,UAAUM,cAAAA,QAAe;kBACnE,mBAACC,KAAGA;YAAC,WAAWD,cAAAA,SAAgB;;8BAC9B,IAACE,KAAGA;oBAAC,WAAWF,cAAAA,OAAc;8BAC5B,mBAAC;wBAAI,WAAWA,cAAAA,YAAmB;;0CACjC,IAAC;gCACC,OAAM;gCACN,QAAO;gCACP,KAAI;gCACJ,WAAWA,cAAAA,YAAmB;gCAC9B,KAAI;gCACJ,SAAS;oCACP,IACEG,SAAS,IAAI,CAAC,QAAQ,CACpBC,OAAO,oBAAoB,CAAC,QAAQ,KAEtCD,SAAS,QAAQ,CAAC,QAAQ,CAAC,aAE3BA,SAAS,IAAI,GAAG;yCAEhBX,SAASY,OAAO,oBAAoB,CAAC,IAAI;gCAE7C;;0CAEF,IAACC,eAAaA,CAAAA;;;;8BAGlB,IAACC,OAAKA;oBAEJ,OAAO;wBAAE,YAAY;oBAAO;mBADvBjB,eAAekB,KAAK,SAAS,CAAClB,gBAAgB;8BAIrD,IAACa,KAAGA;oBAAC,WAAWF,cAAAA,QAAe;8BAC7B,mBAACC,KAAGA;wBAAC,WAAWD,cAAAA,aAAoB;;0CAClC,IAACE,KAAGA;0CACF,kBAACM,yBAAuBA,CAAAA;;0CAe1B,IAACN,KAAGA;0CACF,kBAACO,UAAQA;oCACP,cAAc;wCAAE,QAAQ;oCAAK;oCAC7B,MAAM;wCACJ,OAAOb,UAAU,GAAG,CAAC,CAACc,IAAO;gDAC3B,OAAOA,EAAE,KAAK;gDACd,KAAKA,EAAE,KAAK;gDACZ;oDACEpB,KAAK,cAAc,CAACoB,EAAE,KAAK;gDAC7B;4CACF;wCACA,cAAc;4CAACpB,KAAK,QAAQ;yCAAC;oCAC/B;8CAEA,kBAACqB,qBAAmBA;wCAAC,WAAWX,cAAAA,gBAAuB;;;;;;;;;;AAQvE"}
1
+ {"version":3,"file":"components/Layout/header.mjs","sources":["../../../src/components/Layout/header.tsx"],"sourcesContent":["import { TranslationOutlined } from '@ant-design/icons';\nimport { Col, Dropdown, Layout, Row, Switch } from 'antd';\nimport React from 'react';\nimport { Language, Theme } from '../../constants';\nimport { useI18n, useTheme } from '../../utils';\nimport { OverlayAlertsWithButton } from '../Alerts';\nimport { BuilderSelect } from './builder-select';\nimport { Menus } from './menus';\nimport { Client } from '@rsdoctor/types';\nimport { useNavigate } from 'react-router-dom';\nimport styles from './header.module.scss';\nimport logoDark from './rsdoctor-title-logo-dark.png';\nconst logoLight = 'https://assets.rspack.rs/rsdoctor/rsdoctor-title-logo.png';\n\nexport interface HeaderProps {\n enableRoutes?: string[];\n}\n\nexport const Header: React.FC<HeaderProps> = ({ enableRoutes }) => {\n const { i18n } = useI18n();\n\n const navigate = useNavigate();\n const { setTheme, isLight, isDark } = useTheme();\n const languages = [\n { value: Language.Cn, label: '中文' },\n { value: Language.En, label: 'English' },\n ];\n\n return (\n <Layout.Header className={styles.root}>\n <Row className={styles.innerRoot}>\n <Col className={styles.leftCol}>\n <div className={styles.leftColInner}>\n <img\n width=\"1604\"\n height=\"380\"\n src={isLight ? logoLight : logoDark}\n className={styles.rsdoctorLogo}\n alt=\"logo\"\n onClick={() => {\n if (\n location.hash.includes(\n Client.RsdoctorClientRoutes.Uploader,\n ) &&\n location.pathname.includes('/preview')\n ) {\n location.href = 'http://rsdoctor.rs';\n } else {\n navigate(Client.RsdoctorClientRoutes.Home);\n }\n }}\n />\n <BuilderSelect />\n </div>\n </Col>\n <Menus\n key={enableRoutes ? JSON.stringify(enableRoutes) : 'default'}\n style={{ transition: 'none' }}\n />\n\n <Col className={styles.rightCol}>\n <Row className={styles.rightColInner}>\n <Col>\n <OverlayAlertsWithButton />\n </Col>\n\n <Col>\n <Switch\n className=\"header-switch\"\n checkedChildren=\"🌛\"\n unCheckedChildren=\"🌞\"\n checked={isDark}\n onChange={(checked) => {\n setTheme(checked ? Theme.Dark : Theme.Light);\n }}\n style={{\n border: `1px solid ${isLight ? '#ddd' : '#fff'}`,\n background: isLight ? '#eee' : '#141414',\n }}\n />\n </Col>\n <Col>\n <Dropdown\n overlayStyle={{ zIndex: 1000 }}\n menu={{\n items: languages.map((e) => ({\n label: e.label,\n key: e.value,\n onClick() {\n i18n.changeLanguage(e.value);\n },\n })),\n selectedKeys: [i18n.language],\n }}\n >\n <TranslationOutlined className={styles.translationsIcon} />\n </Dropdown>\n </Col>\n </Row>\n </Col>\n </Row>\n </Layout.Header>\n );\n};\n"],"names":["logoLight","Header","enableRoutes","i18n","useI18n","navigate","useNavigate","setTheme","isLight","isDark","useTheme","languages","Language","Layout","styles","Row","Col","logoDark","location","Client","BuilderSelect","Menus","JSON","OverlayAlertsWithButton","Switch","checked","Theme","Dropdown","e","TranslationOutlined"],"mappings":";;;;;;;;;;;;;AAYA,MAAMA,YAAY;AAMX,MAAMC,SAAgC,CAAC,EAAEC,YAAY,EAAE;IAC5D,MAAM,EAAEC,IAAI,EAAE,GAAGC;IAEjB,MAAMC,WAAWC;IACjB,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,MAAM,EAAE,GAAGC;IACtC,MAAMC,YAAY;QAChB;YAAE,OAAOC,SAAS,EAAE;YAAE,OAAO;QAAK;QAClC;YAAE,OAAOA,SAAS,EAAE;YAAE,OAAO;QAAU;KACxC;IAED,OAAO,WAAP,GACE,IAACC,OAAO,MAAM;QAAC,WAAWC,cAAAA,IAAW;kBACnC,mBAACC,KAAGA;YAAC,WAAWD,cAAAA,SAAgB;;8BAC9B,IAACE,KAAGA;oBAAC,WAAWF,cAAAA,OAAc;8BAC5B,mBAAC;wBAAI,WAAWA,cAAAA,YAAmB;;0CACjC,IAAC;gCACC,OAAM;gCACN,QAAO;gCACP,KAAKN,UAAUR,YAAYiB;gCAC3B,WAAWH,cAAAA,YAAmB;gCAC9B,KAAI;gCACJ,SAAS;oCACP,IACEI,SAAS,IAAI,CAAC,QAAQ,CACpBC,OAAO,oBAAoB,CAAC,QAAQ,KAEtCD,SAAS,QAAQ,CAAC,QAAQ,CAAC,aAE3BA,SAAS,IAAI,GAAG;yCAEhBb,SAASc,OAAO,oBAAoB,CAAC,IAAI;gCAE7C;;0CAEF,IAACC,eAAaA,CAAAA;;;;8BAGlB,IAACC,OAAKA;oBAEJ,OAAO;wBAAE,YAAY;oBAAO;mBADvBnB,eAAeoB,KAAK,SAAS,CAACpB,gBAAgB;8BAIrD,IAACc,KAAGA;oBAAC,WAAWF,cAAAA,QAAe;8BAC7B,mBAACC,KAAGA;wBAAC,WAAWD,cAAAA,aAAoB;;0CAClC,IAACE,KAAGA;0CACF,kBAACO,yBAAuBA,CAAAA;;0CAG1B,IAACP,KAAGA;0CACF,kBAACQ,QAAMA;oCACL,WAAU;oCACV,iBAAgB;oCAChB,mBAAkB;oCAClB,SAASf;oCACT,UAAU,CAACgB;wCACTlB,SAASkB,UAAUC,MAAM,IAAI,GAAGA,MAAM,KAAK;oCAC7C;oCACA,OAAO;wCACL,QAAQ,CAAC,UAAU,EAAElB,UAAU,SAAS,QAAQ;wCAChD,YAAYA,UAAU,SAAS;oCACjC;;;0CAGJ,IAACQ,KAAGA;0CACF,kBAACW,UAAQA;oCACP,cAAc;wCAAE,QAAQ;oCAAK;oCAC7B,MAAM;wCACJ,OAAOhB,UAAU,GAAG,CAAC,CAACiB,IAAO;gDAC3B,OAAOA,EAAE,KAAK;gDACd,KAAKA,EAAE,KAAK;gDACZ;oDACEzB,KAAK,cAAc,CAACyB,EAAE,KAAK;gDAC7B;4CACF;wCACA,cAAc;4CAACzB,KAAK,QAAQ;yCAAC;oCAC/B;8CAEA,kBAAC0B,qBAAmBA;wCAAC,WAAWf,cAAAA,gBAAuB;;;;;;;;;;AAQvE"}
@@ -1,7 +1,6 @@
1
1
  import "./header_module.css";
2
2
  const header_module = {
3
3
  root: "root-nAtwJx",
4
- rootDark: "rootDark-X_YzXd",
5
4
  innerRoot: "innerRoot-b2vAK8",
6
5
  leftCol: "leftCol-n3WyJ5",
7
6
  leftColInner: "leftColInner-AB1JiD",
@@ -1 +1 @@
1
- {"version":3,"file":"components/Layout/header.module.mjs","sources":["../../../src/components/Layout/header.module.scss"],"sourcesContent":["// extracted by LIB_CSS_EXTRACT_LOADER\nimport \"./header_module.css\"\nexport default {\"root\":\"root-nAtwJx\",\"rootDark\":\"rootDark-X_YzXd\",\"innerRoot\":\"innerRoot-b2vAK8\",\"leftCol\":\"leftCol-n3WyJ5\",\"leftColInner\":\"leftColInner-AB1JiD\",\"rightCol\":\"rightCol-jgHpb9\",\"rightColInner\":\"rightColInner-nINgMT\",\"rsdoctorLogo\":\"rsdoctorLogo-O30iKB\",\"translationsIcon\":\"translationsIcon-eK7oMQ\"};"],"names":[],"mappings":";AAEA,sBAAe;IAAC,MAAO;IAAc,UAAW;IAAkB,WAAY;IAAmB,SAAU;IAAiB,cAAe;IAAsB,UAAW;IAAkB,eAAgB;IAAuB,cAAe;IAAsB,kBAAmB;AAAyB"}
1
+ {"version":3,"file":"components/Layout/header.module.mjs","sources":["../../../src/components/Layout/header.module.scss"],"sourcesContent":["// extracted by LIB_CSS_EXTRACT_LOADER\nimport \"./header_module.css\"\nexport default {\"root\":\"root-nAtwJx\",\"innerRoot\":\"innerRoot-b2vAK8\",\"leftCol\":\"leftCol-n3WyJ5\",\"leftColInner\":\"leftColInner-AB1JiD\",\"rightCol\":\"rightCol-jgHpb9\",\"rightColInner\":\"rightColInner-nINgMT\",\"rsdoctorLogo\":\"rsdoctorLogo-O30iKB\",\"translationsIcon\":\"translationsIcon-eK7oMQ\"};"],"names":[],"mappings":";AAEA,sBAAe;IAAC,MAAO;IAAc,WAAY;IAAmB,SAAU;IAAiB,cAAe;IAAsB,UAAW;IAAkB,eAAgB;IAAuB,cAAe;IAAsB,kBAAmB;AAAyB"}