@quillsql/react 2.11.5 → 2.11.8

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 (127) hide show
  1. package/dist/cjs/BarList.d.ts +1 -0
  2. package/dist/cjs/BarList.d.ts.map +1 -1
  3. package/dist/cjs/BarList.js +55 -46
  4. package/dist/cjs/Chart.d.ts +4 -0
  5. package/dist/cjs/Chart.d.ts.map +1 -1
  6. package/dist/cjs/Chart.js +25 -19
  7. package/dist/cjs/ChartBuilder.d.ts +5 -3
  8. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  9. package/dist/cjs/ChartBuilder.js +236 -196
  10. package/dist/cjs/ChartEditor.d.ts +3 -1
  11. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  12. package/dist/cjs/ChartEditor.js +17 -2
  13. package/dist/cjs/Context.d.ts +1 -1
  14. package/dist/cjs/Context.d.ts.map +1 -1
  15. package/dist/cjs/Context.js +33 -3
  16. package/dist/cjs/Dashboard.d.ts +2 -1
  17. package/dist/cjs/Dashboard.d.ts.map +1 -1
  18. package/dist/cjs/Dashboard.js +4 -4
  19. package/dist/cjs/PieChart.d.ts +1 -1
  20. package/dist/cjs/PieChart.d.ts.map +1 -1
  21. package/dist/cjs/PieChart.js +95 -357
  22. package/dist/cjs/QuillProvider.d.ts +1 -3
  23. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  24. package/dist/cjs/QuillProvider.js +2 -2
  25. package/dist/cjs/ReportBuilder.d.ts +11 -3
  26. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  27. package/dist/cjs/ReportBuilder.js +224 -99
  28. package/dist/cjs/SQLEditor.d.ts +4 -2
  29. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  30. package/dist/cjs/SQLEditor.js +9 -6
  31. package/dist/cjs/components/Chart/BarChart.d.ts +2 -1
  32. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  33. package/dist/cjs/components/Chart/BarChart.js +9 -5
  34. package/dist/cjs/components/Chart/ChartError.js +1 -1
  35. package/dist/cjs/components/Chart/ChartSkeleton.js +2 -2
  36. package/dist/cjs/components/Chart/LineChart.d.ts +2 -1
  37. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  38. package/dist/cjs/components/Chart/LineChart.js +10 -3
  39. package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -1
  40. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  41. package/dist/cjs/components/Dashboard/TableComponent.js +1 -1
  42. package/dist/cjs/components/QuillTable.js +1 -1
  43. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
  44. package/dist/cjs/components/ReportBuilder/AddColumnPopover.js +2 -2
  45. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +3 -0
  46. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -0
  47. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +62 -0
  48. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  49. package/dist/cjs/components/ReportBuilder/convert.js +3 -2
  50. package/dist/cjs/components/ReportBuilder/ui.d.ts +1 -0
  51. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  52. package/dist/cjs/components/ReportBuilder/ui.js +12 -5
  53. package/dist/cjs/components/ReportBuilder/util.js +2 -2
  54. package/dist/cjs/components/UiComponents.d.ts +12 -2
  55. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  56. package/dist/cjs/components/UiComponents.js +7 -6
  57. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +2 -1
  58. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  59. package/dist/cjs/internals/ReportBuilder/PivotModal.js +47 -56
  60. package/dist/cjs/utils/aggregate.js +2 -2
  61. package/dist/cjs/utils/color.d.ts +25 -0
  62. package/dist/cjs/utils/color.d.ts.map +1 -1
  63. package/dist/cjs/utils/color.js +164 -1
  64. package/dist/esm/BarList.d.ts +1 -0
  65. package/dist/esm/BarList.d.ts.map +1 -1
  66. package/dist/esm/BarList.js +55 -46
  67. package/dist/esm/Chart.d.ts +4 -0
  68. package/dist/esm/Chart.d.ts.map +1 -1
  69. package/dist/esm/Chart.js +25 -19
  70. package/dist/esm/ChartBuilder.d.ts +5 -3
  71. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  72. package/dist/esm/ChartBuilder.js +234 -195
  73. package/dist/esm/ChartEditor.d.ts +3 -1
  74. package/dist/esm/ChartEditor.d.ts.map +1 -1
  75. package/dist/esm/ChartEditor.js +19 -4
  76. package/dist/esm/Context.d.ts +1 -1
  77. package/dist/esm/Context.d.ts.map +1 -1
  78. package/dist/esm/Context.js +33 -3
  79. package/dist/esm/Dashboard.d.ts +2 -1
  80. package/dist/esm/Dashboard.d.ts.map +1 -1
  81. package/dist/esm/Dashboard.js +4 -4
  82. package/dist/esm/PieChart.d.ts +1 -1
  83. package/dist/esm/PieChart.d.ts.map +1 -1
  84. package/dist/esm/PieChart.js +93 -334
  85. package/dist/esm/QuillProvider.d.ts +1 -3
  86. package/dist/esm/QuillProvider.d.ts.map +1 -1
  87. package/dist/esm/QuillProvider.js +2 -2
  88. package/dist/esm/ReportBuilder.d.ts +11 -3
  89. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  90. package/dist/esm/ReportBuilder.js +229 -104
  91. package/dist/esm/SQLEditor.d.ts +4 -2
  92. package/dist/esm/SQLEditor.d.ts.map +1 -1
  93. package/dist/esm/SQLEditor.js +9 -6
  94. package/dist/esm/components/Chart/BarChart.d.ts +2 -1
  95. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  96. package/dist/esm/components/Chart/BarChart.js +9 -5
  97. package/dist/esm/components/Chart/ChartError.js +1 -1
  98. package/dist/esm/components/Chart/ChartSkeleton.js +2 -2
  99. package/dist/esm/components/Chart/LineChart.d.ts +2 -1
  100. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  101. package/dist/esm/components/Chart/LineChart.js +10 -3
  102. package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -1
  103. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  104. package/dist/esm/components/Dashboard/TableComponent.js +1 -1
  105. package/dist/esm/components/QuillTable.js +1 -1
  106. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
  107. package/dist/esm/components/ReportBuilder/AddColumnPopover.js +2 -2
  108. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +3 -0
  109. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -0
  110. package/dist/esm/components/ReportBuilder/AddSortPopover.js +57 -0
  111. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  112. package/dist/esm/components/ReportBuilder/convert.js +3 -2
  113. package/dist/esm/components/ReportBuilder/ui.d.ts +1 -0
  114. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  115. package/dist/esm/components/ReportBuilder/ui.js +11 -5
  116. package/dist/esm/components/ReportBuilder/util.js +2 -2
  117. package/dist/esm/components/UiComponents.d.ts +12 -2
  118. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  119. package/dist/esm/components/UiComponents.js +7 -6
  120. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +2 -1
  121. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  122. package/dist/esm/internals/ReportBuilder/PivotModal.js +47 -56
  123. package/dist/esm/utils/aggregate.js +2 -2
  124. package/dist/esm/utils/color.d.ts +25 -0
  125. package/dist/esm/utils/color.d.ts.map +1 -1
  126. package/dist/esm/utils/color.js +160 -0
  127. package/package.json +1 -1
