@reshape-biotech/design-system 0.0.54 → 1.1.2

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 (181) hide show
  1. package/dist/components/activity/Activity.stories.svelte +21 -8
  2. package/dist/components/activity/Activity.svelte +44 -6
  3. package/dist/components/activity/Activity.svelte.d.ts +1 -1
  4. package/dist/components/avatar/Avatar.stories.svelte +7 -17
  5. package/dist/components/avatar/Avatar.svelte +2 -2
  6. package/dist/components/avatar/Avatar.svelte.d.ts +2 -2
  7. package/dist/components/banner/Banner.stories.svelte +5 -5
  8. package/dist/components/banner/Banner.svelte +1 -1
  9. package/dist/components/button/Button.stories.svelte +54 -21
  10. package/dist/components/button/Button.svelte +58 -11
  11. package/dist/components/button/Button.svelte.d.ts +4 -3
  12. package/dist/components/card/Card.stories.svelte +130 -0
  13. package/dist/components/card/Card.stories.svelte.d.ts +19 -0
  14. package/dist/components/card/Card.svelte +25 -0
  15. package/dist/components/card/Card.svelte.d.ts +10 -0
  16. package/dist/components/card/index.d.ts +1 -0
  17. package/dist/components/card/index.js +1 -0
  18. package/dist/components/checkbox/Checkbox.stories.svelte +7 -15
  19. package/dist/components/checkbox/Checkbox.svelte +7 -7
  20. package/dist/components/checkbox/Checkbox.svelte.d.ts +3 -5
  21. package/dist/components/collapsible/Collapsible.stories.svelte +5 -4
  22. package/dist/components/combobox/Combobox.stories.svelte +7 -5
  23. package/dist/components/datepicker/DatePicker.stories.svelte +13 -18
  24. package/dist/components/datepicker/DatePicker.svelte +1 -0
  25. package/dist/components/divider/Divider.stories.svelte +1 -3
  26. package/dist/components/divider/Divider.svelte +8 -2
  27. package/dist/components/divider/Divider.svelte.d.ts +2 -0
  28. package/dist/components/drawer/Drawer.stories.svelte +3 -3
  29. package/dist/components/dropdown/Dropdown.stories.svelte +8 -8
  30. package/dist/components/empty-content/EmptyContent.stories.svelte +2 -2
  31. package/dist/components/graphs/bar-chart/BarChart.stories.svelte +81 -0
  32. package/dist/components/graphs/bar-chart/BarChart.stories.svelte.d.ts +19 -0
  33. package/dist/components/graphs/bar-chart/BarChart.svelte +136 -0
  34. package/dist/components/graphs/bar-chart/BarChart.svelte.d.ts +15 -0
  35. package/dist/components/graphs/bar-chart/StackedBarChart.stories.svelte +42 -0
  36. package/dist/components/graphs/bar-chart/StackedBarChart.stories.svelte.d.ts +19 -0
  37. package/dist/components/graphs/bar-chart/StackedBarChart.svelte +177 -0
  38. package/dist/components/graphs/bar-chart/StackedBarChart.svelte.d.ts +16 -0
  39. package/dist/components/graphs/chart/Chart.stories.svelte +30 -25
  40. package/dist/components/graphs/chart/Chart.svelte +104 -32
  41. package/dist/components/graphs/chart/Chart.svelte.d.ts +15 -5
  42. package/dist/components/graphs/index.d.ts +3 -0
  43. package/dist/components/graphs/index.js +3 -0
  44. package/dist/components/graphs/line/LineChart.stories.svelte +97 -17
  45. package/dist/components/graphs/line/LineChart.svelte +90 -51
  46. package/dist/components/graphs/line/LineChart.svelte.d.ts +6 -13
  47. package/dist/components/graphs/matrix/Matrix.stories.svelte +142 -0
  48. package/dist/components/graphs/matrix/Matrix.stories.svelte.d.ts +19 -0
  49. package/dist/components/graphs/matrix/Matrix.svelte +149 -0
  50. package/dist/components/graphs/matrix/Matrix.svelte.d.ts +24 -0
  51. package/dist/components/graphs/matrix/index.d.ts +3 -0
  52. package/dist/components/graphs/matrix/index.js +3 -0
  53. package/dist/components/graphs/multiline/MultiLineChart.stories.svelte +115 -28
  54. package/dist/components/graphs/multiline/MultiLineChart.svelte +187 -50
  55. package/dist/components/graphs/multiline/MultiLineChart.svelte.d.ts +9 -12
  56. package/dist/components/graphs/scatterplot/Scatterplot.stories.svelte +68 -41
  57. package/dist/components/graphs/scatterplot/Scatterplot.svelte +312 -45
  58. package/dist/components/graphs/scatterplot/Scatterplot.svelte.d.ts +23 -13
  59. package/dist/components/graphs/utils/tooltipFormatter.d.ts +10 -0
  60. package/dist/components/graphs/utils/tooltipFormatter.js +52 -0
  61. package/dist/components/icon-button/IconButton.stories.svelte +6 -6
  62. package/dist/components/icon-button/IconButton.svelte +50 -9
  63. package/dist/components/icon-button/IconButton.svelte.d.ts +3 -5
  64. package/dist/components/icons/AnalysisIcon.stories.svelte +15 -21
  65. package/dist/components/icons/AnalysisIcon.svelte +63 -44
  66. package/dist/components/icons/AnalysisIcon.svelte.d.ts +1 -0
  67. package/dist/components/icons/Icon.stories.svelte +4 -4
  68. package/dist/components/icons/Icon.svelte +1 -1
  69. package/dist/components/icons/PrincipalIcon.svelte +96 -0
  70. package/dist/components/icons/PrincipalIcon.svelte.d.ts +10 -0
  71. package/dist/components/icons/custom/Halo.svelte +14 -8
  72. package/dist/components/icons/custom/Halo.svelte.d.ts +7 -25
  73. package/dist/components/icons/custom/Well.svelte +14 -6
  74. package/dist/components/icons/custom/Well.svelte.d.ts +7 -25
  75. package/dist/components/icons/index.d.ts +3 -2
  76. package/dist/components/icons/index.js +34 -0
  77. package/dist/components/input/Input.stories.svelte +16 -22
  78. package/dist/components/input/Input.svelte +140 -134
  79. package/dist/components/input/Input.svelte.d.ts +12 -13
  80. package/dist/components/label/Label.stories.svelte +28 -0
  81. package/dist/components/label/Label.stories.svelte.d.ts +19 -0
  82. package/dist/components/label/Label.svelte +17 -0
  83. package/dist/components/label/Label.svelte.d.ts +9 -0
  84. package/dist/components/list/List.stories.svelte +3 -3
  85. package/dist/components/logo/Logo.stories.svelte +1 -1
  86. package/dist/components/manual-cfu-counter/ManualCFUCounter.stories.svelte +125 -0
  87. package/dist/components/manual-cfu-counter/ManualCFUCounter.stories.svelte.d.ts +3 -0
  88. package/dist/components/manual-cfu-counter/ManualCFUCounter.svelte +577 -0
  89. package/dist/components/manual-cfu-counter/ManualCFUCounter.svelte.d.ts +16 -0
  90. package/dist/components/manual-cfu-counter/index.d.ts +1 -0
  91. package/dist/components/manual-cfu-counter/index.js +1 -0
  92. package/dist/components/manual-cfu-counter/test/ManualCFUCounterTestWrapper.svelte +22 -0
  93. package/dist/components/manual-cfu-counter/test/ManualCFUCounterTestWrapper.svelte.d.ts +19 -0
  94. package/dist/components/markdown/Markdown.stories.svelte +1 -1
  95. package/dist/components/markdown/Markdown.svelte +1 -1
  96. package/dist/components/modal/Modal.stories.svelte +2 -2
  97. package/dist/components/modal/Modal.svelte +27 -22
  98. package/dist/components/modal/Modal.svelte.d.ts +4 -1
  99. package/dist/components/notification-popup/NotificationPopup.stories.svelte +1 -1
  100. package/dist/components/pill/Pill.stories.svelte +13 -0
  101. package/dist/components/pill/Pill.stories.svelte.d.ts +19 -0
  102. package/dist/components/progress-circle/ProgressCircle.stories.svelte +15 -0
  103. package/dist/components/progress-circle/ProgressCircle.stories.svelte.d.ts +19 -0
  104. package/dist/components/required-status-indicator/RequiredStatusIndicator.stories.svelte +28 -0
  105. package/dist/components/required-status-indicator/RequiredStatusIndicator.stories.svelte.d.ts +19 -0
  106. package/dist/components/required-status-indicator/RequiredStatusIndicator.svelte +22 -0
  107. package/dist/components/required-status-indicator/RequiredStatusIndicator.svelte.d.ts +8 -0
  108. package/dist/components/required-status-indicator/index.d.ts +1 -0
  109. package/dist/components/required-status-indicator/index.js +1 -0
  110. package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte +3 -3
  111. package/dist/components/select/Select.stories.svelte +12 -12
  112. package/dist/components/select/Select.svelte +0 -2
  113. package/dist/components/select-new/Select.stories.svelte +219 -0
  114. package/dist/components/select-new/Select.stories.svelte.d.ts +19 -0
  115. package/dist/components/select-new/components/Group.svelte +24 -0
  116. package/dist/components/select-new/components/Group.svelte.d.ts +11 -0
  117. package/dist/components/select-new/components/MultiSelectTrigger.svelte +66 -0
  118. package/dist/components/select-new/components/MultiSelectTrigger.svelte.d.ts +17 -0
  119. package/dist/components/select-new/components/SelectContent.svelte +33 -0
  120. package/dist/components/select-new/components/SelectContent.svelte.d.ts +10 -0
  121. package/dist/components/select-new/components/SelectGroupHeading.svelte +19 -0
  122. package/dist/components/select-new/components/SelectGroupHeading.svelte.d.ts +9 -0
  123. package/dist/components/select-new/components/SelectItem.svelte +41 -0
  124. package/dist/components/select-new/components/SelectItem.svelte.d.ts +9 -0
  125. package/dist/components/select-new/components/SelectTrigger.svelte +48 -0
  126. package/dist/components/select-new/components/SelectTrigger.svelte.d.ts +12 -0
  127. package/dist/components/select-new/index.d.ts +10 -0
  128. package/dist/components/select-new/index.js +12 -0
  129. package/dist/components/select-new/types.d.ts +25 -0
  130. package/dist/components/select-new/types.js +1 -0
  131. package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte +92 -0
  132. package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte.d.ts +3 -0
  133. package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte +65 -0
  134. package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte.d.ts +3 -0
  135. package/dist/components/sjsf-wrappers/index.d.ts +2 -0
  136. package/dist/components/sjsf-wrappers/index.js +2 -0
  137. package/dist/components/sjsf-wrappers/sjsfCustomTheme.d.ts +2 -0
  138. package/dist/components/sjsf-wrappers/sjsfCustomTheme.js +8 -0
  139. package/dist/components/skeleton-loader/SkeletonLoader.stories.svelte +4 -4
  140. package/dist/components/slider/Slider.stories.svelte +4 -4
  141. package/dist/components/spinner/Spinner.stories.svelte +13 -0
  142. package/dist/components/spinner/Spinner.stories.svelte.d.ts +19 -0
  143. package/dist/components/stat-card/StatCard.stories.svelte +27 -19
  144. package/dist/components/stat-card/StatCard.svelte +100 -6
  145. package/dist/components/stat-card/StatCard.svelte.d.ts +3 -0
  146. package/dist/components/status-badge/StatusBadge.stories.svelte +6 -6
  147. package/dist/components/status-badge/StatusBadge.svelte +5 -3
  148. package/dist/components/stepper/Stepper.stories.svelte +243 -0
  149. package/dist/components/stepper/Stepper.stories.svelte.d.ts +19 -0
  150. package/dist/components/stepper/components/stepper-root.svelte +20 -0
  151. package/dist/components/stepper/components/stepper-root.svelte.d.ts +9 -0
  152. package/dist/components/stepper/components/stepper-step.svelte +100 -0
  153. package/dist/components/stepper/components/stepper-step.svelte.d.ts +11 -0
  154. package/dist/components/stepper/index.d.ts +15 -0
  155. package/dist/components/stepper/index.js +2 -0
  156. package/dist/components/table/Table.stories.svelte +1 -1
  157. package/dist/components/table/components/Td.svelte +3 -2
  158. package/dist/components/table/components/Td.svelte.d.ts +1 -0
  159. package/dist/components/table/components/Tr.svelte +3 -2
  160. package/dist/components/table/components/Tr.svelte.d.ts +1 -0
  161. package/dist/components/tabs/Tabs.stories.svelte +1 -1
  162. package/dist/components/tag/Tag.stories.svelte +9 -9
  163. package/dist/components/tag/Tag.svelte +0 -18
  164. package/dist/components/textarea/Textarea.stories.svelte +97 -0
  165. package/dist/components/textarea/Textarea.stories.svelte.d.ts +19 -0
  166. package/dist/components/textarea/Textarea.svelte +94 -0
  167. package/dist/components/textarea/Textarea.svelte.d.ts +17 -0
  168. package/dist/components/textarea/index.d.ts +1 -0
  169. package/dist/components/textarea/index.js +1 -0
  170. package/dist/components/toggle/Toggle.stories.svelte +1 -1
  171. package/dist/components/toggle/Toggle.svelte +3 -2
  172. package/dist/components/toggle/Toggle.svelte.d.ts +1 -0
  173. package/dist/components/toggle-icon-button/ToggleIconButton.stories.svelte +6 -6
  174. package/dist/components/tooltip/Tooltip.stories.svelte +6 -6
  175. package/dist/components/tooltip/Tooltip.svelte +1 -1
  176. package/dist/index.d.ts +7 -0
  177. package/dist/index.js +7 -0
  178. package/dist/tailwind.preset.d.ts +5 -0
  179. package/dist/tokens.d.ts +10 -0
  180. package/dist/tokens.js +6 -4
  181. package/package.json +1 -2
