@kylincloud/flamegraph 0.35.27 → 0.35.29

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 (65) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/FlameGraph/FlameGraphComponent/DiffLegend.d.ts.map +1 -1
  3. package/dist/FlameGraph/FlameGraphComponent/DiffLegendPaletteDropdown.d.ts.map +1 -1
  4. package/dist/FlameGraph/FlameGraphComponent/Flamegraph.d.ts +16 -2
  5. package/dist/FlameGraph/FlameGraphComponent/Flamegraph.d.ts.map +1 -1
  6. package/dist/FlameGraph/FlameGraphComponent/Flamegraph_render.d.ts +15 -2
  7. package/dist/FlameGraph/FlameGraphComponent/Flamegraph_render.d.ts.map +1 -1
  8. package/dist/FlameGraph/FlameGraphComponent/Highlight.d.ts.map +1 -1
  9. package/dist/FlameGraph/FlameGraphComponent/index.d.ts.map +1 -1
  10. package/dist/FlameGraph/normalize.d.ts.map +1 -1
  11. package/dist/FlameGraph/uniqueness.d.ts.map +1 -1
  12. package/dist/Icons.d.ts.map +1 -1
  13. package/dist/ProfilerTable.d.ts.map +1 -1
  14. package/dist/SharedQueryInput.d.ts.map +1 -1
  15. package/dist/Toolbar.d.ts.map +1 -1
  16. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  17. package/dist/flamegraphRenderWorker.js +2 -0
  18. package/dist/flamegraphRenderWorker.js.map +1 -0
  19. package/dist/index.cjs.js +4 -4
  20. package/dist/index.cjs.js.map +1 -1
  21. package/dist/index.esm.js +4 -4
  22. package/dist/index.esm.js.map +1 -1
  23. package/dist/index.node.cjs.js +4 -4
  24. package/dist/index.node.cjs.js.map +1 -1
  25. package/dist/index.node.esm.js +4 -4
  26. package/dist/index.node.esm.js.map +1 -1
  27. package/dist/shims/Table.d.ts +15 -1
  28. package/dist/shims/Table.d.ts.map +1 -1
  29. package/dist/shims/Tooltip.d.ts.map +1 -1
  30. package/dist/workers/createFlamegraphRenderWorker.d.ts +2 -0
  31. package/dist/workers/createFlamegraphRenderWorker.d.ts.map +1 -0
  32. package/dist/workers/flamegraphRenderWorker.d.ts +2 -0
  33. package/dist/workers/flamegraphRenderWorker.d.ts.map +1 -0
  34. package/dist/workers/profilerTableWorker.d.ts +73 -0
  35. package/dist/workers/profilerTableWorker.d.ts.map +1 -0
  36. package/package.json +1 -1
  37. package/src/FlameGraph/FlameGraphComponent/DiffLegend.module.css +8 -2
  38. package/src/FlameGraph/FlameGraphComponent/DiffLegend.tsx +12 -1
  39. package/src/FlameGraph/FlameGraphComponent/DiffLegendPaletteDropdown.module.css +93 -10
  40. package/src/FlameGraph/FlameGraphComponent/DiffLegendPaletteDropdown.tsx +9 -4
  41. package/src/FlameGraph/FlameGraphComponent/Flamegraph.ts +33 -8
  42. package/src/FlameGraph/FlameGraphComponent/Flamegraph_render.ts +289 -85
  43. package/src/FlameGraph/FlameGraphComponent/Highlight.tsx +43 -17
  44. package/src/FlameGraph/FlameGraphComponent/index.tsx +208 -57
  45. package/src/FlameGraph/FlameGraphComponent/styles.module.scss +8 -0
  46. package/src/FlameGraph/normalize.ts +9 -7
  47. package/src/FlameGraph/uniqueness.ts +69 -59
  48. package/src/Icons.tsx +18 -9
  49. package/src/ProfilerTable.tsx +463 -33
  50. package/src/SharedQueryInput.module.scss +50 -0
  51. package/src/SharedQueryInput.tsx +18 -3
  52. package/src/Toolbar.module.scss +90 -0
  53. package/src/Toolbar.tsx +30 -16
  54. package/src/Tooltip/Tooltip.tsx +49 -16
  55. package/src/i18n.tsx +1 -1
  56. package/src/sass/_common.scss +22 -3
  57. package/src/sass/_css-variables.scss +5 -1
  58. package/src/sass/flamegraph.scss +26 -23
  59. package/src/shims/Table.module.scss +91 -13
  60. package/src/shims/Table.tsx +202 -7
  61. package/src/shims/Tooltip.module.scss +40 -0
  62. package/src/shims/Tooltip.tsx +31 -3
  63. package/src/workers/createFlamegraphRenderWorker.ts +7 -0
  64. package/src/workers/flamegraphRenderWorker.ts +198 -0
  65. package/src/workers/profilerTableWorker.ts +368 -0
