@perses-dev/timeseries-chart-plugin 0.14.0-beta.8 → 0.14.0-rc.1

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 (122) hide show
  1. package/__mf/js/{TimeSeriesChart.aa6aa96b.js → TimeSeriesChart.7f526181.js} +7 -7
  2. package/__mf/js/async/1409.e9ad4f43.js +7 -0
  3. package/__mf/js/async/1616.3707628d.js +1 -0
  4. package/__mf/js/async/2490.8191d3c7.js +2 -0
  5. package/__mf/js/async/392.f873c2c7.js +2 -0
  6. package/__mf/js/async/4077.3d2ff94b.js +1 -0
  7. package/__mf/js/async/4121.c9669ae9.js +2 -0
  8. package/__mf/js/async/{4134.9d3e6a8b.js → 4134.a260c36c.js} +1 -1
  9. package/__mf/js/async/4496.d8c4cea3.js +1 -0
  10. package/__mf/js/async/4670.a4a8e750.js +2 -0
  11. package/__mf/js/async/5002.c3cb865a.js +1 -0
  12. package/__mf/js/async/5071.dddd45fe.js +1 -0
  13. package/__mf/js/async/{5182.375bbf8e.js → 5182.73420039.js} +2 -2
  14. package/__mf/js/async/5587.59996038.js +1 -0
  15. package/__mf/js/async/6274.7219e671.js +2 -0
  16. package/__mf/js/async/6384.3e31b785.js +52 -0
  17. package/__mf/js/async/6609.cecb80fd.js +88 -0
  18. package/__mf/js/async/6625.c9cb0271.js +1 -0
  19. package/__mf/js/async/7151.9be3ff42.js +1 -0
  20. package/__mf/js/async/7192.e1318648.js +1 -0
  21. package/__mf/js/async/7319.5a6cb03e.js +1 -0
  22. package/__mf/js/async/7384.09a58270.js +1 -0
  23. package/__mf/js/async/7633.b6b2c919.js +2 -0
  24. package/__mf/js/async/7955.a1c086ae.js +1 -0
  25. package/__mf/js/async/7968.878ff828.js +1 -0
  26. package/__mf/js/async/7978.c6634ff0.js +1 -0
  27. package/__mf/js/async/8356.3bd57272.js +1 -0
  28. package/__mf/js/async/836.e750d252.js +1 -0
  29. package/__mf/js/async/8465.a14ad9ad.js +1 -0
  30. package/__mf/js/async/8470.76b0dffe.js +2 -0
  31. package/__mf/js/async/873.f90f2e34.js +1 -0
  32. package/__mf/js/async/9235.a5518ab6.js +1 -0
  33. package/__mf/js/async/941.81cd9115.js +2 -0
  34. package/__mf/js/async/9588.8e34f9b1.js +1 -0
  35. package/__mf/js/async/9700.dc8bef5f.js +1 -0
  36. package/__mf/js/async/__federation_expose_TimeSeriesChart.c48ce856.js +1 -0
  37. package/__mf/js/async/lib-router.1cf33fbf.js +2 -0
  38. package/__mf/js/{main.7434d87e.js → main.88657a76.js} +7 -7
  39. package/lib/QuerySettingsEditor.d.ts.map +1 -1
  40. package/lib/QuerySettingsEditor.js +5 -8
  41. package/lib/QuerySettingsEditor.js.map +1 -1
  42. package/lib/TimeSeriesChartBase.d.ts.map +1 -1
  43. package/lib/TimeSeriesChartBase.js +37 -33
  44. package/lib/TimeSeriesChartBase.js.map +1 -1
  45. package/lib/TimeSeriesChartPanel.d.ts.map +1 -1
  46. package/lib/TimeSeriesChartPanel.js +7 -7
  47. package/lib/TimeSeriesChartPanel.js.map +1 -1
  48. package/lib/VisualOptionsEditor.d.ts.map +1 -1
  49. package/lib/VisualOptionsEditor.js +8 -0
  50. package/lib/VisualOptionsEditor.js.map +1 -1
  51. package/lib/annotations/AnnotationTooltip.d.ts +3 -2
  52. package/lib/annotations/AnnotationTooltip.d.ts.map +1 -1
  53. package/lib/annotations/AnnotationTooltip.js +14 -2
  54. package/lib/annotations/AnnotationTooltip.js.map +1 -1
  55. package/lib/components/ColorSwatches.d.ts +5 -0
  56. package/lib/components/ColorSwatches.d.ts.map +1 -0
  57. package/lib/components/ColorSwatches.js +35 -0
  58. package/lib/components/ColorSwatches.js.map +1 -0
  59. package/lib/components/PaletteSelector.d.ts +8 -0
  60. package/lib/components/PaletteSelector.d.ts.map +1 -0
  61. package/lib/components/PaletteSelector.js +93 -0
  62. package/lib/components/PaletteSelector.js.map +1 -0
  63. package/lib/time-series-chart-model.d.ts +25 -3
  64. package/lib/time-series-chart-model.d.ts.map +1 -1
  65. package/lib/time-series-chart-model.js +34 -0
  66. package/lib/time-series-chart-model.js.map +1 -1
  67. package/lib/utils/data-transform.d.ts.map +1 -1
  68. package/lib/utils/data-transform.js +0 -1
  69. package/lib/utils/data-transform.js.map +1 -1
  70. package/lib/utils/palette-gen.d.ts +2 -2
  71. package/lib/utils/palette-gen.d.ts.map +1 -1
  72. package/lib/utils/palette-gen.js +12 -8
  73. package/lib/utils/palette-gen.js.map +1 -1
  74. package/mf-manifest.json +44 -44
  75. package/mf-stats.json +44 -44
  76. package/package.json +10 -6
  77. package/__mf/js/async/1616.2ad408f8.js +0 -1
  78. package/__mf/js/async/2490.7e5650e7.js +0 -2
  79. package/__mf/js/async/3068.c95fecc7.js +0 -88
  80. package/__mf/js/async/3441.65e1728a.js +0 -52
  81. package/__mf/js/async/392.11188127.js +0 -2
  82. package/__mf/js/async/4077.cf1d675f.js +0 -1
  83. package/__mf/js/async/4121.2a21582b.js +0 -2
  84. package/__mf/js/async/4496.eb53e477.js +0 -1
  85. package/__mf/js/async/4670.b5dafbaa.js +0 -2
  86. package/__mf/js/async/5002.e3ab6daa.js +0 -1
  87. package/__mf/js/async/5071.586de8fa.js +0 -1
  88. package/__mf/js/async/5394.f1c40599.js +0 -7
  89. package/__mf/js/async/5587.bfa64ec3.js +0 -1
  90. package/__mf/js/async/6274.c6a9892d.js +0 -2
  91. package/__mf/js/async/6625.e3624f20.js +0 -1
  92. package/__mf/js/async/7151.f8879976.js +0 -1
  93. package/__mf/js/async/7192.f5f93b5e.js +0 -1
  94. package/__mf/js/async/7319.3e3c9686.js +0 -1
  95. package/__mf/js/async/7384.4be917ee.js +0 -1
  96. package/__mf/js/async/7633.9cb6de7a.js +0 -2
  97. package/__mf/js/async/7955.877daa4d.js +0 -1
  98. package/__mf/js/async/7968.cf8a4d6a.js +0 -1
  99. package/__mf/js/async/7978.67c99e22.js +0 -1
  100. package/__mf/js/async/8356.b7f7e7f3.js +0 -1
  101. package/__mf/js/async/8465.56096f79.js +0 -1
  102. package/__mf/js/async/8470.f137ffe2.js +0 -2
  103. package/__mf/js/async/8724.0d169bb2.js +0 -1
  104. package/__mf/js/async/873.b41b449a.js +0 -1
  105. package/__mf/js/async/9235.4831e488.js +0 -1
  106. package/__mf/js/async/941.76f11ced.js +0 -2
  107. package/__mf/js/async/9588.883e3395.js +0 -1
  108. package/__mf/js/async/9700.628e2532.js +0 -1
  109. package/__mf/js/async/__federation_expose_TimeSeriesChart.40d2d053.js +0 -1
  110. package/__mf/js/async/lib-router.4f5ed027.js +0 -2
  111. /package/__mf/css/async/{5394.85c2cbf6.css → 1409.85c2cbf6.css} +0 -0
  112. /package/__mf/js/async/{5394.f1c40599.js.LICENSE.txt → 1409.e9ad4f43.js.LICENSE.txt} +0 -0
  113. /package/__mf/js/async/{2490.7e5650e7.js.LICENSE.txt → 2490.8191d3c7.js.LICENSE.txt} +0 -0
  114. /package/__mf/js/async/{392.11188127.js.LICENSE.txt → 392.f873c2c7.js.LICENSE.txt} +0 -0
  115. /package/__mf/js/async/{4121.2a21582b.js.LICENSE.txt → 4121.c9669ae9.js.LICENSE.txt} +0 -0
  116. /package/__mf/js/async/{5182.375bbf8e.js.LICENSE.txt → 5182.73420039.js.LICENSE.txt} +0 -0
  117. /package/__mf/js/async/{6274.c6a9892d.js.LICENSE.txt → 6274.7219e671.js.LICENSE.txt} +0 -0
  118. /package/__mf/js/async/{3068.c95fecc7.js.LICENSE.txt → 6609.cecb80fd.js.LICENSE.txt} +0 -0
  119. /package/__mf/js/async/{7633.9cb6de7a.js.LICENSE.txt → 7633.b6b2c919.js.LICENSE.txt} +0 -0
  120. /package/__mf/js/async/{8470.f137ffe2.js.LICENSE.txt → 8470.76b0dffe.js.LICENSE.txt} +0 -0
  121. /package/__mf/js/async/{941.76f11ced.js.LICENSE.txt → 941.81cd9115.js.LICENSE.txt} +0 -0
  122. /package/__mf/js/async/{lib-router.4f5ed027.js.LICENSE.txt → lib-router.1cf33fbf.js.LICENSE.txt} +0 -0