@@ -1,7 +1,9 @@
1
1
  <script lang="ts">
2
- import { textColor, backgroundColor } from '../../../tokens';
3
- import Chart from '../chart/Chart.svelte';
4
- import type { EChartsOption } from 'echarts';
2
+ import { textColor } 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';
5
7
  import { Duration } from 'luxon';
6
8
 
7
9
  interface Groups {
@@ -9,35 +11,33 @@
9
11
  series: (number | null)[];
10
12
  }
11
13
 
12
- interface Props {
14
+ interface MultiLineChartProps extends GenericChartProps {
13
15
  data: Groups[];
16
+ withArea?: boolean;
17
+ colors?: Record<string, string>;
18
+ withFocus?: boolean;
19
+ focusTargetKey?: string;
20
+ sumYAxis?: boolean;
14
21
  captureInterval?: number;
15
- loading?: boolean;
16
- xAxis?: string;
17
- yAxis?: string;
18
- height?: string;
19
- width?: string;
20
- xAxisOptions?: EChartsOption['xAxis'];
21
- yAxisOptions?: EChartsOption['yAxis'];
22
- onitemclick?: (params: echarts.ECElementEvent) => void;
23
- onmouseover?: (params: echarts.ECElementEvent) => void;
24
- onmouseout?: () => void;
22
+ grid?: EChartsOption['grid'];
25
23
  }
26
24
 
27
- const toFixedLocaleString = (
28
- value?: number | undefined,
29
- fractionDigits: number | undefined = 0,
30
- locale: string | undefined = undefined
31
- ): string =>
32
- value?.toLocaleString(locale, {
33
- minimumFractionDigits: fractionDigits,
34
- maximumFractionDigits: fractionDigits
35
- }) ?? '';
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();
36
37
 
37
- let { data, xAxis, xAxisOptions, yAxis, yAxisOptions, captureInterval, ...props }: Props =
38
- $props();
38
+ const dataKeyToIndexMap = $derived(new Map(data.map((group, index) => [group.key, index])));
39
39
 
40
- const longestSeries = data.reduce(
40
+ const longestSeries = data?.reduce(
41
41
  (acc: (number | null)[], group) => (group.series.length > acc.length ? group.series : acc),
42
42
  []
43
43
  ).length;
@@ -52,14 +52,59 @@
52
52
  })
