@perses-dev/components 0.37.1 → 0.38.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 (100) hide show
  1. package/README.md +1 -0
  2. package/dist/BarChart/BarChart.d.ts +16 -0
  3. package/dist/BarChart/BarChart.d.ts.map +1 -0
  4. package/dist/BarChart/BarChart.js +123 -0
  5. package/dist/BarChart/BarChart.js.map +1 -0
  6. package/dist/BarChart/index.d.ts +2 -0
  7. package/dist/BarChart/index.d.ts.map +1 -0
  8. package/dist/BarChart/index.js +15 -0
  9. package/dist/BarChart/index.js.map +1 -0
  10. package/dist/Dialog/DiscardChangesConfirmationDialog.d.ts +10 -0
  11. package/dist/Dialog/DiscardChangesConfirmationDialog.d.ts.map +1 -0
  12. package/dist/Dialog/DiscardChangesConfirmationDialog.js +47 -0
  13. package/dist/Dialog/DiscardChangesConfirmationDialog.js.map +1 -0
  14. package/dist/Dialog/index.d.ts +1 -0
  15. package/dist/Dialog/index.d.ts.map +1 -1
  16. package/dist/Dialog/index.js +1 -0
  17. package/dist/Dialog/index.js.map +1 -1
  18. package/dist/Legend/ListLegendItem.d.ts +1 -1
  19. package/dist/LineChart/LineChart.d.ts.map +1 -1
  20. package/dist/LineChart/LineChart.js +2 -1
  21. package/dist/LineChart/LineChart.js.map +1 -1
  22. package/dist/ModeSelector/ModeSelector.d.ts +9 -0
  23. package/dist/ModeSelector/ModeSelector.d.ts.map +1 -0
  24. package/dist/ModeSelector/ModeSelector.js +43 -0
  25. package/dist/ModeSelector/ModeSelector.js.map +1 -0
  26. package/dist/ModeSelector/index.d.ts +2 -0
  27. package/dist/ModeSelector/index.d.ts.map +1 -0
  28. package/dist/ModeSelector/index.js +15 -0
  29. package/dist/ModeSelector/index.js.map +1 -0
  30. package/dist/SortSelector/SortSelector.d.ts +8 -0
  31. package/dist/SortSelector/SortSelector.d.ts.map +1 -0
  32. package/dist/SortSelector/SortSelector.js +42 -0
  33. package/dist/SortSelector/SortSelector.js.map +1 -0
  34. package/dist/SortSelector/index.d.ts +2 -0
  35. package/dist/SortSelector/index.d.ts.map +1 -0
  36. package/dist/SortSelector/index.js +15 -0
  37. package/dist/SortSelector/index.js.map +1 -0
  38. package/dist/TimeChart/TimeChart.d.ts +1 -0
  39. package/dist/TimeChart/TimeChart.d.ts.map +1 -1
  40. package/dist/TimeChart/TimeChart.js +49 -12
  41. package/dist/TimeChart/TimeChart.js.map +1 -1
  42. package/dist/TimeSeriesTooltip/LineChartTooltip.d.ts +5 -0
  43. package/dist/TimeSeriesTooltip/LineChartTooltip.d.ts.map +1 -1
  44. package/dist/TimeSeriesTooltip/LineChartTooltip.js +12 -5
  45. package/dist/TimeSeriesTooltip/LineChartTooltip.js.map +1 -1
  46. package/dist/TimeSeriesTooltip/TimeChartTooltip.d.ts.map +1 -1
  47. package/dist/TimeSeriesTooltip/TimeChartTooltip.js +9 -4
  48. package/dist/TimeSeriesTooltip/TimeChartTooltip.js.map +1 -1
  49. package/dist/TimeSeriesTooltip/nearby-series.d.ts +1 -1
  50. package/dist/TimeSeriesTooltip/nearby-series.d.ts.map +1 -1
  51. package/dist/TimeSeriesTooltip/nearby-series.js +87 -96
  52. package/dist/TimeSeriesTooltip/nearby-series.js.map +1 -1
  53. package/dist/TimeSeriesTooltip/tooltip-model.d.ts +1 -0
  54. package/dist/TimeSeriesTooltip/tooltip-model.d.ts.map +1 -1
  55. package/dist/TimeSeriesTooltip/tooltip-model.js +1 -0
  56. package/dist/TimeSeriesTooltip/tooltip-model.js.map +1 -1
  57. package/dist/TimeSeriesTooltip/utils.d.ts +1 -1
  58. package/dist/TimeSeriesTooltip/utils.d.ts.map +1 -1
  59. package/dist/TimeSeriesTooltip/utils.js +11 -5
  60. package/dist/TimeSeriesTooltip/utils.js.map +1 -1
  61. package/dist/UnitSelector/UnitSelector.d.ts +2 -1
  62. package/dist/UnitSelector/UnitSelector.d.ts.map +1 -1
  63. package/dist/UnitSelector/UnitSelector.js +3 -2
  64. package/dist/UnitSelector/UnitSelector.js.map +1 -1
  65. package/dist/cjs/BarChart/BarChart.js +129 -0
  66. package/dist/cjs/BarChart/index.js +28 -0
  67. package/dist/cjs/Dialog/DiscardChangesConfirmationDialog.js +53 -0
  68. package/dist/cjs/Dialog/index.js +1 -0
  69. package/dist/cjs/LineChart/LineChart.js +2 -1
  70. package/dist/cjs/ModeSelector/ModeSelector.js +49 -0
  71. package/dist/cjs/ModeSelector/index.js +28 -0
  72. package/dist/cjs/SortSelector/SortSelector.js +48 -0
  73. package/dist/cjs/SortSelector/index.js +28 -0
  74. package/dist/cjs/TimeChart/TimeChart.js +52 -10
  75. package/dist/cjs/TimeSeriesTooltip/LineChartTooltip.js +11 -4
  76. package/dist/cjs/TimeSeriesTooltip/TimeChartTooltip.js +8 -3
  77. package/dist/cjs/TimeSeriesTooltip/nearby-series.js +87 -96
  78. package/dist/cjs/TimeSeriesTooltip/tooltip-model.js +2 -0
  79. package/dist/cjs/TimeSeriesTooltip/utils.js +10 -4
  80. package/dist/cjs/UnitSelector/UnitSelector.js +3 -2
  81. package/dist/cjs/index.js +3 -0
  82. package/dist/cjs/model/graph.js +35 -3
  83. package/dist/cjs/utils/chart-actions.js +61 -1
  84. package/dist/cjs/utils/theme-gen.js +34 -6
  85. package/dist/index.d.ts +3 -0
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +3 -0
  88. package/dist/index.js.map +1 -1
  89. package/dist/model/graph.d.ts +11 -2
  90. package/dist/model/graph.d.ts.map +1 -1
  91. package/dist/model/graph.js +25 -0
  92. package/dist/model/graph.js.map +1 -1
  93. package/dist/utils/chart-actions.d.ts +3 -0
  94. package/dist/utils/chart-actions.d.ts.map +1 -1
  95. package/dist/utils/chart-actions.js +66 -0
  96. package/dist/utils/chart-actions.js.map +1 -1
  97. package/dist/utils/theme-gen.d.ts.map +1 -1
  98. package/dist/utils/theme-gen.js +34 -6
  99. package/dist/utils/theme-gen.js.map +1 -1
  100. package/package.json +3 -3