@@ -0,0 +1,93 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // Copyright The Perses Authors
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ import { OptionsEditorControl, SettingsAutocomplete, useChartsTheme } from "@perses-dev/components";
15
+ import { useCallback, useMemo } from "react";
16
+ import { CATEGORICAL_PALETTE_NAMES, CATEGORICAL_PALETTE_SCHEMES, CATEGORICAL_SCHEME_METADATA, PALETTE_DROPDOWN_TOOLTIP, VISUAL_CONFIG } from "../time-series-chart-model.js";
17
+ import { ColorSwatches } from "./ColorSwatches.js";
18
+ export function PaletteSelector({ value, onChange }) {
19
+ const chartsTheme = useChartsTheme();
20
+ const themePalette = chartsTheme.echartsTheme.color;
21
+ const paletteOptions = useMemo(()=>{
22
+ const themeColors = Array.isArray(themePalette) && themePalette.length > 0 ? themePalette : [];
23
+ return [
24
+ {
25
+ id: 'auto',
26
+ label: 'Auto',
27
+ paletteMode: 'auto'
28
+ },
29
+ {
30
+ id: 'theme-colors',
31
+ label: 'Theme colors',
32
+ description: themeColors.length > 0 ? /*#__PURE__*/ _jsx(ColorSwatches, {
33
+ colors: themeColors
34
+ }) : undefined,
35
+ paletteMode: 'categorical'
36
+ },
37
+ ...CATEGORICAL_PALETTE_NAMES.map((name)=>{
38
+ const meta = CATEGORICAL_SCHEME_METADATA[name];
39
+ const colors = CATEGORICAL_PALETTE_SCHEMES[name];
40
+ return {
41
+ id: `categorical-${name}`,
42
+ label: meta.label,
43
+ description: /*#__PURE__*/ _jsx(ColorSwatches, {
44
+ colors: colors
45
+ }),
46
+ paletteMode: 'categorical',
47
+ paletteName: name
48
+ };
49
+ })
50
+ ];
51
+ }, [
52
+ themePalette
53
+ ]);
54
+ const currentPaletteOption = useMemo(()=>{
55
+ if (value?.mode !== 'categorical') {
56
+ return paletteOptions.find((o)=>o.id === 'auto');
57
+ }
58
+ const name = value.name;
59
+ if (!name) {
60
+ return paletteOptions.find((o)=>o.id === 'theme-colors');
61
+ }
62
+ return paletteOptions.find((o)=>o.paletteName === name) ?? paletteOptions.find((o)=>o.id === 'theme-colors');
63
+ }, [
64
+ value,
65
+ paletteOptions
66
+ ]);
67
+ const handleChange = useCallback((_, selected)=>{
68
+ if (selected.paletteMode === 'auto') {
69
+ onChange({
70
+ mode: 'auto'
71
+ });
72
+ } else {
73
+ onChange({
74
+ mode: 'categorical',
75
+ name: selected.paletteName
76
+ });
77
+ }
78
+ }, [
79
+ onChange
80
+ ]);
81
+ return /*#__PURE__*/ _jsx(OptionsEditorControl, {
82
+ label: VISUAL_CONFIG.colorPalette.label,
83
+ description: PALETTE_DROPDOWN_TOOLTIP,
84
+ control: /*#__PURE__*/ _jsx(SettingsAutocomplete, {
85
+ value: currentPaletteOption,
86
+ options: paletteOptions,
87
+ onChange: handleChange,
88
+ disableClearable: true
89
+ })
90
+ });
91
+ }
92
+
93
+ //# sourceMappingURL=PaletteSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/PaletteSelector.tsx"],"sourcesContent":["// Copyright 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 { OptionsEditorControl, SettingsAutocomplete, useChartsTheme } from '@perses-dev/components';\nimport type { SettingsAutocompleteOption } from '@perses-dev/components';\nimport type { ReactElement, SyntheticEvent } from 'react';\nimport { useCallback, useMemo } from 'react';\n\nimport type { CategoricalPaletteName, TimeSeriesChartPaletteOptions } from '../time-series-chart-model';\nimport {\n CATEGORICAL_PALETTE_NAMES,\n CATEGORICAL_PALETTE_SCHEMES,\n CATEGORICAL_SCHEME_METADATA,\n PALETTE_DROPDOWN_TOOLTIP,\n VISUAL_CONFIG,\n} from '../time-series-chart-model';\nimport { ColorSwatches } from './ColorSwatches';\n\ninterface PaletteOption extends SettingsAutocompleteOption {\n paletteMode: 'auto' | 'categorical';\n paletteName?: CategoricalPaletteName;\n}\n\nexport interface PaletteSelectorProps {\n value: TimeSeriesChartPaletteOptions | undefined;\n onChange: (palette: TimeSeriesChartPaletteOptions | undefined) => void;\n}\n\nexport function PaletteSelector({ value, onChange }: PaletteSelectorProps): ReactElement {\n const chartsTheme = useChartsTheme();\n const themePalette = chartsTheme.echartsTheme.color as string[] | undefined;\n\n const paletteOptions = useMemo((): PaletteOption[] => {\n const themeColors: string[] = Array.isArray(themePalette) && themePalette.length > 0 ? themePalette : [];\n return [\n {\n id: 'auto',\n label: 'Auto',\n paletteMode: 'auto',\n },\n {\n id: 'theme-colors',\n label: 'Theme colors',\n description: themeColors.length > 0 ? <ColorSwatches colors={themeColors} /> : undefined,\n paletteMode: 'categorical',\n },\n ...CATEGORICAL_PALETTE_NAMES.map((name): PaletteOption => {\n const meta = CATEGORICAL_SCHEME_METADATA[name];\n const colors = CATEGORICAL_PALETTE_SCHEMES[name];\n return {\n id: `categorical-${name}`,\n label: meta.label,\n description: <ColorSwatches colors={colors} />,\n paletteMode: 'categorical',\n paletteName: name,\n };\n }),\n ];\n }, [themePalette]);\n\n const currentPaletteOption = useMemo((): PaletteOption => {\n if (value?.mode !== 'categorical') {\n return paletteOptions.find((o) => o.id === 'auto')!;\n }\n const name = value.name;\n if (!name) {\n return paletteOptions.find((o) => o.id === 'theme-colors')!;\n }\n return paletteOptions.find((o) => o.paletteName === name) ?? paletteOptions.find((o) => o.id === 'theme-colors')!;\n }, [value, paletteOptions]);\n\n const handleChange = useCallback(\n (_: SyntheticEvent, selected: PaletteOption): void => {\n if (selected.paletteMode === 'auto') {\n onChange({ mode: 'auto' });\n } else {\n onChange({\n mode: 'categorical',\n name: selected.paletteName,\n });\n }\n },\n [onChange],\n );\n\n return (\n <OptionsEditorControl\n label={VISUAL_CONFIG.colorPalette.label}\n description={PALETTE_DROPDOWN_TOOLTIP}\n control={\n <SettingsAutocomplete\n value={currentPaletteOption}\n options={paletteOptions}\n onChange={handleChange}\n disableClearable\n />\n }\n />\n );\n}\n"],"names":["OptionsEditorControl","SettingsAutocomplete","useChartsTheme","useCallback","useMemo","CATEGORICAL_PALETTE_NAMES","CATEGORICAL_PALETTE_SCHEMES","CATEGORICAL_SCHEME_METADATA","PALETTE_DROPDOWN_TOOLTIP","VISUAL_CONFIG","ColorSwatches","PaletteSelector","value","onChange","chartsTheme","themePalette","echartsTheme","color","paletteOptions","themeColors","Array","isArray","length","id","label","paletteMode","description","colors","undefined","map","name","meta","paletteName","currentPaletteOption","mode","find","o","handleChange","_","selected","colorPalette","control","options","disableClearable"],"mappings":";AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,oBAAoB,EAAEC,oBAAoB,EAAEC,cAAc,QAAQ,yBAAyB;AAGpG,SAASC,WAAW,EAAEC,OAAO,QAAQ,QAAQ;AAG7C,SACEC,yBAAyB,EACzBC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,wBAAwB,EACxBC,aAAa,QACR,gCAA6B;AACpC,SAASC,aAAa,QAAQ,qBAAkB;AAYhD,OAAO,SAASC,gBAAgB,EAAEC,KAAK,EAAEC,QAAQ,EAAwB;IACvE,MAAMC,cAAcZ;IACpB,MAAMa,eAAeD,YAAYE,YAAY,CAACC,KAAK;IAEnD,MAAMC,iBAAiBd,QAAQ;QAC7B,MAAMe,cAAwBC,MAAMC,OAAO,CAACN,iBAAiBA,aAAaO,MAAM,GAAG,IAAIP,eAAe,EAAE;QACxG,OAAO;YACL;gBACEQ,IAAI;gBACJC,OAAO;gBACPC,aAAa;YACf;YACA;gBACEF,IAAI;gBACJC,OAAO;gBACPE,aAAaP,YAAYG,MAAM,GAAG,kBAAI,KAACZ;oBAAciB,QAAQR;qBAAkBS;gBAC/EH,aAAa;YACf;eACGpB,0BAA0BwB,GAAG,CAAC,CAACC;gBAChC,MAAMC,OAAOxB,2BAA2B,CAACuB,KAAK;gBAC9C,MAAMH,SAASrB,2BAA2B,CAACwB,KAAK;gBAChD,OAAO;oBACLP,IAAI,CAAC,YAAY,EAAEO,MAAM;oBACzBN,OAAOO,KAAKP,KAAK;oBACjBE,2BAAa,KAAChB;wBAAciB,QAAQA;;oBACpCF,aAAa;oBACbO,aAAaF;gBACf;YACF;SACD;IACH,GAAG;QAACf;KAAa;IAEjB,MAAMkB,uBAAuB7B,QAAQ;QACnC,IAAIQ,OAAOsB,SAAS,eAAe;YACjC,OAAOhB,eAAeiB,IAAI,CAAC,CAACC,IAAMA,EAAEb,EAAE,KAAK;QAC7C;QACA,MAAMO,OAAOlB,MAAMkB,IAAI;QACvB,IAAI,CAACA,MAAM;YACT,OAAOZ,eAAeiB,IAAI,CAAC,CAACC,IAAMA,EAAEb,EAAE,KAAK;QAC7C;QACA,OAAOL,eAAeiB,IAAI,CAAC,CAACC,IAAMA,EAAEJ,WAAW,KAAKF,SAASZ,eAAeiB,IAAI,CAAC,CAACC,IAAMA,EAAEb,EAAE,KAAK;IACnG,GAAG;QAACX;QAAOM;KAAe;IAE1B,MAAMmB,eAAelC,YACnB,CAACmC,GAAmBC;QAClB,IAAIA,SAASd,WAAW,KAAK,QAAQ;YACnCZ,SAAS;gBAAEqB,MAAM;YAAO;QAC1B,OAAO;YACLrB,SAAS;gBACPqB,MAAM;gBACNJ,MAAMS,SAASP,WAAW;YAC5B;QACF;IACF,GACA;QAACnB;KAAS;IAGZ,qBACE,KAACb;QACCwB,OAAOf,cAAc+B,YAAY,CAAChB,KAAK;QACvCE,aAAalB;QACbiC,uBACE,KAACxC;YACCW,OAAOqB;YACPS,SAASxB;YACTL,UAAUwB;YACVM,gBAAgB;;;AAK1B"}
@@ -1,5 +1,5 @@
1
1
  import type { FormatOptions, ThresholdOptions } from '@perses-dev/components';
2
- import type { OptionsEditorProps, LegendSpecOptions } from '@perses-dev/plugin-system';
2
+ import type { LegendSpecOptions, OptionsEditorProps } from '@perses-dev/plugin-system';
3
3
  import type { Definition } from '@perses-dev/spec';