@@ -29,6 +29,15 @@ export type TableBodyType = {
29
29
  } | {
30
30
  type: 'filled';
31
31
  bodyRows: BodyRow[];
32
+ } | {
33
+ type: 'virtual';
34
+ rowCount: number;
35
+ rows: BodyRow[];
36
+ range: {
37
+ start: number;
38
+ end: number;
39
+ };
40
+ onRangeChange?: (start: number, end: number) => void;
32
41
  };
33
42
  type Table = TableBodyType & {
34
43
  headRow: HeadCell[];
@@ -48,7 +57,12 @@ interface TableProps {
48
57
  className?: string;
49
58
  isLoading?: boolean;
50
59
  itemsPerPage?: number;
60
+ virtualize?: boolean;
61
+ virtualizeRowHeight?: number;
62
+ virtualizeOverscan?: number;
63
+ scrollRef?: RefObject<HTMLElement>;
64
+ disableSort?: boolean;
51
65
  }
52
- declare function Table({ sortByDirection, sortBy, updateSortParams, table, tableBodyRef, className, isLoading, itemsPerPage, }: TableProps): import("react/jsx-runtime").JSX.Element;
66
+ declare function Table({ sortByDirection, sortBy, updateSortParams, table, tableBodyRef, className, isLoading, itemsPerPage, virtualize, virtualizeRowHeight, virtualizeOverscan, scrollRef, disableSort, }: TableProps): import("react/jsx-runtime").JSX.Element;
53
67
  export default Table;
54
68
  //# sourceMappingURL=Table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/shims/Table.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAoB,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUrF,UAAU,UAAU;IAClB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;CACvH;AAED,MAAM,WAAW,IAAK,SAAQ,UAAU;IACtC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,UAAU,QAAS,SAAQ,UAAU;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GACrB;IACA,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACC;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEJ,KAAK,KAAK,GAAG,aAAa,GAAG;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB,CAAC;AAEF,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,eAAe,EAAE,MAAM,GAAG,KAAK,CAAC;CACjC;AAED,eAAO,MAAM,YAAY,YAAa,QAAQ,EAAE,KAAG,cAsBlD,CAAC;AAEF,UAAU,UAAU;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,CAAC,EAAE,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA0CD,iBAAS,KAAK,CAAC,EACb,eAAe,EACf,MAAM,EACN,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,GACb,EAAE,UAAU,2CAkEZ;AA2DD,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/shims/Table.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/shims/Tooltip.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AA2BD,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAe1C,CAAA"}
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/shims/Tooltip.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAG1D,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AA2BD,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CA0C1C,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function createFlamegraphRenderWorker(): Worker;
2
+ //# sourceMappingURL=createFlamegraphRenderWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFlamegraphRenderWorker.d.ts","sourceRoot":"","sources":["../../src/workers/createFlamegraphRenderWorker.ts"],"names":[],"mappings":"AAAA,wBAAgB,4BAA4B,IAAI,MAAM,CAMrD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=flamegraphRenderWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flamegraphRenderWorker.d.ts","sourceRoot":"","sources":["../../src/workers/flamegraphRenderWorker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ export type ProfilerTableWorkerRow = {
2
+ type: 'single';
3
+ name: string;
4
+ self: number;
5
+ total: number;
6
+ } | {
7
+ type: 'double';
8
+ name: string;
9
+ totalLeft: number;
10
+ totalRght: number;
11
+ leftTicks: number;
12
+ rightTicks: number;
13
+ };
14
+ export type ProfilerTableWorkerRequest = {
15
+ type: 'init';
16
+ payload: {
17
+ flamebearer: {
18
+ names: string[];
19
+ levels: number[][];
20
+ format: 'single' | 'double';
21
+ leftTicks?: number;
22
+ rightTicks?: number;
23
+ };
24
+ sortBy: string;
25
+ sortByDirection: 'asc' | 'desc';
26
+ highlightQuery: string;
27
+ };
28
+ } | {
29
+ type: 'update';
30
+ payload: {
31
+ sortBy: string;
32
+ sortByDirection: 'asc' | 'desc';
33
+ highlightQuery: string;
34
+ };
35
+ } | {
36
+ type: 'range';
37
+ payload: {
38
+ start: number;
39
+ end: number;
40
+ requestId: number;
41
+ };
42
+ } | {
43
+ type: 'findNode';
44
+ payload: {
45
+ name: string;
46
+ requestId: number;
47
+ };
48
+ };
49
+ export type ProfilerTableWorkerResponse = {
50
+ type: 'ready';
51
+ payload: {
52
+ rowCount: number;
53
+ };
54
+ } | {
55
+ type: 'range';
56
+ payload: {
57
+ rows: ProfilerTableWorkerRow[];
58
+ start: number;
59
+ end: number;
60
+ requestId: number;
61
+ };
62
+ } | {
63
+ type: 'findNode';
64
+ payload: {
65
+ node: {
66
+ i: number;
67
+ j: number;
68
+ } | null;
69
+ requestId: number;
70
+ };
71
+ };
72
+ export declare function createProfilerTableWorker(): Worker;
73
+ //# sourceMappingURL=profilerTableWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profilerTableWorker.d.ts","sourceRoot":"","sources":["../../src/workers/profilerTableWorker.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAC9B;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEN,MAAM,MAAM,0BAA0B,GAClC;IACE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACP,WAAW,EAAE;YACX,KAAK,EAAE,MAAM,EAAE,CAAC;YAChB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;YACnB,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;YAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;QACF,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,KAAK,GAAG,MAAM,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,KAAK,GAAG,MAAM,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC;AAEN,MAAM,MAAM,2BAA2B,GACnC;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE;QACP,IAAI,EAAE,sBAAsB,EAAE,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE;QACP,IAAI,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC;AAEN,wBAAgB,yBAAyB,IAAI,MAAM,CA+RlD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kylincloud/flamegraph",
3
- "version": "0.35.27",
3
+ "version": "0.35.29",
4
4
  "description": "KylinCloud flamegraph renderer (Pyroscope-based)",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/index.node.cjs.js",