53
53
  : undefined;
54
54
 
55
- let options: EChartsOption = {
56
- color: ['#5750EE', '#FF7100', '#50EEA6', '#E7EE50', '#EE5098'],
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
+ blue: textColor['icon-blue'],
69
+ accent: textColor['icon-accent'],
70
+ orange: textColor['icon-orange'],
71
+ sky: textColor['icon-sky'],
72
+ lilac: textColor['icon-lilac'],
73
+ plum: textColor['icon-plum'],
74
+ pear: textColor['icon-pear']
75
+ };
76
+ const defaultColorRotationArray = $derived(Object.values(defaultColors));
77
+
78
+ // Helper function to get color (needed for tooltip formatter config)
79
+ const getSeriesColor = (seriesName: string, seriesIndex: number): string => {
80
+ if (colors && colors[seriesName]) {
81
+ return colors[seriesName];
82
+ }
83
+ const dataIndex = dataKeyToIndexMap.get(seriesName);
84
+ if (dataIndex !== undefined) {
85
+ return defaultColorRotationArray[dataIndex % defaultColorRotationArray.length];
86
+ }
87
+ return defaultColorRotationArray[seriesIndex % defaultColorRotationArray.length]; // Fallback based on index
88
+ };
89
+
90
+ const toFixedLocaleString = (
91
+ value?: number | undefined,
92
+ fractionDigits: number | undefined = 0,
93
+ locale: string | undefined = undefined
94
+ ): string =>
95
+ value?.toLocaleString(locale, {
96
+ minimumFractionDigits: fractionDigits,
97
+ maximumFractionDigits: fractionDigits
98
+ }) ?? '';
99
+
100
+ let options: EChartsOption = $derived.by(() => ({
57
101
  grid: {
58
102
  top: 10,
59
- bottom: 10,
60
- left: 10,
61
- right: 10,
62
- containLabel: true
103
+ bottom: 0,
104
+ left: 0,
105
+ right: 0,
106
+ containLabel: true,
107
+ ...props.grid
63
108
  },
64
109
  textStyle: {
65
110
  color: textColor['secondary']
@@ -70,9 +115,28 @@
70
115
  axisLine: {
71
116
  onZero: false
72
117
  },
73
- name: xAxis,
74
118
  data: captureIntervals,
75
- ...xAxisOptions
119
+ axisLabel: {
120
+ interval: (index: number, value: string) => {
121
+ const dataLength = longestSeries;
122
+ if (dataLength <= 1) return true; // Show label if only one point
123
+
124
+ const targetLabelCount = 10; // Aim for about 10 labels
125
+ // Calculate interval, ensuring it's at least 1
126
+ const calculatedInterval = Math.max(1, Math.ceil(dataLength / targetLabelCount));
127
+
128
+ // Show the first label (index 0)
129
+ if (index === 0) return true;
130
+ // Show the last label if data exists
131
+ if (dataLength > 0 && index === dataLength - 1) return true;
132
+ // Show labels at the calculated interval, but not the last one if it was already shown
133
+ if (index % calculatedInterval === 0 && index !== dataLength - 1) return true;
134
+ // Hide others
135
+ return false;
136
+ },
137
+ hideOverlap: true
138
+ },
139
+ ...props.xAxisOptions
76
140
  },
77
141
  yAxis: {
78
142
  type: 'value',
@@ -85,24 +149,97 @@
85
149
  formatter: (value: any) => toFixedLocaleString(value.value, 2)
86
150
  }
87
151
  },
88
- name: yAxis,
89
- ...yAxisOptions
152
+ ...props.yAxisOptions
90
153
  },
91
154
  selectedMode: 'multiple',
92
- series: data.map((group) => ({
93
- animation: false,
94
- seriesLayoutBy: 'row',
95
- emphasis: {
96
- focus: 'series'
97
- },
98
- tooltip: {
99
- show: false
155
+ tooltip: {
156
+ trigger: 'axis',
157
+ axisPointer: {
158
+ type: 'line',
159
+ lineStyle: {
160
+ type: 'solid'
161
+ }
100
162
  },
101
- type: 'line',
102
- symbol: group.series.length > 1 ? 'none' : 'circle',
103
- data: group.series
104
- }))
105
- };
163
+ formatter: createTooltipFormatter({
164
+ yAxisName,
165
+ yAxisUnit: props.yAxisUnit ?? undefined,
166
+ focusedSeriesAccessor: () => focusedSeries,
167
+ getSeriesColor,
168
+ maxSeriesToShow: 6
169
+ })
170
+ },
171
+ series: data.map((group, index): LineSeriesOption => {
172
+ const color =
173
+ colors?.[group.key] ?? defaultColorRotationArray[index % defaultColorRotationArray.length];
174
+
175
+ // Determine emphasis based on focusTargetKey or withFocus
176
+ let emphasisConfig: LineSeriesOption['emphasis'];
177
+ if (focusTargetKey) {
178
+ if (group.key === focusTargetKey) {
179
+ emphasisConfig = { focus: 'series' };
180
+ } else {
181
+ emphasisConfig = undefined;
182
+ }
183
+ } else if (withFocus) {
184
+ emphasisConfig = { focus: 'series' };
185
+ } else {
186
+ emphasisConfig = undefined;
187
+ }
188
+
189
+ // Determine visual style based on focusTargetKey
190
+ const isTargeted = focusTargetKey && group.key === focusTargetKey;
191
+ const isBlurred = focusTargetKey && !isTargeted;
192
+ const lineOpacity = isBlurred ? 0.3 : 1;
193
+ const areaOpacityBase = isBlurred ? 0.1 : 0.4; // Lower base opacity for blurred area
194
+ const areaOpacityEnd = 0;
195
+
196
+ return {
197
+ animation: false,
198
+ ...(emphasisConfig && { emphasis: emphasisConfig }),
199
+ type: 'line',
200
+ stack: sumYAxis ? 'total' : undefined,
201
+ symbol: 'circle',
202
+ progressive: 300,
203
+ progressiveThreshold: 1000,
204
+ symbolSize: 1,
205
+ data: group.series,
206
+ triggerLineEvent: true,
207
+ name: group.key,
208
+ lineStyle: {
209
+ color: color,
210
+ opacity: lineOpacity
211
+ },
212
+ itemStyle: {
213
+ color: color,
214
+ opacity: lineOpacity // Also apply opacity to item markers if needed
215
+ },
216
+ areaStyle: withArea
217
+ ? {
218
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
219
+ {
220
+ offset: 0,
221
+ color: echarts.color.modifyAlpha(color, areaOpacityBase)
222
+ },
223
+ {
224
+ offset: 1,
225
+ color: echarts.color.modifyAlpha(color, areaOpacityEnd)
226
+ }
227
+ ])
228
+ }
229
+ : undefined
230
+ };
231
+ })
232
+ }));
106
233
  </script>