4
4
  /**
5
5
  * Line style options for time series charts.
@@ -49,9 +49,28 @@ export interface TimeSeriesChartYAxisOptions {
49
49
  export interface TooltipSpecOptions {
50
50
  enablePinning: boolean;
51
51
  }
52
- export interface TimeSeriesChartPaletteOptions {
53
- mode: 'auto' | 'categorical';
52
+ export type TimeSeriesChartPaletteMode = 'auto' | 'categorical';
53
+ export declare const CATEGORICAL_PALETTE_SCHEMES: {
54
+ readonly category10: readonly string[];
55
+ readonly tableau10: readonly string[];
56
+ readonly set1: readonly string[];
57
+ readonly set2: readonly string[];
58
+ readonly set3: readonly string[];
59
+ readonly dark2: readonly string[];
60
+ };
61
+ export type CategoricalPaletteName = keyof typeof CATEGORICAL_PALETTE_SCHEMES;
62
+ export declare const CATEGORICAL_PALETTE_NAMES: CategoricalPaletteName[];
63
+ export interface CategoricalSchemeMetadata {
64
+ label: string;
54
65
  }
66
+ export declare const CATEGORICAL_SCHEME_METADATA: Record<CategoricalPaletteName, CategoricalSchemeMetadata>;
67
+ export type TimeSeriesChartPaletteOptions = {
68
+ mode: 'auto';
69
+ } | {
70
+ mode: 'categorical';
71
+ name?: CategoricalPaletteName;
72
+ };
73
+ export declare const PALETTE_DROPDOWN_TOOLTIP: string;
55
74
  export type TimeSeriesChartVisualOptions = {
56
75
  display?: 'line' | 'bar';
57
76
  lineWidth?: number;
@@ -122,6 +141,9 @@ export declare const VISUAL_CONFIG: {
122
141
  stack: {
123
142
  label: string;
124
143
  };
144
+ colorPalette: {
145
+ label: string;
146
+ };
125
147
  connectNulls: {
126
148
  label: string;
127
149
  };
@@ -1 +1 @@
1
- {"version":3,"file":"time-series-chart-model.d.ts","sourceRoot":"","sources":["../../src/time-series-chart-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"time-series-chart-model.d.ts","sourceRoot":"","sources":["../../src/time-series-chart-model.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,37 @@
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
+ import { schemeCategory10, schemeDark2, schemeSet1, schemeSet2, schemeSet3, schemeTableau10 } from "d3-scale-chromatic";
14
+ export const CATEGORICAL_PALETTE_SCHEMES = {
15
+ category10: schemeCategory10,
16
+ tableau10: schemeTableau10,
17
+ set1: schemeSet1,
18
+ set2: schemeSet2,
19
+ set3: schemeSet3,
20
+ dark2: schemeDark2
21
+ };
22
+ export const CATEGORICAL_PALETTE_NAMES = Object.keys(CATEGORICAL_PALETTE_SCHEMES);
23
+ export const CATEGORICAL_SCHEME_METADATA = {
24
+ category10: {
25
+ label: 'D3 Category 10'
26
+ },
27
+ tableau10: {
28
+ label: 'Tableau 10'
29
+ },
30
+ set1: {
31
+ label: 'ColorBrewer Set 1'
32
+ },
33
+ set2: {
34
+ label: 'ColorBrewer Set 2'
35
+ },
36
+ set3: {
37
+ label: 'ColorBrewer Set 3'
38
+ },
39
+ dark2: {
40
+ label: 'ColorBrewer Dark 2'
41
+ }
42
+ };
43
+ export const PALETTE_DROPDOWN_TOOLTIP = 'Auto derives a unique color from the series name — same name always maps to the same color across panels. ' + 'Categorical palettes assign colors from a fixed set by series order.';
13
44
  export const DEFAULT_FORMAT = {
14
45
  unit: 'decimal',
15
46
  shortValues: true
@@ -89,6 +120,9 @@ export const VISUAL_CONFIG = {
89
120
  stack: {
90
121
  label: 'Stack Series'
91
122
  },
123
+ colorPalette: {
124
+ label: 'Color Palette'
125
+ },
92
126
  connectNulls: {
93
127
  label: 'Connect Nulls'
94
128
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/time-series-chart-model.ts"],"sourcesContent":["// Copyright 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 type { FormatOptions, ThresholdOptions } from '@perses-dev/components';\nimport type { OptionsEditorProps, LegendSpecOptions } from '@perses-dev/plugin-system';\nimport type { Definition } from '@perses-dev/spec';\n\n/**\n * Line style options for time series charts.\n */\nexport type LineStyleType = 'solid' | 'dashed' | 'dotted';\n\n/**\n * The schema for a TimeSeriesChart panel.\n */\nexport interface TimeSeriesChartDefinition extends Definition<TimeSeriesChartOptions> {\n kind: 'TimeSeriesChart';\n}\n\n/**\n * The Options object supported by the TimeSeriesChartPanel plugin.\n */\nexport interface TimeSeriesChartOptions {\n legend?: LegendSpecOptions;\n yAxis?: TimeSeriesChartYAxisOptions;\n thresholds?: ThresholdOptions;\n visual?: TimeSeriesChartVisualOptions;\n tooltip?: TooltipSpecOptions;\n querySettings?: QuerySettingsOptions[];\n}\n\nexport interface QuerySettingsOptions {\n queryIndex: number;\n colorMode?: 'fixed' | 'fixed-single';\n colorValue?: string;\n lineStyle?: LineStyleType;\n areaOpacity?: number;\n format?: FormatOptions;\n /**\n * If true, the query's series values are negated for display so they render\n * below the X axis. The original (positive) values are preserved for legend\n * calculations and CSV export, matching Grafana's `transform: \"negative-Y\"` behavior.\n */\n negativeY?: boolean;\n stack?: boolean;\n}\n\nexport type TimeSeriesChartOptionsEditorProps = OptionsEditorProps<TimeSeriesChartOptions>;\n\nexport interface TimeSeriesChartYAxisOptions {\n show?: boolean;\n label?: string;\n format?: FormatOptions;\n min?: number;\n max?: number;\n logBase?: LOG_BASE;\n}\n\nexport interface TooltipSpecOptions {\n enablePinning: boolean;\n}\n\nexport interface TimeSeriesChartPaletteOptions {\n mode: 'auto' | 'categorical';\n}\n\nexport type TimeSeriesChartVisualOptions = {\n display?: 'line' | 'bar';\n lineWidth?: number;\n lineStyle?: LineStyleType;\n areaOpacity?: number;\n showPoints?: 'auto' | 'always';\n palette?: TimeSeriesChartPaletteOptions;\n pointRadius?: number;\n stack?: StackOptions;\n connectNulls?: boolean;\n};\n\nexport const DEFAULT_FORMAT: FormatOptions = {\n unit: 'decimal',\n shortValues: true,\n};\n\nexport const DEFAULT_Y_AXIS: TimeSeriesChartYAxisOptions = {\n show: true,\n label: '',\n format: DEFAULT_FORMAT,\n min: undefined,\n max: undefined,\n logBase: undefined,\n};\n\nexport const Y_AXIS_CONFIG = {\n show: { label: 'Show' },\n label: { label: 'Label' },\n unit: { label: 'Unit' },\n min: { label: 'Min' },\n max: { label: 'Max' },\n logBase: { label: 'Log Base' },\n};\n\nexport const DEFAULT_DISPLAY = 'line';\nexport const DEFAULT_LINE_WIDTH = 1.25;\nexport const DEFAULT_LINE_STYLE = 'solid';\nexport const DEFAULT_AREA_OPACITY = 0;\n// How much larger datapoint symbols are than line width, also applied in VisualOptionsEditor.\nexport const POINT_SIZE_OFFSET = 1.5;\nexport const DEFAULT_POINT_RADIUS = DEFAULT_LINE_WIDTH + POINT_SIZE_OFFSET;\nexport const DEFAULT_CONNECT_NULLS = false;\n\nexport const DEFAULT_VISUAL: TimeSeriesChartVisualOptions = {\n display: DEFAULT_DISPLAY,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineStyle: DEFAULT_LINE_STYLE,\n areaOpacity: DEFAULT_AREA_OPACITY,\n pointRadius: DEFAULT_POINT_RADIUS,\n connectNulls: DEFAULT_CONNECT_NULLS,\n};\n\n// Controls how often static threshold values should be plotted so threshold data shows\n// in tooltip without flicker.\nexport const THRESHOLD_PLOT_INTERVAL = 15;\n\nexport const VISUAL_CONFIG = {\n lineWidth: {\n label: 'Line Width',\n testId: 'slider-line-width',\n min: 0.25,\n max: 3,\n step: 0.25,\n },\n lineStyle: {\n label: 'Line Style',\n },\n pointRadius: {\n label: 'Point Radius',\n testId: 'slider-point-radius',\n min: 0,\n max: 6,\n step: 0.25,\n },\n areaOpacity: {\n label: 'Area Opacity',\n testId: 'slider-area-opacity',\n min: 0,\n max: 1,\n step: 0.05,\n },\n stack: {\n label: 'Stack Series',\n },\n connectNulls: {\n label: 'Connect Nulls',\n },\n};\n\n// None is equivalent to undefined since stack is optional\nexport type StackOptions = 'none' | 'all'; // TODO: add percent option support\n\nexport const STACK_CONFIG = {\n none: { label: 'None' },\n all: { label: 'All' },\n // TODO: enable option after 'Percent' implemented\n // percent: { label: 'Percent', disabled: true }, // hidden since not implemented yet\n};\n\nexport const STACK_OPTIONS = Object.entries(STACK_CONFIG).map(([id, config]) => {\n return {\n id: id as StackOptions,\n ...config,\n };\n});\n\nexport const LINE_STYLE_CONFIG = {\n solid: { label: 'Solid' },\n dashed: { label: 'Dashes' },\n dotted: { label: 'Dots' },\n};\n\nexport const OPACITY_CONFIG = {\n label: 'Opacity',\n testId: 'slider-opacity',\n min: 0,\n max: 1,\n step: 0.05,\n};\n\n// LogBase outlines the allowed log bases for the log-supported charts.\nexport type LOG_BASE = undefined | 2 | 10;\n\n// Single source of truth for log base configuration\nexport const LOG_BASE_CONFIG: Record<string, { label: string; log: LOG_BASE }> = {\n none: { label: 'None', log: undefined },\n '2': { label: '2', log: 2 },\n '10': { label: '10', log: 10 },\n};\n\n// Options array for SettingsAutocomplete\nexport const LOG_BASE_OPTIONS = Object.entries(LOG_BASE_CONFIG).map(([id, config]) => ({\n id: id as string,\n ...config,\n}));\n\n// Both of these constants help produce a value that is LESS THAN the initial value.\n// For positive values, we multiply by a number less than 1 to get this outcome.\n// For negative values, we multiply to a number greater than 1 to get this outcome.\nexport const POSITIVE_MIN_VALUE_MULTIPLIER = 0.8;\nexport const NEGATIVE_MIN_VALUE_MULTIPLIER = 1.2;\n\n/**\n * Creates an initial/empty options object for the TimeSeriesChartPanel.\n */\nexport function createInitialTimeSeriesChartOptions(): TimeSeriesChartOptions {\n return {};\n}\n"],"names":["DEFAULT_FORMAT","unit","shortValues","DEFAULT_Y_AXIS","show","label","format","min","undefined","max","logBase","Y_AXIS_CONFIG","DEFAULT_DISPLAY","DEFAULT_LINE_WIDTH","DEFAULT_LINE_STYLE","DEFAULT_AREA_OPACITY","POINT_SIZE_OFFSET","DEFAULT_POINT_RADIUS","DEFAULT_CONNECT_NULLS","DEFAULT_VISUAL","display","lineWidth","lineStyle","areaOpacity","pointRadius","connectNulls","THRESHOLD_PLOT_INTERVAL","VISUAL_CONFIG","testId","step","stack","STACK_CONFIG","none","all","STACK_OPTIONS","Object","entries","map","id","config","LINE_STYLE_CONFIG","solid","dashed","dotted","OPACITY_CONFIG","LOG_BASE_CONFIG","log","LOG_BASE_OPTIONS","POSITIVE_MIN_VALUE_MULTIPLIER","NEGATIVE_MIN_VALUE_MULTIPLIER","createInitialTimeSeriesChartOptions"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/time-series-chart-model.ts"],"sourcesContent":["// Copyright 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 type { FormatOptions, ThresholdOptions } from '@perses-dev/components';\nimport type { LegendSpecOptions, OptionsEditorProps } from '@perses-dev/plugin-system';\nimport type { Definition } from '@perses-dev/spec';\nimport { schemeCategory10, schemeDark2, schemeSet1, schemeSet2, schemeSet3, schemeTableau10 } from 'd3-scale-chromatic';\n\n/**\n * Line style options for time series charts.\n */\nexport type LineStyleType = 'solid' | 'dashed' | 'dotted';\n\n/**\n * The schema for a TimeSeriesChart panel.\n */\nexport interface TimeSeriesChartDefinition extends Definition<TimeSeriesChartOptions> {\n kind: 'TimeSeriesChart';\n}\n\n/**\n * The Options object supported by the TimeSeriesChartPanel plugin.\n */\nexport interface TimeSeriesChartOptions {\n legend?: LegendSpecOptions;\n yAxis?: TimeSeriesChartYAxisOptions;\n thresholds?: ThresholdOptions;\n visual?: TimeSeriesChartVisualOptions;\n tooltip?: TooltipSpecOptions;\n querySettings?: QuerySettingsOptions[];\n}\n\nexport interface QuerySettingsOptions {\n queryIndex: number;\n colorMode?: 'fixed' | 'fixed-single';\n colorValue?: string;\n lineStyle?: LineStyleType;\n areaOpacity?: number;\n format?: FormatOptions;\n /**\n * If true, the query's series values are negated for display so they render\n * below the X axis. The original (positive) values are preserved for legend\n * calculations and CSV export, matching Grafana's `transform: \"negative-Y\"` behavior.\n */\n negativeY?: boolean;\n stack?: boolean;\n}\n\nexport type TimeSeriesChartOptionsEditorProps = OptionsEditorProps<TimeSeriesChartOptions>;\n\nexport interface TimeSeriesChartYAxisOptions {\n show?: boolean;\n label?: string;\n format?: FormatOptions;\n min?: number;\n max?: number;\n logBase?: LOG_BASE;\n}\n\nexport interface TooltipSpecOptions {\n enablePinning: boolean;\n}\n\nexport type TimeSeriesChartPaletteMode = 'auto' | 'categorical';\n\nexport const CATEGORICAL_PALETTE_SCHEMES = {\n category10: schemeCategory10,\n tableau10: schemeTableau10,\n set1: schemeSet1,\n set2: schemeSet2,\n set3: schemeSet3,\n dark2: schemeDark2,\n} as const;\n\nexport type CategoricalPaletteName = keyof typeof CATEGORICAL_PALETTE_SCHEMES;\n\nexport const CATEGORICAL_PALETTE_NAMES = Object.keys(CATEGORICAL_PALETTE_SCHEMES) as CategoricalPaletteName[];\n\nexport interface CategoricalSchemeMetadata {\n label: string;\n}\n\nexport const CATEGORICAL_SCHEME_METADATA: Record<CategoricalPaletteName, CategoricalSchemeMetadata> = {\n category10: { label: 'D3 Category 10' },\n tableau10: { label: 'Tableau 10' },\n set1: { label: 'ColorBrewer Set 1' },\n set2: { label: 'ColorBrewer Set 2' },\n set3: { label: 'ColorBrewer Set 3' },\n dark2: { label: 'ColorBrewer Dark 2' },\n};\n\nexport type TimeSeriesChartPaletteOptions =\n | { mode: 'auto' }\n | {\n mode: 'categorical';\n // Omitting falls back to the ECharts theme palette.\n name?: CategoricalPaletteName;\n };\n\nexport const PALETTE_DROPDOWN_TOOLTIP =\n 'Auto derives a unique color from the series name — same name always maps to the same color across panels. ' +\n 'Categorical palettes assign colors from a fixed set by series order.';\n\nexport type TimeSeriesChartVisualOptions = {\n display?: 'line' | 'bar';\n lineWidth?: number;\n lineStyle?: LineStyleType;\n areaOpacity?: number;\n showPoints?: 'auto' | 'always';\n palette?: TimeSeriesChartPaletteOptions;\n pointRadius?: number;\n stack?: StackOptions;\n connectNulls?: boolean;\n};\n\nexport const DEFAULT_FORMAT: FormatOptions = {\n unit: 'decimal',\n shortValues: true,\n};\n\nexport const DEFAULT_Y_AXIS: TimeSeriesChartYAxisOptions = {\n show: true,\n label: '',\n format: DEFAULT_FORMAT,\n min: undefined,\n max: undefined,\n logBase: undefined,\n};\n\nexport const Y_AXIS_CONFIG = {\n show: { label: 'Show' },\n label: { label: 'Label' },\n unit: { label: 'Unit' },\n min: { label: 'Min' },\n max: { label: 'Max' },\n logBase: { label: 'Log Base' },\n};\n\nexport const DEFAULT_DISPLAY = 'line';\nexport const DEFAULT_LINE_WIDTH = 1.25;\nexport const DEFAULT_LINE_STYLE = 'solid';\nexport const DEFAULT_AREA_OPACITY = 0;\n// How much larger datapoint symbols are than line width, also applied in VisualOptionsEditor.\nexport const POINT_SIZE_OFFSET = 1.5;\nexport const DEFAULT_POINT_RADIUS = DEFAULT_LINE_WIDTH + POINT_SIZE_OFFSET;\nexport const DEFAULT_CONNECT_NULLS = false;\n\nexport const DEFAULT_VISUAL: TimeSeriesChartVisualOptions = {\n display: DEFAULT_DISPLAY,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineStyle: DEFAULT_LINE_STYLE,\n areaOpacity: DEFAULT_AREA_OPACITY,\n pointRadius: DEFAULT_POINT_RADIUS,\n connectNulls: DEFAULT_CONNECT_NULLS,\n};\n\n// Controls how often static threshold values should be plotted so threshold data shows\n// in tooltip without flicker.\nexport const THRESHOLD_PLOT_INTERVAL = 15;\n\nexport const VISUAL_CONFIG = {\n lineWidth: {\n label: 'Line Width',\n testId: 'slider-line-width',\n min: 0.25,\n max: 3,\n step: 0.25,\n },\n lineStyle: {\n label: 'Line Style',\n },\n pointRadius: {\n label: 'Point Radius',\n testId: 'slider-point-radius',\n min: 0,\n max: 6,\n step: 0.25,\n },\n areaOpacity: {\n label: 'Area Opacity',\n testId: 'slider-area-opacity',\n min: 0,\n max: 1,\n step: 0.05,\n },\n stack: {\n label: 'Stack Series',\n },\n colorPalette: {\n label: 'Color Palette',\n },\n connectNulls: {\n label: 'Connect Nulls',\n },\n};\n\n// None is equivalent to undefined since stack is optional\nexport type StackOptions = 'none' | 'all'; // TODO: add percent option support\n\nexport const STACK_CONFIG = {\n none: { label: 'None' },\n all: { label: 'All' },\n // TODO: enable option after 'Percent' implemented\n // percent: { label: 'Percent', disabled: true }, // hidden since not implemented yet\n};\n\nexport const STACK_OPTIONS = Object.entries(STACK_CONFIG).map(([id, config]) => {\n return {\n id: id as StackOptions,\n ...config,\n };\n});\n\nexport const LINE_STYLE_CONFIG = {\n solid: { label: 'Solid' },\n dashed: { label: 'Dashes' },\n dotted: { label: 'Dots' },\n};\n\nexport const OPACITY_CONFIG = {\n label: 'Opacity',\n testId: 'slider-opacity',\n min: 0,\n max: 1,\n step: 0.05,\n};\n\n// LogBase outlines the allowed log bases for the log-supported charts.\nexport type LOG_BASE = undefined | 2 | 10;\n\n// Single source of truth for log base configuration\nexport const LOG_BASE_CONFIG: Record<string, { label: string; log: LOG_BASE }> = {\n none: { label: 'None', log: undefined },\n '2': { label: '2', log: 2 },\n '10': { label: '10', log: 10 },\n};\n\n// Options array for SettingsAutocomplete\nexport const LOG_BASE_OPTIONS = Object.entries(LOG_BASE_CONFIG).map(([id, config]) => ({\n id: id as string,\n ...config,\n}));\n\n// Both of these constants help produce a value that is LESS THAN the initial value.\n// For positive values, we multiply by a number less than 1 to get this outcome.\n// For negative values, we multiply to a number greater than 1 to get this outcome.\nexport const POSITIVE_MIN_VALUE_MULTIPLIER = 0.8;\nexport const NEGATIVE_MIN_VALUE_MULTIPLIER = 1.2;\n\n/**\n * Creates an initial/empty options object for the TimeSeriesChartPanel.\n */\nexport function createInitialTimeSeriesChartOptions(): TimeSeriesChartOptions {\n return {};\n}\n"],"names":["schemeCategory10","schemeDark2","schemeSet1","schemeSet2","schemeSet3","schemeTableau10","CATEGORICAL_PALETTE_SCHEMES","category10","tableau10","set1","set2","set3","dark2","CATEGORICAL_PALETTE_NAMES","Object","keys","CATEGORICAL_SCHEME_METADATA","label","PALETTE_DROPDOWN_TOOLTIP","DEFAULT_FORMAT","unit","shortValues","DEFAULT_Y_AXIS","show","format","min","undefined","max","logBase","Y_AXIS_CONFIG","DEFAULT_DISPLAY","DEFAULT_LINE_WIDTH","DEFAULT_LINE_STYLE","DEFAULT_AREA_OPACITY","POINT_SIZE_OFFSET","DEFAULT_POINT_RADIUS","DEFAULT_CONNECT_NULLS","DEFAULT_VISUAL","display","lineWidth","lineStyle","areaOpacity","pointRadius","connectNulls","THRESHOLD_PLOT_INTERVAL","VISUAL_CONFIG","testId","step","stack","colorPalette","STACK_CONFIG","none","all","STACK_OPTIONS","entries","map","id","config","LINE_STYLE_CONFIG","solid","dashed","dotted","OPACITY_CONFIG","LOG_BASE_CONFIG","log","LOG_BASE_OPTIONS","POSITIVE_MIN_VALUE_MULTIPLIER","NEGATIVE_MIN_VALUE_MULTIPLIER","createInitialTimeSeriesChartOptions"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-transform.d.ts","sourceRoot":"","sources":["../../../src/utils/data-transform.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EAEjB,gBAAgB,EAChB,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AACtH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAmB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE7F,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC3B,aAAa,EACd,MAAM,4BAA4B,CAAC;AAWpC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE1E,eAAO,MAAM,gBAAgB,EAAE,iBAI9B,CAAC;AAEF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,eAAO,MAAM,yBAAyB,cAAc,CAAC;AAErD,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,GAAG,SAAS,GAAG,SAAS,CAG7G;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,4BAA4B,EACpC,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,aAAa,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACpF,UAAU,CAAC,EAAE,MAAM,EACnB,kBAAkB,SAAI,GACrB,gBAAgB,CAsElB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAmB9E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CA2B9G;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,EACvC,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAMR;AA8BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,2BAAgC,GAAG,oBAAoB,CAgDnG;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI7C"}
1
+ {"version":3,"file":"data-transform.d.ts","sourceRoot":"","sources":["../../../src/utils/data-transform.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EAEjB,gBAAgB,EAChB,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AACtH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAmB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE7F,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC3B,aAAa,EACd,MAAM,4BAA4B,CAAC;AAWpC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE1E,eAAO,MAAM,gBAAgB,EAAE,iBAI9B,CAAC;AAEF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,eAAO,MAAM,yBAAyB,cAAc,CAAC;AAErD,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,GAAG,SAAS,GAAG,SAAS,CAG7G;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,4BAA4B,EACpC,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,aAAa,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACpF,UAAU,CAAC,EAAE,MAAM,EACnB,kBAAkB,SAAI,GACrB,gBAAgB,CAsElB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAmB9E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CA2B9G;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,EACvC,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAMR;AA6BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,2BAAgC,GAAG,oBAAoB,CAgDnG;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI7C"}
@@ -177,7 +177,6 @@ function findMax(data) {
177
177
  if (data.length && data[0] !== undefined && data[0]?.values) {
178
178
  data.forEach((series)=>{
179
179
  series.values.forEach((valueTuple)=>{
180
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
181
180
  const [_, value] = valueTuple;
182
181
  // Use the absolute value so percent thresholds compute correctly against
183
182
  // negated series (e.g. when `querySettings[].negativeY` is enabled).
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/data-transform.ts"],"sourcesContent":["// Copyright 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 type {\n LegacyTimeSeries,\n EChartsDataFormat,\n EChartsValues,\n TimeSeriesOption,\n StepOptions,\n} from '@perses-dev/components';\nimport { OPTIMIZED_MODE_SERIES_LIMIT, getCommonTimeScale } from '@perses-dev/components';\nimport type { useTimeSeriesQueries, PanelData } from '@perses-dev/plugin-system';\nimport type { Exemplar, Labels, TimeScale, TimeSeries, TimeSeriesData, TimeSeriesValueTuple } from '@perses-dev/spec';\nimport type { YAXisComponentOption } from 'echarts';\nimport type { LineSeriesOption, BarSeriesOption, ScatterSeriesOption } from 'echarts/charts';\n\nimport type {\n TimeSeriesChartVisualOptions,\n TimeSeriesChartYAxisOptions,\n LineStyleType,\n} from '../time-series-chart-model';\nimport {\n DEFAULT_AREA_OPACITY,\n DEFAULT_CONNECT_NULLS,\n DEFAULT_LINE_WIDTH,\n DEFAULT_POINT_RADIUS,\n DEFAULT_Y_AXIS,\n POSITIVE_MIN_VALUE_MULTIPLIER,\n NEGATIVE_MIN_VALUE_MULTIPLIER,\n} from '../time-series-chart-model';\n\nexport type RunningQueriesState = ReturnType<typeof useTimeSeriesQueries>;\n\nexport const EMPTY_GRAPH_DATA: EChartsDataFormat = {\n timeSeries: [],\n xAxis: [],\n legendItems: [],\n};\n\nexport const HIDE_DATAPOINTS_LIMIT = 70;\n\nexport const BLUR_FADEOUT_OPACITY = 0.5;\n\nexport const EXEMPLAR_SERIES_ID_PREFIX = 'exemplar-';\n\nexport const EXEMPLAR_SYMBOL_SIZE = 14;\n\n/**\n * The exemplars of one series, converted to a chart-friendly shape with the\n * rendering attributes (color, y axis) of the matching time series.\n */\nexport interface ExemplarChartData {\n seriesId: string;\n seriesName: string;\n color: string;\n seriesLabels?: Labels;\n yAxisIndex?: number;\n /**\n * When the matching series is rendered with `querySettings.negativeY`, its values are\n * visually negated so it renders below the X axis. The same transform is applied to\n * the exemplar markers' plotted Y values so they stay next to their series. The\n * original (positive) values remain on each `exemplar` for metadata display.\n */\n negativeY?: boolean;\n exemplars: Exemplar[];\n}\n\n/**\n * Given a list of running queries, calculates a common time scale for use on\n * the x axis (i.e. start/end dates and a step that is divisible into all of\n * the queries' steps).\n */\nexport function getCommonTimeScaleForQueries(queries: Array<PanelData<TimeSeriesData>>): TimeScale | undefined {\n const seriesData = queries.map((query) => query.data);\n return getCommonTimeScale(seriesData);\n}\n\n/**\n * Gets ECharts line series option properties for regular trends\n */\nexport function getTimeSeries(\n id: string,\n datasetIndex: number,\n formattedName: string,\n visual: TimeSeriesChartVisualOptions,\n timeScale: TimeScale,\n paletteColor: string,\n querySettings?: { lineStyle?: LineStyleType; areaOpacity?: number; stack?: boolean },\n yAxisIndex?: number,\n visibleSeriesCount = 1,\n): TimeSeriesOption {\n const lineWidth = visual.lineWidth ?? DEFAULT_LINE_WIDTH;\n const pointRadius = visual.pointRadius ?? DEFAULT_POINT_RADIUS;\n const shouldStack = querySettings?.stack !== undefined ? querySettings.stack : visual.stack === 'all';\n const areaOpacity = querySettings?.areaOpacity ?? visual.areaOpacity ?? DEFAULT_AREA_OPACITY;\n\n // Show automatic point markers only on short, sparse charts. Dense charts\n // otherwise create a symbol for every sample across every visible series.\n const minuteMs = 60000;\n let showPoints = timeScale.rangeMs <= minuteMs * 15 && visibleSeriesCount <= HIDE_DATAPOINTS_LIMIT;\n // Allows overriding default behavior and opt-in to always show all symbols (can hurt performance)\n if (visual.showPoints === 'always') {\n showPoints = true;\n }\n\n if (visual.display === 'bar') {\n const series: BarSeriesOption = {\n type: 'bar',\n id: id,\n datasetIndex,\n name: formattedName,\n color: paletteColor,\n stack: shouldStack ? 'all' : undefined,\n yAxisIndex: yAxisIndex,\n label: {\n show: false,\n },\n };\n return series;\n }\n\n const series: LineSeriesOption = {\n type: 'line',\n id: id,\n datasetIndex,\n name: formattedName,\n connectNulls: visual.connectNulls ?? DEFAULT_CONNECT_NULLS,\n color: paletteColor,\n stack: shouldStack ? 'all' : undefined,\n yAxisIndex: yAxisIndex,\n sampling: 'lttb',\n progressiveThreshold: OPTIMIZED_MODE_SERIES_LIMIT, // https://echarts.apache.org/en/option.html#series-lines.progressiveThreshold\n showSymbol: showPoints,\n showAllSymbol: true,\n symbolSize: pointRadius,\n lineStyle: {\n width: lineWidth,\n type: (querySettings?.lineStyle ?? visual.lineStyle) as LineStyleType,\n },\n // ECharts builds an area polygon whenever areaStyle is set, including at opacity 0.\n ...(areaOpacity > 0 ? { areaStyle: { opacity: areaOpacity } } : {}),\n // https://echarts.apache.org/en/option.html#series-line.emphasis\n emphasis: {\n focus: 'series',\n disabled: areaOpacity > 0, // prevents flicker when moving cursor between shaded regions\n lineStyle: {\n width: lineWidth + 1,\n opacity: 1,\n type: visual.lineStyle,\n },\n },\n blur: {\n lineStyle: {\n width: lineWidth,\n opacity: BLUR_FADEOUT_OPACITY,\n type: visual.lineStyle,\n },\n },\n };\n return series;\n}\n\n/**\n * Gets an ECharts scatter series rendering exemplar markers for a single series.\n * Each data item embeds its exemplar (and series labels) so the metadata dialog\n * can be populated when a marker is clicked.\n */\nexport function getExemplarSeries(data: ExemplarChartData): ScatterSeriesOption {\n return {\n type: 'scatter',\n id: `${EXEMPLAR_SERIES_ID_PREFIX}${data.seriesId}`,\n name: data.seriesName,\n color: data.color,\n yAxisIndex: data.yAxisIndex,\n symbol: 'diamond',\n symbolSize: EXEMPLAR_SYMBOL_SIZE,\n z: 10,\n cursor: 'pointer',\n data: data.exemplars.map((exemplar) => ({\n // The plotted Y value is negated when negativeY is enabled for the matching series,\n // while `exemplar.value` keeps the original value for the metadata tooltip.\n value: [exemplar.timestamp, data.negativeY ? -exemplar.value : exemplar.value],\n exemplar,\n seriesLabels: data.seriesLabels,\n })),\n };\n}\n\n/**\n * Gets threshold-specific line series styles\n * markLine cannot be used since it does not update yAxis max / min\n * and threshold data needs to show in the tooltip\n */\nexport function getThresholdSeries(name: string, threshold: StepOptions, seriesIndex: number): LineSeriesOption {\n return {\n type: 'line',\n name: name,\n id: name,\n datasetId: name,\n datasetIndex: seriesIndex,\n color: threshold.color,\n label: {\n show: false,\n },\n lineStyle: {\n type: 'dashed',\n width: 2,\n },\n emphasis: {\n focus: 'series',\n lineStyle: {\n width: 2.5,\n },\n },\n blur: {\n lineStyle: {\n opacity: BLUR_FADEOUT_OPACITY,\n },\n },\n };\n}\n\n/**\n * Converts percent threshold into absolute step value\n * If max is undefined, use the max value from time series data as default\n */\nexport function convertPercentThreshold(\n percent: number,\n data: LegacyTimeSeries[] | TimeSeries[],\n max?: number,\n min?: number,\n): number {\n const percentDecimal = percent / 100;\n const adjustedMax = max ?? findMax(data);\n const adjustedMin = min ?? 0;\n const total = adjustedMax - adjustedMin;\n return percentDecimal * total + adjustedMin;\n}\n\nfunction findMax(data: LegacyTimeSeries[] | TimeSeries[]): number {\n let max = 0;\n if (data.length && data[0] !== undefined && (data as TimeSeries[])[0]?.values) {\n (data as TimeSeries[]).forEach((series) => {\n series.values.forEach((valueTuple: TimeSeriesValueTuple) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, value] = valueTuple;\n // Use the absolute value so percent thresholds compute correctly against\n // negated series (e.g. when `querySettings[].negativeY` is enabled).\n if (typeof value === 'number' && Math.abs(value) > max) {\n max = Math.abs(value);\n }\n });\n });\n } else {\n (data as LegacyTimeSeries[]).forEach((series) => {\n if (series.data !== undefined) {\n series.data.forEach((value: EChartsValues) => {\n if (typeof value === 'number' && Math.abs(value) > max) {\n max = Math.abs(value);\n }\n });\n }\n });\n }\n return max;\n}\n\n/**\n * Converts Perses panel yAxis from dashboard spec to ECharts supported yAxis options.\n * Handles both linear and logarithmic scales with appropriate min/max calculations.\n */\nexport function convertPanelYAxis(inputAxis: TimeSeriesChartYAxisOptions = {}): YAXisComponentOption {\n // Determine the appropriate min value based on scale type and user input\n let minValue: YAXisComponentOption['min'];\n if (inputAxis.logBase !== undefined) {\n // For logarithmic scales without explicit min:\n // Let ECharts auto-calculate the range based on data to avoid issues with\n // function-based calculations which can result in improper ranges (e.g., 1-10)\n minValue = undefined;\n } else if (inputAxis?.min !== undefined) {\n // User explicitly set a min value - use it for both linear and log scales\n minValue = inputAxis.min;\n } else {\n // For linear scales without explicit min:\n // Use dynamic calculation with padding for better visualization\n // https://echarts.apache.org/en/option.html#yAxis.min\n minValue = (value): number => {\n if (value.min >= 0 && value.min <= 1) {\n // Helps with PercentDecimal units, or datasets that return 0 or 1 booleans\n return 0;\n }\n\n // Note: We can tweak the MULTIPLIER constants if we want\n // TODO: Experiment with using a padding that is based on the difference between max value and min value\n if (value.min > 0) {\n return roundDown(value.min * POSITIVE_MIN_VALUE_MULTIPLIER);\n } else {\n return roundDown(value.min * NEGATIVE_MIN_VALUE_MULTIPLIER);\n }\n };\n }\n\n // Build the yAxis configuration\n const yAxis: YAXisComponentOption = {\n show: inputAxis?.show ?? DEFAULT_Y_AXIS.show,\n min: minValue,\n max: inputAxis?.max,\n };\n\n // Apply logarithmic scale settings if requested\n if (inputAxis.logBase !== undefined) {\n return {\n ...yAxis,\n type: 'log',\n logBase: inputAxis.logBase,\n };\n }\n\n return yAxis;\n}\n\n/**\n * Rounds down to nearest number with one significant digit.\n *\n * Examples:\n * 1. 675 --> 600\n * 2. 0.567 --> 0.5\n * 3. -12 --> -20\n */\nexport function roundDown(num: number): number {\n const magnitude = Math.floor(Math.log10(Math.abs(num)));\n const firstDigit = Math.floor(num / Math.pow(10, magnitude));\n return Number((firstDigit * Math.pow(10, magnitude)).toPrecision(1));\n}\n"],"names":["OPTIMIZED_MODE_SERIES_LIMIT","getCommonTimeScale","DEFAULT_AREA_OPACITY","DEFAULT_CONNECT_NULLS","DEFAULT_LINE_WIDTH","DEFAULT_POINT_RADIUS","DEFAULT_Y_AXIS","POSITIVE_MIN_VALUE_MULTIPLIER","NEGATIVE_MIN_VALUE_MULTIPLIER","EMPTY_GRAPH_DATA","timeSeries","xAxis","legendItems","HIDE_DATAPOINTS_LIMIT","BLUR_FADEOUT_OPACITY","EXEMPLAR_SERIES_ID_PREFIX","EXEMPLAR_SYMBOL_SIZE","getCommonTimeScaleForQueries","queries","seriesData","map","query","data","getTimeSeries","id","datasetIndex","formattedName","visual","timeScale","paletteColor","querySettings","yAxisIndex","visibleSeriesCount","lineWidth","pointRadius","shouldStack","stack","undefined","areaOpacity","minuteMs","showPoints","rangeMs","display","series","type","name","color","label","show","connectNulls","sampling","progressiveThreshold","showSymbol","showAllSymbol","symbolSize","lineStyle","width","areaStyle","opacity","emphasis","focus","disabled","blur","getExemplarSeries","seriesId","seriesName","symbol","z","cursor","exemplars","exemplar","value","timestamp","negativeY","seriesLabels","getThresholdSeries","threshold","seriesIndex","datasetId","convertPercentThreshold","percent","max","min","percentDecimal","adjustedMax","findMax","adjustedMin","total","length","values","forEach","valueTuple","_","Math","abs","convertPanelYAxis","inputAxis","minValue","logBase","roundDown","yAxis","num","magnitude","floor","log10","firstDigit","pow","Number","toPrecision"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/data-transform.ts"],"sourcesContent":["// Copyright 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 type {\n LegacyTimeSeries,\n EChartsDataFormat,\n EChartsValues,\n TimeSeriesOption,\n StepOptions,\n} from '@perses-dev/components';\nimport { OPTIMIZED_MODE_SERIES_LIMIT, getCommonTimeScale } from '@perses-dev/components';\nimport type { useTimeSeriesQueries, PanelData } from '@perses-dev/plugin-system';\nimport type { Exemplar, Labels, TimeScale, TimeSeries, TimeSeriesData, TimeSeriesValueTuple } from '@perses-dev/spec';\nimport type { YAXisComponentOption } from 'echarts';\nimport type { LineSeriesOption, BarSeriesOption, ScatterSeriesOption } from 'echarts/charts';\n\nimport type {\n TimeSeriesChartVisualOptions,\n TimeSeriesChartYAxisOptions,\n LineStyleType,\n} from '../time-series-chart-model';\nimport {\n DEFAULT_AREA_OPACITY,\n DEFAULT_CONNECT_NULLS,\n DEFAULT_LINE_WIDTH,\n DEFAULT_POINT_RADIUS,\n DEFAULT_Y_AXIS,\n POSITIVE_MIN_VALUE_MULTIPLIER,\n NEGATIVE_MIN_VALUE_MULTIPLIER,\n} from '../time-series-chart-model';\n\nexport type RunningQueriesState = ReturnType<typeof useTimeSeriesQueries>;\n\nexport const EMPTY_GRAPH_DATA: EChartsDataFormat = {\n timeSeries: [],\n xAxis: [],\n legendItems: [],\n};\n\nexport const HIDE_DATAPOINTS_LIMIT = 70;\n\nexport const BLUR_FADEOUT_OPACITY = 0.5;\n\nexport const EXEMPLAR_SERIES_ID_PREFIX = 'exemplar-';\n\nexport const EXEMPLAR_SYMBOL_SIZE = 14;\n\n/**\n * The exemplars of one series, converted to a chart-friendly shape with the\n * rendering attributes (color, y axis) of the matching time series.\n */\nexport interface ExemplarChartData {\n seriesId: string;\n seriesName: string;\n color: string;\n seriesLabels?: Labels;\n yAxisIndex?: number;\n /**\n * When the matching series is rendered with `querySettings.negativeY`, its values are\n * visually negated so it renders below the X axis. The same transform is applied to\n * the exemplar markers' plotted Y values so they stay next to their series. The\n * original (positive) values remain on each `exemplar` for metadata display.\n */\n negativeY?: boolean;\n exemplars: Exemplar[];\n}\n\n/**\n * Given a list of running queries, calculates a common time scale for use on\n * the x axis (i.e. start/end dates and a step that is divisible into all of\n * the queries' steps).\n */\nexport function getCommonTimeScaleForQueries(queries: Array<PanelData<TimeSeriesData>>): TimeScale | undefined {\n const seriesData = queries.map((query) => query.data);\n return getCommonTimeScale(seriesData);\n}\n\n/**\n * Gets ECharts line series option properties for regular trends\n */\nexport function getTimeSeries(\n id: string,\n datasetIndex: number,\n formattedName: string,\n visual: TimeSeriesChartVisualOptions,\n timeScale: TimeScale,\n paletteColor: string,\n querySettings?: { lineStyle?: LineStyleType; areaOpacity?: number; stack?: boolean },\n yAxisIndex?: number,\n visibleSeriesCount = 1,\n): TimeSeriesOption {\n const lineWidth = visual.lineWidth ?? DEFAULT_LINE_WIDTH;\n const pointRadius = visual.pointRadius ?? DEFAULT_POINT_RADIUS;\n const shouldStack = querySettings?.stack !== undefined ? querySettings.stack : visual.stack === 'all';\n const areaOpacity = querySettings?.areaOpacity ?? visual.areaOpacity ?? DEFAULT_AREA_OPACITY;\n\n // Show automatic point markers only on short, sparse charts. Dense charts\n // otherwise create a symbol for every sample across every visible series.\n const minuteMs = 60000;\n let showPoints = timeScale.rangeMs <= minuteMs * 15 && visibleSeriesCount <= HIDE_DATAPOINTS_LIMIT;\n // Allows overriding default behavior and opt-in to always show all symbols (can hurt performance)\n if (visual.showPoints === 'always') {\n showPoints = true;\n }\n\n if (visual.display === 'bar') {\n const series: BarSeriesOption = {\n type: 'bar',\n id: id,\n datasetIndex,\n name: formattedName,\n color: paletteColor,\n stack: shouldStack ? 'all' : undefined,\n yAxisIndex: yAxisIndex,\n label: {\n show: false,\n },\n };\n return series;\n }\n\n const series: LineSeriesOption = {\n type: 'line',\n id: id,\n datasetIndex,\n name: formattedName,\n connectNulls: visual.connectNulls ?? DEFAULT_CONNECT_NULLS,\n color: paletteColor,\n stack: shouldStack ? 'all' : undefined,\n yAxisIndex: yAxisIndex,\n sampling: 'lttb',\n progressiveThreshold: OPTIMIZED_MODE_SERIES_LIMIT, // https://echarts.apache.org/en/option.html#series-lines.progressiveThreshold\n showSymbol: showPoints,\n showAllSymbol: true,\n symbolSize: pointRadius,\n lineStyle: {\n width: lineWidth,\n type: (querySettings?.lineStyle ?? visual.lineStyle) as LineStyleType,\n },\n // ECharts builds an area polygon whenever areaStyle is set, including at opacity 0.\n ...(areaOpacity > 0 ? { areaStyle: { opacity: areaOpacity } } : {}),\n // https://echarts.apache.org/en/option.html#series-line.emphasis\n emphasis: {\n focus: 'series',\n disabled: areaOpacity > 0, // prevents flicker when moving cursor between shaded regions\n lineStyle: {\n width: lineWidth + 1,\n opacity: 1,\n type: visual.lineStyle,\n },\n },\n blur: {\n lineStyle: {\n width: lineWidth,\n opacity: BLUR_FADEOUT_OPACITY,\n type: visual.lineStyle,\n },\n },\n };\n return series;\n}\n\n/**\n * Gets an ECharts scatter series rendering exemplar markers for a single series.\n * Each data item embeds its exemplar (and series labels) so the metadata dialog\n * can be populated when a marker is clicked.\n */\nexport function getExemplarSeries(data: ExemplarChartData): ScatterSeriesOption {\n return {\n type: 'scatter',\n id: `${EXEMPLAR_SERIES_ID_PREFIX}${data.seriesId}`,\n name: data.seriesName,\n color: data.color,\n yAxisIndex: data.yAxisIndex,\n symbol: 'diamond',\n symbolSize: EXEMPLAR_SYMBOL_SIZE,\n z: 10,\n cursor: 'pointer',\n data: data.exemplars.map((exemplar) => ({\n // The plotted Y value is negated when negativeY is enabled for the matching series,\n // while `exemplar.value` keeps the original value for the metadata tooltip.\n value: [exemplar.timestamp, data.negativeY ? -exemplar.value : exemplar.value],\n exemplar,\n seriesLabels: data.seriesLabels,\n })),\n };\n}\n\n/**\n * Gets threshold-specific line series styles\n * markLine cannot be used since it does not update yAxis max / min\n * and threshold data needs to show in the tooltip\n */\nexport function getThresholdSeries(name: string, threshold: StepOptions, seriesIndex: number): LineSeriesOption {\n return {\n type: 'line',\n name: name,\n id: name,\n datasetId: name,\n datasetIndex: seriesIndex,\n color: threshold.color,\n label: {\n show: false,\n },\n lineStyle: {\n type: 'dashed',\n width: 2,\n },\n emphasis: {\n focus: 'series',\n lineStyle: {\n width: 2.5,\n },\n },\n blur: {\n lineStyle: {\n opacity: BLUR_FADEOUT_OPACITY,\n },\n },\n };\n}\n\n/**\n * Converts percent threshold into absolute step value\n * If max is undefined, use the max value from time series data as default\n */\nexport function convertPercentThreshold(\n percent: number,\n data: LegacyTimeSeries[] | TimeSeries[],\n max?: number,\n min?: number,\n): number {\n const percentDecimal = percent / 100;\n const adjustedMax = max ?? findMax(data);\n const adjustedMin = min ?? 0;\n const total = adjustedMax - adjustedMin;\n return percentDecimal * total + adjustedMin;\n}\n\nfunction findMax(data: LegacyTimeSeries[] | TimeSeries[]): number {\n let max = 0;\n if (data.length && data[0] !== undefined && (data as TimeSeries[])[0]?.values) {\n (data as TimeSeries[]).forEach((series) => {\n series.values.forEach((valueTuple: TimeSeriesValueTuple) => {\n const [_, value] = valueTuple;\n // Use the absolute value so percent thresholds compute correctly against\n // negated series (e.g. when `querySettings[].negativeY` is enabled).\n if (typeof value === 'number' && Math.abs(value) > max) {\n max = Math.abs(value);\n }\n });\n });\n } else {\n (data as LegacyTimeSeries[]).forEach((series) => {\n if (series.data !== undefined) {\n series.data.forEach((value: EChartsValues) => {\n if (typeof value === 'number' && Math.abs(value) > max) {\n max = Math.abs(value);\n }\n });\n }\n });\n }\n return max;\n}\n\n/**\n * Converts Perses panel yAxis from dashboard spec to ECharts supported yAxis options.\n * Handles both linear and logarithmic scales with appropriate min/max calculations.\n */\nexport function convertPanelYAxis(inputAxis: TimeSeriesChartYAxisOptions = {}): YAXisComponentOption {\n // Determine the appropriate min value based on scale type and user input\n let minValue: YAXisComponentOption['min'];\n if (inputAxis.logBase !== undefined) {\n // For logarithmic scales without explicit min:\n // Let ECharts auto-calculate the range based on data to avoid issues with\n // function-based calculations which can result in improper ranges (e.g., 1-10)\n minValue = undefined;\n } else if (inputAxis?.min !== undefined) {\n // User explicitly set a min value - use it for both linear and log scales\n minValue = inputAxis.min;\n } else {\n // For linear scales without explicit min:\n // Use dynamic calculation with padding for better visualization\n // https://echarts.apache.org/en/option.html#yAxis.min\n minValue = (value): number => {\n if (value.min >= 0 && value.min <= 1) {\n // Helps with PercentDecimal units, or datasets that return 0 or 1 booleans\n return 0;\n }\n\n // Note: We can tweak the MULTIPLIER constants if we want\n // TODO: Experiment with using a padding that is based on the difference between max value and min value\n if (value.min > 0) {\n return roundDown(value.min * POSITIVE_MIN_VALUE_MULTIPLIER);\n } else {\n return roundDown(value.min * NEGATIVE_MIN_VALUE_MULTIPLIER);\n }\n };\n }\n\n // Build the yAxis configuration\n const yAxis: YAXisComponentOption = {\n show: inputAxis?.show ?? DEFAULT_Y_AXIS.show,\n min: minValue,\n max: inputAxis?.max,\n };\n\n // Apply logarithmic scale settings if requested\n if (inputAxis.logBase !== undefined) {\n return {\n ...yAxis,\n type: 'log',\n logBase: inputAxis.logBase,\n };\n }\n\n return yAxis;\n}\n\n/**\n * Rounds down to nearest number with one significant digit.\n *\n * Examples:\n * 1. 675 --> 600\n * 2. 0.567 --> 0.5\n * 3. -12 --> -20\n */\nexport function roundDown(num: number): number {\n const magnitude = Math.floor(Math.log10(Math.abs(num)));\n const firstDigit = Math.floor(num / Math.pow(10, magnitude));\n return Number((firstDigit * Math.pow(10, magnitude)).toPrecision(1));\n}\n"],"names":["OPTIMIZED_MODE_SERIES_LIMIT","getCommonTimeScale","DEFAULT_AREA_OPACITY","DEFAULT_CONNECT_NULLS","DEFAULT_LINE_WIDTH","DEFAULT_POINT_RADIUS","DEFAULT_Y_AXIS","POSITIVE_MIN_VALUE_MULTIPLIER","NEGATIVE_MIN_VALUE_MULTIPLIER","EMPTY_GRAPH_DATA","timeSeries","xAxis","legendItems","HIDE_DATAPOINTS_LIMIT","BLUR_FADEOUT_OPACITY","EXEMPLAR_SERIES_ID_PREFIX","EXEMPLAR_SYMBOL_SIZE","getCommonTimeScaleForQueries","queries","seriesData","map","query","data","getTimeSeries","id","datasetIndex","formattedName","visual","timeScale","paletteColor","querySettings","yAxisIndex","visibleSeriesCount","lineWidth","pointRadius","shouldStack","stack","undefined","areaOpacity","minuteMs","showPoints","rangeMs","display","series","type","name","color","label","show","connectNulls","sampling","progressiveThreshold","showSymbol","showAllSymbol","symbolSize","lineStyle","width","areaStyle","opacity","emphasis","focus","disabled","blur","getExemplarSeries","seriesId","seriesName","symbol","z","cursor","exemplars","exemplar","value","timestamp","negativeY","seriesLabels","getThresholdSeries","threshold","seriesIndex","datasetId","convertPercentThreshold","percent","max","min","percentDecimal","adjustedMax","findMax","adjustedMin","total","length","values","forEach","valueTuple","_","Math","abs","convertPanelYAxis","inputAxis","minValue","logBase","roundDown","yAxis","num","magnitude","floor","log10","firstDigit","pow","Number","toPrecision"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { QuerySettingsOptions, TimeSeriesChartVisualOptions } from '../time-series-chart-model';
2
2
  export interface SeriesColorProps {
3
- categoricalPalette: string[];
3
+ defaultCategoricalPalette: string[];
4
4
  visual: TimeSeriesChartVisualOptions;
5
5
  muiPrimaryColor: string;
6
6
  seriesName: string;
@@ -20,6 +20,6 @@ export declare function getAutoPaletteColor(name: string, fallbackColor: string)
20
20
  /**
21
21
  * Default classical qualitative palette that cycles through the colors array by index.
22
22
  */
23
- export declare function getCategoricalPaletteColor(palette: string[], seriesIndex: number, fallbackColor: string): string;
23
+ export declare function getCategoricalPaletteColor(palette: readonly string[], seriesIndex: number, fallbackColor: string): string;
24
24
  export declare function getConsistentSeriesNameColor(inputString: string): string;
25
25
  //# sourceMappingURL=palette-gen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"palette-gen.d.ts","sourceRoot":"","sources":["../../../src/utils/palette-gen.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAGrG,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,4BAA4B,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAgC9D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAUhH;AAKD,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExE"}
1
+ {"version":3,"file":"palette-gen.d.ts","sourceRoot":"","sources":["../../../src/utils/palette-gen.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAIrG,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,MAAM,EAAE,4BAA4B,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAqC9D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,MAAM,CAQR;AAKD,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExE"}
@@ -10,11 +10,12 @@
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
+ import { CATEGORICAL_PALETTE_SCHEMES } from "../time-series-chart-model.js";
13
14
  import { getConsistentColor } from "./palette.js";
14
15
  /**
15
16
  * Get line color as well as color for tooltip and legend, account for whether palette is 'categorical' or 'auto' aka generative
16
17
  */ export function getSeriesColor(props) {
17
- const { categoricalPalette, visual, muiPrimaryColor, seriesName, seriesIndex, querySettings, queryHasMultipleResults } = props;
18
+ const { defaultCategoricalPalette, visual, muiPrimaryColor, seriesName, seriesIndex, querySettings, queryHasMultipleResults } = props;
18
19
  // Use color overrides defined in query settings in priority, if applicable
19
20
  if (querySettings) {
20
21
  if (querySettings.colorMode === 'fixed' && querySettings.colorValue) {
@@ -24,11 +25,16 @@ import { getConsistentColor } from "./palette.js";
24
25
  }
25
26
  }
26
27
  // Fallback is unlikely to set unless echarts theme palette in charts theme provider is undefined.
27
- const fallbackColor = Array.isArray(categoricalPalette) && categoricalPalette[0] ? categoricalPalette[0] // Needed since echarts color property isn't always an array.
28
+ const fallbackColor = Array.isArray(defaultCategoricalPalette) && defaultCategoricalPalette[0] ? defaultCategoricalPalette[0] // Needed since echarts color property isn't always an array.
28
29
  : muiPrimaryColor;
29
30
  // Explicit way to always cycle through classical palette instead of changing when based on number of series.
30
31
  if (visual.palette?.mode === 'categorical') {
31
- return getCategoricalPaletteColor(categoricalPalette, seriesIndex, fallbackColor);
32
+ const schemeName = visual.palette.name;
33
+ const scheme = schemeName ? CATEGORICAL_PALETTE_SCHEMES[schemeName] : null;
34
+ const palette = scheme && scheme.length > 0 ? scheme : defaultCategoricalPalette;
35
+ if (palette && palette.length > 0) {
36
+ return getCategoricalPaletteColor(palette, seriesIndex, fallbackColor);
37
+ }
32
38
  }
33
39
  return getAutoPaletteColor(seriesName, fallbackColor);
34
40
  }
@@ -43,15 +49,13 @@ import { getConsistentColor } from "./palette.js";
43
49
  /**
44
50
  * Default classical qualitative palette that cycles through the colors array by index.
45
51
  */ export function getCategoricalPaletteColor(palette, seriesIndex, fallbackColor) {
46
- if (palette === undefined) {
52
+ if (!palette || palette.length === 0) {
47
53
  return fallbackColor;
48
54
  }
49
55
  // Loop through predefined static color palette
50
- const paletteTotalColors = palette.length ?? 1;
51
- const paletteIndex = seriesIndex % paletteTotalColors;
56
+ const paletteIndex = seriesIndex % palette.length;
52
57
  // fallback color comes from echarts theme
53
- const seriesColor = palette[paletteIndex] ?? fallbackColor;
54
- return seriesColor;
58
+ return palette[paletteIndex] ?? fallbackColor;
55
59
  }
56
60
  /*
57
61
  * Generate a consistent series name color (if series name includes 'error', it will have a red hue).
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/palette-gen.ts"],"sourcesContent":["// Copyright 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 type { QuerySettingsOptions, TimeSeriesChartVisualOptions } from '../time-series-chart-model';\nimport { getConsistentColor } from './palette';\n\nexport interface SeriesColorProps {\n categoricalPalette: string[];\n visual: TimeSeriesChartVisualOptions;\n muiPrimaryColor: string;\n seriesName: string;\n seriesIndex: number;\n querySettings?: QuerySettingsOptions;\n queryHasMultipleResults?: boolean;\n}\n\n/**\n * Get line color as well as color for tooltip and legend, account for whether palette is 'categorical' or 'auto' aka generative\n */\nexport function getSeriesColor(props: SeriesColorProps): string {\n const {\n categoricalPalette,\n visual,\n muiPrimaryColor,\n seriesName,\n seriesIndex,\n querySettings,\n queryHasMultipleResults,\n } = props;\n\n // Use color overrides defined in query settings in priority, if applicable\n if (querySettings) {\n if (querySettings.colorMode === 'fixed' && querySettings.colorValue) {\n return querySettings.colorValue;\n } else if (querySettings.colorMode === 'fixed-single' && !queryHasMultipleResults && querySettings.colorValue) {\n return querySettings.colorValue;\n }\n }\n\n // Fallback is unlikely to set unless echarts theme palette in charts theme provider is undefined.\n const fallbackColor =\n Array.isArray(categoricalPalette) && categoricalPalette[0]\n ? (categoricalPalette[0] as string) // Needed since echarts color property isn't always an array.\n : muiPrimaryColor;\n\n // Explicit way to always cycle through classical palette instead of changing when based on number of series.\n if (visual.palette?.mode === 'categorical') {\n return getCategoricalPaletteColor(categoricalPalette, seriesIndex, fallbackColor);\n }\n\n return getAutoPaletteColor(seriesName, fallbackColor);\n}\n\n/**\n * Get color from generative color palette, this approaches uses series name as the seed and\n * allows for consistent colors across panels (when all panels use this approach).\n */\nexport function getAutoPaletteColor(name: string, fallbackColor: string): string {\n // corresponds to 'Auto' in palette.kind for generative color palette\n const generatedColor = getConsistentSeriesNameColor(name);\n return generatedColor ?? fallbackColor;\n}\n\n/**\n * Default classical qualitative palette that cycles through the colors array by index.\n */\nexport function getCategoricalPaletteColor(palette: string[], seriesIndex: number, fallbackColor: string): string {\n if (palette === undefined) {\n return fallbackColor;\n }\n // Loop through predefined static color palette\n const paletteTotalColors = palette.length ?? 1;\n const paletteIndex = seriesIndex % paletteTotalColors;\n // fallback color comes from echarts theme\n const seriesColor = palette[paletteIndex] ?? fallbackColor;\n return seriesColor;\n}\n\n/*\n * Generate a consistent series name color (if series name includes 'error', it will have a red hue).\n */\nexport function getConsistentSeriesNameColor(inputString: string): string {\n return getConsistentColor(inputString, inputString.toLowerCase().includes('error'));\n}\n"],"names":["getConsistentColor","getSeriesColor","props","categoricalPalette","visual","muiPrimaryColor","seriesName","seriesIndex","querySettings","queryHasMultipleResults","colorMode","colorValue","fallbackColor","Array","isArray","palette","mode","getCategoricalPaletteColor","getAutoPaletteColor","name","generatedColor","getConsistentSeriesNameColor","undefined","paletteTotalColors","length","paletteIndex","seriesColor","inputString","toLowerCase","includes"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAGjC,SAASA,kBAAkB,QAAQ,eAAY;AAY/C;;CAEC,GACD,OAAO,SAASC,eAAeC,KAAuB;IACpD,MAAM,EACJC,kBAAkB,EAClBC,MAAM,EACNC,eAAe,EACfC,UAAU,EACVC,WAAW,EACXC,aAAa,EACbC,uBAAuB,EACxB,GAAGP;IAEJ,2EAA2E;IAC3E,IAAIM,eAAe;QACjB,IAAIA,cAAcE,SAAS,KAAK,WAAWF,cAAcG,UAAU,EAAE;YACnE,OAAOH,cAAcG,UAAU;QACjC,OAAO,IAAIH,cAAcE,SAAS,KAAK,kBAAkB,CAACD,2BAA2BD,cAAcG,UAAU,EAAE;YAC7G,OAAOH,cAAcG,UAAU;QACjC;IACF;IAEA,kGAAkG;IAClG,MAAMC,gBACJC,MAAMC,OAAO,CAACX,uBAAuBA,kBAAkB,CAAC,EAAE,GACrDA,kBAAkB,CAAC,EAAE,CAAY,6DAA6D;OAC/FE;IAEN,6GAA6G;IAC7G,IAAID,OAAOW,OAAO,EAAEC,SAAS,eAAe;QAC1C,OAAOC,2BAA2Bd,oBAAoBI,aAAaK;IACrE;IAEA,OAAOM,oBAAoBZ,YAAYM;AACzC;AAEA;;;CAGC,GACD,OAAO,SAASM,oBAAoBC,IAAY,EAAEP,aAAqB;IACrE,qEAAqE;IACrE,MAAMQ,iBAAiBC,6BAA6BF;IACpD,OAAOC,kBAAkBR;AAC3B;AAEA;;CAEC,GACD,OAAO,SAASK,2BAA2BF,OAAiB,EAAER,WAAmB,EAAEK,aAAqB;IACtG,IAAIG,YAAYO,WAAW;QACzB,OAAOV;IACT;IACA,+CAA+C;IAC/C,MAAMW,qBAAqBR,QAAQS,MAAM,IAAI;IAC7C,MAAMC,eAAelB,cAAcgB;IACnC,0CAA0C;IAC1C,MAAMG,cAAcX,OAAO,CAACU,aAAa,IAAIb;IAC7C,OAAOc;AACT;AAEA;;CAEC,GACD,OAAO,SAASL,6BAA6BM,WAAmB;IAC9D,OAAO3B,mBAAmB2B,aAAaA,YAAYC,WAAW,GAAGC,QAAQ,CAAC;AAC5E"}
1
+ {"version":3,"sources":["../../../src/utils/palette-gen.ts"],"sourcesContent":["// Copyright 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 type { QuerySettingsOptions, TimeSeriesChartVisualOptions } from '../time-series-chart-model';\nimport { CATEGORICAL_PALETTE_SCHEMES } from '../time-series-chart-model';\nimport { getConsistentColor } from './palette';\n\nexport interface SeriesColorProps {\n defaultCategoricalPalette: string[];\n visual: TimeSeriesChartVisualOptions;\n muiPrimaryColor: string;\n seriesName: string;\n seriesIndex: number;\n querySettings?: QuerySettingsOptions;\n queryHasMultipleResults?: boolean;\n}\n\n/**\n * Get line color as well as color for tooltip and legend, account for whether palette is 'categorical' or 'auto' aka generative\n */\nexport function getSeriesColor(props: SeriesColorProps): string {\n const {\n defaultCategoricalPalette,\n visual,\n muiPrimaryColor,\n seriesName,\n seriesIndex,\n querySettings,\n queryHasMultipleResults,\n } = props;\n\n // Use color overrides defined in query settings in priority, if applicable\n if (querySettings) {\n if (querySettings.colorMode === 'fixed' && querySettings.colorValue) {\n return querySettings.colorValue;\n } else if (querySettings.colorMode === 'fixed-single' && !queryHasMultipleResults && querySettings.colorValue) {\n return querySettings.colorValue;\n }\n }\n\n // Fallback is unlikely to set unless echarts theme palette in charts theme provider is undefined.\n const fallbackColor =\n Array.isArray(defaultCategoricalPalette) && defaultCategoricalPalette[0]\n ? (defaultCategoricalPalette[0] as string) // Needed since echarts color property isn't always an array.\n : muiPrimaryColor;\n\n // Explicit way to always cycle through classical palette instead of changing when based on number of series.\n if (visual.palette?.mode === 'categorical') {\n const schemeName = visual.palette.name;\n const scheme = schemeName ? CATEGORICAL_PALETTE_SCHEMES[schemeName] : null;\n const palette = scheme && scheme.length > 0 ? scheme : defaultCategoricalPalette;\n if (palette && palette.length > 0) {\n return getCategoricalPaletteColor(palette, seriesIndex, fallbackColor);\n }\n }\n\n return getAutoPaletteColor(seriesName, fallbackColor);\n}\n\n/**\n * Get color from generative color palette, this approaches uses series name as the seed and\n * allows for consistent colors across panels (when all panels use this approach).\n */\nexport function getAutoPaletteColor(name: string, fallbackColor: string): string {\n // corresponds to 'Auto' in palette.kind for generative color palette\n const generatedColor = getConsistentSeriesNameColor(name);\n return generatedColor ?? fallbackColor;\n}\n\n/**\n * Default classical qualitative palette that cycles through the colors array by index.\n */\nexport function getCategoricalPaletteColor(\n palette: readonly string[],\n seriesIndex: number,\n fallbackColor: string,\n): string {\n if (!palette || palette.length === 0) {\n return fallbackColor;\n }\n // Loop through predefined static color palette\n const paletteIndex = seriesIndex % palette.length;\n // fallback color comes from echarts theme\n return palette[paletteIndex] ?? fallbackColor;\n}\n\n/*\n * Generate a consistent series name color (if series name includes 'error', it will have a red hue).\n */\nexport function getConsistentSeriesNameColor(inputString: string): string {\n return getConsistentColor(inputString, inputString.toLowerCase().includes('error'));\n}\n"],"names":["CATEGORICAL_PALETTE_SCHEMES","getConsistentColor","getSeriesColor","props","defaultCategoricalPalette","visual","muiPrimaryColor","seriesName","seriesIndex","querySettings","queryHasMultipleResults","colorMode","colorValue","fallbackColor","Array","isArray","palette","mode","schemeName","name","scheme","length","getCategoricalPaletteColor","getAutoPaletteColor","generatedColor","getConsistentSeriesNameColor","paletteIndex","inputString","toLowerCase","includes"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAGjC,SAASA,2BAA2B,QAAQ,gCAA6B;AACzE,SAASC,kBAAkB,QAAQ,eAAY;AAY/C;;CAEC,GACD,OAAO,SAASC,eAAeC,KAAuB;IACpD,MAAM,EACJC,yBAAyB,EACzBC,MAAM,EACNC,eAAe,EACfC,UAAU,EACVC,WAAW,EACXC,aAAa,EACbC,uBAAuB,EACxB,GAAGP;IAEJ,2EAA2E;IAC3E,IAAIM,eAAe;QACjB,IAAIA,cAAcE,SAAS,KAAK,WAAWF,cAAcG,UAAU,EAAE;YACnE,OAAOH,cAAcG,UAAU;QACjC,OAAO,IAAIH,cAAcE,SAAS,KAAK,kBAAkB,CAACD,2BAA2BD,cAAcG,UAAU,EAAE;YAC7G,OAAOH,cAAcG,UAAU;QACjC;IACF;IAEA,kGAAkG;IAClG,MAAMC,gBACJC,MAAMC,OAAO,CAACX,8BAA8BA,yBAAyB,CAAC,EAAE,GACnEA,yBAAyB,CAAC,EAAE,CAAY,6DAA6D;OACtGE;IAEN,6GAA6G;IAC7G,IAAID,OAAOW,OAAO,EAAEC,SAAS,eAAe;QAC1C,MAAMC,aAAab,OAAOW,OAAO,CAACG,IAAI;QACtC,MAAMC,SAASF,aAAalB,2BAA2B,CAACkB,WAAW,GAAG;QACtE,MAAMF,UAAUI,UAAUA,OAAOC,MAAM,GAAG,IAAID,SAAShB;QACvD,IAAIY,WAAWA,QAAQK,MAAM,GAAG,GAAG;YACjC,OAAOC,2BAA2BN,SAASR,aAAaK;QAC1D;IACF;IAEA,OAAOU,oBAAoBhB,YAAYM;AACzC;AAEA;;;CAGC,GACD,OAAO,SAASU,oBAAoBJ,IAAY,EAAEN,aAAqB;IACrE,qEAAqE;IACrE,MAAMW,iBAAiBC,6BAA6BN;IACpD,OAAOK,kBAAkBX;AAC3B;AAEA;;CAEC,GACD,OAAO,SAASS,2BACdN,OAA0B,EAC1BR,WAAmB,EACnBK,aAAqB;IAErB,IAAI,CAACG,WAAWA,QAAQK,MAAM,KAAK,GAAG;QACpC,OAAOR;IACT;IACA,+CAA+C;IAC/C,MAAMa,eAAelB,cAAcQ,QAAQK,MAAM;IACjD,0CAA0C;IAC1C,OAAOL,OAAO,CAACU,aAAa,IAAIb;AAClC;AAEA;;CAEC,GACD,OAAO,SAASY,6BAA6BE,WAAmB;IAC9D,OAAO1B,mBAAmB0B,aAAaA,YAAYC,WAAW,GAAGC,QAAQ,CAAC;AAC5E"}