@@ -1,7 +1,11 @@
1
1
  .flamegraph-legend {
2
2
  display: flex;
3
3
  align-items: center;
4
- font-size: 11px;
4
+ font-size: var(--legend-font-size, 11px);
5
+ line-height: var(--legend-line-height, 1);
6
+ --legend-item-width: 37px;
7
+ --legend-item-padding: 0;
8
+ --legend-item-height: auto;
5
9
  justify-content: center;
6
10
  }
7
11
 
@@ -11,7 +15,9 @@
11
15
  }
12
16
 
13
17
  .flamegraph-legend-item {
14
- width: 37px;
18
+ width: var(--legend-item-width, 37px);
19
+ height: var(--legend-item-height, auto);
20
+ padding: var(--legend-item-padding, 0);
15
21
  text-align: center;
16
22
 
17
23
  /* if for some reason the contents can't fit
@@ -14,11 +14,22 @@ export default function DiffLegend(props: DiffLegendProps) {
14
14
  const values = decideLegend(showMode);
15
15
 
16
16
  const color = NewDiffColor(palette);
17
+ const compactLegendStyle =
18
+ showMode === 'small'
19
+ ? ({
20
+ '--legend-item-width': '32px',
21
+ '--legend-item-padding': '2px 2px',
22
+ '--legend-font-size': '10px',
23
+ '--legend-line-height': '1.1',
24
+ '--legend-item-height': '16px',
25
+ } as React.CSSProperties)
26
+ : undefined;
17
27
 
18
28
  return (
19
29
  <div
20
30
  data-testid="flamegraph-legend"
21
31
  className={`${styles['flamegraph-legend']} ${styles['flamegraph-legend-list']}`}
32
+ style={compactLegendStyle}
22
33
  >
23
34
  {values.map((v) => (
24
35
  <div
@@ -43,7 +54,7 @@ function decideLegend(showMode: sizeMode) {
43
54
  }
44
55
 
45
56
  case 'small': {
46
- return [-100, -40, -20, 0, 20, 40, 100];
57
+ return [-100, -50, 0, 50, 100];
47
58
  }
48
59
 
49
60
  default:
@@ -10,38 +10,116 @@
10
10
  .triggerButton {
11
11
  display: flex;
12
12
  align-items: center;
13
- gap: 6px;
14
- padding: 4px 8px;
13
+ gap: 4px;
14
+ padding: 2px 16px 2px 6px;
15
15
  border: 1px solid var(--ps-ui-border);
16
16
  border-radius: 4px;
17
- background-color: var(--ps-immutable-off-white);
17
+ background-color: transparent;
18
18
  cursor: pointer;
19
- height: 37px;
19
+ height: 32px;
20
+ margin-right: 0;
20
21
  }
21
22
 
22
23
  .triggerButton:hover {
23
- background-color: var(--ps-ui-element-bg-highlight);
24
+ background-color: transparent;
25
+ border-color: #6aa27d;
26
+ }
27
+
28
+ .triggerButton:focus-visible,
29
+ .triggerButton[aria-expanded='true'] {
30
+ border-color: #3c7150;
31
+ box-shadow: 0 0 0 3px rgba(60, 113, 80, 0.22);
32
+ }
33
+
34
+ .triggerButton::after {
35
+ top: 50%;
36
+ right: 6px;
37
+ transform: translateY(-50%);
38
+ font-size: 10px;
24
39
  }
25
40
 
26
41
  .dropdownArrow {
27
42
  font-size: 8px;
28
43
  color: var(--ps-text-secondary);
29
- margin-left: 4px;
44
+ margin-left: 2px;
30
45
  }
31
46
 
32
47
  /* 菜单项样式 */
33
48
  .menuItem {
34
49
  display: flex;
35
50
  align-items: center;
36
- justify-content: space-between;
37
- gap: 12px;
38
- min-width: 200px;
39
- padding: 4px 0;
51
+ justify-content: flex-start;
52
+ gap: 6px;
53
+ min-width: 148px;
54
+ padding: 4px 8px;
40
55
  }
41
56
 
42
57
  .menuItemText {
43
58
  color: var(--ps-text-primary);
44
59
  font-size: 13px;
60
+ line-height: 1.2;
61
+ }
62
+
63
+ .dropdownMenu :global(.szh-menu__header) {
64
+ padding: 6px 12px 4px;
65
+ color: #8a8f99;
66
+ font-size: 12px;
67
+ font-weight: 500;
68
+ letter-spacing: 0.2px;
69
+ }
70
+
71
+ .dropdownMenu :global(.szh-menu) {
72
+ margin-top: 4px;
73
+ transform-origin: top center;
74
+ animation: dropdownZoomIn 0.18s ease-out;
75
+ }
76
+
77
+ .menuItemWrapper {
78
+ background-color: transparent !important;
79
+ border: 1px solid transparent;
80
+ border-radius: 6px;
81
+ margin: 2px 6px;
82
+ padding: 0;
83
+ }
84
+
85
+ .menuItemSelected {
86
+ background-color: rgba(93, 151, 111, 0.38) !important;
87
+ border-color: transparent;
88
+ }
89
+
90
+ .menuItemSelected .menuItemText {
91
+ font-weight: 600;
92
+ }
93
+
94
+ .menuItemWrapper:global(.szh-menu__item--hover),
95
+ .menuItemWrapper:global(.szh-menu__item--focus),
96
+ .menuItemWrapper:global(.szh-menu__item--active) {
97
+ background-color: #f5f5f5 !important;
98
+ border-color: transparent;
99
+ }
100
+
101
+ .menuItemSelected:global(.szh-menu__item--hover),
102
+ .menuItemSelected:global(.szh-menu__item--focus),
103
+ .menuItemSelected:global(.szh-menu__item--active) {
104
+ background-color: rgba(93, 151, 111, 0.38) !important;
105
+ border-color: transparent;
106
+ }
107
+
108
+ @keyframes dropdownZoomIn {
109
+ from {
110
+ opacity: 0;
111
+ transform: scaleY(0.92);
112
+ }
113
+ to {
114
+ opacity: 1;
115
+ transform: scaleY(1);
116
+ }
117
+ }
118
+
119
+ @media (prefers-reduced-motion: reduce) {
120
+ .dropdownMenu :global(.szh-menu) {
121
+ animation: none;
122
+ }
45
123
  }
46
124
 
47
125
  /* ========== 以下为旧样式,保留兼容性 ========== */
@@ -86,3 +164,8 @@
86
164
  height: 16px;
87
165
  flex-shrink: 0;
88
166
  }
