@reshape-biotech/design-system 1.2.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +5 -1
  2. package/dist/app.css +97 -97
  3. package/dist/components/activity/Activity.stories.svelte +104 -104
  4. package/dist/components/activity/Activity.svelte +112 -112
  5. package/dist/components/avatar/Avatar.stories.svelte +23 -23
  6. package/dist/components/avatar/Avatar.svelte +54 -54
  7. package/dist/components/banner/Banner.stories.svelte +105 -105
  8. package/dist/components/banner/Banner.svelte +42 -42
  9. package/dist/components/button/Button.stories.svelte +61 -61
  10. package/dist/components/button/Button.svelte +95 -95
  11. package/dist/components/card/Card.stories.svelte +112 -112
  12. package/dist/components/card/Card.svelte +18 -18
  13. package/dist/components/checkbox/Checkbox.stories.svelte +8 -8
  14. package/dist/components/checkbox/Checkbox.svelte +17 -17
  15. package/dist/components/collapsible/Collapsible.stories.svelte +26 -26
  16. package/dist/components/collapsible/components/collapsible-content.svelte +20 -20
  17. package/dist/components/collapsible/components/collapsible-trigger.svelte +12 -12
  18. package/dist/components/collapsible/index.d.ts +1 -1
  19. package/dist/components/combobox/Combobox.stories.svelte +412 -412
  20. package/dist/components/combobox/components/combobox-add.svelte +8 -8
  21. package/dist/components/combobox/components/combobox-content.svelte +39 -39
  22. package/dist/components/combobox/components/combobox-indicator.svelte +1 -1
  23. package/dist/components/combobox/index.d.ts +1 -1
  24. package/dist/components/datepicker/DatePicker.stories.svelte +196 -196
  25. package/dist/components/datepicker/DatePicker.svelte +173 -173
  26. package/dist/components/divider/Divider.stories.svelte +7 -7
  27. package/dist/components/divider/Divider.svelte +9 -9
  28. package/dist/components/drawer/Drawer.stories.svelte +51 -51
  29. package/dist/components/drawer/Drawer.svelte +33 -33
  30. package/dist/components/drawer/DrawerLabel.svelte +10 -10
  31. package/dist/components/dropdown/Dropdown.stories.svelte +210 -210
  32. package/dist/components/dropdown/Dropdown.svelte +57 -57
  33. package/dist/components/dropdown/components/DropdownContent.svelte +16 -16
  34. package/dist/components/dropdown/components/DropdownMenu.svelte +10 -10
  35. package/dist/components/dropdown/components/DropdownTrigger.svelte +37 -37
  36. package/dist/components/dropdown/components/OutlinedButton.svelte +9 -9
  37. package/dist/components/empty-content/EmptyContent.stories.svelte +38 -38
  38. package/dist/components/empty-content/EmptyContent.svelte +12 -12
  39. package/dist/components/graphs/bar-chart/BarChart.stories.svelte +91 -91
  40. package/dist/components/graphs/bar-chart/BarChart.svelte +147 -147
  41. package/dist/components/graphs/bar-chart/StackedBarChart.stories.svelte +57 -57
  42. package/dist/components/graphs/bar-chart/StackedBarChart.svelte +198 -199
  43. package/dist/components/graphs/chart/Chart.stories.svelte +96 -96
  44. package/dist/components/graphs/chart/Chart.svelte +207 -207
  45. package/dist/components/graphs/line/LineChart.stories.svelte +138 -138
  46. package/dist/components/graphs/line/LineChart.svelte +140 -142
  47. package/dist/components/graphs/matrix/Matrix.stories.svelte +117 -117
  48. package/dist/components/graphs/matrix/Matrix.svelte +141 -141
  49. package/dist/components/graphs/multiline/MultiLineChart.stories.svelte +168 -168
  50. package/dist/components/graphs/multiline/MultiLineChart.svelte +236 -236
  51. package/dist/components/graphs/scatterplot/Scatterplot.stories.svelte +84 -84
  52. package/dist/components/graphs/scatterplot/Scatterplot.svelte +302 -302
  53. package/dist/components/graphs/utils/duration.d.ts +1 -0
  54. package/dist/components/graphs/utils/duration.js +33 -0
  55. package/dist/components/graphs/utils/tooltipFormatter.js +1 -1
  56. package/dist/components/icon-button/IconButton.stories.svelte +64 -64
  57. package/dist/components/icon-button/IconButton.svelte +88 -88
  58. package/dist/components/icons/AnalysisIcon.stories.svelte +18 -18
  59. package/dist/components/icons/AnalysisIcon.svelte +96 -96
  60. package/dist/components/icons/Icon.stories.svelte +111 -111
  61. package/dist/components/icons/Icon.svelte +17 -17
  62. package/dist/components/icons/PrincipalIcon.svelte +59 -59
  63. package/dist/components/icons/custom/Halo.svelte +31 -31
  64. package/dist/components/icons/custom/Well.svelte +27 -27
  65. package/dist/components/icons/index.js +1 -1
  66. package/dist/components/image/Image.svelte +42 -42
  67. package/dist/components/input/Input.stories.svelte +55 -55
  68. package/dist/components/input/Input.svelte +121 -121
  69. package/dist/components/label/Label.stories.svelte +18 -18
  70. package/dist/components/label/Label.svelte +11 -11
  71. package/dist/components/list/List.stories.svelte +84 -84
  72. package/dist/components/list/List.svelte +20 -20
  73. package/dist/components/logo/Logo.stories.svelte +15 -15
  74. package/dist/components/logo/Logo.svelte +30 -30
  75. package/dist/components/manual-cfu-counter/ManualCFUCounter.stories.svelte +102 -102
  76. package/dist/components/manual-cfu-counter/ManualCFUCounter.svelte +557 -557
  77. package/dist/components/manual-cfu-counter/test/ManualCFUCounterTestWrapper.svelte +11 -11
  78. package/dist/components/markdown/Markdown.stories.svelte +10 -10
  79. package/dist/components/markdown/Markdown.svelte +6 -6
  80. package/dist/components/modal/Modal.stories.svelte +29 -29
  81. package/dist/components/modal/Modal.svelte +71 -71
  82. package/dist/components/multi-cfu-counter/MultiCFUCounter.stories.svelte +201 -201
  83. package/dist/components/multi-cfu-counter/MultiCFUCounter.svelte +606 -606
  84. package/dist/components/multi-cfu-counter/test/MultiCFUCounterTestWrapper.svelte +17 -17
  85. package/dist/components/notification-popup/NotificationPopup.stories.svelte +18 -18
  86. package/dist/components/notification-popup/NotificationPopup.svelte +26 -26
  87. package/dist/components/notifications/Notifications.stories.svelte +101 -101
  88. package/dist/components/notifications/Notifications.svelte +9 -9
  89. package/dist/components/pill/Pill.stories.svelte +8 -8
  90. package/dist/components/pill/Pill.svelte +27 -27
  91. package/dist/components/progress-circle/ProgressCircle.stories.svelte +8 -8
  92. package/dist/components/progress-circle/ProgressCircle.svelte +54 -54
  93. package/dist/components/required-status-indicator/RequiredStatusIndicator.stories.svelte +18 -18
  94. package/dist/components/required-status-indicator/RequiredStatusIndicator.svelte +14 -14
  95. package/dist/components/segmented-control-buttons/ControlButton.svelte +36 -36
  96. package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte +35 -35
  97. package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte +13 -13
  98. package/dist/components/select/Select.stories.svelte +200 -94
  99. package/dist/components/select/Select.stories.svelte.d.ts +1 -1
  100. package/dist/components/select/components/Group.svelte +24 -0
  101. package/dist/components/select/components/MultiSelectTrigger.svelte +66 -0
  102. package/dist/components/select/components/SelectContent.svelte +33 -0
  103. package/dist/components/select/components/SelectGroupHeading.svelte +19 -0
  104. package/dist/components/select/components/SelectItem.svelte +39 -0
  105. package/dist/components/select/components/SelectTrigger.svelte +48 -0
  106. package/dist/components/select/index.d.ts +10 -7
  107. package/dist/components/select/index.js +12 -1
  108. package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte +102 -87
  109. package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte.d.ts +1 -1
  110. package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte +53 -53
  111. package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte.d.ts +1 -1
  112. package/dist/components/sjsf-wrappers/sjsfCustomTheme.js +1 -1
  113. package/dist/components/skeleton-loader/SkeletonLoader.stories.svelte +32 -32
  114. package/dist/components/skeleton-loader/SkeletonLoader.svelte +10 -10
  115. package/dist/components/skeleton-loader/StatcardSkeleton.svelte +9 -9
  116. package/dist/components/skeleton-loader/components/Skeleton.svelte +7 -7
  117. package/dist/components/skeleton-loader/components/SkeletonImage.svelte +12 -12
  118. package/dist/components/slider/Slider.stories.svelte +23 -23
  119. package/dist/components/slider/Slider.svelte +107 -107
  120. package/dist/components/spinner/Spinner.stories.svelte +8 -8
  121. package/dist/components/spinner/Spinner.svelte +18 -18
  122. package/dist/components/stat-card/StatCard.stories.svelte +26 -26
  123. package/dist/components/stat-card/StatCard.svelte +128 -128
  124. package/dist/components/status-badge/StatusBadge.stories.svelte +365 -365
  125. package/dist/components/status-badge/StatusBadge.svelte +54 -54
  126. package/dist/components/stepper/Stepper.stories.svelte +219 -219
  127. package/dist/components/stepper/components/stepper-root.svelte +12 -12
  128. package/dist/components/stepper/components/stepper-step.svelte +83 -83
  129. package/dist/components/table/Table.stories.svelte +87 -87
  130. package/dist/components/table/Table.svelte +32 -32
  131. package/dist/components/table/components/TBody.svelte +7 -7
  132. package/dist/components/table/components/THead.svelte +7 -7
  133. package/dist/components/table/components/Td.svelte +8 -8
  134. package/dist/components/table/components/Th.svelte +8 -8
  135. package/dist/components/table/components/Tr.svelte +11 -11
  136. package/dist/components/tabs/Tabs.stories.svelte +20 -20
  137. package/dist/components/tabs/Tabs.svelte +8 -8
  138. package/dist/components/tabs/components/Content.svelte +8 -8
  139. package/dist/components/tabs/components/Tab.svelte +14 -14
  140. package/dist/components/tabs/components/Tabs.svelte +7 -7
  141. package/dist/components/tag/Tag.stories.svelte +57 -57
  142. package/dist/components/tag/Tag.svelte +95 -95
  143. package/dist/components/textarea/Textarea.stories.svelte +70 -70
  144. package/dist/components/textarea/Textarea.svelte +76 -76
  145. package/dist/components/toast/Toast.stories.svelte +204 -204
  146. package/dist/components/toast/Toast.svelte +53 -53
  147. package/dist/components/toggle/Toggle.stories.svelte +9 -9
  148. package/dist/components/toggle/Toggle.svelte +53 -53
  149. package/dist/components/toggle-icon-button/ToggleIconButton.stories.svelte +152 -152
  150. package/dist/components/toggle-icon-button/ToggleIconButton.svelte +99 -99
  151. package/dist/components/tooltip/Tooltip.stories.svelte +85 -111
  152. package/dist/components/tooltip/Tooltip.svelte +57 -46
  153. package/dist/components/tooltip/Tooltip.svelte.d.ts +1 -1
  154. package/dist/components/tooltip/TooltipTest.svelte +31 -0
  155. package/dist/components/tooltip/TooltipTest.svelte.d.ts +11 -0
  156. package/dist/fonts/index.js +1 -1
  157. package/dist/index.d.ts +0 -1
  158. package/dist/index.js +0 -1
  159. package/dist/notifications.d.ts +1 -4
  160. package/dist/notifications.js +1 -1
  161. package/dist/tailwind-safelist.js +406 -406
  162. package/dist/tailwind.preset.js +10 -10
  163. package/dist/tokens/colors.js +18 -18
  164. package/dist/tokens/typography.js +6 -6
  165. package/dist/tokens.js +19 -19
  166. package/dist/types/fonts.d.ts +2 -2
  167. package/package.json +199 -204
  168. package/dist/components/select/Select.svelte +0 -139
  169. package/dist/components/select/Select.svelte.d.ts +0 -60
  170. package/dist/components/select-new/Select.stories.svelte +0 -219
  171. package/dist/components/select-new/Select.stories.svelte.d.ts +0 -19
  172. package/dist/components/select-new/components/Group.svelte +0 -24
  173. package/dist/components/select-new/components/MultiSelectTrigger.svelte +0 -66
  174. package/dist/components/select-new/components/SelectContent.svelte +0 -33
  175. package/dist/components/select-new/components/SelectGroupHeading.svelte +0 -19
  176. package/dist/components/select-new/components/SelectItem.svelte +0 -39
  177. package/dist/components/select-new/components/SelectTrigger.svelte +0 -48
  178. package/dist/components/select-new/index.d.ts +0 -10
  179. package/dist/components/select-new/index.js +0 -12
  180. /package/dist/components/{select-new → select}/components/Group.svelte.d.ts +0 -0
  181. /package/dist/components/{select-new → select}/components/MultiSelectTrigger.svelte.d.ts +0 -0
  182. /package/dist/components/{select-new → select}/components/SelectContent.svelte.d.ts +0 -0
  183. /package/dist/components/{select-new → select}/components/SelectGroupHeading.svelte.d.ts +0 -0
  184. /package/dist/components/{select-new → select}/components/SelectItem.svelte.d.ts +0 -0
  185. /package/dist/components/{select-new → select}/components/SelectTrigger.svelte.d.ts +0 -0
  186. /package/dist/components/{select-new → select}/types.d.ts +0 -0
  187. /package/dist/components/{select-new → select}/types.js +0 -0
