@perses-dev/flame-chart-plugin 0.2.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 (198) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +23 -0
  3. package/__mf/css/async/325.f56729ca.css +1 -0
  4. package/__mf/css/async/341.f56729ca.css +1 -0
  5. package/__mf/css/async/908.f56729ca.css +1 -0
  6. package/__mf/font/lato-all-300-normal.322bdf14.woff +0 -0
  7. package/__mf/font/lato-all-400-normal.63513b00.woff +0 -0
  8. package/__mf/font/lato-all-700-normal.bb27db94.woff +0 -0
  9. package/__mf/font/lato-all-900-normal.a27049a3.woff +0 -0
  10. package/__mf/font/lato-latin-300-normal.c5195215.woff2 +0 -0
  11. package/__mf/font/lato-latin-400-normal.b7ffde23.woff2 +0 -0
  12. package/__mf/font/lato-latin-700-normal.d5eb20bc.woff2 +0 -0
  13. package/__mf/font/lato-latin-900-normal.d884a71c.woff2 +0 -0
  14. package/__mf/font/lato-latin-ext-300-normal.abcc64a9.woff2 +0 -0
  15. package/__mf/font/lato-latin-ext-400-normal.6ebed106.woff2 +0 -0
  16. package/__mf/font/lato-latin-ext-700-normal.8697d1d5.woff2 +0 -0
  17. package/__mf/font/lato-latin-ext-900-normal.20a2b415.woff2 +0 -0
  18. package/__mf/js/FlameChart.96aae761.js +5 -0
  19. package/__mf/js/async/109.f7e97e30.js +73 -0
  20. package/__mf/js/async/109.f7e97e30.js.LICENSE.txt +35 -0
  21. package/__mf/js/async/173.40a64c5c.js +2 -0
  22. package/__mf/js/async/173.40a64c5c.js.LICENSE.txt +19 -0
  23. package/__mf/js/async/214.f491540e.js +1 -0
  24. package/__mf/js/async/224.511d05b6.js +1 -0
  25. package/__mf/js/async/238.5fdc556e.js +1 -0
  26. package/__mf/js/async/29.8b55315e.js +1 -0
  27. package/__mf/js/async/292.643bbcde.js +1 -0
  28. package/__mf/js/async/32.a46fc45f.js +110 -0
  29. package/__mf/js/async/32.a46fc45f.js.LICENSE.txt +49 -0
  30. package/__mf/js/async/325.80031d25.js +1 -0
  31. package/__mf/js/async/362.c587718a.js +1 -0
  32. package/__mf/js/async/409.fd2d437e.js +1 -0
  33. package/__mf/js/async/464.bb266d9b.js +7 -0
  34. package/__mf/js/async/464.bb266d9b.js.LICENSE.txt +21 -0
  35. package/__mf/js/async/488.807096d6.js +1 -0
  36. package/__mf/js/async/600.fdf527b8.js +38 -0
  37. package/__mf/js/async/651.9eb6f201.js +1 -0
  38. package/__mf/js/async/69.a1079bc1.js +2 -0
  39. package/__mf/js/async/69.a1079bc1.js.LICENSE.txt +24 -0
  40. package/__mf/js/async/694.15848123.js +1 -0
  41. package/__mf/js/async/738.0b2ab393.js +1 -0
  42. package/__mf/js/async/740.65aa69e2.js +1 -0
  43. package/__mf/js/async/75.3435fe3f.js +1 -0
  44. package/__mf/js/async/770.bc6ab5a3.js +1 -0
  45. package/__mf/js/async/863.8b7bdf43.js +2 -0
  46. package/__mf/js/async/863.8b7bdf43.js.LICENSE.txt +9 -0
  47. package/__mf/js/async/908.0672909d.js +1 -0
  48. package/__mf/js/async/960.d56a397e.js +2 -0
  49. package/__mf/js/async/960.d56a397e.js.LICENSE.txt +8 -0
  50. package/__mf/js/async/964.86d91e52.js +2 -0
  51. package/__mf/js/async/964.86d91e52.js.LICENSE.txt +9 -0
  52. package/__mf/js/async/981.4de2d5c8.js +2 -0
  53. package/__mf/js/async/981.4de2d5c8.js.LICENSE.txt +8 -0
  54. package/__mf/js/async/__federation_expose_FlameChart.aaa6df30.js +17 -0
  55. package/__mf/js/async/lib-router.00804bbc.js +2 -0
  56. package/__mf/js/async/lib-router.00804bbc.js.LICENSE.txt +32 -0
  57. package/__mf/js/main.4931a266.js +5 -0
  58. package/lib/FlameChart.d.ts +8 -0
  59. package/lib/FlameChart.d.ts.map +1 -0
  60. package/lib/FlameChart.js +32 -0
  61. package/lib/FlameChart.js.map +1 -0
  62. package/lib/bootstrap.d.ts +2 -0
  63. package/lib/bootstrap.d.ts.map +1 -0
  64. package/lib/bootstrap.js +19 -0
  65. package/lib/bootstrap.js.map +1 -0
  66. package/lib/cjs/FlameChart.js +38 -0
  67. package/lib/cjs/bootstrap.js +26 -0
  68. package/lib/cjs/components/CustomBreadcrumb.js +96 -0
  69. package/lib/cjs/components/FlameChart.js +341 -0
  70. package/lib/cjs/components/FlameChartOptionsEditorSettings.js +87 -0
  71. package/lib/cjs/components/FlameChartPanel.js +147 -0
  72. package/lib/cjs/components/PaletteSelector.js +49 -0
  73. package/lib/cjs/components/SearchBar.js +59 -0
  74. package/lib/cjs/components/SeriesChart.js +189 -0
  75. package/lib/cjs/components/Settings.js +202 -0
  76. package/lib/cjs/components/SwitchSelector.js +37 -0
  77. package/lib/cjs/components/TableChart.js +143 -0
  78. package/lib/cjs/components/index.js +39 -0
  79. package/lib/cjs/env.d.js +14 -0
  80. package/lib/cjs/flame-chart-model.js +31 -0
  81. package/lib/cjs/getPluginModule.js +39 -0
  82. package/lib/cjs/index-federation.js +55 -0
  83. package/lib/cjs/index.js +37 -0
  84. package/lib/cjs/setup-tests.js +19 -0
  85. package/lib/cjs/utils/data-model.js +18 -0
  86. package/lib/cjs/utils/data-transform.js +152 -0
  87. package/lib/cjs/utils/format.js +87 -0
  88. package/lib/cjs/utils/palette-gen.js +68 -0
  89. package/lib/cjs/utils/palette.js +62 -0
  90. package/lib/cjs/utils/series-tooltip.js +51 -0
  91. package/lib/cjs/utils/tooltip.js +76 -0
  92. package/lib/cjs/utils/ui-text.js +30 -0
  93. package/lib/cjs/utils/utils.js +108 -0
  94. package/lib/components/CustomBreadcrumb.d.ts +9 -0
  95. package/lib/components/CustomBreadcrumb.d.ts.map +1 -0
  96. package/lib/components/CustomBreadcrumb.js +83 -0
  97. package/lib/components/CustomBreadcrumb.js.map +1 -0
  98. package/lib/components/FlameChart.d.ts +13 -0
  99. package/lib/components/FlameChart.d.ts.map +1 -0
  100. package/lib/components/FlameChart.js +328 -0
  101. package/lib/components/FlameChart.js.map +1 -0
  102. package/lib/components/FlameChartOptionsEditorSettings.d.ts +4 -0
  103. package/lib/components/FlameChartOptionsEditorSettings.d.ts.map +1 -0
  104. package/lib/components/FlameChartOptionsEditorSettings.js +79 -0
  105. package/lib/components/FlameChartOptionsEditorSettings.js.map +1 -0
  106. package/lib/components/FlameChartPanel.d.ts +7 -0
  107. package/lib/components/FlameChartPanel.d.ts.map +1 -0
  108. package/lib/components/FlameChartPanel.js +139 -0
  109. package/lib/components/FlameChartPanel.js.map +1 -0
  110. package/lib/components/PaletteSelector.d.ts +8 -0
  111. package/lib/components/PaletteSelector.d.ts.map +1 -0
  112. package/lib/components/PaletteSelector.js +41 -0
  113. package/lib/components/PaletteSelector.js.map +1 -0
  114. package/lib/components/SearchBar.d.ts +7 -0
  115. package/lib/components/SearchBar.d.ts.map +1 -0
  116. package/lib/components/SearchBar.js +46 -0
  117. package/lib/components/SearchBar.js.map +1 -0
  118. package/lib/components/SeriesChart.d.ts +9 -0
  119. package/lib/components/SeriesChart.d.ts.map +1 -0
  120. package/lib/components/SeriesChart.js +181 -0
  121. package/lib/components/SeriesChart.js.map +1 -0
  122. package/lib/components/Settings.d.ts +11 -0
  123. package/lib/components/Settings.d.ts.map +1 -0
  124. package/lib/components/Settings.js +189 -0
  125. package/lib/components/Settings.js.map +1 -0
  126. package/lib/components/SwitchSelector.d.ts +8 -0
  127. package/lib/components/SwitchSelector.d.ts.map +1 -0
  128. package/lib/components/SwitchSelector.js +29 -0
  129. package/lib/components/SwitchSelector.js.map +1 -0
  130. package/lib/components/TableChart.d.ts +12 -0
  131. package/lib/components/TableChart.d.ts.map +1 -0
  132. package/lib/components/TableChart.js +135 -0
  133. package/lib/components/TableChart.js.map +1 -0
  134. package/lib/components/index.d.ts +11 -0
  135. package/lib/components/index.d.ts.map +1 -0
  136. package/lib/components/index.js +24 -0
  137. package/lib/components/index.js.map +1 -0
  138. package/lib/env.d.js +15 -0
  139. package/lib/env.d.js.map +1 -0
  140. package/lib/flame-chart-model.d.ts +18 -0
  141. package/lib/flame-chart-model.d.ts.map +1 -0
  142. package/lib/flame-chart-model.js +23 -0
  143. package/lib/flame-chart-model.js.map +1 -0
  144. package/lib/getPluginModule.d.ts +6 -0
  145. package/lib/getPluginModule.d.ts.map +1 -0
  146. package/lib/getPluginModule.js +28 -0
  147. package/lib/getPluginModule.js.map +1 -0
  148. package/lib/index-federation.d.ts +1 -0
  149. package/lib/index-federation.d.ts.map +1 -0
  150. package/lib/index-federation.js +15 -0
  151. package/lib/index-federation.js.map +1 -0
  152. package/lib/index.d.ts +3 -0
  153. package/lib/index.d.ts.map +1 -0
  154. package/lib/index.js +16 -0
  155. package/lib/index.js.map +1 -0
  156. package/lib/setup-tests.d.ts +2 -0
  157. package/lib/setup-tests.d.ts.map +1 -0
  158. package/lib/setup-tests.js +17 -0
  159. package/lib/setup-tests.js.map +1 -0
  160. package/lib/utils/data-model.d.ts +37 -0
  161. package/lib/utils/data-model.d.ts.map +1 -0
  162. package/lib/utils/data-model.js +19 -0
  163. package/lib/utils/data-model.js.map +1 -0
  164. package/lib/utils/data-transform.d.ts +19 -0
  165. package/lib/utils/data-transform.d.ts.map +1 -0
  166. package/lib/utils/data-transform.js +138 -0
  167. package/lib/utils/data-transform.js.map +1 -0
  168. package/lib/utils/format.d.ts +3 -0
  169. package/lib/utils/format.d.ts.map +1 -0
  170. package/lib/utils/format.js +71 -0
  171. package/lib/utils/format.js.map +1 -0
  172. package/lib/utils/palette-gen.d.ts +14 -0
  173. package/lib/utils/palette-gen.d.ts.map +1 -0
  174. package/lib/utils/palette-gen.js +56 -0
  175. package/lib/utils/palette-gen.js.map +1 -0
  176. package/lib/utils/palette.d.ts +5 -0
  177. package/lib/utils/palette.d.ts.map +1 -0
  178. package/lib/utils/palette.js +51 -0
  179. package/lib/utils/palette.js.map +1 -0
  180. package/lib/utils/series-tooltip.d.ts +3 -0
  181. package/lib/utils/series-tooltip.d.ts.map +1 -0
  182. package/lib/utils/series-tooltip.js +43 -0
  183. package/lib/utils/series-tooltip.js.map +1 -0
  184. package/lib/utils/tooltip.d.ts +6 -0
  185. package/lib/utils/tooltip.d.ts.map +1 -0
  186. package/lib/utils/tooltip.js +29 -0
  187. package/lib/utils/tooltip.js.map +1 -0
  188. package/lib/utils/ui-text.d.ts +9 -0
  189. package/lib/utils/ui-text.d.ts.map +1 -0
  190. package/lib/utils/ui-text.js +22 -0
  191. package/lib/utils/ui-text.js.map +1 -0
  192. package/lib/utils/utils.d.ts +36 -0
  193. package/lib/utils/utils.d.ts.map +1 -0
  194. package/lib/utils/utils.js +92 -0
  195. package/lib/utils/utils.js.map +1 -0
  196. package/mf-manifest.json +274 -0
  197. package/mf-stats.json +322 -0
  198. package/package.json +64 -0