@@ -2,133 +2,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /* eslint-disable @typescript-eslint/ban-ts-comment */
3
3
  /* eslint-disable react/display-name */
4
4
  // @ts-nocheck
5
- import React, { useRef, useState, useEffect } from 'react';
6
- import { Pie, PieChart, ResponsiveContainer, Tooltip, Legend } from 'recharts';
7
- // const data = [
8
- // {
9
- // name: 'Project Nile',
10
- // pct_of_the_total: 0.208266213458027,
11
- // },
12
- // {
13
- // name: 'GA_Columbus',
14
- // pct_of_the_total: 0.102192710707096,
15
- // },
16
- // {
17
- // name: 'IN_Indianapolis',
18
- // pct_of_the_total: 0.0965229750772778,
19
- // },
20
- // {
21
- // name: 'MO_St Louis',
22
- // pct_of_the_total: 0.0732235559304729,
23
- // },
24
- // {
25
- // name: 'AL_Birmingham',
26
- // pct_of_the_total: 0.0555956813239389,
27
- // },
28
- // {
29
- // name: 'FL_Fort Myers',
30
- // pct_of_the_total: 0.0479532568651074,
31
- // },
32
- // {
33
- // name: 'GA_Macon',
34
- // pct_of_the_total: 0.0431507654834117,
35
- // },
36
- // {
37
- // name: 'NC_Charlotte',
38
- // pct_of_the_total: 0.034166792944838,
39
- // },
40
- // {
41
- // name: 'AL_Montgomery',
42
- // pct_of_the_total: 0.0298663023800594,
43
- // },
44
- // {
45
- // name: 'TN_Memphis',
46
- // pct_of_the_total: 0.0292140477651036,
47
- // },
48
- // {
49
- // name: 'SC_Greenville',
50
- // pct_of_the_total: 0.0288115667542858,
51
- // },
52
- // {
53
- // name: 'SC_Columbia',
54
- // pct_of_the_total: 0.0285805316472631,
55
- // },
56
- // {
57
- // name: 'NC_Fayetteville',
58
- // pct_of_the_total: 0.0279000448849207,
59
- // },
60
- // {
61
- // name: 'SC_Spartanburg',
62
- // pct_of_the_total: 0.0260196308313896,
63
- // },
64
- // {
65
- // name: 'NC_Greensboro',
66
- // pct_of_the_total: 0.0169521323221251,
67
- // },
68
- // {
69
- // name: 'FL_Orlando',
70
- // pct_of_the_total: 0.0167433815522564,
71
- // },
72
- // {
73
- // name: 'FL_Tampa',
74
- // pct_of_the_total: 0.0155513189530513,
75
- // },
76
- // {
77
- // name: 'NC_Raleigh',
78
- // pct_of_the_total: 0.0154308010765727,
79
- // },
80
- // {
81
- // name: 'FL_Jacksonville',
82
- // pct_of_the_total: 0.0152275224173022,
83
- // },
84
- // {
85
- // name: 'GA_LaGrange',
86
- // pct_of_the_total: 0.00867900369362145,
87
- // },
88
- // {
89
- // name: 'GA_Augusta',
90
- // pct_of_the_total: 0.0084582649800033,
91
- // },
92
- // {
93
- // name: 'TX_San Antonio',
94
- // pct_of_the_total: 0.00682971823492258,
95
- // },
96
- // {
97
- // name: 'FL_North Port',
98
- // pct_of_the_total: 0.00637954051173961,
99
- // },
100
- // {
101
- // name: 'No Portfolio',
102
- // pct_of_the_total: 0.00522734435854761,
103
- // },
104
- // ];
105
- const useOnWindowResize = (handler, initialWindowSize) => {
106
- const [windowSize, setWindowSize] = useState(initialWindowSize);
107
- useEffect(() => {
108
- const handleResize = () => {
109
- setWindowSize(window.innerWidth);
110
- handler();
111
- };
112
- handleResize();
113
- window.addEventListener('resize', handleResize);
114
- return () => window.removeEventListener('resize', handleResize);
115
- }, [handler, windowSize]);
116
- };
117
- const ChartLegend = (categories, colors) => {
118
- const legendRef = useRef(null);
119
- // useOnWindowResize(() => {
120
- // const calculateHeight = (height: number | undefined) =>
121
- // height
122
- // ? Number(height) + 20 // 20px extra padding
123
- // : 60; // default height
124
- // setLegendHeight(calculateHeight(legendRef.current?.clientHeight));
125
- // });
126
- return (_jsx("div", { ref: legendRef, className: "qq-flex qq-items-center qq-justify-end", children: _jsx(Legend
127
- // @ts-ignore
128
- , {
129
- // @ts-ignore
130
- categories: categories, colors: colors }) }));
131
- };
5
+ import React from 'react';
6
+ import { Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';
7
+ import { namedColorToHex, rgbToHsl as RGBToHSL, HSLtoRGB } from './utils/color';
132
8
  const iconVariantValues = [
133
9
  'simple',
134
10
  'light',
@@ -185,16 +61,6 @@ const alignItemsValues = [
185
61
  ];
186
62
  export const defaultValueFormatter = (value) => (value * 1).toFixed(1) + '%';
187
63
  export const sumNumericArray = (arr) => arr.reduce((prefixSum, num) => prefixSum + num, 0);
188
- // export const parseData = (data: any[], colors: any[]) =>
189
- // data.map((dataPoint: any, idx: number) => {
190
- // const baseColor = idx < colors.length ? colors[idx] : BaseColors.Gray;
191
- // const hexCode = hexColors[baseColor ?? BaseColors.Gray];
192
- // return {
193
- // ...dataPoint,
194
- // color: colors[idx],
195
- // fill: colors[idx],
196
- // };
197
- // });
198
64
  // @ts-ignore
199
65
  export const parseData = (data, colors, categoryKey, valueKey) => {
200
66
  const maxItems = 20;
@@ -243,17 +109,14 @@ export const ChartTooltipFrame = ({ children, theme, }) => (_jsx("div", { style:
243
109
  }, children: children }));
244
110
  export const ChartTooltipRow = ({ value, name, color, theme, }) => (_jsxs("div", { style: {
245
111
  display: 'flex',
112
+ gap: 8,
246
113
  alignItems: 'center',
247
114
  justifyContent: 'space-between',
248
115
  minWidth: 120,
249
- // minHeight: 27,
250
- // margin: '0 2rem',
251
116
  }, children: [_jsxs("div", { style: {
252
117
  display: 'flex',
253
118
  alignItems: 'center',
254
119
  justifyContent: 'space-between',
255
- // margin: '0 0.5rem',
256
- // minWidth: 120,
257
120
  }, children: [_jsx("span", { style: {
258
121
  background: color,
259
122
  borderWidth: 2,
@@ -264,12 +127,7 @@ export const ChartTooltipRow = ({ value, name, color, theme, }) => (_jsxs("div",
264
127
  boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',
265
128
  borderRadius: '9999px',
266
129
  marginRight: 5,
267
- } }), _jsx("p", {
268
- // className={twMerge(
269
- // 'font-medium tabular-nums text-right whitespace-nowrap',
270
- // 'text-[#212121] !important'
271
- // )}
272
- style: {
130
+ } }), _jsx("p", { style: {
273
131
  marginTop: 0,
274
132
  marginBottom: 0,
275
133
  fontFamily: theme?.fontFamily,
@@ -293,10 +151,7 @@ export const ChartTooltipRow = ({ value, name, color, theme, }) => (_jsxs("div",
293
151
  export const DonutChartTooltip = ({ active, payload, valueFormatter, theme, }) => {
294
152
  if (active && payload[0]) {
295
153
  const payloadRow = payload[0];
296
- return (_jsx(ChartTooltipFrame, { theme: theme, children: _jsx("div", {
297
- // style={{ transform: 'translateX(-120px)' }}
298
- // className={twMerge('qq-px-4', 'qq-py-2')}
299
- style: {
154
+ return (_jsx(ChartTooltipFrame, { theme: theme, children: _jsx("div", { style: {
300
155
  paddingLeft: '1rem',
301
156
  paddingRight: '1rem',
302
157
  paddingTop: '8px',
@@ -305,173 +160,105 @@ export const DonutChartTooltip = ({ active, payload, valueFormatter, theme, }) =
305
160
  }
306
161
  return null;
307
162
  };
308
- // @ts-ignore
309
- export function findComplementaryAndAnalogousColors(color1, color2) {
310
- // Calculate the hue of the first color
311
- const color1HSL = rgbToHsl(hexToRgb(color1));
312
- const color2HSL = rgbToHsl(hexToRgb(color2));
313
- const color1Hue = color1HSL.h;
314
- // Calculate the complementary color of the first color
315
- const complementaryHue = (color1Hue + 180) % 360;
316
- const complementaryColor = hslToRgb({
317
- h: complementaryHue,
318
- s: color1HSL.s,
319
- l: color1HSL.l,
320
- });
321
- // Find an analogous hue to the first color
322
- const analogousHue1 = (color1Hue + 30) % 360;
323
- const analogousHue2 = (color1Hue - 30 + 360) % 360;
324
- // Convert the analogous hues back to RGB colors
325
- const analogousColor1 = hslToRgb({
326
- h: analogousHue1,
327
- s: color1HSL.s,
328
- l: color1HSL.l,
329
- });
330
- const analogousColor2 = hslToRgb({
331
- h: analogousHue2,
332
- s: color1HSL.s,
333
- l: color1HSL.l,
334
- });
335
- // Calculate the average hue between the two colors
336
- const avgHue = (color1HSL.h + color2HSL.h) / 2;
337
- // Generate a new HSL object with the average hue and the same saturation and lightness as color1
338
- const analogousHsl = { h: avgHue, s: color1HSL.s, l: color1HSL.l };
339
- return [
340
- color1,
341
- color2,
342
- rgbToHex(hslToRgb(analogousHsl)),
343
- // rgbToHex(complementaryColor),
344
- // rgbToHex(analogousColor1),
345
- // rgbToHex(analogousColor2),
346
- ];
347
- }
348
- // @ts-ignore
349
163
  function hexToRgb(hex) {
350
164
  const r = parseInt(hex.substring(1, 3), 16);
351
165
  const g = parseInt(hex.substring(3, 5), 16);
352
166
  const b = parseInt(hex.substring(5, 7), 16);
353
167
  return { r, g, b };
354
168
  }
355
- // @ts-ignore
356
169
  function rgbToHex(rgb) {
357
170
  const rHex = rgb.r.toString(16).padStart(2, '0');
358
171
  const gHex = rgb.g.toString(16).padStart(2, '0');
359
172
  const bHex = rgb.b.toString(16).padStart(2, '0');
360
173
  return `#${rHex}${gHex}${bHex}`;
361
174
  }
362
- // @ts-ignore
363
- function rgbToHsl(rgb) {
364
- const r = rgb.r / 255;
365
- const g = rgb.g / 255;
366
- const b = rgb.b / 255;
367
- const max = Math.max(r, g, b);
368
- const min = Math.min(r, g, b);
369
- let h = 0, s = 0, l = (max + min) / 2;
370
- if (max !== min) {
371
- const d = max - min;
372
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
373
- switch (max) {
374
- case r:
375
- h = (g - b) / d + (g < b ? 6 : 0);
376
- break;
377
- case g:
378
- h = (b - r) / d + 2;
379
- break;
380
- case b:
381
- h = (r - g) / d + 4;
382
- break;
383
- }
384
- h /= 6;
385
- }
386
- return { h: h * 360, s: s * 100, l: l * 100 };
175
+ function colorToHSL(color) {
176
+ const colorHex = namedColorToHex(color);
177
+ const { r, g, b } = hexToRgb(colorHex);
178
+ return RGBToHSL(r, g, b);
387
179
  }
388
- // @ts-ignore
389
- function hslToRgb(hsl) {
390
- const h = hsl.h / 360;
391
- const s = hsl.s / 100;
392
- const l = hsl.l / 100;
393
- let r, g, b;
394
- if (s === 0) {
395
- r = g = b = l;
396
- }
397
- else {
398
- // @ts-ignore
399
- const hue2rgb = (p, q, t) => {
400
- if (t < 0)
401
- t += 1;
402
- if (t > 1)
403
- t -= 1;
404
- if (t < 1 / 6)
405
- return p + (q - p) * 6 * t;
406
- if (t < 1 / 2)
407
- return q;
408
- if (t < 2 / 3)
409
- return p + (q - p) * (2 / 3 - t) * 6;
410
- return p;
411
- };
412
- const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
413
- const p = 2 * l - q;
414
- r = hue2rgb(p, q, h + 1 / 3);
415
- g = hue2rgb(p, q, h);
416
- b = hue2rgb(p, q, h - 1 / 3);
417
- }
418
- return {
419
- r: Math.round(r * 255),
420
- g: Math.round(g * 255),
421
- b: Math.round(b * 255),
422
- };
180
+ /**
181
+ * Interpolates between two colors using HSL color space.
182
+ * @param leftColor - The left color in hexadecimal format.
183
+ * @param rightColor - The right color in hexadecimal format.
184
+ * @param length - The number of interpolated colors to generate between the
185
+ * left and right colors.
186
+ */
187
+ function interpolateBetween(leftColor, rightColor, length = 3) {
188
+ const [h, s, _l] = colorToHSL(leftColor);
189
+ const [h2, s2, _l2] = colorToHSL(rightColor);
190
+ const hues = linspace(h, h2, length);
191
+ const saturations = linspace(s, s2, length);
192
+ const lightnesses = linspace(_l, _l2, length);
193
+ return Array.from({ length }).map((_, i) => {
194
+ const [r, g, b] = HSLtoRGB(hues[i], saturations[i], lightnesses[i]);
195
+ return rgbToHex({ r: Math.round(r), g: Math.round(g), b: Math.round(b) });
196
+ });
423
197
  }
424
- // @ts-ignore
425
- function generateColorGradientSteps(n, colors) {
426
- const numColors = colors.length;
427
- // If there are fewer than two colors, return the original array
428
- if (numColors < 2) {
429
- return colors;
198
+ /**
199
+ * Generates monochromatic interpolation of a given color.
200
+ * @param color - The base color in hexadecimal format.
201
+ * @param length - The number of interpolated colors to generate.
202
+ */
203
+ function monochromaticInterpolation(color, length) {
204
+ const [h, s, _l] = colorToHSL(color);
205
+ const hues = linspace(h, h, length);
206
+ const saturations = linspace(s, s, length);
207
+ const lightnesses = linspace(0.6, 0.9, length);
208
+ return Array.from({ length }).map((_, i) => {
209
+ const [r, g, b] = HSLtoRGB(hues[i], saturations[i], lightnesses[i]);
210
+ return rgbToHex({ r: Math.round(r), g: Math.round(g), b: Math.round(b) });
211
+ });
212
+ }
213
+ /**
214
+ * Generates an array of colors by interpolating between colors in the given array.
215
+ * @param colors - The array of colors to interpolate between.
216
+ * @param length - The desired length of the resulting array.
217
+ */
218
+ function generateArrayFromColor(colors, length) {
219
+ if (typeof colors === 'string') {
220
+ return monochromaticInterpolation(colors, length);
430
221
  }
431
- // Initialize the output array with the first color
432
- const output = [colors[0]];
433
- // Calculate the number of gradient steps between each pair of colors
434
- const stepsPerPair = Math.floor(n / (numColors - 1));
435
- // Generate the gradient steps for each pair of colors
436
- for (let i = 1; i < numColors; i++) {
437
- const color1 = colors[i - 1];
438
- const color2 = colors[i];
439
- const gradientSteps = generateGradientSteps(color1, color2, stepsPerPair);
440
- output.push(...gradientSteps);
222
+ if (colors.length === 1) {
223
+ return monochromaticInterpolation(colors[0], length);
441
224
  }
442
- // If there are remaining steps, add the last color as a stopgap measure
443
- while (output.length < n) {
444
- output.push(colors[numColors - 1]);
225
+ const pairs = colors.length - 1;
226
+ const needed = length - colors.length;
227
+ const baseAmount = Math.floor(needed / pairs);
228
+ const extras = needed % pairs;
229
+ let result = [];
230
+ let i = 0;
231
+ let j = 1;
232
+ while (j < colors.length) {
233
+ const additional = i < extras ? 1 : 0;
234
+ const interpLength = 2 + baseAmount + additional;
235
+ const interp = interpolateBetween(colors[i], colors[j], interpLength);
236
+ const lastIndex = j === colors.length - 1 ? undefined : -1;
237
+ result = result.concat(interp.slice(0, lastIndex));
238
+ i++;
239
+ j++;
445
240
  }
446
- return output;
241
+ return result;
447
242
  }
448
- //@ts-ignore
449
- function generateGradientSteps(color1, color2, n) {
450
- // Convert the colors to RGB objects
451
- const rgb1 = hexToRgb(color1);
452
- const rgb2 = hexToRgb(color2);
453
- // Calculate the RGB color difference between the two colors
454
- const diffR = rgb2.r - rgb1.r;
455
- const diffG = rgb2.g - rgb1.g;
456
- const diffB = rgb2.b - rgb1.b;
457
- // Calculate the RGB gradient step size between the two colors
458
- const stepR = diffR / (n + 1);
459
- const stepG = diffG / (n + 1);
460
- const stepB = diffB / (n + 1);
461
- // Generate the RGB gradient steps
462
- const gradientSteps = [];
463
- for (let i = 1; i <= n; i++) {
464
- const r = Math.round(rgb1.r + stepR * i);
465
- const g = Math.round(rgb1.g + stepG * i);
466
- const b = Math.round(rgb1.b + stepB * i);
467
- gradientSteps.push(rgbToHex({ r, g, b }));
243
+ /**
244
+ * Generates an array of numbers linearly spaced between start and end.
245
+ * @param start - The starting number of the sequence.
246
+ * @param end - The end number of the sequence.
247
+ * @param num - The number of samples to generate.
248
+ */
249
+ function linspace(start, end, num) {
250
+ if (num <= 1)
251
+ return [start];
252
+ const step = (end - start) / (num - 1);
253
+ const result = new Array(num);
254
+ for (let i = 0; i < num; i++) {
255
+ result[i] = start + step * i;
468
256
  }
469
- return gradientSteps;
257
+ return result;
470
258
  }
471
259
  const PieChartWrapper = React.forwardRef((props, ref) => {
472
- const { category = 'pct_of_the_total', index = 'status', data, colors = [], variant = 'donut', valueFormatter = defaultValueFormatter, label, showLabel = true, showAnimation = true, showTooltip = true, className, containerStyle, theme, ...other } = props;
260
+ const { category = 'pct_of_the_total', index = 'status', data, colors = [], colorMap = {}, variant = 'donut', valueFormatter = defaultValueFormatter, label, showLabel = true, showAnimation = true, showTooltip = true, className, containerStyle, theme, ...other } = props;
473
261
  const isDonut = variant == 'donut';
474
- const parsedLabelInput = parseLabelInput(label, valueFormatter, data, category);
475
262
  if (!data || data.length === 0) {
476
263
  return (_jsx("div", { style: {
477
264
  display: 'flex',
@@ -482,52 +269,24 @@ const PieChartWrapper = React.forwardRef((props, ref) => {
482
269
  alignItems: 'center',
483
270
  fontSize: 13,
484
271
  color: theme.secondaryTextColor,
272
+ ...containerStyle,
485
273
  }, children: "No results found for specified time period." }));
486
274
  }
487
- // const newColors = generateColorGradientSteps(
488
- // data.length,
489
- // findComplementaryAndAnalogousColors(colors[0], colors[1])
490
- // );
491
275
  return (_jsx("div", { ref: ref, style: {
492
- ...containerStyle,
493
276
  width: '100%',
494
- // height: '100%',
495
277
  display: 'flex',
496
278
  flexDirection: 'row',
497
279
  alignItems: 'center',
498
280
  boxSizing: 'content-box',
499
- }, ...other, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(PieChart, { children: [_jsx(Pie
500
- // style={{ transform: 'translateX(-120px)' }}
501
- , {
502
- // style={{ transform: 'translateX(-120px)' }}
503
- data: parseData(data, colors.length >= data.length
504
- ? colors
505
- : generateColorGradientSteps(Math.min(21, data.length), [
506
- ...findComplementaryAndAnalogousColors(colors[0], colors[1]),
507
- ...colors.slice(2),
508
- ]), index, category), cx: "50%", cy: "50%", startAngle: 90, endAngle: -270, innerRadius: isDonut ? '70%' : '0%', outerRadius: "100%", paddingAngle: 0, dataKey: category, nameKey: index, isAnimationActive: true }), _jsx(Tooltip, { wrapperStyle: {
281
+ ...containerStyle,
282
+ }, ...other, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(PieChart, { children: [_jsx(Pie, { data: parseData(data, (colorMap[category] &&
283
+ generateArrayFromColor(colorMap[category], data.length)) ??
284
+ (colors.length >= data.length
285
+ ? colors
286
+ : generateArrayFromColor(colors.slice(0, 2), data.length)), index, category), cx: "50%", cy: "50%", startAngle: 90, endAngle: -270, innerRadius: isDonut ? '70%' : '0%', outerRadius: "100%", paddingAngle: 0, dataKey: category, nameKey: index, isAnimationActive: true }), _jsx(Tooltip, { wrapperStyle: {
509
287
  outline: 'none',
510
- }, content: ({ active, payload }) => (_jsx(DonutChartTooltip, { active: active, payload: payload, valueFormatter: valueFormatter, theme: theme })) })] }) }) }));
288
+ }, content: ({ active, payload }) => {
289
+ return (_jsx(DonutChartTooltip, { active: active, payload: payload, valueFormatter: valueFormatter, theme: theme }));
290
+ } })] }) }) }));
511
291
  });
512
- function Legend2({ payload, colors }) {
513
- return (_jsx("div", { children: payload.map((item, idx) => {
514
- if (idx > 9) {
515
- return null;
516
- }
517
- return (_jsxs("div", { children: [_jsx("div", { style: {
518
- height: 8,
519
- width: 8,
520
- borderRadius: 8,
521
- background: colors[idx],
522
- marginRight: 8,
523
- marginTop: 2,
524
- } }), _jsx("div", { style: {
525
- whiteSpace: 'nowrap',
526
- overflow: 'hidden',
527
- textOverflow: 'ellipsis',
528
- display: 'block',
529
- maxWidth: 120,
530
- }, children: item.value })] }, item.value));
531
- }) }));
532
- }
533
292
  export default PieChartWrapper;
@@ -10,14 +10,12 @@ interface WithOrganizationId extends BaseQuillProviderProps {
10
10
  queryEndpoint?: never;
11
11
  queryHeaders?: never;
12
12
  withCredentials?: boolean;
13
- databaseType: string;
14
13
  }
15
14
  interface WithQueryEndpoint extends BaseQuillProviderProps {
16
15
  organizationId?: string;
17
16
  queryEndpoint: string;
18
17
  queryHeaders: object;
19
18
  withCredentials?: boolean;
20
- databaseType: string;
21
19
  }
22
20
  type QuillProviderProps = WithOrganizationId | WithQueryEndpoint;
23
21
  export interface QuillTheme {
@@ -57,6 +55,6 @@ export declare const defaultQuillTheme: {
57
55
  loadingStateBackgroundColor: string;
58
56
  hoverBackgroundColor: string;
59
57
  };
60
- declare const QuillProvider: ({ organizationId, publicKey, queryEndpoint, queryHeaders, environment, children, databaseType, theme, withCredentials, }: QuillProviderProps) => import("react/jsx-runtime").JSX.Element;
58
+ declare const QuillProvider: ({ organizationId, publicKey, queryEndpoint, queryHeaders, environment, children, theme, withCredentials, }: QuillProviderProps) => import("react/jsx-runtime").JSX.Element;
61
59
  export default QuillProvider;
62
60
  //# sourceMappingURL=QuillProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"QuillProvider.d.ts","sourceRoot":"","sources":["../../src/QuillProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAGrD,UAAU,sBAAsB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,UAAU,kBAAmB,SAAQ,sBAAsB;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,iBAAkB,SAAQ,sBAAsB;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,kBAAkB,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAwB7B,CAAC;AAEF,QAAA,MAAM,aAAa,6HAUhB,kBAAkB,4CAepB,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"QuillProvider.d.ts","sourceRoot":"","sources":["../../src/QuillProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAGrD,UAAU,sBAAsB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,UAAU,kBAAmB,SAAQ,sBAAsB;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,iBAAkB,SAAQ,sBAAsB;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,KAAK,kBAAkB,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAwB7B,CAAC;AAEF,QAAA,MAAM,aAAa,+GAShB,kBAAkB,4CAcpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -25,7 +25,7 @@ export const defaultQuillTheme = {
25
25
  loadingStateBackgroundColor: '#F9F9FA',
26
26
  hoverBackgroundColor: '#F4F4F5',
27
27
  };
28
- const QuillProvider = ({ organizationId, publicKey, queryEndpoint = 'https://quill-344421.uc.r.appspot.com/cloud', queryHeaders, environment, children, databaseType, theme = defaultQuillTheme, withCredentials = false, }) => {
29
- return (_jsx(ContextProvider, { initialTheme: theme, publicKey: publicKey, environment: environment, customerId: organizationId, queryEndpoint: queryEndpoint, queryHeaders: queryHeaders, withCredentials: withCredentials, databaseType: databaseType, children: children }));
28
+ const QuillProvider = ({ organizationId, publicKey, queryEndpoint = 'https://quill-344421.uc.r.appspot.com/cloud', queryHeaders, environment, children, theme = defaultQuillTheme, withCredentials = false, }) => {
29
+ return (_jsx(ContextProvider, { initialTheme: theme, publicKey: publicKey, environment: environment, customerId: organizationId, queryEndpoint: queryEndpoint, queryHeaders: queryHeaders, withCredentials: withCredentials, children: children }));
30
30
  };
31
31
  export default QuillProvider;
@@ -1,3 +1,5 @@
1
+ /// <reference types="react" />
2
+ import { ButtonComponentProps, HeaderProps, LabelProps, MemoizedPopoverProps, TextProps } from './components/UiComponents';
1
3
  /**
2
4
  * Quill Report Builder
3
5
  *
@@ -6,13 +8,13 @@
6
8
  * they can click a button and add that report to their dashboard or export it
7
9
  * as a CSV.
8
10
  */
9
- export default function ReportBuilder({ initialTableName, onAddToDashboardComplete, destinationDashboard, organizationName, Button, SecondaryButton, TextInput, Select, Table, Popover, Tabs, Checkbox, Sidebar, Container, HandleButton, SelectColumn, DraggableColumn, ButtonLoadingState, TableLoadingState, SidebarHeading, SidebarSubHeading, FilterPopover, admin, }: {
11
+ export default function ReportBuilder({ initialTableName, onAddToDashboardComplete, destinationDashboard, organizationName, Button, SecondaryButton, TextInput, Select, Table, Popover, Tabs, Checkbox, Sidebar, Container, HandleButton, SelectColumn, DraggableColumn, ButtonLoadingState, TableLoadingState, SidebarHeading, SidebarSubHeading, FilterPopover, SortPopover, Label, Header, Text, PivotPopover, admin, hideAi, }: {
10
12
  initialTableName: string;
11
13
  onAddToDashboardComplete: () => void;
12
14
  destinationDashboard?: string;
13
15
  organizationName?: string;
14
- Button?: any;
15
- SecondaryButton?: any;
16
+ Button?: (props: ButtonComponentProps) => JSX.Element;
17
+ SecondaryButton?: (props: ButtonComponentProps) => JSX.Element;
16
18
  TextInput?: any;
17
19
  Select?: any;
18
20
  Table?: any;
@@ -29,6 +31,12 @@ export default function ReportBuilder({ initialTableName, onAddToDashboardComple
29
31
  SidebarHeading?: any;
30
32
  SidebarSubHeading?: any;
31
33
  FilterPopover?: any;
34
+ SortPopover?: any;
35
+ Label?: (props: LabelProps) => JSX.Element;
36
+ Header?: (props: HeaderProps) => JSX.Element;
37
+ Text?: (props: TextProps) => JSX.Element;
38
+ PivotPopover?: (props: MemoizedPopoverProps) => JSX.Element;
32
39
  admin?: boolean;
40
+ hideAi?: boolean;
33
41
  }): import("react/jsx-runtime").JSX.Element;
34
42
  //# sourceMappingURL=ReportBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReportBuilder.d.ts","sourceRoot":"","sources":["../../src/ReportBuilder.tsx"],"names":[],"mappings":"AAwGA;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,gBAAqB,EACrB,wBAA0C,EAC1C,oBAAgC,EAChC,gBAAqB,EACrB,MAAoB,EACpB,eAAsC,EACtC,SAA0B,EAC1B,MAAoB,EACpB,KAA+B,EAC/B,OAAsB,EACtB,IAAgB,EAChB,QAA2B,EAC3B,OAAsB,EACtB,SAA2B,EAC3B,YAAgC,EAChC,YAAgC,EAChC,eAAsC,EACtC,kBAA4C,EAC5C,iBAA0C,EAC1C,cAAoC,EACpC,iBAA0C,EAC1C,aAAkC,EAClC,KAAa,GACd,EAAE;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,IAAI,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,2CAuhGA"}
1
+ {"version":3,"file":"ReportBuilder.d.ts","sourceRoot":"","sources":["../../src/ReportBuilder.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,UAAU,EAMV,oBAAoB,EAIpB,SAAS,EACV,MAAM,2BAA2B,CAAC;AAqHnC;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,gBAAqB,EACrB,wBAA0C,EAC1C,oBAAgC,EAChC,gBAAqB,EACrB,MAAuB,EACvB,eAAyC,EACzC,SAA0B,EAC1B,MAAoB,EACpB,KAAkB,EAClB,OAAsB,EACtB,IAAgB,EAChB,QAA2B,EAC3B,OAAsB,EACtB,SAA2B,EAC3B,YAAgC,EAChC,YAAgC,EAChC,eAAsC,EACtC,kBAA4C,EAC5C,iBAA0C,EAC1C,cAAoC,EACpC,iBAA0C,EAC1C,aAAkC,EAClC,WAA8B,EAC9B,KAAqB,EACrB,MAAuB,EACvB,IAAmB,EACnB,YAA8B,EAC9B,KAAa,EACb,MAAc,GACf,EAAE;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,IAAI,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IACtD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC/D,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,GAAG,CAAC,OAAO,CAAC;IAC3C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,GAAG,CAAC,OAAO,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,GAAG,CAAC,OAAO,CAAC;IACzC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,2CAsyGA"}