@@ -1,241 +1,241 @@
1
1
  <script lang="ts">
2
- import { textColor, borderColor, chartColor, boxShadow } from '../../../tokens';
3
- import Chart, { type GenericChartProps } from '../chart/Chart.svelte';
4
- import type { ECElementEvent, EChartsOption, LineSeriesOption } from 'echarts';
5
- import * as echarts from 'echarts/core';
6
- import { createTooltipFormatter } from '../utils/tooltipFormatter';
7
- import { Duration } from 'luxon';
8
-
9
- interface Groups {
10
- key: string;
11
- series: (number | null)[];
12
- }
13
-
14
- interface MultiLineChartProps extends GenericChartProps {
15
- data: Groups[];
16
- withArea?: boolean;
17
- colors?: Record<string, string>;
18
- withFocus?: boolean;
19
- focusTargetKey?: string;
20
- sumYAxis?: boolean;
21
- captureInterval?: number;
22
- grid?: EChartsOption['grid'];
23
- }
24
-
25
- let {
26
- data,
27
- xAxisName,
28
- yAxisName,
29
- withArea = false,
30
- colors,
31
- withFocus = true,
32
- focusTargetKey,
33
- sumYAxis = true,
34
- captureInterval,
35
- ...props
36
- }: MultiLineChartProps = $props();
37
-
38
- const dataKeyToIndexMap = $derived(new Map(data.map((group, index) => [group.key, index])));
39
-
40
- const longestSeries = data?.reduce(
41
- (acc: (number | null)[], group) => (group.series.length > acc.length ? group.series : acc),
42
- []
43
- ).length;
44
-
45
- const captureIntervals = captureInterval
46
- ? Array(longestSeries)
47
- .fill(null)
48
- .map((_, timeIndex) => {
49
- const seconds = timeIndex * captureInterval;
50
- const duration = Duration.fromObject({ seconds }).shiftTo('days', 'hours', 'minutes');
51
- return duration.days >= 1 ? duration.toFormat('dd:hh:mm') : duration.toFormat('hh:mm');
52
- })
53
- : undefined;
54
-
55
- let focusedSeries = $state<string | undefined>(undefined);
56
-
57
- function handleMouseOver(params: ECElementEvent) {
58
- focusedSeries = params.seriesName;
59
- props.onmouseover?.(params);
60
- }
61
-
62
- function handleMouseOut() {
63
- focusedSeries = undefined;
64
- props.onmouseout?.();
65
- }
66
-
67
- const defaultColors: Record<string, string> = {
68
- accent: chartColor['accent'],
69
- blue: chartColor['blue'],
70
- orange: chartColor['orange'],
71
- plum: chartColor['plum'],
72
- sky: chartColor['sky'],
73
- pear: chartColor['pear'],
74
- pink: chartColor['pink'],
75
- lilac: chartColor['lilac'],
76
- lime: chartColor['lime']
77
- };
78
- const defaultColorRotationArray = $derived(Object.values(defaultColors));
79
-
80
- // Helper function to get color (needed for tooltip formatter config)
81
- const getSeriesColor = (seriesName: string, seriesIndex: number): string => {
82
- if (colors && colors[seriesName]) {
83
- return colors[seriesName];
84
- }
85
- const dataIndex = dataKeyToIndexMap.get(seriesName);
86
- if (dataIndex !== undefined) {
87
- return defaultColorRotationArray[dataIndex % defaultColorRotationArray.length];
88
- }
89
- return defaultColorRotationArray[seriesIndex % defaultColorRotationArray.length]; // Fallback based on index
90
- };
91
-
92
- const toFixedLocaleString = (
93
- value?: number | undefined,
94
- fractionDigits: number | undefined = 0,
95
- locale: string | undefined = undefined
96
- ): string =>
97
- value?.toLocaleString(locale, {
98
- minimumFractionDigits: fractionDigits,
99
- maximumFractionDigits: fractionDigits
100
- }) ?? '';
101
-
102
- let options: EChartsOption = $derived.by(() => ({
103
- grid: {
104
- left: 0,
105
- right: 16,
106
- bottom: 16,
107
- top: 16,
108
- containLabel: true
109
- },
110
- textStyle: {
111
- color: textColor['secondary'],
112
- fontFamily: 'af Another Sans'
113
- },
114
- xAxis: {
115
- type: 'category',
116
- boundaryGap: false,
117
- axisLabel: {
118
- fontSize: 11
119
- },
120
- axisLine: {
121
- onZero: false,
122
- lineStyle: {
123
- color: borderColor['axis']
124
- }
125
- },
126
- data: captureIntervals,
127
- ...props.xAxisOptions
128
- },
129
- yAxis: {
130
- type: 'value',
131
- alignTicks: true,
132
- axisLabel: {
133
- formatter: (value: any) => value.toLocaleString()
134
- } as any,
135
- axisPointer: {
136
- label: {
137
- formatter: (value: any) => toFixedLocaleString(value.value, 2)
138
- }
139
- },
140
- splitLine: {
141
- lineStyle: {
142
- color: borderColor['input'],
143
- type: 'dashed'
144
- }
145
- },
146
- ...props.yAxisOptions
147
- },
148
- selectedMode: 'multiple',
149
- tooltip: {
150
- trigger: 'axis',
151
- axisPointer: {
152
- type: 'line',
153
- z: 0,
154
- lineStyle: {
155
- type: 'solid'
156
- }
157
- },
158
- extraCssText: `box-shadow: ${boxShadow.menu}`,
159
- formatter: createTooltipFormatter({
160
- yAxisName,
161
- yAxisUnit: props.yAxisUnit ?? undefined,
162
- focusedSeriesAccessor: () => focusedSeries,
163
- getSeriesColor,
164
- maxSeriesToShow: 6
165
- })
166
- },
167
- series: data.map((group, index): LineSeriesOption => {
168
- const color =
169
- colors?.[group.key] ?? defaultColorRotationArray[index % defaultColorRotationArray.length];
170
-
171
- // Determine emphasis based on focusTargetKey or withFocus
172
- let emphasisConfig: LineSeriesOption['emphasis'];
173
- if (focusTargetKey) {
174
- if (group.key === focusTargetKey) {
175
- emphasisConfig = { focus: 'series' };
176
- } else {
177
- emphasisConfig = undefined;
178
- }
179
- } else if (withFocus) {
180
- emphasisConfig = { focus: 'series' };
181
- } else {
182
- emphasisConfig = undefined;
183
- }
184
-
185
- // Determine visual style based on focusTargetKey
186
- const isTargeted = focusTargetKey && group.key === focusTargetKey;
187
- const isBlurred = focusTargetKey && !isTargeted;
188
- const lineOpacity = isBlurred ? 0.25 : 1;
189
- const areaOpacityBase = isBlurred ? 0.1 : 0.2; // Lower base opacity for blurred area
190
- const areaOpacityEnd = 0;
191
-
192
- return {
193
- animation: false,
194
- ...(emphasisConfig && { emphasis: emphasisConfig }),
195
- type: 'line',
196
- stack: sumYAxis ? 'total' : undefined,
197
- symbol: 'circle',
198
- progressive: 300,
199
- progressiveThreshold: 1000,
200
- symbolSize: 1,
201
- data: group.series,
202
- triggerLineEvent: true,
203
- name: group.key,
204
- lineStyle: {
205
- color: color,
206
- opacity: lineOpacity
207
- },
208
- itemStyle: {
209
- color: color,
210
- opacity: lineOpacity // Also apply opacity to item markers if needed
211
- },
212
- areaStyle: withArea
213
- ? {
214
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
215
- {
216
- offset: 0,
217
- color: echarts.color.modifyAlpha(color, areaOpacityBase)
218
- },
219
- {
220
- offset: 1,
221
- color: echarts.color.modifyAlpha(color, areaOpacityEnd)
222
- }
223
- ])
224
- }
225
- : undefined
226
- };
227
- })
228
- }));
2
+ import { textColor, borderColor, chartColor, boxShadow } from '../../../tokens';
3
+ import Chart, { type GenericChartProps } from '../chart/Chart.svelte';
4
+ import type { ECElementEvent, EChartsOption, LineSeriesOption } from 'echarts';
5
+ import * as echarts from 'echarts/core';
6
+ import { createTooltipFormatter } from '../utils/tooltipFormatter';
7
+ import { Duration } from 'luxon';
8
+ import { formattedDurationCompact } from '../utils/duration';
9
+
10
+ interface Groups {
11
+ key: string;
12
+ series: (number | null)[];
13
+ }
14
+
15
+ interface MultiLineChartProps extends GenericChartProps {
16
+ data: Groups[];
17
+ withArea?: boolean;
18
+ colors?: Record<string, string>;
19
+ withFocus?: boolean;
20
+ focusTargetKey?: string;
21
+ sumYAxis?: boolean;
22
+ captureInterval?: number;
23
+ grid?: EChartsOption['grid'];
24
+ }
25
+
26
+ let {
27
+ data,
28
+ xAxisName,
29
+ yAxisName,
30
+ withArea = false,
31
+ colors,
32
+ withFocus = true,
33
+ focusTargetKey,
34
+ sumYAxis = true,
35
+ captureInterval,
36
+ ...props
37
+ }: MultiLineChartProps = $props();
38
+
39
+ const dataKeyToIndexMap = $derived(new Map(data.map((group, index) => [group.key, index])));
40
+
41
+ const longestSeries = data?.reduce(
42
+ (acc: (number | null)[], group) => (group.series.length > acc.length ? group.series : acc),
43
+ []
44
+ ).length;
45
+
46
+ const captureIntervals = captureInterval
47
+ ? Array(longestSeries)
48
+ .fill(null)
49
+ .map((_, timeIndex) => {
50
+ const seconds = timeIndex * captureInterval;
51
+ return formattedDurationCompact(seconds);
52
+ })
53
+ : undefined;
54
+
55
+ let focusedSeries = $state<string | undefined>(undefined);
56
+
57
+ function handleMouseOver(params: ECElementEvent) {
58
+ focusedSeries = params.seriesName;
59
+ props.onmouseover?.(params);
60
+ }
61
+
62
+ function handleMouseOut() {
63
+ focusedSeries = undefined;
64
+ props.onmouseout?.();
65
+ }
66
+
67
+ const defaultColors: Record<string, string> = {
68
+ accent: chartColor['accent'],
69
+ blue: chartColor['blue'],
70
+ orange: chartColor['orange'],
71
+ plum: chartColor['plum'],
72
+ sky: chartColor['sky'],
73
+ pear: chartColor['pear'],
74
+ pink: chartColor['pink'],
75
+ lilac: chartColor['lilac'],
76
+ lime: chartColor['lime'],
77
+ };
78
+ const defaultColorRotationArray = $derived(Object.values(defaultColors));
79
+
80
+ // Helper function to get color (needed for tooltip formatter config)
81
+ const getSeriesColor = (seriesName: string, seriesIndex: number): string => {
82
+ if (colors && colors[seriesName]) {
83
+ return colors[seriesName];
84
+ }
85
+ const dataIndex = dataKeyToIndexMap.get(seriesName);
86
+ if (dataIndex !== undefined) {
87
+ return defaultColorRotationArray[dataIndex % defaultColorRotationArray.length];
88
+ }
89
+ return defaultColorRotationArray[seriesIndex % defaultColorRotationArray.length]; // Fallback based on index
90
+ };
91
+
92
+ const toFixedLocaleString = (
93
+ value?: number | undefined,
94
+ fractionDigits: number | undefined = 0,
95
+ locale: string | undefined = undefined
96
+ ): string =>
97
+ value?.toLocaleString(locale, {
98
+ minimumFractionDigits: fractionDigits,
99
+ maximumFractionDigits: fractionDigits,
100
+ }) ?? '';
101
+
102
+ let options: EChartsOption = $derived.by(() => ({
103
+ grid: {
104
+ left: 0,
105
+ right: 16,
106
+ bottom: 16,
107
+ top: 16,
108
+ containLabel: true,
109
+ },
110
+ textStyle: {
111
+ color: textColor['secondary'],
112
+ fontFamily: 'af Another Sans',
113
+ },
114
+ xAxis: {
115
+ type: 'category',
116
+ boundaryGap: false,
117
+ axisLabel: {
118
+ fontSize: 11,
119
+ },
120
+ axisLine: {
121
+ onZero: false,
122
+ lineStyle: {
123
+ color: borderColor['axis'],
124
+ },
125
+ },
126
+ data: captureIntervals,
127
+ ...props.xAxisOptions,
128
+ },
129
+ yAxis: {
130
+ type: 'value',
131
+ alignTicks: true,
132
+ axisLabel: {
133
+ formatter: (value: any) => value.toLocaleString(),
134
+ } as any,
135
+ axisPointer: {
136
+ label: {
137
+ formatter: (value: any) => toFixedLocaleString(value.value, 2),
138
+ },
139
+ },
140
+ splitLine: {
141
+ lineStyle: {
142
+ color: borderColor['input'],
143
+ type: 'dashed',
144
+ },
145
+ },
146
+ ...props.yAxisOptions,
147
+ },
148
+ selectedMode: 'multiple',
149
+ tooltip: {
150
+ trigger: 'axis',
151
+ axisPointer: {
152
+ type: 'line',
153
+ z: 0,
154
+ lineStyle: {
155
+ type: 'solid',
156
+ },
157
+ },
158
+ extraCssText: `box-shadow: ${boxShadow.menu}`,
159
+ formatter: createTooltipFormatter({
160
+ yAxisName,
161
+ yAxisUnit: props.yAxisUnit ?? undefined,
162
+ focusedSeriesAccessor: () => focusedSeries,
163
+ getSeriesColor,
164
+ maxSeriesToShow: 6,
165
+ }),
166
+ },
167
+ series: data.map((group, index): LineSeriesOption => {
168
+ const color =
169
+ colors?.[group.key] ?? defaultColorRotationArray[index % defaultColorRotationArray.length];
170
+
171
+ // Determine emphasis based on focusTargetKey or withFocus
172
+ let emphasisConfig: LineSeriesOption['emphasis'];
173
+ if (focusTargetKey) {
174
+ if (group.key === focusTargetKey) {
175
+ emphasisConfig = { focus: 'series' };
176
+ } else {
177
+ emphasisConfig = undefined;
178
+ }
179
+ } else if (withFocus) {
180
+ emphasisConfig = { focus: 'series' };
181
+ } else {
182
+ emphasisConfig = undefined;
183
+ }
184
+
185
+ // Determine visual style based on focusTargetKey
186
+ const isTargeted = focusTargetKey && group.key === focusTargetKey;
187
+ const isBlurred = focusTargetKey && !isTargeted;
188
+ const lineOpacity = isBlurred ? 0.25 : 1;
189
+ const areaOpacityBase = isBlurred ? 0.1 : 0.2; // Lower base opacity for blurred area
190
+ const areaOpacityEnd = 0;
191
+
192
+ return {
193
+ animation: false,
194
+ ...(emphasisConfig && { emphasis: emphasisConfig }),
195
+ type: 'line',
196
+ stack: sumYAxis ? 'total' : undefined,
197
+ symbol: 'circle',
198
+ progressive: 300,
199
+ progressiveThreshold: 1000,
200
+ symbolSize: 1,
201
+ data: group.series,
202
+ triggerLineEvent: true,
203
+ name: group.key,
204
+ lineStyle: {
205
+ color: color,
206
+ opacity: lineOpacity,
207
+ },
208
+ itemStyle: {
209
+ color: color,
210
+ opacity: lineOpacity, // Also apply opacity to item markers if needed
211
+ },
212
+ areaStyle: withArea
213
+ ? {
214
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
215
+ {
216
+ offset: 0,
217
+ color: echarts.color.modifyAlpha(color, areaOpacityBase),
218
+ },
219
+ {
220
+ offset: 1,
221
+ color: echarts.color.modifyAlpha(color, areaOpacityEnd),
222
+ },
223
+ ]),
224
+ }
225
+ : undefined,
226
+ };
227
+ }),
228
+ }));
229
229
  </script>
230
230
 
231
231
  <Chart
232
- {options}
233
- {...{
234
- ...props,
235
-
236
- xAxisName,
237
- yAxisName,
238
- onmouseover: handleMouseOver,
239
- onmouseout: handleMouseOut
240
- }}
232
+ {options}
233
+ {...{
234
+ ...props,
235
+
236
+ xAxisName,
237
+ yAxisName,
238
+ onmouseover: handleMouseOver,
239
+ onmouseout: handleMouseOut,
240
+ }}
241
241
  />