@@ -0,0 +1,328 @@
1
+ // Copyright 2025 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ import { Stack, Box, Menu, MenuItem, Divider, useTheme } from '@mui/material';
15
+ import { useState, useMemo } from 'react';
16
+ import { useChartsTheme, EChart } from '@perses-dev/components';
17
+ import RefreshIcon from 'mdi-material-ui/Refresh';
18
+ import EyeIcon from 'mdi-material-ui/EyeOutline';
19
+ import ContentCopyIcon from 'mdi-material-ui/ContentCopy';
20
+ import { recursionJson, findTotalSampleByName } from '../utils/data-transform';
21
+ import { generateTooltip } from '../utils/tooltip';
22
+ import { CustomBreadcrumb } from './CustomBreadcrumb';
23
+ const ITEM_GAP = 2; // vertical gap between flame chart items
24
+ const Y_MIN_SMALL = 6; // min value of y axis for small containers
25
+ const Y_MIN_LARGE = 20; // min value of y axis for large containers
26
+ const LARGE_CONTAINER_THRESHOLD = 600;
27
+ const CONTAINER_PADDING = 10;
28
+ const BREADCRUMB_SPACE = 50;
29
+ export function FlameChart(props) {
30
+ const { width, height, data, palette, selectedId, searchValue, onSelectedIdChange } = props;
31
+ const theme = useTheme();
32
+ const chartsTheme = useChartsTheme();
33
+ const [menuPosition, setMenuPosition] = useState(null);
34
+ const [selectedItem, setSelectedItem] = useState({
35
+ id: 0,
36
+ name: ''
37
+ });
38
+ const [isCopied, setIsCopied] = useState(false);
39
+ const seriesData = useMemo(()=>recursionJson(palette, data.metadata, data.profile.stackTrace, searchValue, selectedId), [
40
+ palette,
41
+ data.metadata,
42
+ data.profile.stackTrace,
43
+ selectedId,
44
+ searchValue
45
+ ]);
46
+ const handleItemClick = (params)=>{
47
+ const data = params.data;
48
+ const functionName = data.value[6];
49
+ const functionId = data.name;
50
+ setSelectedItem({
51
+ id: functionId,
52
+ name: functionName
53
+ });
54
+ // To ensure that the cursor is positioned inside the menu when it opens,
55
+ // we adjust the click event coordinates as follows:
56
+ if ('event' in params) {
57
+ const mouseEvent = params.event;
58
+ setMenuPosition({
59
+ mouseX: mouseEvent.event.clientX - 2,
60
+ mouseY: mouseEvent.event.clientY - 4
61
+ });
62
+ }
63
+ };
64
+ const handleFocusBlock = ()=>{
65
+ onSelectedIdChange(selectedItem.id);
66
+ handleClose();
67
+ };
68
+ const handleCopyFunctionName = ()=>{
69
+ if ((selectedId || selectedId === 0) && selectedItem.name) {
70
+ navigator.clipboard.writeText(selectedItem.name);
71
+ }
72
+ setIsCopied(true);
73
+ };
74
+ const handleResetGraph = ()=>{
75
+ if (selectedId) {
76
+ onSelectedIdChange(0);
77
+ }
78
+ handleClose();
79
+ };
80
+ const handleClose = ()=>{
81
+ setMenuPosition(null);
82
+ if (isCopied) setIsCopied(false);
83
+ };
84
+ const renderItem = (params, api)=>{
85
+ const level = api.value(0);
86
+ const start = api.coord([
87
+ api.value(1),
88
+ level
89
+ ]);
90
+ const end = api.coord([
91
+ api.value(2),
92
+ level
93
+ ]);
94
+ const height = (api.size && api.size([
95
+ 0,
96
+ 1
97
+ ]) || [
98
+ 0,
99
+ 20
100
+ ])[1];
101
+ const width = (end?.[0] ?? 0) - (start?.[0] ?? 0);
102
+ return {
103
+ type: 'rect',
104
+ transition: [
105
+ 'shape'
106
+ ],
107
+ shape: {
108
+ x: start?.[0],
109
+ y: (start?.[1] ?? 0) - (height ?? 0) / 2,
110
+ width,
111
+ height: (height ?? ITEM_GAP) - ITEM_GAP,
112
+ r: 0
113
+ },
114
+ style: {
115
+ fill: api.visual('color')
116
+ },
117
+ emphasis: {
118
+ style: {
119
+ stroke: '#000'
120
+ }
121
+ },
122
+ textConfig: {
123
+ position: 'insideLeft'
124
+ },
125
+ textContent: {
126
+ style: {
127
+ text: api.value(3),
128
+ fill: '#000',
129
+ width: width - 4,
130
+ overflow: 'truncate',
131
+ ellipsis: '..',
132
+ truncateMinChar: 1
133
+ },
134
+ emphasis: {
135
+ style: {
136
+ stroke: '#000',
137
+ lineWidth: 0.5
138
+ }
139
+ }
140
+ }
141
+ };
142
+ };
143
+ const option = useMemo(()=>{
144
+ if (data.profile.stackTrace === undefined) return chartsTheme.noDataOption;
145
+ const maxDepth = Math.max(...seriesData.map((s)=>s.value[0])); // maximum depth of the stack trace
146
+ const yAxisMax = Math.max(height > LARGE_CONTAINER_THRESHOLD ? Y_MIN_LARGE : Y_MIN_SMALL, maxDepth);
147
+ const totalStart = seriesData[0]?.value[1]; // start value of the total function
148
+ const totalEnd = seriesData[0]?.value[2]; // end value of the total function
149
+ const xAxisMin = totalStart;
150
+ const xAxisMax = totalEnd;
151
+ // compute flame chart padding top and bottom
152
+ const padding = (height / (yAxisMax - 1) - ITEM_GAP) / 2 + 1;
153
+ const option = {
154
+ tooltip: {
155
+ appendToBody: true,
156
+ confine: true,
157
+ formatter: (params)=>generateTooltip(params, data.metadata?.units),
158
+ backgroundColor: theme.palette.background.paper,
159
+ borderColor: theme.palette.background.paper,
160
+ textStyle: {
161
+ color: theme.palette.text.primary
162
+ }
163
+ },
164
+ xAxis: {
165
+ show: false,
166
+ min: xAxisMin,
167
+ max: xAxisMax,
168
+ axisLabel: {
169
+ show: false
170
+ }
171
+ },
172
+ yAxis: {
173
+ show: false,
174
+ max: yAxisMax,
175
+ inverse: true,
176
+ axisLabel: {
177
+ show: false
178
+ }
179
+ },
180
+ axisLabel: {
181
+ overflow: 'truncate',
182
+ width: width / 3
183
+ },
184
+ grid: {
185
+ left: 5,
186
+ right: 5,
187
+ top: padding + 5,
188
+ bottom: padding
189
+ },
190
+ series: [
191
+ {
192
+ type: 'custom',
193
+ renderItem,
194
+ encode: {
195
+ x: [
196
+ 0,
197
+ 1,
198
+ 2
199
+ ],
200
+ y: 0
201
+ },
202
+ data: seriesData
203
+ }
204
+ ]
205
+ };
206
+ return option;
207
+ }, [
208
+ data,
209
+ chartsTheme,
210
+ theme,
211
+ width,
212
+ seriesData,
213
+ height
214
+ ]);
215
+ // Use useMemo to memoize the flame chart component and prevent unnecessary re-renders.
216
+ // This ensures the chart does not re-render when the onClick event updates state variables
217
+ // like menuPosition or selectedId.
218
+ const flameChart = useMemo(()=>/*#__PURE__*/ _jsx(EChart, {
219
+ sx: {
220
+ width: width,
221
+ height: height - 2 * CONTAINER_PADDING - BREADCRUMB_SPACE
222
+ },
223
+ option: option,
224
+ theme: chartsTheme.echartsTheme,
225
+ onEvents: {
226
+ click: handleItemClick
227
+ }
228
+ }), [
229
+ chartsTheme.echartsTheme,
230
+ height,
231
+ option,
232
+ width
233
+ ]);
234
+ return /*#__PURE__*/ _jsxs(Stack, {
235
+ style: {
236
+ width: width,
237
+ height: height
238
+ },
239
+ alignItems: "center",
240
+ children: [
241
+ /*#__PURE__*/ _jsx(CustomBreadcrumb, {
242
+ totalValue: seriesData[0]?.value[3] || '',
243
+ totalSample: seriesData[0]?.value[8] || 0,
244
+ otherItemSample: findTotalSampleByName(seriesData, selectedId),
245
+ onSelectedIdChange: onSelectedIdChange
246
+ }),
247
+ flameChart,
248
+ /*#__PURE__*/ _jsxs(Menu, {
249
+ sx: {
250
+ '& .MuiPaper-root': {
251
+ backgroundColor: theme.palette.background.paper,
252
+ color: theme.palette.text.primary,
253
+ padding: '5px',
254
+ paddingBottom: '0px'
255
+ },
256
+ '& .MuiMenuItem-root': {
257
+ '&:hover': {
258
+ backgroundColor: theme.palette.action.hover
259
+ }
260
+ }
261
+ },
262
+ open: menuPosition !== null,
263
+ onClose: handleClose,
264
+ anchorReference: "anchorPosition",
265
+ anchorPosition: menuPosition !== null ? {
266
+ top: menuPosition.mouseY,
267
+ left: menuPosition.mouseX
268
+ } : undefined,
269
+ children: [
270
+ /*#__PURE__*/ _jsx(Box, {
271
+ sx: {
272
+ paddingLeft: '16px',
273
+ paddingBottom: '8px'
274
+ },
275
+ children: selectedItem.name
276
+ }),
277
+ /*#__PURE__*/ _jsx(Divider, {
278
+ sx: {
279
+ backgroundColor: theme.palette.divider
280
+ }
281
+ }),
282
+ /*#__PURE__*/ _jsxs(MenuItem, {
283
+ onClick: handleFocusBlock,
284
+ children: [
285
+ /*#__PURE__*/ _jsx(EyeIcon, {
286
+ fontSize: "small",
287
+ color: "secondary",
288
+ sx: {
289
+ marginRight: '10px'
290
+ }
291
+ }),
292
+ "Focus block"
293
+ ]
294
+ }),
295
+ /*#__PURE__*/ _jsxs(MenuItem, {
296
+ onClick: handleCopyFunctionName,
297
+ disabled: isCopied,
298
+ children: [
299
+ /*#__PURE__*/ _jsx(ContentCopyIcon, {
300
+ fontSize: "small",
301
+ color: "secondary",
302
+ sx: {
303
+ marginRight: '10px'
304
+ }
305
+ }),
306
+ isCopied ? 'Copied' : 'Copy function name'
307
+ ]
308
+ }),
309
+ /*#__PURE__*/ _jsxs(MenuItem, {
310
+ onClick: handleResetGraph,
311
+ children: [
312
+ /*#__PURE__*/ _jsx(RefreshIcon, {
313
+ fontSize: "small",
314
+ color: "secondary",
315
+ sx: {
316
+ marginRight: '10px'
317
+ }
318
+ }),
319
+ "Reset graph"
320
+ ]
321
+ })
322
+ ]
323
+ })
324
+ ]
325
+ });
326
+ }
327
+
328
+ //# sourceMappingURL=FlameChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/FlameChart.tsx"],"sourcesContent":["// Copyright 2025 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {\n CustomSeriesRenderItem,\n CustomSeriesRenderItemAPI,\n CustomSeriesRenderItemParams,\n CustomSeriesRenderItemReturn,\n} from 'echarts';\nimport { Stack, Box, Menu, MenuItem, Divider, useTheme } from '@mui/material';\nimport { ReactElement, useState, useMemo, MouseEvent } from 'react';\nimport { ProfileData } from '@perses-dev/core';\nimport { useChartsTheme, EChart, MouseEventsParameters } from '@perses-dev/components';\nimport RefreshIcon from 'mdi-material-ui/Refresh';\nimport EyeIcon from 'mdi-material-ui/EyeOutline';\nimport ContentCopyIcon from 'mdi-material-ui/ContentCopy';\nimport { EChartsCoreOption } from 'echarts/core';\nimport { recursionJson, findTotalSampleByName } from '../utils/data-transform';\nimport { generateTooltip } from '../utils/tooltip';\nimport { FlameChartSample as Sample } from '../utils/data-model';\nimport { CustomBreadcrumb } from './CustomBreadcrumb';\n\nconst ITEM_GAP = 2; // vertical gap between flame chart items\nconst Y_MIN_SMALL = 6; // min value of y axis for small containers\nconst Y_MIN_LARGE = 20; // min value of y axis for large containers\nconst LARGE_CONTAINER_THRESHOLD = 600;\nconst CONTAINER_PADDING = 10;\nconst BREADCRUMB_SPACE = 50;\n\nexport interface FlameChartProps {\n width: number;\n height: number;\n data: ProfileData;\n palette: 'package-name' | 'value';\n selectedId: number;\n searchValue: string;\n onSelectedIdChange: (newId: number) => void;\n}\n\nexport function FlameChart(props: FlameChartProps): ReactElement {\n const { width, height, data, palette, selectedId, searchValue, onSelectedIdChange } = props;\n const theme = useTheme();\n const chartsTheme = useChartsTheme();\n const [menuPosition, setMenuPosition] = useState<{ mouseX: number; mouseY: number } | null>(null);\n const [selectedItem, setSelectedItem] = useState<{ id: number; name: string }>({ id: 0, name: '' });\n const [isCopied, setIsCopied] = useState(false);\n\n const seriesData = useMemo(\n () => recursionJson(palette, data.metadata, data.profile.stackTrace, searchValue, selectedId),\n [palette, data.metadata, data.profile.stackTrace, selectedId, searchValue]\n );\n\n const handleItemClick = (params: MouseEventsParameters<Sample>): void => {\n const data: Sample = params.data;\n const functionName = data.value[6];\n const functionId = data.name;\n setSelectedItem({ id: functionId, name: functionName });\n\n // To ensure that the cursor is positioned inside the menu when it opens,\n // we adjust the click event coordinates as follows:\n if ('event' in params) {\n const mouseEvent = params.event as { event: MouseEvent };\n setMenuPosition({\n mouseX: mouseEvent.event.clientX - 2,\n mouseY: mouseEvent.event.clientY - 4,\n });\n }\n };\n\n const handleFocusBlock = (): void => {\n onSelectedIdChange(selectedItem.id);\n handleClose();\n };\n\n const handleCopyFunctionName = (): void => {\n if ((selectedId || selectedId === 0) && selectedItem.name) {\n navigator.clipboard.writeText(selectedItem.name);\n }\n setIsCopied(true);\n };\n\n const handleResetGraph = (): void => {\n if (selectedId) {\n onSelectedIdChange(0);\n }\n handleClose();\n };\n\n const handleClose = (): void => {\n setMenuPosition(null);\n if (isCopied) setIsCopied(false);\n };\n\n const renderItem: CustomSeriesRenderItem = (params: CustomSeriesRenderItemParams, api: CustomSeriesRenderItemAPI) => {\n const level = api.value(0);\n const start = api.coord([api.value(1), level]);\n const end = api.coord([api.value(2), level]);\n const height = (((api.size && api.size([0, 1])) || [0, 20]) as number[])[1];\n const width = (end?.[0] ?? 0) - (start?.[0] ?? 0);\n\n return {\n type: 'rect',\n transition: ['shape'],\n shape: {\n x: start?.[0],\n y: (start?.[1] ?? 0) - (height ?? 0) / 2,\n width,\n height: (height ?? ITEM_GAP) - ITEM_GAP,\n r: 0,\n },\n style: {\n fill: api.visual('color'),\n },\n emphasis: {\n style: {\n stroke: '#000',\n },\n },\n textConfig: {\n position: 'insideLeft',\n },\n textContent: {\n style: {\n text: api.value(3),\n fill: '#000',\n width: width - 4,\n overflow: 'truncate',\n ellipsis: '..',\n truncateMinChar: 1,\n },\n emphasis: {\n style: {\n stroke: '#000',\n lineWidth: 0.5,\n },\n },\n },\n } as CustomSeriesRenderItemReturn;\n };\n\n const option: EChartsCoreOption = useMemo(() => {\n if (data.profile.stackTrace === undefined) return chartsTheme.noDataOption;\n\n const maxDepth = Math.max(...seriesData.map((s) => s.value[0])); // maximum depth of the stack trace\n const yAxisMax = Math.max(height > LARGE_CONTAINER_THRESHOLD ? Y_MIN_LARGE : Y_MIN_SMALL, maxDepth);\n const totalStart = seriesData[0]?.value[1]; // start value of the total function\n const totalEnd = seriesData[0]?.value[2]; // end value of the total function\n const xAxisMin = totalStart;\n const xAxisMax = totalEnd;\n\n // compute flame chart padding top and bottom\n const padding = (height / (yAxisMax - 1) - ITEM_GAP) / 2 + 1;\n\n const option = {\n tooltip: {\n appendToBody: true,\n confine: true,\n formatter: (params: Sample): string => generateTooltip(params, data.metadata?.units),\n backgroundColor: theme.palette.background.paper,\n borderColor: theme.palette.background.paper,\n textStyle: {\n color: theme.palette.text.primary,\n },\n },\n xAxis: {\n show: false,\n min: xAxisMin,\n max: xAxisMax,\n axisLabel: {\n show: false,\n },\n },\n yAxis: {\n show: false,\n max: yAxisMax,\n inverse: true, // Reverse Y axis\n axisLabel: {\n show: false,\n },\n },\n axisLabel: {\n overflow: 'truncate',\n width: width / 3,\n },\n grid: {\n left: 5,\n right: 5,\n top: padding + 5,\n bottom: padding,\n },\n series: [\n {\n type: 'custom',\n renderItem,\n encode: {\n x: [0, 1, 2],\n y: 0,\n },\n data: seriesData,\n },\n ],\n };\n\n return option;\n }, [data, chartsTheme, theme, width, seriesData, height]);\n\n // Use useMemo to memoize the flame chart component and prevent unnecessary re-renders.\n // This ensures the chart does not re-render when the onClick event updates state variables\n // like menuPosition or selectedId.\n const flameChart = useMemo(\n () => (\n <EChart\n sx={{\n width: width,\n height: height - 2 * CONTAINER_PADDING - BREADCRUMB_SPACE,\n }}\n option={option} // even data is in this prop\n theme={chartsTheme.echartsTheme}\n onEvents={{\n click: handleItemClick as (params: MouseEventsParameters<unknown>) => void,\n }}\n />\n ),\n [chartsTheme.echartsTheme, height, option, width]\n );\n\n return (\n <Stack\n style={{\n width: width,\n height: height,\n }}\n alignItems=\"center\"\n >\n <CustomBreadcrumb\n totalValue={seriesData[0]?.value[3] || ''} // name of the total function\n totalSample={seriesData[0]?.value[8] || 0} // total sample of the total function\n otherItemSample={findTotalSampleByName(seriesData, selectedId)} // total sample of the selected function\n onSelectedIdChange={onSelectedIdChange}\n />\n {flameChart}\n <Menu\n sx={{\n '& .MuiPaper-root': {\n backgroundColor: theme.palette.background.paper,\n color: theme.palette.text.primary,\n padding: '5px',\n paddingBottom: '0px',\n },\n '& .MuiMenuItem-root': {\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n }}\n open={menuPosition !== null}\n onClose={handleClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuPosition !== null ? { top: menuPosition.mouseY, left: menuPosition.mouseX } : undefined}\n >\n <Box\n sx={{\n paddingLeft: '16px',\n paddingBottom: '8px',\n }}\n >\n {selectedItem.name}\n </Box>\n <Divider sx={{ backgroundColor: theme.palette.divider }} />\n <MenuItem onClick={handleFocusBlock}>\n <EyeIcon fontSize=\"small\" color=\"secondary\" sx={{ marginRight: '10px' }} />\n Focus block\n </MenuItem>\n <MenuItem onClick={handleCopyFunctionName} disabled={isCopied}>\n <ContentCopyIcon fontSize=\"small\" color=\"secondary\" sx={{ marginRight: '10px' }} />\n {isCopied ? 'Copied' : 'Copy function name'}\n </MenuItem>\n <MenuItem onClick={handleResetGraph}>\n <RefreshIcon fontSize=\"small\" color=\"secondary\" sx={{ marginRight: '10px' }} />\n Reset graph\n </MenuItem>\n </Menu>\n </Stack>\n );\n}\n"],"names":["Stack","Box","Menu","MenuItem","Divider","useTheme","useState","useMemo","useChartsTheme","EChart","RefreshIcon","EyeIcon","ContentCopyIcon","recursionJson","findTotalSampleByName","generateTooltip","CustomBreadcrumb","ITEM_GAP","Y_MIN_SMALL","Y_MIN_LARGE","LARGE_CONTAINER_THRESHOLD","CONTAINER_PADDING","BREADCRUMB_SPACE","FlameChart","props","width","height","data","palette","selectedId","searchValue","onSelectedIdChange","theme","chartsTheme","menuPosition","setMenuPosition","selectedItem","setSelectedItem","id","name","isCopied","setIsCopied","seriesData","metadata","profile","stackTrace","handleItemClick","params","functionName","value","functionId","mouseEvent","event","mouseX","clientX","mouseY","clientY","handleFocusBlock","handleClose","handleCopyFunctionName","navigator","clipboard","writeText","handleResetGraph","renderItem","api","level","start","coord","end","size","type","transition","shape","x","y","r","style","fill","visual","emphasis","stroke","textConfig","position","textContent","text","overflow","ellipsis","truncateMinChar","lineWidth","option","undefined","noDataOption","maxDepth","Math","max","map","s","yAxisMax","totalStart","totalEnd","xAxisMin","xAxisMax","padding","tooltip","appendToBody","confine","formatter","units","backgroundColor","background","paper","borderColor","textStyle","color","primary","xAxis","show","min","axisLabel","yAxis","inverse","grid","left","right","top","bottom","series","encode","flameChart","sx","echartsTheme","onEvents","click","alignItems","totalValue","totalSample","otherItemSample","paddingBottom","action","hover","open","onClose","anchorReference","anchorPosition","paddingLeft","divider","onClick","fontSize","marginRight","disabled"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAQjC,SAASA,KAAK,EAAEC,GAAG,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,gBAAgB;AAC9E,SAAuBC,QAAQ,EAAEC,OAAO,QAAoB,QAAQ;AAEpE,SAASC,cAAc,EAAEC,MAAM,QAA+B,yBAAyB;AACvF,OAAOC,iBAAiB,0BAA0B;AAClD,OAAOC,aAAa,6BAA6B;AACjD,OAAOC,qBAAqB,8BAA8B;AAE1D,SAASC,aAAa,EAAEC,qBAAqB,QAAQ,0BAA0B;AAC/E,SAASC,eAAe,QAAQ,mBAAmB;AAEnD,SAASC,gBAAgB,QAAQ,qBAAqB;AAEtD,MAAMC,WAAW,GAAG,yCAAyC;AAC7D,MAAMC,cAAc,GAAG,2CAA2C;AAClE,MAAMC,cAAc,IAAI,2CAA2C;AACnE,MAAMC,4BAA4B;AAClC,MAAMC,oBAAoB;AAC1B,MAAMC,mBAAmB;AAYzB,OAAO,SAASC,WAAWC,KAAsB;IAC/C,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,UAAU,EAAEC,WAAW,EAAEC,kBAAkB,EAAE,GAAGP;IACtF,MAAMQ,QAAQ3B;IACd,MAAM4B,cAAczB;IACpB,MAAM,CAAC0B,cAAcC,gBAAgB,GAAG7B,SAAoD;IAC5F,MAAM,CAAC8B,cAAcC,gBAAgB,GAAG/B,SAAuC;QAAEgC,IAAI;QAAGC,MAAM;IAAG;IACjG,MAAM,CAACC,UAAUC,YAAY,GAAGnC,SAAS;IAEzC,MAAMoC,aAAanC,QACjB,IAAMM,cAAce,SAASD,KAAKgB,QAAQ,EAAEhB,KAAKiB,OAAO,CAACC,UAAU,EAAEf,aAAaD,aAClF;QAACD;QAASD,KAAKgB,QAAQ;QAAEhB,KAAKiB,OAAO,CAACC,UAAU;QAAEhB;QAAYC;KAAY;IAG5E,MAAMgB,kBAAkB,CAACC;QACvB,MAAMpB,OAAeoB,OAAOpB,IAAI;QAChC,MAAMqB,eAAerB,KAAKsB,KAAK,CAAC,EAAE;QAClC,MAAMC,aAAavB,KAAKY,IAAI;QAC5BF,gBAAgB;YAAEC,IAAIY;YAAYX,MAAMS;QAAa;QAErD,yEAAyE;QACzE,oDAAoD;QACpD,IAAI,WAAWD,QAAQ;YACrB,MAAMI,aAAaJ,OAAOK,KAAK;YAC/BjB,gBAAgB;gBACdkB,QAAQF,WAAWC,KAAK,CAACE,OAAO,GAAG;gBACnCC,QAAQJ,WAAWC,KAAK,CAACI,OAAO,GAAG;YACrC;QACF;IACF;IAEA,MAAMC,mBAAmB;QACvB1B,mBAAmBK,aAAaE,EAAE;QAClCoB;IACF;IAEA,MAAMC,yBAAyB;QAC7B,IAAI,AAAC9B,CAAAA,cAAcA,eAAe,CAAA,KAAMO,aAAaG,IAAI,EAAE;YACzDqB,UAAUC,SAAS,CAACC,SAAS,CAAC1B,aAAaG,IAAI;QACjD;QACAE,YAAY;IACd;IAEA,MAAMsB,mBAAmB;QACvB,IAAIlC,YAAY;YACdE,mBAAmB;QACrB;QACA2B;IACF;IAEA,MAAMA,cAAc;QAClBvB,gBAAgB;QAChB,IAAIK,UAAUC,YAAY;IAC5B;IAEA,MAAMuB,aAAqC,CAACjB,QAAsCkB;QAChF,MAAMC,QAAQD,IAAIhB,KAAK,CAAC;QACxB,MAAMkB,QAAQF,IAAIG,KAAK,CAAC;YAACH,IAAIhB,KAAK,CAAC;YAAIiB;SAAM;QAC7C,MAAMG,MAAMJ,IAAIG,KAAK,CAAC;YAACH,IAAIhB,KAAK,CAAC;YAAIiB;SAAM;QAC3C,MAAMxC,SAAS,AAAE,CAAA,AAACuC,IAAIK,IAAI,IAAIL,IAAIK,IAAI,CAAC;YAAC;YAAG;SAAE,KAAM;YAAC;YAAG;SAAG,AAAD,CAAe,CAAC,EAAE;QAC3E,MAAM7C,QAAQ,AAAC4C,CAAAA,KAAK,CAAC,EAAE,IAAI,CAAA,IAAMF,CAAAA,OAAO,CAAC,EAAE,IAAI,CAAA;QAE/C,OAAO;YACLI,MAAM;YACNC,YAAY;gBAAC;aAAQ;YACrBC,OAAO;gBACLC,GAAGP,OAAO,CAAC,EAAE;gBACbQ,GAAG,AAACR,CAAAA,OAAO,CAAC,EAAE,IAAI,CAAA,IAAK,AAACzC,CAAAA,UAAU,CAAA,IAAK;gBACvCD;gBACAC,QAAQ,AAACA,CAAAA,UAAUT,QAAO,IAAKA;gBAC/B2D,GAAG;YACL;YACAC,OAAO;gBACLC,MAAMb,IAAIc,MAAM,CAAC;YACnB;YACAC,UAAU;gBACRH,OAAO;oBACLI,QAAQ;gBACV;YACF;YACAC,YAAY;gBACVC,UAAU;YACZ;YACAC,aAAa;gBACXP,OAAO;oBACLQ,MAAMpB,IAAIhB,KAAK,CAAC;oBAChB6B,MAAM;oBACNrD,OAAOA,QAAQ;oBACf6D,UAAU;oBACVC,UAAU;oBACVC,iBAAiB;gBACnB;gBACAR,UAAU;oBACRH,OAAO;wBACLI,QAAQ;wBACRQ,WAAW;oBACb;gBACF;YACF;QACF;IACF;IAEA,MAAMC,SAA4BnF,QAAQ;QACxC,IAAIoB,KAAKiB,OAAO,CAACC,UAAU,KAAK8C,WAAW,OAAO1D,YAAY2D,YAAY;QAE1E,MAAMC,WAAWC,KAAKC,GAAG,IAAIrD,WAAWsD,GAAG,CAAC,CAACC,IAAMA,EAAEhD,KAAK,CAAC,EAAE,IAAI,mCAAmC;QACpG,MAAMiD,WAAWJ,KAAKC,GAAG,CAACrE,SAASN,4BAA4BD,cAAcD,aAAa2E;QAC1F,MAAMM,aAAazD,UAAU,CAAC,EAAE,EAAEO,KAAK,CAAC,EAAE,EAAE,oCAAoC;QAChF,MAAMmD,WAAW1D,UAAU,CAAC,EAAE,EAAEO,KAAK,CAAC,EAAE,EAAE,kCAAkC;QAC5E,MAAMoD,WAAWF;QACjB,MAAMG,WAAWF;QAEjB,6CAA6C;QAC7C,MAAMG,UAAU,AAAC7E,CAAAA,SAAUwE,CAAAA,WAAW,CAAA,IAAKjF,QAAO,IAAK,IAAI;QAE3D,MAAMyE,SAAS;YACbc,SAAS;gBACPC,cAAc;gBACdC,SAAS;gBACTC,WAAW,CAAC5D,SAA2BhC,gBAAgBgC,QAAQpB,KAAKgB,QAAQ,EAAEiE;gBAC9EC,iBAAiB7E,MAAMJ,OAAO,CAACkF,UAAU,CAACC,KAAK;gBAC/CC,aAAahF,MAAMJ,OAAO,CAACkF,UAAU,CAACC,KAAK;gBAC3CE,WAAW;oBACTC,OAAOlF,MAAMJ,OAAO,CAACyD,IAAI,CAAC8B,OAAO;gBACnC;YACF;YACAC,OAAO;gBACLC,MAAM;gBACNC,KAAKjB;gBACLN,KAAKO;gBACLiB,WAAW;oBACTF,MAAM;gBACR;YACF;YACAG,OAAO;gBACLH,MAAM;gBACNtB,KAAKG;gBACLuB,SAAS;gBACTF,WAAW;oBACTF,MAAM;gBACR;YACF;YACAE,WAAW;gBACTjC,UAAU;gBACV7D,OAAOA,QAAQ;YACjB;YACAiG,MAAM;gBACJC,MAAM;gBACNC,OAAO;gBACPC,KAAKtB,UAAU;gBACfuB,QAAQvB;YACV;YACAwB,QAAQ;gBACN;oBACExD,MAAM;oBACNP;oBACAgE,QAAQ;wBACNtD,GAAG;4BAAC;4BAAG;4BAAG;yBAAE;wBACZC,GAAG;oBACL;oBACAhD,MAAMe;gBACR;aACD;QACH;QAEA,OAAOgD;IACT,GAAG;QAAC/D;QAAMM;QAAaD;QAAOP;QAAOiB;QAAYhB;KAAO;IAExD,uFAAuF;IACvF,2FAA2F;IAC3F,mCAAmC;IACnC,MAAMuG,aAAa1H,QACjB,kBACE,KAACE;YACCyH,IAAI;gBACFzG,OAAOA;gBACPC,QAAQA,SAAS,IAAIL,oBAAoBC;YAC3C;YACAoE,QAAQA;YACR1D,OAAOC,YAAYkG,YAAY;YAC/BC,UAAU;gBACRC,OAAOvF;YACT;YAGJ;QAACb,YAAYkG,YAAY;QAAEzG;QAAQgE;QAAQjE;KAAM;IAGnD,qBACE,MAACzB;QACC6E,OAAO;YACLpD,OAAOA;YACPC,QAAQA;QACV;QACA4G,YAAW;;0BAEX,KAACtH;gBACCuH,YAAY7F,UAAU,CAAC,EAAE,EAAEO,KAAK,CAAC,EAAE,IAAI;gBACvCuF,aAAa9F,UAAU,CAAC,EAAE,EAAEO,KAAK,CAAC,EAAE,IAAI;gBACxCwF,iBAAiB3H,sBAAsB4B,YAAYb;gBACnDE,oBAAoBA;;YAErBkG;0BACD,MAAC/H;gBACCgI,IAAI;oBACF,oBAAoB;wBAClBrB,iBAAiB7E,MAAMJ,OAAO,CAACkF,UAAU,CAACC,KAAK;wBAC/CG,OAAOlF,MAAMJ,OAAO,CAACyD,IAAI,CAAC8B,OAAO;wBACjCZ,SAAS;wBACTmC,eAAe;oBACjB;oBACA,uBAAuB;wBACrB,WAAW;4BACT7B,iBAAiB7E,MAAMJ,OAAO,CAAC+G,MAAM,CAACC,KAAK;wBAC7C;oBACF;gBACF;gBACAC,MAAM3G,iBAAiB;gBACvB4G,SAASpF;gBACTqF,iBAAgB;gBAChBC,gBAAgB9G,iBAAiB,OAAO;oBAAE2F,KAAK3F,aAAaqB,MAAM;oBAAEoE,MAAMzF,aAAamB,MAAM;gBAAC,IAAIsC;;kCAElG,KAAC1F;wBACCiI,IAAI;4BACFe,aAAa;4BACbP,eAAe;wBACjB;kCAECtG,aAAaG,IAAI;;kCAEpB,KAACnC;wBAAQ8H,IAAI;4BAAErB,iBAAiB7E,MAAMJ,OAAO,CAACsH,OAAO;wBAAC;;kCACtD,MAAC/I;wBAASgJ,SAAS1F;;0CACjB,KAAC9C;gCAAQyI,UAAS;gCAAQlC,OAAM;gCAAYgB,IAAI;oCAAEmB,aAAa;gCAAO;;4BAAK;;;kCAG7E,MAAClJ;wBAASgJ,SAASxF;wBAAwB2F,UAAU9G;;0CACnD,KAAC5B;gCAAgBwI,UAAS;gCAAQlC,OAAM;gCAAYgB,IAAI;oCAAEmB,aAAa;gCAAO;;4BAC7E7G,WAAW,WAAW;;;kCAEzB,MAACrC;wBAASgJ,SAASpF;;0CACjB,KAACrD;gCAAY0I,UAAS;gCAAQlC,OAAM;gCAAYgB,IAAI;oCAAEmB,aAAa;gCAAO;;4BAAK;;;;;;;AAMzF"}
@@ -0,0 +1,4 @@
1
+ import { ReactElement } from 'react';
2
+ import { FlameChartOptionsEditorProps } from '../flame-chart-model';
3
+ export declare function FlameChartOptionsEditorSettings(props: FlameChartOptionsEditorProps): ReactElement;
4
+ //# sourceMappingURL=FlameChartOptionsEditorSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlameChartOptionsEditorSettings.d.ts","sourceRoot":"","sources":["../../../src/components/FlameChartOptionsEditorSettings.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAYpE,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,4BAA4B,GAAG,YAAY,CAiCjG"}
@@ -0,0 +1,79 @@
1
+ // Copyright 2025 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ import { OptionsEditorGroup, OptionsEditorGrid, OptionsEditorColumn } from '@perses-dev/components';
15
+ import { Button } from '@mui/material';
16
+ import { usePaletteState, useShowSettingsState, useShowSeriesState, useShowTableState, useShowFlameGraphState, resetSettings } from '../utils/utils';
17
+ import { PaletteSelector } from './PaletteSelector';
18
+ import { SwitchSelector } from './SwitchSelector';
19
+ export function FlameChartOptionsEditorSettings(props) {
20
+ const { value } = props;
21
+ const { handlePaletteChange } = usePaletteState(props);
22
+ const { handleShowSettingsChange } = useShowSettingsState(props);
23
+ const { handleShowSeriesChange } = useShowSeriesState(props);
24
+ const { handleShowTableChange } = useShowTableState(props);
25
+ const { handleShowFlameGraphChange } = useShowFlameGraphState(props);
26
+ return /*#__PURE__*/ _jsxs(OptionsEditorGrid, {
27
+ children: [
28
+ /*#__PURE__*/ _jsx(OptionsEditorColumn, {
29
+ children: /*#__PURE__*/ _jsx(OptionsEditorGroup, {
30
+ title: "Misc",
31
+ children: /*#__PURE__*/ _jsx(PaletteSelector, {
32
+ value: value.palette,
33
+ onChange: handlePaletteChange
34
+ })
35
+ })
36
+ }),
37
+ /*#__PURE__*/ _jsx(OptionsEditorColumn, {
38
+ children: /*#__PURE__*/ _jsxs(OptionsEditorGroup, {
39
+ title: "Panels to display",
40
+ children: [
41
+ /*#__PURE__*/ _jsx(SwitchSelector, {
42
+ label: "Show Options",
43
+ value: value.showSettings,
44
+ onChange: handleShowSettingsChange
45
+ }),
46
+ /*#__PURE__*/ _jsx(SwitchSelector, {
47
+ label: "Show Series",
48
+ value: value.showSeries,
49
+ onChange: handleShowSeriesChange
50
+ }),
51
+ /*#__PURE__*/ _jsx(SwitchSelector, {
52
+ label: "Show Table",
53
+ value: value.showTable,
54
+ onChange: handleShowTableChange
55
+ }),
56
+ /*#__PURE__*/ _jsx(SwitchSelector, {
57
+ label: "Show Flame Graph",
58
+ value: value.showFlameGraph,
59
+ onChange: handleShowFlameGraphChange
60
+ })
61
+ ]
62
+ })
63
+ }),
64
+ /*#__PURE__*/ _jsx(OptionsEditorColumn, {
65
+ children: /*#__PURE__*/ _jsx(OptionsEditorGroup, {
66
+ title: "Reset Settings",
67
+ children: /*#__PURE__*/ _jsx(Button, {
68
+ variant: "outlined",
69
+ color: "secondary",
70
+ onClick: ()=>resetSettings(props),
71
+ children: "Reset To Defaults"
72
+ })
73
+ })
74
+ })
75
+ ]
76
+ });
77
+ }
78
+
79
+ //# sourceMappingURL=FlameChartOptionsEditorSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/FlameChartOptionsEditorSettings.tsx"],"sourcesContent":["// Copyright 2025 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ReactElement } from 'react';\nimport { OptionsEditorGroup, OptionsEditorGrid, OptionsEditorColumn } from '@perses-dev/components';\nimport { Button } from '@mui/material';\nimport { FlameChartOptionsEditorProps } from '../flame-chart-model';\nimport {\n usePaletteState,\n useShowSettingsState,\n useShowSeriesState,\n useShowTableState,\n useShowFlameGraphState,\n resetSettings,\n} from '../utils/utils';\nimport { PaletteSelector } from './PaletteSelector';\nimport { SwitchSelector } from './SwitchSelector';\n\nexport function FlameChartOptionsEditorSettings(props: FlameChartOptionsEditorProps): ReactElement {\n const { value } = props;\n\n const { handlePaletteChange } = usePaletteState(props);\n const { handleShowSettingsChange } = useShowSettingsState(props);\n const { handleShowSeriesChange } = useShowSeriesState(props);\n const { handleShowTableChange } = useShowTableState(props);\n const { handleShowFlameGraphChange } = useShowFlameGraphState(props);\n\n return (\n <OptionsEditorGrid>\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Misc\">\n <PaletteSelector value={value.palette} onChange={handlePaletteChange} />\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Panels to display\">\n <SwitchSelector label=\"Show Options\" value={value.showSettings} onChange={handleShowSettingsChange} />\n <SwitchSelector label=\"Show Series\" value={value.showSeries} onChange={handleShowSeriesChange} />\n <SwitchSelector label=\"Show Table\" value={value.showTable} onChange={handleShowTableChange} />\n <SwitchSelector label=\"Show Flame Graph\" value={value.showFlameGraph} onChange={handleShowFlameGraphChange} />\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Reset Settings\">\n <Button variant=\"outlined\" color=\"secondary\" onClick={() => resetSettings(props)}>\n Reset To Defaults\n </Button>\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n </OptionsEditorGrid>\n );\n}\n"],"names":["OptionsEditorGroup","OptionsEditorGrid","OptionsEditorColumn","Button","usePaletteState","useShowSettingsState","useShowSeriesState","useShowTableState","useShowFlameGraphState","resetSettings","PaletteSelector","SwitchSelector","FlameChartOptionsEditorSettings","props","value","handlePaletteChange","handleShowSettingsChange","handleShowSeriesChange","handleShowTableChange","handleShowFlameGraphChange","title","palette","onChange","label","showSettings","showSeries","showTable","showFlameGraph","variant","color","onClick"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAGjC,SAASA,kBAAkB,EAAEC,iBAAiB,EAAEC,mBAAmB,QAAQ,yBAAyB;AACpG,SAASC,MAAM,QAAQ,gBAAgB;AAEvC,SACEC,eAAe,EACfC,oBAAoB,EACpBC,kBAAkB,EAClBC,iBAAiB,EACjBC,sBAAsB,EACtBC,aAAa,QACR,iBAAiB;AACxB,SAASC,eAAe,QAAQ,oBAAoB;AACpD,SAASC,cAAc,QAAQ,mBAAmB;AAElD,OAAO,SAASC,gCAAgCC,KAAmC;IACjF,MAAM,EAAEC,KAAK,EAAE,GAAGD;IAElB,MAAM,EAAEE,mBAAmB,EAAE,GAAGX,gBAAgBS;IAChD,MAAM,EAAEG,wBAAwB,EAAE,GAAGX,qBAAqBQ;IAC1D,MAAM,EAAEI,sBAAsB,EAAE,GAAGX,mBAAmBO;IACtD,MAAM,EAAEK,qBAAqB,EAAE,GAAGX,kBAAkBM;IACpD,MAAM,EAAEM,0BAA0B,EAAE,GAAGX,uBAAuBK;IAE9D,qBACE,MAACZ;;0BACC,KAACC;0BACC,cAAA,KAACF;oBAAmBoB,OAAM;8BACxB,cAAA,KAACV;wBAAgBI,OAAOA,MAAMO,OAAO;wBAAEC,UAAUP;;;;0BAGrD,KAACb;0BACC,cAAA,MAACF;oBAAmBoB,OAAM;;sCACxB,KAACT;4BAAeY,OAAM;4BAAeT,OAAOA,MAAMU,YAAY;4BAAEF,UAAUN;;sCAC1E,KAACL;4BAAeY,OAAM;4BAAcT,OAAOA,MAAMW,UAAU;4BAAEH,UAAUL;;sCACvE,KAACN;4BAAeY,OAAM;4BAAaT,OAAOA,MAAMY,SAAS;4BAAEJ,UAAUJ;;sCACrE,KAACP;4BAAeY,OAAM;4BAAmBT,OAAOA,MAAMa,cAAc;4BAAEL,UAAUH;;;;;0BAGpF,KAACjB;0BACC,cAAA,KAACF;oBAAmBoB,OAAM;8BACxB,cAAA,KAACjB;wBAAOyB,SAAQ;wBAAWC,OAAM;wBAAYC,SAAS,IAAMrB,cAAcI;kCAAQ;;;;;;AAO5F"}
@@ -0,0 +1,7 @@
1
+ import { FC } from 'react';
2
+ import { ProfileData } from '@perses-dev/core';
3
+ import { PanelProps } from '@perses-dev/plugin-system';
4
+ import { FlameChartOptions } from '../flame-chart-model';
5
+ export type FlameChartPanelProps = PanelProps<FlameChartOptions, ProfileData>;
6
+ export declare const FlameChartPanel: FC<FlameChartPanelProps>;
7
+ //# sourceMappingURL=FlameChartPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlameChartPanel.d.ts","sourceRoot":"","sources":["../../../src/components/FlameChartPanel.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,EAAE,EAAuB,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AASzD,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;AAE9E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAqIpD,CAAC"}
@@ -0,0 +1,139 @@
1
+ // Copyright 2023 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ import { useChartsTheme } from '@perses-dev/components';
15
+ import { Stack, Typography, useMediaQuery, useTheme } from '@mui/material';
16
+ import { useState, useEffect } from 'react';
17
+ import { FlameChart } from './FlameChart';
18
+ import { Settings } from './Settings';
19
+ import { TableChart } from './TableChart';
20
+ import { SeriesChart } from './SeriesChart';
21
+ const LARGE_PANEL_TRESHOLD = 600;
22
+ const DEFAULT_SERIES_CHART_HEIGHT = 200;
23
+ export const FlameChartPanel = (props)=>{
24
+ const { contentDimensions, queryResults, spec } = props;
25
+ const isMobileSize = useMediaQuery(useTheme().breakpoints.down('sm'));
26
+ // selectedId equals 0 => Flame Graph is not zoomed in
27
+ // selectedId different from 0 => Flame Graph is zoomed in
28
+ const [selectedId, setSelectedId] = useState(0);
29
+ const [searchValue, setSearchValue] = useState('');
30
+ // This spec is used to manage settings temporarily
31
+ const [liveSpec, setLiveSpec] = useState(spec);
32
+ // keep liveSpec up to date
33
+ useEffect(()=>{
34
+ setLiveSpec(spec);
35
+ setSelectedId(0);
36
+ setSearchValue('');
37
+ }, [
38
+ spec
39
+ ]);
40
+ const chartsTheme = useChartsTheme();
41
+ const flameChartData = queryResults[0];
42
+ if (contentDimensions === undefined) return null;
43
+ const noDataTextStyle = chartsTheme.noDataOption.title.textStyle;
44
+ const onChangePalette = (newPalette)=>{
45
+ setLiveSpec((prev)=>{
46
+ return {
47
+ ...prev,
48
+ palette: newPalette
49
+ };
50
+ });
51
+ };
52
+ const onDisplayChange = (value)=>{
53
+ let showTable = true;
54
+ let showFlameGraph = true;
55
+ if (value === 'table') {
56
+ showFlameGraph = false;
57
+ } else if (value === 'flame-graph') {
58
+ showTable = false;
59
+ }
60
+ setLiveSpec((prev)=>{
61
+ return {
62
+ ...prev,
63
+ showTable: showTable,
64
+ showFlameGraph: showFlameGraph
65
+ };
66
+ });
67
+ };
68
+ const PADDING = liveSpec.showSeries && liveSpec.showSettings ? 32 : liveSpec.showSeries || liveSpec.showSettings ? 16 : 0;
69
+ const SETTINGS_HEIGHT = liveSpec.showSettings ? 30 : 0;
70
+ const SERIES_CHART_HEIGHT = liveSpec.showSeries ? contentDimensions.height < DEFAULT_SERIES_CHART_HEIGHT ? contentDimensions.height : DEFAULT_SERIES_CHART_HEIGHT : 0;
71
+ const TABLE_FLAME_CHART_HEIGHT = contentDimensions.height - (contentDimensions.height > LARGE_PANEL_TRESHOLD ? SERIES_CHART_HEIGHT + SETTINGS_HEIGHT + PADDING : 0);
72
+ const TABLE_CHART_WIDTH = isMobileSize ? contentDimensions.width : liveSpec.showFlameGraph ? 0.4 * contentDimensions.width : contentDimensions.width;
73
+ const FLAME_CHART_WIDTH = isMobileSize ? contentDimensions.width : liveSpec.showTable ? 0.6 * contentDimensions.width : contentDimensions.width;
74
+ return /*#__PURE__*/ _jsx(Stack, {
75
+ height: contentDimensions.height,
76
+ width: contentDimensions.width,
77
+ justifyContent: "center",
78
+ alignItems: "center",
79
+ children: queryResults.length > 1 ? // display a message if there is more than one query
80
+ /*#__PURE__*/ _jsx(Typography, {
81
+ sx: {
82
+ ...noDataTextStyle
83
+ },
84
+ children: "There is more than one query. Please make sure that you provided only one query."
85
+ }) : flameChartData ? /*#__PURE__*/ _jsxs(Stack, {
86
+ gap: 2,
87
+ sx: {
88
+ overflowY: 'auto',
89
+ scrollbarGutter: 'stable both-edges',
90
+ paddingTop: liveSpec.showSeries ? 0 : 1
91
+ },
92
+ children: [
93
+ liveSpec.showSeries && /*#__PURE__*/ _jsx(SeriesChart, {
94
+ width: contentDimensions.width,
95
+ height: SERIES_CHART_HEIGHT,
96
+ data: flameChartData.data
97
+ }),
98
+ liveSpec.showSettings && /*#__PURE__*/ _jsx(Settings, {
99
+ onSelectedIdChange: setSelectedId,
100
+ onChangePalette: onChangePalette,
101
+ onDisplayChange: onDisplayChange,
102
+ value: liveSpec,
103
+ selectedId: selectedId
104
+ }),
105
+ /*#__PURE__*/ _jsxs(Stack, {
106
+ direction: isMobileSize ? 'column' : 'row',
107
+ justifyContent: "center",
108
+ alignItems: isMobileSize ? 'center' : 'top',
109
+ children: [
110
+ liveSpec.showTable && /*#__PURE__*/ _jsx(TableChart, {
111
+ width: TABLE_CHART_WIDTH,
112
+ height: TABLE_FLAME_CHART_HEIGHT,
113
+ data: flameChartData.data,
114
+ searchValue: searchValue,
115
+ onSearchValueChange: setSearchValue,
116
+ onSelectedIdChange: setSelectedId
117
+ }),
118
+ liveSpec.showFlameGraph && /*#__PURE__*/ _jsx(FlameChart, {
119
+ width: FLAME_CHART_WIDTH,
120
+ height: TABLE_FLAME_CHART_HEIGHT,
121
+ data: flameChartData.data,
122
+ palette: liveSpec.palette,
123
+ selectedId: selectedId,
124
+ searchValue: searchValue,
125
+ onSelectedIdChange: setSelectedId
126
+ })
127
+ ]
128
+ })
129
+ ]
130
+ }) : /*#__PURE__*/ _jsx(Typography, {
131
+ sx: {
132
+ ...noDataTextStyle
133
+ },
134
+ children: "No data"
135
+ })
136
+ });
137
+ };
138
+
139
+ //# sourceMappingURL=FlameChartPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/FlameChartPanel.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TitleComponentOption } from 'echarts';\nimport { useChartsTheme } from '@perses-dev/components';\nimport { Stack, Typography, SxProps, useMediaQuery, useTheme } from '@mui/material';\nimport { FC, useState, useEffect } from 'react';\nimport { ProfileData } from '@perses-dev/core';\nimport { PanelProps } from '@perses-dev/plugin-system';\nimport { FlameChartOptions } from '../flame-chart-model';\nimport { FlameChart } from './FlameChart';\nimport { Settings } from './Settings';\nimport { TableChart } from './TableChart';\nimport { SeriesChart } from './SeriesChart';\n\nconst LARGE_PANEL_TRESHOLD = 600;\nconst DEFAULT_SERIES_CHART_HEIGHT = 200;\n\nexport type FlameChartPanelProps = PanelProps<FlameChartOptions, ProfileData>;\n\nexport const FlameChartPanel: FC<FlameChartPanelProps> = (props) => {\n const { contentDimensions, queryResults, spec } = props;\n\n const isMobileSize = useMediaQuery(useTheme().breakpoints.down('sm'));\n\n // selectedId equals 0 => Flame Graph is not zoomed in\n // selectedId different from 0 => Flame Graph is zoomed in\n const [selectedId, setSelectedId] = useState(0);\n const [searchValue, setSearchValue] = useState('');\n\n // This spec is used to manage settings temporarily\n const [liveSpec, setLiveSpec] = useState<FlameChartOptions>(spec);\n\n // keep liveSpec up to date\n useEffect(() => {\n setLiveSpec(spec);\n setSelectedId(0);\n setSearchValue('');\n }, [spec]);\n\n const chartsTheme = useChartsTheme();\n const flameChartData = queryResults[0];\n\n if (contentDimensions === undefined) return null;\n\n const noDataTextStyle = (chartsTheme.noDataOption.title as TitleComponentOption).textStyle as SxProps;\n\n const onChangePalette = (newPalette: 'package-name' | 'value') => {\n setLiveSpec((prev) => {\n return { ...prev, palette: newPalette };\n });\n };\n\n const onDisplayChange = (value: 'table' | 'flame-graph' | 'both' | 'none') => {\n let showTable = true;\n let showFlameGraph = true;\n if (value === 'table') {\n showFlameGraph = false;\n } else if (value === 'flame-graph') {\n showTable = false;\n }\n setLiveSpec((prev) => {\n return { ...prev, showTable: showTable, showFlameGraph: showFlameGraph };\n });\n };\n\n const PADDING =\n liveSpec.showSeries && liveSpec.showSettings ? 32 : liveSpec.showSeries || liveSpec.showSettings ? 16 : 0;\n\n const SETTINGS_HEIGHT = liveSpec.showSettings ? 30 : 0;\n const SERIES_CHART_HEIGHT = liveSpec.showSeries\n ? contentDimensions.height < DEFAULT_SERIES_CHART_HEIGHT\n ? contentDimensions.height\n : DEFAULT_SERIES_CHART_HEIGHT\n : 0;\n const TABLE_FLAME_CHART_HEIGHT =\n contentDimensions.height -\n (contentDimensions.height > LARGE_PANEL_TRESHOLD ? SERIES_CHART_HEIGHT + SETTINGS_HEIGHT + PADDING : 0);\n\n const TABLE_CHART_WIDTH = isMobileSize\n ? contentDimensions.width\n : liveSpec.showFlameGraph\n ? 0.4 * contentDimensions.width\n : contentDimensions.width;\n\n const FLAME_CHART_WIDTH = isMobileSize\n ? contentDimensions.width\n : liveSpec.showTable\n ? 0.6 * contentDimensions.width\n : contentDimensions.width;\n\n return (\n <Stack\n height={contentDimensions.height}\n width={contentDimensions.width}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n {queryResults.length > 1 ? (\n // display a message if there is more than one query\n <Typography sx={{ ...noDataTextStyle }}>\n There is more than one query. Please make sure that you provided only one query.\n </Typography>\n ) : flameChartData ? (\n <Stack\n gap={2}\n sx={{ overflowY: 'auto', scrollbarGutter: 'stable both-edges', paddingTop: liveSpec.showSeries ? 0 : 1 }}\n >\n {liveSpec.showSeries && (\n <SeriesChart width={contentDimensions.width} height={SERIES_CHART_HEIGHT} data={flameChartData.data} />\n )}\n {liveSpec.showSettings && (\n <Settings\n onSelectedIdChange={setSelectedId}\n onChangePalette={onChangePalette}\n onDisplayChange={onDisplayChange}\n value={liveSpec}\n selectedId={selectedId}\n />\n )}\n <Stack\n direction={isMobileSize ? 'column' : 'row'}\n justifyContent=\"center\"\n alignItems={isMobileSize ? 'center' : 'top'}\n >\n {liveSpec.showTable && (\n <TableChart\n width={TABLE_CHART_WIDTH}\n height={TABLE_FLAME_CHART_HEIGHT}\n data={flameChartData.data}\n searchValue={searchValue}\n onSearchValueChange={setSearchValue}\n onSelectedIdChange={setSelectedId}\n />\n )}\n {liveSpec.showFlameGraph && (\n <FlameChart\n width={FLAME_CHART_WIDTH}\n height={TABLE_FLAME_CHART_HEIGHT}\n data={flameChartData.data}\n palette={liveSpec.palette}\n selectedId={selectedId}\n searchValue={searchValue}\n onSelectedIdChange={setSelectedId}\n />\n )}\n </Stack>\n </Stack>\n ) : (\n <Typography sx={{ ...noDataTextStyle }}>No data</Typography>\n )}\n </Stack>\n );\n};\n"],"names":["useChartsTheme","Stack","Typography","useMediaQuery","useTheme","useState","useEffect","FlameChart","Settings","TableChart","SeriesChart","LARGE_PANEL_TRESHOLD","DEFAULT_SERIES_CHART_HEIGHT","FlameChartPanel","props","contentDimensions","queryResults","spec","isMobileSize","breakpoints","down","selectedId","setSelectedId","searchValue","setSearchValue","liveSpec","setLiveSpec","chartsTheme","flameChartData","undefined","noDataTextStyle","noDataOption","title","textStyle","onChangePalette","newPalette","prev","palette","onDisplayChange","value","showTable","showFlameGraph","PADDING","showSeries","showSettings","SETTINGS_HEIGHT","SERIES_CHART_HEIGHT","height","TABLE_FLAME_CHART_HEIGHT","TABLE_CHART_WIDTH","width","FLAME_CHART_WIDTH","justifyContent","alignItems","length","sx","gap","overflowY","scrollbarGutter","paddingTop","data","onSelectedIdChange","direction","onSearchValueChange"],"mappings":"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"}