107
234
 
108
- <Chart {options} {...props} />
235
+ <Chart
236
+ {options}
237
+ {...{
238
+ ...props,
239
+
240
+ xAxisName,
241
+ yAxisName,
242
+ onmouseover: handleMouseOver,
243
+ onmouseout: handleMouseOut
244
+ }}
245
+ />
@@ -1,22 +1,19 @@
1
+ import { type GenericChartProps } from '../chart/Chart.svelte';
1
2
  import type { EChartsOption } from 'echarts';
2
3
  interface Groups {
3
4
  key: string;
4
5
  series: (number | null)[];
5
6
  }
6
- interface Props {
7
+ interface MultiLineChartProps extends GenericChartProps {
7
8
  data: Groups[];
9
+ withArea?: boolean;
10
+ colors?: Record<string, string>;
11
+ withFocus?: boolean;
12
+ focusTargetKey?: string;
13
+ sumYAxis?: boolean;
8
14
  captureInterval?: number;
9
- loading?: boolean;
10
- xAxis?: string;
11
- yAxis?: string;
12
- height?: string;
13
- width?: string;
14
- xAxisOptions?: EChartsOption['xAxis'];
15
- yAxisOptions?: EChartsOption['yAxis'];
16
- onitemclick?: (params: echarts.ECElementEvent) => void;
17
- onmouseover?: (params: echarts.ECElementEvent) => void;
18
- onmouseout?: () => void;
15
+ grid?: EChartsOption['grid'];
19
16
  }
20
- declare const MultiLineChart: import("svelte").Component<Props, {}, "">;
17
+ declare const MultiLineChart: import("svelte").Component<MultiLineChartProps, {}, "">;
21
18
  type MultiLineChart = ReturnType<typeof MultiLineChart>;
22
19
  export default MultiLineChart;
@@ -1,7 +1,7 @@
1
1
  <script module lang="ts">
2
2
  import { defineMeta } from '@storybook/addon-svelte-csf';
3
-
4
3
  import Scatterplot from './Scatterplot.svelte';
4
+ import type { DataPoint } from './Scatterplot.svelte';
5
5
 
6
6
  const { Story } = defineMeta({
7
7
  component: Scatterplot,
@@ -9,67 +9,94 @@
9
9
  tags: ['autodocs']
10
10
  });
11
11
 
12
- const data = [
13
- [10.0, 8.04],
14
- [8.07, 6.95],
15
- [13.0, 7.58],
16
- [9.05, 8.81],
17
- [11.0, 8.33],
18
- [14.0, 7.66],
19
- [13.4, 6.81],
20
- [10.0, 6.33],
21
- [14.0, 8.96],
22
- [12.5, 6.82],
23
- [9.15, 7.2],
24
- [11.5, 7.2],
25
- [3.03, 4.23],
26
- [12.2, 7.83],
27
- [2.02, 4.47],
28
- [1.05, 3.33],
29
- [4.05, 4.96],
30
- [6.03, 7.24],
31
- [12.0, 6.26],
32
- [12.0, 8.84],
33
- [7.08, 5.82],
34
- [5.02, 5.68]
12
+ const data: DataPoint[] = [
13
+ { value: [10.0, 8.04], metadata: { blip: '1', blop: 1, user_id: '1' } },
14
+ { value: [8.07, 6.95], metadata: { blip: '2', blop: 2, user_id: '2' } },
15
+ { value: [13.0, 7.58], metadata: { blip: '3', blop: 3, user_id: '3' } },
16
+ { value: [9.05, 8.81], metadata: { blip: '4', blop: 4, user_id: '4' } },
17
+ { value: [12.0, 8.33], metadata: { blip: '5', blop: 5, user_id: '5' } },
18
+ { value: [14.0, 7.66], metadata: { blip: '6', blop: 6, user_id: '6' } }
35
19
  ];
36
20
 
37
- const lineData = [0, 2, 4, 6, 8, 10, 12, 14];
21
+ const errorBarsData: DataPoint[] = data.map((d) => ({
22
+ ...d,
23
+ error_value: 1.5
24
+ }));
25
+
26
+ const lineData: [[number, number], [number, number]] = [
27
+ [0, 2],
28
+ [12, 14]
29
+ ];
38
30
 
39
- function handleItemClick(params: echarts.ECElementEvent) {
40
- console.log(params);
41
- }
31
+ function handleItemClick(params: echarts.ECElementEvent) {}
42
32
 
43
- function handleMouseOver(params: echarts.ECElementEvent) {
44
- console.log(params);
45
- }
33
+ function handleMouseOver(params: echarts.ECElementEvent) {}
46
34
 
47
- function handleMouseOut() {
48
- console.log('mouse out');
49
- }
35
+ function handleMouseOut() {}
50
36
  </script>
51
37
 
52
- <Story name="Base">
38
+ <Story name="Base" asChild>
39
+ <div class="h-[400px] w-full">
40
+ <Scatterplot
41
+ {data}
42
+ xAxisName="Manual count"
43
+ yAxisName="Analysis count"
44
+ onitemclick={handleItemClick}
45
+ onmouseover={handleMouseOver}
46
+ onmouseout={handleMouseOut}
47
+ />
48
+ </div>
49
+ </Story>
50
+
51
+ <Story name="With Line Data" asChild>
53
52
  <div class="h-[400px] w-full">
54
53
  <Scatterplot
55
54
  {data}
56
55
  {lineData}
57
- xAxis="Manual count"
58
- yAxis="Analysis count"
56
+ xAxisName="Manual count"
57
+ yAxisName="Analysis count"
58
+ onitemclick={handleItemClick}
59
+ onmouseover={handleMouseOver}
60
+ onmouseout={handleMouseOut}
61
+ />
62
+ </div>
63
+ </Story>
64
+ <Story name="Error bars" asChild>
65
+ <div class="h-[400px] w-full">
66
+ <Scatterplot
67
+ data={errorBarsData}
68
+ {lineData}
69
+ xAxisName="Manual count"
70
+ yAxisName="Analysis count"
71
+ onitemclick={handleItemClick}
72
+ onmouseover={handleMouseOver}
73
+ onmouseout={handleMouseOut}
74
+ />
75
+ </div>
76
+ </Story>
77
+ <Story name="Error bars with confidence band" asChild>
78
+ <div class="h-[400px] w-full">
79
+ <Scatterplot
80
+ data={errorBarsData}
81
+ {lineData}
82
+ xAxisName="Manual count"
83
+ yAxisName="Analysis count"
84
+ showConfidenceBand
59
85
  onitemclick={handleItemClick}
60
86
  onmouseover={handleMouseOver}
61
87
  onmouseout={handleMouseOut}
62
88
  />
63
89
  </div>
64
90
  </Story>
65
- <Story name="Loading">
91
+ <Story name="Confidence band and legend" asChild>
66
92
  <div class="h-[400px] w-full">
67
93
  <Scatterplot
68
94
  {data}
69
95
  {lineData}
70
- xAxis="Manual count"
71
- yAxis="Analysis count"
72
- loading
96
+ xAxisName="Manual count"
97
+ yAxisName="Analysis count"
98
+ showConfidenceBand
99
+ showLegend
73
100
  onitemclick={handleItemClick}
74
101
  onmouseover={handleMouseOver}
75
102
  onmouseout={handleMouseOut}