@@ -34,6 +34,7 @@ function _interopRequireDefault(obj) {
34
34
  }
35
35
  const TimeChartTooltip = /*#__PURE__*/ (0, _react.memo)(function TimeChartTooltip({ containerId , chartRef , data , seriesMapping , wrapLabels , unit , onUnpinClick , pinnedPos }) {
36
36
  const [showAllSeries, setShowAllSeries] = (0, _react.useState)(false);
37
+ const transform = (0, _react.useRef)('');
37
38
  const mousePos = (0, _tooltipModel.useMousePosition)();
38
39
  const { height , width , ref: tooltipRef } = (0, _useResizeObserver.default)();
39
40
  const isTooltipPinned = pinnedPos !== null;
@@ -44,7 +45,11 @@ const TimeChartTooltip = /*#__PURE__*/ (0, _react.memo)(function TimeChartToolti
44
45
  var ref;
45
46
  const chartWidth = (ref = chart === null || chart === void 0 ? void 0 : chart.getWidth()) !== null && ref !== void 0 ? ref : _tooltipModel.FALLBACK_CHART_WIDTH; // Fallback width not likely to ever be needed.
46
47
  const containerElement = containerId ? document.querySelector(containerId) : undefined;
47
- const cursorTransform = (0, _utils.assembleTransform)(mousePos, chartWidth, pinnedPos, height !== null && height !== void 0 ? height : 0, width !== null && width !== void 0 ? width : 0, containerElement);
48
+ // if tooltip is attached to a container, set max height to the height of the container so tooltip does not get cut off
49
+ const maxHeight = containerElement ? containerElement.getBoundingClientRect().height : undefined;
50
+ if (!isTooltipPinned) {
51
+ transform.current = (0, _utils.assembleTransform)(mousePos, chartWidth, pinnedPos, height !== null && height !== void 0 ? height : 0, width !== null && width !== void 0 ? width : 0, containerElement);
52
+ }
48
53
  // Get series nearby the cursor and pass into tooltip content children.
49
54
  const nearbySeries = (0, _nearbySeries.getNearbySeriesData)({
50
55
  mousePos,
@@ -63,9 +68,9 @@ const TimeChartTooltip = /*#__PURE__*/ (0, _react.memo)(function TimeChartToolti
63
68
  container: containerElement,
64
69
  children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Box, {
65
70
  ref: tooltipRef,
66
- sx: (theme)=>(0, _utils.getTooltipStyles)(theme, pinnedPos),
71
+ sx: (theme)=>(0, _utils.getTooltipStyles)(theme, pinnedPos, maxHeight),
67
72
  style: {
68
- transform: cursorTransform
73
+ transform: transform.current
69
74
  },
70
75
  children: /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
71
76
  spacing: 0.5,
@@ -33,6 +33,7 @@ _export(exports, {
33
33
  });
34
34
  const _core = require("@perses-dev/core");
35
35
  const _model = require("../model");
36
+ const _utils = require("../utils");
36
37
  const INCREASE_NEARBY_SERIES_MULTIPLIER = 5.5; // adjusts how many series show in tooltip (higher == more series shown)
37
38
  const DYNAMIC_NEARBY_SERIES_MULTIPLIER = 30; // used for adjustment after series number divisor
38
39
  const SHOW_FEWER_SERIES_LIMIT = 5;
@@ -43,11 +44,15 @@ function checkforNearbyTimeSeries(data, seriesMapping, pointInGrid, yBuffer, cha
43
44
  var ref1;
44
45
  const cursorY = (ref1 = pointInGrid[1]) !== null && ref1 !== void 0 ? ref1 : null;
45
46
  if (cursorX === null || cursorY === null) return currentNearbySeriesData;
47
+ if (chart.dispatchAction === undefined) return currentNearbySeriesData;
46
48
  if (!Array.isArray(data)) return currentNearbySeriesData;
47
49
  const nearbySeriesIndexes = [];
48
50
  const emphasizedSeriesIndexes = [];
49
51
  const nonEmphasizedSeriesIndexes = [];
52
+ const emphasizedDatapoints = [];
53
+ const duplicateDatapoints = [];
50
54
  const totalSeries = data.length;
55
+ const yValueCounts = new Map();
51
56
  let closestTimestamp = null;
52
57
  let closestDistance = Infinity;
53
58
  // find the timestamp with data that is closest to cursorX
@@ -90,16 +95,35 @@ function checkforNearbyTimeSeries(data, seriesMapping, pointInGrid, yBuffer, cha
90
95
  percentage: percentRangeToCheck
91
96
  });
92
97
  if (isClosestToCursor) {
98
+ // shows as bold in tooltip, customize 'emphasis' options in getTimeSeries util
93
99
  emphasizedSeriesIndexes.push(seriesIdx);
100
+ var ref2;
101
+ // Used to determine which datapoint to apply select styles to.
102
+ // Accounts for cases where lines may be rendered directly on top of eachother.
103
+ const duplicateValuesCount = (ref2 = yValueCounts.get(yValue)) !== null && ref2 !== void 0 ? ref2 : 0;
104
+ yValueCounts.set(yValue, duplicateValuesCount + 1);
105
+ if (duplicateValuesCount > 0) {
106
+ duplicateDatapoints.push({
107
+ seriesIndex: seriesIdx,
108
+ dataIndex: datumIdx,
109
+ seriesName: currentSeriesName,
110
+ yValue: yValue
111
+ });
112
+ }
113
+ // keep track of all bold datapoints in tooltip so that 'select' state only applied to topmost
114
+ emphasizedDatapoints.push({
115
+ seriesIndex: seriesIdx,
116
+ dataIndex: datumIdx,
117
+ seriesName: currentSeriesName,
118
+ yValue: yValue
119
+ });
94
120
  } else {
95
121
  nonEmphasizedSeriesIndexes.push(seriesIdx);
96
122
  // ensure series far away from cursor are not highlighted
97
- if ((chart === null || chart === void 0 ? void 0 : chart.dispatchAction) !== undefined) {
98
- chart.dispatchAction({
99
- type: 'downplay',
100
- seriesIndex: seriesIdx
101
- });
102
- }
123
+ chart.dispatchAction({
124
+ type: 'downplay',
125
+ seriesIndex: seriesIdx
126
+ });
103
127
  }
104
128
  const formattedY = (0, _core.formatValue)(yValue, unit);
105
129
  currentNearbySeriesData.push({
@@ -120,32 +144,7 @@ function checkforNearbyTimeSeries(data, seriesMapping, pointInGrid, yBuffer, cha
120
144
  }
121
145
  }
122
146
  }
123
- if ((chart === null || chart === void 0 ? void 0 : chart.dispatchAction) !== undefined) {
124
- // Clears emphasis state of all lines that are not emphasized.
125
- // Emphasized is a subset of just the nearby series that are closest to cursor.
126
- chart.dispatchAction({
127
- type: 'downplay',
128
- seriesIndex: nonEmphasizedSeriesIndexes
129
- });
130
- // https://echarts.apache.org/en/api.html#action.highlight
131
- if (emphasizedSeriesIndexes.length > 0) {
132
- // Fadeout opacity of all series not closest to cursor.
133
- chart.dispatchAction({
134
- type: 'highlight',
135
- seriesIndex: emphasizedSeriesIndexes,
136
- notBlur: false,
137
- escapeConnect: true
138
- });
139
- } else {
140
- // When no emphasized series with bold text, notBlur allows opacity fadeout to not trigger.
141
- chart.dispatchAction({
142
- type: 'highlight',
143
- seriesIndex: nearbySeriesIndexes,
144
- notBlur: true,
145
- escapeConnect: true
146
- });
147
- }
148
- }
147
+ (0, _utils.batchDispatchNearbySeriesActions)(chart, nearbySeriesIndexes, emphasizedSeriesIndexes, nonEmphasizedSeriesIndexes, emphasizedDatapoints, duplicateDatapoints);
149
148
  return currentNearbySeriesData;
150
149
  }
151
150
  function legacyCheckforNearbySeries(data, pointInGrid, yBuffer, chart, unit) {
@@ -164,55 +163,54 @@ function legacyCheckforNearbySeries(data, pointInGrid, yBuffer, chart, unit) {
164
163
  if (Array.isArray(data.xAxis) && Array.isArray(data.timeSeries)) {
165
164
  for(let seriesIdx = 0; seriesIdx < totalSeries; seriesIdx++){
166
165
  const currentSeries = data.timeSeries[seriesIdx];
166
+ if (currentSeries === undefined) break;
167
167
  if (currentNearbySeriesData.length >= _model.OPTIMIZED_MODE_SERIES_LIMIT) break;
168
- if (currentSeries !== undefined) {
169
- const currentSeriesName = currentSeries.name ? currentSeries.name.toString() : '';
170
- var _color;
171
- const markerColor = (_color = currentSeries.color) !== null && _color !== void 0 ? _color : '#000';
172
- if (Array.isArray(currentSeries.data)) {
173
- for(let datumIdx = 0; datumIdx < currentSeries.data.length; datumIdx++){
174
- var _datumIdx;
175
- const xValue = (_datumIdx = data.xAxis[datumIdx]) !== null && _datumIdx !== void 0 ? _datumIdx : 0;
176
- const yValue = currentSeries.data[datumIdx];
177
- // ensure null values not displayed in tooltip
178
- if (yValue !== undefined && yValue !== null && cursorX === datumIdx) {
179
- if (yValue !== '-' && cursorY <= yValue + yBuffer && cursorY >= yValue - yBuffer) {
180
- // show fewer bold series in tooltip when many total series
181
- const minPercentRange = totalSeries > SHOW_FEWER_SERIES_LIMIT ? 2 : 5;
182
- const percentRangeToCheck = Math.max(minPercentRange, 100 / totalSeries);
183
- const isClosestToCursor = isWithinPercentageRange({
184
- valueToCheck: cursorY,
185
- baseValue: yValue,
186
- percentage: percentRangeToCheck
187
- });
188
- if (isClosestToCursor) {
189
- emphasizedSeriesIndexes.push(seriesIdx);
190
- } else {
191
- nonEmphasizedSeriesIndexes.push(seriesIdx);
192
- // ensure series not close to cursor are not highlighted
193
- if ((chart === null || chart === void 0 ? void 0 : chart.dispatchAction) !== undefined) {
194
- chart.dispatchAction({
195
- type: 'downplay',
196
- seriesIndex: seriesIdx
197
- });
198
- }
168
+ const currentSeriesName = currentSeries.name ? currentSeries.name.toString() : '';
169
+ var _color;
170
+ const markerColor = (_color = currentSeries.color) !== null && _color !== void 0 ? _color : '#000';
171
+ if (Array.isArray(currentSeries.data)) {
172
+ for(let datumIdx = 0; datumIdx < currentSeries.data.length; datumIdx++){
173
+ var _datumIdx;
174
+ const xValue = (_datumIdx = data.xAxis[datumIdx]) !== null && _datumIdx !== void 0 ? _datumIdx : 0;
175
+ const yValue = currentSeries.data[datumIdx];
176
+ // ensure null values not displayed in tooltip
177
+ if (yValue !== undefined && yValue !== null && cursorX === datumIdx) {
178
+ if (yValue !== '-' && cursorY <= yValue + yBuffer && cursorY >= yValue - yBuffer) {
179
+ // show fewer bold series in tooltip when many total series
180
+ const minPercentRange = totalSeries > SHOW_FEWER_SERIES_LIMIT ? 2 : 5;
181
+ const percentRangeToCheck = Math.max(minPercentRange, 100 / totalSeries);
182
+ const isClosestToCursor = isWithinPercentageRange({
183
+ valueToCheck: cursorY,
184
+ baseValue: yValue,
185
+ percentage: percentRangeToCheck
186
+ });
187
+ if (isClosestToCursor) {
188
+ emphasizedSeriesIndexes.push(seriesIdx);
189
+ } else {
190
+ nonEmphasizedSeriesIndexes.push(seriesIdx);
191
+ // ensure series not close to cursor are not highlighted
192
+ if ((chart === null || chart === void 0 ? void 0 : chart.dispatchAction) !== undefined) {
193
+ chart.dispatchAction({
194
+ type: 'downplay',
195
+ seriesIndex: seriesIdx
196
+ });
199
197
  }
200
- // determine whether to convert timestamp to ms, see: https://stackoverflow.com/a/23982005/17575201
201
- const xValueMilliSeconds = xValue > 99999999999 ? xValue : xValue * 1000;
202
- const formattedY = (0, _core.formatValue)(yValue, unit);
203
- currentNearbySeriesData.push({
204
- seriesIdx: seriesIdx,
205
- datumIdx: datumIdx,
206
- seriesName: currentSeriesName,
207
- date: xValueMilliSeconds,
208
- x: xValue,
209
- y: yValue,
210
- formattedY: formattedY,
211
- markerColor: markerColor.toString(),
212
- isClosestToCursor
213
- });
214
- nearbySeriesIndexes.push(seriesIdx);
215
198
  }
199
+ // determine whether to convert timestamp to ms, see: https://stackoverflow.com/a/23982005/17575201
200
+ const xValueMilliSeconds = xValue > 99999999999 ? xValue : xValue * 1000;
201
+ const formattedY = (0, _core.formatValue)(yValue, unit);
202
+ currentNearbySeriesData.push({
203
+ seriesIdx: seriesIdx,
204
+ datumIdx: datumIdx,
205
+ seriesName: currentSeriesName,
206
+ date: xValueMilliSeconds,
207
+ x: xValue,
208
+ y: yValue,
209
+ formattedY: formattedY,
210
+ markerColor: markerColor.toString(),
211
+ isClosestToCursor
212
+ });
213
+ nearbySeriesIndexes.push(seriesIdx);
216
214
  }
217
215
  }
218
216
  }
@@ -270,24 +268,17 @@ function getNearbySeriesData({ mousePos , pinnedPos , data , seriesMapping , cha
270
268
  }
271
269
  if (cursorTargetMatchesChart === false) return [];
272
270
  if (chart['_model'] === undefined || data === null) return [];
273
- const chartModel = chart['_model'];
274
- const yInterval = chartModel.getComponent('yAxis').axis.scale._interval;
275
- const totalSeries = data.length;
276
- const yBuffer = getYBuffer({
277
- yInterval,
278
- totalSeries,
279
- showAllSeries
280
- });
281
- var _x, _y;
282
- const pointInPixel = [
283
- (_x = mousePos.plotCanvas.x) !== null && _x !== void 0 ? _x : 0,
284
- (_y = mousePos.plotCanvas.y) !== null && _y !== void 0 ? _y : 0
285
- ];
286
- if (chart.containPixel('grid', pointInPixel)) {
287
- const pointInGrid = chart.convertFromPixel('grid', pointInPixel);
288
- if (pointInGrid[0] !== undefined && pointInGrid[1] !== undefined) {
289
- return checkforNearbyTimeSeries(data, seriesMapping, pointInGrid, yBuffer, chart, unit);
290
- }
271
+ const pointInGrid = (0, _utils.getPointInGrid)(mousePos.plotCanvas.x, mousePos.plotCanvas.y, chart);
272
+ if (pointInGrid !== null) {
273
+ const chartModel = chart['_model'];
274
+ const yInterval = chartModel.getComponent('yAxis').axis.scale._interval;
275
+ const totalSeries = data.length;
276
+ const yBuffer = getYBuffer({
277
+ yInterval,
278
+ totalSeries,
279
+ showAllSeries
280
+ });
281
+ return checkforNearbyTimeSeries(data, seriesMapping, pointInGrid, yBuffer, chart, unit);
291
282
  }
292
283
  return [];
293
284
  }
@@ -26,6 +26,7 @@ _export(exports, {
26
26
  TOOLTIP_MAX_HEIGHT: ()=>TOOLTIP_MAX_HEIGHT,
27
27
  TOOLTIP_LABELS_MAX_WIDTH: ()=>TOOLTIP_LABELS_MAX_WIDTH,
28
28
  TOOLTIP_ADJUST_Y_POS_MULTIPLIER: ()=>TOOLTIP_ADJUST_Y_POS_MULTIPLIER,
29
+ TOOLTIP_PADDING: ()=>TOOLTIP_PADDING,
29
30
  FALLBACK_CHART_WIDTH: ()=>FALLBACK_CHART_WIDTH,
30
31
  NEARBY_SERIES_DESCRIPTION: ()=>NEARBY_SERIES_DESCRIPTION,
31
32
  EMPHASIZED_SERIES_DESCRIPTION: ()=>EMPHASIZED_SERIES_DESCRIPTION,
@@ -41,6 +42,7 @@ const TOOLTIP_MAX_WIDTH = 650;
41
42
  const TOOLTIP_MAX_HEIGHT = 650;
42
43
  const TOOLTIP_LABELS_MAX_WIDTH = TOOLTIP_MAX_WIDTH - 150;
43
44
  const TOOLTIP_ADJUST_Y_POS_MULTIPLIER = 0.75;
45
+ const TOOLTIP_PADDING = 8;
44
46
  const FALLBACK_CHART_WIDTH = 750;
45
47
  const NEARBY_SERIES_DESCRIPTION = 'nearby series showing in tooltip';
46
48
  const EMPHASIZED_SERIES_DESCRIPTION = 'emphasized series showing as bold in tooltip';
@@ -40,30 +40,36 @@ function assembleTransform(mousePos, chartWidth, pinnedPos, tooltipHeight, toolt
40
40
  let x = mousePos.page.x;
41
41
  let y = mousePos.page.y + cursorPaddingY;
42
42
  // If containerElement is defined, tooltip is attached to the containerElement instead.
43
+ let containerRect;
43
44
  if (containerElement) {
44
45
  // get the container's position relative to viewport
45
- const containerRect = containerElement.getBoundingClientRect();
46
+ containerRect = containerElement.getBoundingClientRect();
46
47
  // calculate the mouse position relative to container
47
48
  x = x - containerRect.left + containerElement.scrollLeft;
48
49
  y = y - containerRect.top + containerElement.scrollTop;
49
50
  }
50
- // adjust so tooltip does not get cut off at bottom of chart
51
51
  if (mousePos.client.y + tooltipHeight + cursorPaddingY > window.innerHeight) {
52
+ // adjust so tooltip does not get cut off at bottom of chart
52
53
  // multiplier ensures tooltip isn't overly adjusted and gets cut off at the top of the viewport
53
54
  y = y - tooltipHeight * _tooltipModel.TOOLTIP_ADJUST_Y_POS_MULTIPLIER;
55
+ // If y is now above of the top of containerElement, set y close to 0 so tooltip does not get cut off
56
+ if (containerRect && y < containerRect.top) {
57
+ y = _tooltipModel.TOOLTIP_PADDING / 2; // leaves room for some padding around tooltip
58
+ }
54
59
  }
55
60
  // use tooltip width to determine when to repos from right to left
56
61
  const xPosAdjustThreshold = chartWidth - tooltipWidth * 0.9;
57
62
  // reposition so tooltip is never too close to right side of chart or left side of browser window
58
63
  return mousePos.plotCanvas.x > xPosAdjustThreshold && x > _tooltipModel.TOOLTIP_MAX_WIDTH ? `translate3d(${x - cursorPaddingX}px, ${y}px, 0) translateX(-100%)` : `translate3d(${x + cursorPaddingX}px, ${y}px, 0)`;
59
64
  }
60
- function getTooltipStyles(theme, pinnedPos) {
65
+ function getTooltipStyles(theme, pinnedPos, maxHeight) {
61
66
  var ref;
67
+ const adjustedMaxHeight = maxHeight ? maxHeight - _tooltipModel.TOOLTIP_PADDING : undefined;
62
68
  var ref1;
63
69
  return {
64
70
  minWidth: _tooltipModel.TOOLTIP_MIN_WIDTH,
65
71
  maxWidth: _tooltipModel.TOOLTIP_MAX_WIDTH,
66
- maxHeight: _tooltipModel.TOOLTIP_MAX_HEIGHT,
72
+ maxHeight: adjustedMaxHeight !== null && adjustedMaxHeight !== void 0 ? adjustedMaxHeight : _tooltipModel.TOOLTIP_MAX_HEIGHT,
67
73
  padding: 0,
68
74
  position: 'absolute',
69
75
  top: 0,
@@ -64,7 +64,7 @@ const DECIMAL_PLACES_OPTIONS = [
64
64
  function getOptionByDecimalPlaces(decimal_places) {
65
65
  return DECIMAL_PLACES_OPTIONS.find((o)=>o.decimal_places === decimal_places);
66
66
  }
67
- function UnitSelector({ value , onChange }) {
67
+ function UnitSelector({ value , onChange , disabled =false }) {
68
68
  const hasDecimalPlaces = (0, _core.isUnitWithDecimalPlaces)(value);
69
69
  const hasAbbreviate = (0, _core.isUnitWithAbbreviate)(value);
70
70
  const handleKindChange = (_, newValue)=>{
@@ -109,7 +109,8 @@ function UnitSelector({ value , onChange }) {
109
109
  options: KIND_OPTIONS,
110
110
  groupBy: (option)=>option.group,
111
111
  onChange: handleKindChange,
112
- disableClearable: true
112
+ disableClearable: true,
113
+ disabled: disabled
113
114
  })
114
115
  }),
115
116
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_optionsEditorLayout.OptionsEditorControl, {
package/dist/cjs/index.js CHANGED
@@ -14,6 +14,7 @@
14
14
  Object.defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
+ _exportStar(require("./BarChart"), exports);
17
18
  _exportStar(require("./ColorPicker"), exports);
18
19
  _exportStar(require("./ContentWithLegend"), exports);
19
20
  _exportStar(require("./DateTimeRangePicker"), exports);
@@ -28,8 +29,10 @@ _exportStar(require("./InfoTooltip"), exports);
28
29
  _exportStar(require("./JSONEditor"), exports);
29
30
  _exportStar(require("./Legend"), exports);
30
31
  _exportStar(require("./LineChart"), exports);
32
+ _exportStar(require("./ModeSelector"), exports);
31
33
  _exportStar(require("./OptionsEditorLayout"), exports);
32
34
  _exportStar(require("./SettingsAutocomplete"), exports);
35
+ _exportStar(require("./SortSelector"), exports);
33
36
  _exportStar(require("./StatChart"), exports);
34
37
  _exportStar(require("./Table"), exports);
35
38
  _exportStar(require("./ThresholdsEditor"), exports);
@@ -14,8 +14,40 @@
14
14
  Object.defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
- Object.defineProperty(exports, "OPTIMIZED_MODE_SERIES_LIMIT", {
18
- enumerable: true,
19
- get: ()=>OPTIMIZED_MODE_SERIES_LIMIT
17
+ function _export(target, all) {
18
+ for(var name in all)Object.defineProperty(target, name, {
19
+ enumerable: true,
20
+ get: all[name]
21
+ });
22
+ }
23
+ _export(exports, {
24
+ OPTIMIZED_MODE_SERIES_LIMIT: ()=>OPTIMIZED_MODE_SERIES_LIMIT,
25
+ PINNED_CROSSHAIR_SERIES_NAME: ()=>PINNED_CROSSHAIR_SERIES_NAME,
26
+ DEFAULT_PINNED_CROSSHAIR: ()=>DEFAULT_PINNED_CROSSHAIR
20
27
  });
21
28
  const OPTIMIZED_MODE_SERIES_LIMIT = 1000;
29
+ const PINNED_CROSSHAIR_SERIES_NAME = 'Pinned Crosshair';
30
+ const DEFAULT_PINNED_CROSSHAIR = {
31
+ name: PINNED_CROSSHAIR_SERIES_NAME,
32
+ type: 'line',
33
+ // https://echarts.apache.org/en/option.html#series-line.markLine
34
+ markLine: {
35
+ data: [],
36
+ lineStyle: {
37
+ type: 'dashed',
38
+ width: 2
39
+ },
40
+ emphasis: {
41
+ lineStyle: {
42
+ width: 2,
43
+ opacity: 1
44
+ }
45
+ },
46
+ blur: {
47
+ lineStyle: {
48
+ width: 2,
49
+ opacity: 1
50
+ }
51
+ }
52
+ }
53
+ };
@@ -23,7 +23,9 @@ function _export(target, all) {
23
23
  _export(exports, {
24
24
  enableDataZoom: ()=>enableDataZoom,
25
25
  restoreChart: ()=>restoreChart,
26
- clearHighlightedSeries: ()=>clearHighlightedSeries
26
+ clearHighlightedSeries: ()=>clearHighlightedSeries,
27
+ getPointInGrid: ()=>getPointInGrid,
28
+ batchDispatchNearbySeriesActions: ()=>batchDispatchNearbySeriesActions
27
29
  });
28
30
  function enableDataZoom(chart) {
29
31
  const chartModel = chart['_model'];
@@ -55,3 +57,61 @@ function clearHighlightedSeries(chart, totalSeries) {
55
57
  }
56
58
  }
57
59
  }
60
+ function getPointInGrid(cursorCoordX, cursorCoordY, chart) {
61
+ if (chart === undefined) {
62
+ return null;
63
+ }
64
+ const pointInPixel = [
65
+ cursorCoordX,
66
+ cursorCoordY
67
+ ];
68
+ if (!chart.containPixel('grid', pointInPixel)) {
69
+ return null;
70
+ }
71
+ const pointInGrid = chart.convertFromPixel('grid', pointInPixel);
72
+ return pointInGrid;
73
+ }
74
+ function batchDispatchNearbySeriesActions(chart, nearbySeriesIndexes, emphasizedSeriesIndexes, nonEmphasizedSeriesIndexes, emphasizedDatapoints, duplicateDatapoints) {
75
+ // Accounts for multiple series that are rendered direct on top of eachother.
76
+ // Only applies select state to the datapoint that is visible to avoid color mismatch.
77
+ const lastEmphasizedDatapoint = duplicateDatapoints.length > 0 ? duplicateDatapoints[duplicateDatapoints.length - 1] : emphasizedDatapoints[emphasizedDatapoints.length - 1];
78
+ if (lastEmphasizedDatapoint !== undefined) {
79
+ // Corresponds to select options inside getTimeSeries util.
80
+ // https://echarts.apache.org/en/option.html#series-line.select.itemStyle
81
+ chart.dispatchAction({
82
+ type: 'select',
83
+ seriesIndex: lastEmphasizedDatapoint.seriesIndex,
84
+ dataIndex: lastEmphasizedDatapoint.dataIndex,
85
+ // Shared crosshair should not emphasize datapoints on adjacent charts.
86
+ escapeConnect: true
87
+ });
88
+ }
89
+ // Clears emphasis state of all lines that are not emphasized.
90
+ // Emphasized is a subset of just the nearby series that are closest to cursor.
91
+ chart.dispatchAction({
92
+ type: 'downplay',
93
+ seriesIndex: nonEmphasizedSeriesIndexes
94
+ });
95
+ // https://echarts.apache.org/en/api.html#action.highlight
96
+ if (emphasizedSeriesIndexes.length > 0) {
97
+ // Fadeout opacity of all series not closest to cursor.
98
+ chart.dispatchAction({
99
+ type: 'highlight',
100
+ seriesIndex: emphasizedSeriesIndexes,
101
+ notBlur: false,
102
+ escapeConnect: true
103
+ });
104
+ } else {
105
+ // When no emphasized series with bold text, notBlur allows opacity fadeout to not trigger.
106
+ chart.dispatchAction({
107
+ type: 'highlight',
108
+ seriesIndex: nearbySeriesIndexes,
109
+ notBlur: true,
110
+ escapeConnect: true
111
+ });
112
+ // Clears selected datapoints since no bold series in tooltip, restore does not impact highlighting
113
+ chart.dispatchAction({
114
+ type: 'toggleSelect'
115
+ });
116
+ }
117
+ }
@@ -29,9 +29,9 @@ function generateChartsTheme(muiTheme, echartsTheme, /**
29
29
  * The id of the container that will have the chart tooltip appended to it.
30
30
  * By default, chart tooltip uses the body of the top-level document object.
31
31
  */ tooltipPortalContainerId) {
32
- var ref, ref1, ref2, ref3, ref4;
33
- var ref5;
34
- const primaryTextColor = (ref5 = (ref = muiTheme.palette.text) === null || ref === void 0 ? void 0 : ref.primary) !== null && ref5 !== void 0 ? ref5 : DEFAULT_TEXT_COLOR;
32
+ var ref, ref1, ref2, ref3, ref4, ref5, ref6;
33
+ var ref7;
34
+ const primaryTextColor = (ref7 = (ref = muiTheme.palette.text) === null || ref === void 0 ? void 0 : ref.primary) !== null && ref7 !== void 0 ? ref7 : DEFAULT_TEXT_COLOR;
35
35
  const muiConvertedTheme = {
36
36
  title: {
37
37
  show: false
@@ -83,7 +83,7 @@ function generateChartsTheme(muiTheme, echartsTheme, /**
83
83
  lineStyle: {
84
84
  width: 0.5,
85
85
  color: muiTheme.palette.grey[300],
86
- opacity: 0.6
86
+ opacity: 0.4
87
87
  }
88
88
  },
89
89
  splitArea: {
@@ -120,7 +120,7 @@ function generateChartsTheme(muiTheme, echartsTheme, /**
120
120
  lineStyle: {
121
121
  width: 0.5,
122
122
  color: muiTheme.palette.grey[300],
123
- opacity: 0.6
123
+ opacity: 0.4
124
124
  }
125
125
  },
126
126
  splitArea: {
@@ -169,7 +169,30 @@ function generateChartsTheme(muiTheme, echartsTheme, /**
169
169
  borderColor: primaryTextColor
170
170
  }
171
171
  },
172
- tooltip: {},
172
+ tooltip: {
173
+ backgroundColor: (ref5 = muiTheme.palette.designSystem) === null || ref5 === void 0 ? void 0 : ref5.grey[800],
174
+ borderColor: (ref6 = muiTheme.palette.designSystem) === null || ref6 === void 0 ? void 0 : ref6.grey[800],
175
+ textStyle: {
176
+ color: '#fff',
177
+ fontSize: 11
178
+ }
179
+ },
180
+ axisPointer: {
181
+ lineStyle: {
182
+ color: muiTheme.palette.grey[500]
183
+ }
184
+ },
185
+ markLine: {
186
+ symbol: 'none',
187
+ symbolSize: 0,
188
+ itemStyle: {
189
+ color: muiTheme.palette.grey[500]
190
+ },
191
+ lineStyle: {
192
+ type: 'dashed',
193
+ width: 1
194
+ }
195
+ },
173
196
  line: {
174
197
  showSymbol: false,
175
198
  symbol: 'circle',
@@ -188,7 +211,12 @@ function generateChartsTheme(muiTheme, echartsTheme, /**
188
211
  barMaxWidth: 150,
189
212
  itemStyle: {
190
213
  borderWidth: 0,
214
+ borderRadius: 0,
191
215
  borderColor: muiTheme.palette.grey[300]
216
+ },
217
+ label: {
218
+ show: false,
219
+ color: primaryTextColor
192
220
  }
193
221
  },
194
222
  gauge: {
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './BarChart';
1
2
  export * from './ColorPicker';
2
3
  export * from './ContentWithLegend';
3
4
  export * from './DateTimeRangePicker';
@@ -12,8 +13,10 @@ export * from './InfoTooltip';
12
13
  export * from './JSONEditor';
13
14
  export * from './Legend';
14
15
  export * from './LineChart';
16
+ export * from './ModeSelector';
15
17
  export * from './OptionsEditorLayout';
16
18
  export * from './SettingsAutocomplete';
19
+ export * from './SortSelector';
17
20
  export * from './StatChart';
18
21
  export * from './Table';
19
22
  export * from './ThresholdsEditor';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@
10
10
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
+ export * from './BarChart';
13
14
  export * from './ColorPicker';
14
15
  export * from './ContentWithLegend';
15
16
  export * from './DateTimeRangePicker';
@@ -24,8 +25,10 @@ export * from './InfoTooltip';
24
25
  export * from './JSONEditor';
25
26
  export * from './Legend';
26
27
  export * from './LineChart';
28
+ export * from './ModeSelector';
27
29
  export * from './OptionsEditorLayout';
28
30
  export * from './SettingsAutocomplete';
31
+ export * from './SortSelector';
29
32
  export * from './StatChart';
30
33
  export * from './Table';
31
34
  export * from './ThresholdsEditor';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"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\nexport * from './ColorPicker';\nexport * from './ContentWithLegend';\nexport * from './DateTimeRangePicker';\nexport * from './Dialog';\nexport * from './Drawer';\nexport * from './EChart';\nexport * from './ErrorAlert';\nexport * from './ErrorBoundary';\nexport * from './FontSizeSelector';\nexport * from './GaugeChart';\nexport * from './InfoTooltip';\nexport * from './JSONEditor';\nexport * from './Legend';\nexport * from './LineChart';\nexport * from './OptionsEditorLayout';\nexport * from './SettingsAutocomplete';\nexport * from './StatChart';\nexport * from './Table';\nexport * from './ThresholdsEditor';\nexport * from './TimeChart';\nexport * from './TimeSeriesTooltip';\nexport * from './UnitSelector';\nexport * from './YAxisLabel';\nexport * from './context/ChartsThemeProvider';\nexport * from './context/TimeZoneProvider';\nexport * from './context/SnackbarProvider';\nexport * from './utils';\nexport * from './model';\nexport * from './test-utils';\nexport * from './theme';\nexport * from './RefreshIntervalPicker';\n"],"names":[],"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;AAEjC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"sources":["../src/index.ts"],"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\nexport * from './BarChart';\nexport * from './ColorPicker';\nexport * from './ContentWithLegend';\nexport * from './DateTimeRangePicker';\nexport * from './Dialog';\nexport * from './Drawer';\nexport * from './EChart';\nexport * from './ErrorAlert';\nexport * from './ErrorBoundary';\nexport * from './FontSizeSelector';\nexport * from './GaugeChart';\nexport * from './InfoTooltip';\nexport * from './JSONEditor';\nexport * from './Legend';\nexport * from './LineChart';\nexport * from './ModeSelector';\nexport * from './OptionsEditorLayout';\nexport * from './SettingsAutocomplete';\nexport * from './SortSelector';\nexport * from './StatChart';\nexport * from './Table';\nexport * from './ThresholdsEditor';\nexport * from './TimeChart';\nexport * from './TimeSeriesTooltip';\nexport * from './UnitSelector';\nexport * from './YAxisLabel';\nexport * from './context/ChartsThemeProvider';\nexport * from './context/TimeZoneProvider';\nexport * from './context/SnackbarProvider';\nexport * from './utils';\nexport * from './model';\nexport * from './test-utils';\nexport * from './theme';\nexport * from './RefreshIntervalPicker';\n"],"names":[],"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;AAEjC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,yBAAyB,CAAC"}