167
+
168
+ :global([data-theme='kylin']) .triggerButton {
169
+ height: 28px;
170
+ padding: 1px 14px 1px 6px;
171
+ }
@@ -8,7 +8,6 @@ import {
8
8
  FlamegraphPalette,
9
9
  } from './colorPalette';
10
10
  import DiffLegend from './DiffLegend';
11
- import CheckIcon from './CheckIcon';
12
11
  // 在把通用 UI 抽成独立包之前,临时复用 shims 目录下的 Dropdown 封装
13
12
  // eslint-disable-next-line
14
13
  import Dropdown, { MenuItem, MenuButton } from '../../shims/Dropdown';
@@ -62,6 +61,7 @@ export const DiffLegendPaletteDropdown = (
62
61
  // 下拉菜单的无障碍 label 文案(i18n)
63
62
  label={messages.diffLegendSelectPalette}
64
63
  align="end"
64
+ className={styles.dropdownMenu}
65
65
  menuButton={
66
66
  <MenuButton
67
67
  className={cx(
@@ -82,13 +82,18 @@ export const DiffLegendPaletteDropdown = (
82
82
  }}
83
83
  >
84
84
  {paletteList.map((p) => (
85
- <MenuItem key={p.name} value={p}>
85
+ <MenuItem
86
+ key={p.name}
87
+ value={p}
88
+ className={cx(
89
+ styles.menuItemWrapper,
90
+ p.name === palette.name && styles.menuItemSelected
91
+ )}
92
+ >
86
93
  <div className={styles.menuItem}>
87
94
  <span className={styles.menuItemText}>
88
95
  {getPaletteName(p)} {getPaletteColorDesc(p)}
89
96
  </span>
90
- {/* 当前选中的调色板右侧展示对勾图标 */}
91
- {p.name === palette.name && <CheckIcon />}
92
97
  </div>
93
98
  </MenuItem>
94
99
  ))}
@@ -28,7 +28,7 @@ export default class Flamegraph {
28
28
 
29
29
  constructor(
30
30
  private readonly flamebearer: Flamebearer,
31
- private canvas: HTMLCanvasElement,
31
+ private canvas: HTMLCanvasElement | OffscreenCanvas,
32
32
  /**
33
33
  * What node to be 'focused'
34
34
  * ie what node to start the tree
@@ -75,11 +75,26 @@ export default class Flamegraph {
75
75
  }
76
76
  }
77
77
 
78
- public render(options?: { renderRects?: boolean; renderText?: boolean }) {
78
+ public render(options?: {
79
+ renderRects?: boolean;
80
+ renderText?: boolean;
81
+ highlightQueryOverride?: string;
82
+ renderMode?: 'normal' | 'highlightOnly' | 'forceGrey';
83
+ levelStart?: number;
84
+ levelEnd?: number;
85
+ startI?: number;
86
+ startJ?: number;
87
+ timeBudgetMs?: number;
88
+ skipCanvasResize?: boolean;
89
+ skipDprScale?: boolean;
90
+ devicePixelRatio?: number;
91
+ }): { done: boolean; nextI: number; nextJ: number } {
79
92
  const { rangeMin, rangeMax, pxPerTick } = this.updateCachedMetrics();
80
93
  const tickToX = (i: number) => {
81
94
  return (i - this.flamebearer.numTicks * rangeMin) * pxPerTick;
82
95
  };
96
+ const highlightQuery =
97
+ options?.highlightQueryOverride ?? this.highlightQuery;
83
98
 
84
99
  const props = {
85
100
  canvas: this.canvas,
@@ -99,7 +114,7 @@ export default class Flamegraph {
99
114
  rangeMin,
100
115
  rangeMax,
101
116
  fitMode: this.fitMode,
102
- highlightQuery: this.highlightQuery,
117
+ highlightQuery,
103
118
  zoom: this.zoom,
104
119
  focusedNode: this.focusedNode,
105
120
  pxPerTick,
@@ -108,22 +123,29 @@ export default class Flamegraph {
108
123
  messages: this.messages,
109
124
  renderRects: options?.renderRects,
110
125
  renderText: options?.renderText,
126
+ renderMode: options?.renderMode,
127
+ levelStart: options?.levelStart,
128
+ levelEnd: options?.levelEnd,
129
+ startI: options?.startI,
130
+ startJ: options?.startJ,
131
+ timeBudgetMs: options?.timeBudgetMs,
132
+ skipCanvasResize: options?.skipCanvasResize,
133
+ skipDprScale: options?.skipDprScale,
134
+ devicePixelRatio: options?.devicePixelRatio,
111
135
  };
112
136
 
113
137
  const { format: viewType } = this.flamebearer;
114
138
 
115
139
  switch (viewType) {
116
140
  case 'single': {
117
- RenderCanvas({ ...props, format: 'single' });
118
- break;
141
+ return RenderCanvas({ ...props, format: 'single' });
119
142
  }
120
143
  case 'double': {
121
- RenderCanvas({
144
+ return RenderCanvas({
122
145
  ...props,
123
146
  leftTicks: this.flamebearer.leftTicks,
124
147
  rightTicks: this.flamebearer.rightTicks,
125
148
  });
126
- break;
127
149
  }
128
150
  default: {
129
151
  throw new Error(`Invalid format: '${viewType}'`);
@@ -256,7 +278,10 @@ export default class Flamegraph {
256
278
 
257
279
  private getCanvasWidth() {
258
280
  // bit of a hack, but clientWidth is not available in node-canvas
259
- return this.canvas.clientWidth || this.canvas.width;
281
+ if ('clientWidth' in this.canvas && typeof this.canvas.clientWidth === 'number') {
282
+ return this.canvas.clientWidth;
283
+ }
284
+ return this.canvas.width;
260
285
  }
261
286
 
262
287
  private isFocused() {