@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,215 +1,215 @@
1
1
  <script module lang="ts">
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import MultiCFUCounter from './MultiCFUCounter.svelte';
4
- const { Story } = defineMeta({
5
- component: MultiCFUCounter,
6
- title: 'Design System/MultiCFUCounter',
7
- tags: ['autodocs'],
8
- args: {
9
- imageUrl: '/imgs/ris.jpg',
10
- marks: [],
11
- disabled: false,
12
- hideMarkers: false
13
- },
14
- argTypes: {
15
- imageUrl: {
16
- control: 'text',
17
- description: 'URL of the image to display'
18
- },
19
- marks: {
20
- control: 'object',
21
- description: 'Array of marker coordinates. Bindable for two-way data flow.'
22
- },
23
- onclick: {
24
- action: 'clicked',
25
- description: 'Event handler for when a marker is added'
26
- },
27
- disabled: {
28
- control: 'boolean',
29
- description: 'Disables interaction with the counter'
30
- },
31
- hideMarkers: {
32
- control: 'boolean',
33
- description: 'Hides the markers and prevents new ones from being added'
34
- }
35
- }
36
- });
37
-
38
- const largeImage = '/imgs/ris.jpg';
39
-
40
- function handleUpdate(event: MouseEvent, marks: Array<{ x: number; y: number }>) {
41
- console.log('Marker count:', marks.length);
42
- console.log('Marker positions:', marks);
43
- }
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import MultiCFUCounter from './MultiCFUCounter.svelte';
4
+ const { Story } = defineMeta({
5
+ component: MultiCFUCounter,
6
+ title: 'Design System/MultiCFUCounter',
7
+ tags: ['autodocs'],
8
+ args: {
9
+ imageUrl: '/imgs/ris.jpg',
10
+ marks: [],
11
+ disabled: false,
12
+ hideMarkers: false,
13
+ },
14
+ argTypes: {
15
+ imageUrl: {
16
+ control: 'text',
17
+ description: 'URL of the image to display',
18
+ },
19
+ marks: {
20
+ control: 'object',
21
+ description: 'Array of marker coordinates. Bindable for two-way data flow.',
22
+ },
23
+ onclick: {
24
+ action: 'clicked',
25
+ description: 'Event handler for when a marker is added',
26
+ },
27
+ disabled: {
28
+ control: 'boolean',
29
+ description: 'Disables interaction with the counter',
30
+ },
31
+ hideMarkers: {
32
+ control: 'boolean',
33
+ description: 'Hides the markers and prevents new ones from being added',
34
+ },
35
+ },
36
+ });
37
+
38
+ const largeImage = '/imgs/ris.jpg';
39
+
40
+ function handleUpdate(event: MouseEvent, marks: Array<{ x: number; y: number }>) {
41
+ console.log('Marker count:', marks.length);
42
+ console.log('Marker positions:', marks);
43
+ }
44
44
  </script>
45
45
 
46
46
  <script lang="ts">
47
- let activeConfigIndex = $state(0);
48
- let allMarksMultiConfig = $state([
49
- // Yeast Count (config 0) - blue markers
50
- { x: 120, y: 150, configIndex: 0, color: 'icon-blue', id: 'yeast-1' },
51
- { x: 180, y: 220, configIndex: 0, color: 'icon-blue', id: 'yeast-2' },
52
- { x: 250, y: 180, configIndex: 0, color: 'icon-blue', id: 'yeast-3' },
53
-
54
- // Mold Count (config 1) - orange markers
55
- { x: 320, y: 160, configIndex: 1, color: 'icon-orange', id: 'mold-1' },
56
- { x: 380, y: 240, configIndex: 1, color: 'icon-orange', id: 'mold-2' },
57
-
58
- // Colony Type (config 2) - lime markers
59
- { x: 400, y: 120, configIndex: 2, color: 'icon-lime', id: 'type-1' }
60
- ]);
61
-
62
- const configurations = [
63
- { name: 'Yeast Count', color: 'icon-blue', configIndex: 0 },
64
- { name: 'Mold Count', color: 'icon-orange', configIndex: 1 },
65
- { name: 'Colony Type', color: 'icon-lime', configIndex: 2 }
66
- ];
67
-
68
- function handleMultiConfigUpdate(event: MouseEvent, marks: Array<{ x: number; y: number }>) {
69
- console.log(`Configuration ${activeConfigIndex} updated:`, marks.length, 'marks');
70
-
71
- allMarksMultiConfig = allMarksMultiConfig.filter(
72
- (mark) => mark.configIndex !== activeConfigIndex
73
- );
74
-
75
- const newMarks = marks.map((mark, index) => ({
76
- x: mark.x,
77
- y: mark.y,
78
- configIndex: activeConfigIndex,
79
- color: configurations[activeConfigIndex].color,
80
- id: `config-${activeConfigIndex}-${index + 1}`
81
- }));
82
-
83
- allMarksMultiConfig = [...allMarksMultiConfig, ...newMarks];
84
- }
85
-
86
- function switchConfiguration(configIndex: number) {
87
- activeConfigIndex = configIndex;
88
- }
89
-
90
- const activeConfigMarks = $derived(
91
- allMarksMultiConfig
92
- .filter((mark) => mark.configIndex === activeConfigIndex)
93
- .map((mark) => ({ x: mark.x, y: mark.y }))
94
- );
47
+ let activeConfigIndex = $state(0);
48
+ let allMarksMultiConfig = $state([
49
+ // Yeast Count (config 0) - blue markers
50
+ { x: 120, y: 150, configIndex: 0, color: 'icon-blue', id: 'yeast-1' },
51
+ { x: 180, y: 220, configIndex: 0, color: 'icon-blue', id: 'yeast-2' },
52
+ { x: 250, y: 180, configIndex: 0, color: 'icon-blue', id: 'yeast-3' },
53
+
54
+ // Mold Count (config 1) - orange markers
55
+ { x: 320, y: 160, configIndex: 1, color: 'icon-orange', id: 'mold-1' },
56
+ { x: 380, y: 240, configIndex: 1, color: 'icon-orange', id: 'mold-2' },
57
+
58
+ // Colony Type (config 2) - lime markers
59
+ { x: 400, y: 120, configIndex: 2, color: 'icon-lime', id: 'type-1' },
60
+ ]);
61
+
62
+ const configurations = [
63
+ { name: 'Yeast Count', color: 'icon-blue', configIndex: 0 },
64
+ { name: 'Mold Count', color: 'icon-orange', configIndex: 1 },
65
+ { name: 'Colony Type', color: 'icon-lime', configIndex: 2 },
66
+ ];
67
+
68
+ function handleMultiConfigUpdate(event: MouseEvent, marks: Array<{ x: number; y: number }>) {
69
+ console.log(`Configuration ${activeConfigIndex} updated:`, marks.length, 'marks');
70
+
71
+ allMarksMultiConfig = allMarksMultiConfig.filter(
72
+ (mark) => mark.configIndex !== activeConfigIndex
73
+ );
74
+
75
+ const newMarks = marks.map((mark, index) => ({
76
+ x: mark.x,
77
+ y: mark.y,
78
+ configIndex: activeConfigIndex,
79
+ color: configurations[activeConfigIndex].color,
80
+ id: `config-${activeConfigIndex}-${index + 1}`,
81
+ }));
82
+
83
+ allMarksMultiConfig = [...allMarksMultiConfig, ...newMarks];
84
+ }
85
+
86
+ function switchConfiguration(configIndex: number) {
87
+ activeConfigIndex = configIndex;
88
+ }
89
+
90
+ const activeConfigMarks = $derived(
91
+ allMarksMultiConfig
92
+ .filter((mark) => mark.configIndex === activeConfigIndex)
93
+ .map((mark) => ({ x: mark.x, y: mark.y }))
94
+ );
95
95
  </script>
96
96
 
97
97
  <Story name="Default" asChild>
98
- <div class="p-4">
99
- <h3 class="mb-4 text-lg font-semibold">Manual CFU Counter</h3>
100
- <p class="mb-4 text-sm text-secondary">
101
- Click to add markers. Pan by clicking and dragging. Zoom with the mouse wheel.
102
- </p>
103
- <div class="h-[600px] rounded-lg border border-static p-4">
104
- <MultiCFUCounter imageUrl={largeImage} onclick={handleUpdate} activeMarkerName="Yeast" />
105
- </div>
106
- </div>
98
+ <div class="p-4">
99
+ <h3 class="mb-4 text-lg font-semibold">Manual CFU Counter</h3>
100
+ <p class="mb-4 text-sm text-secondary">
101
+ Click to add markers. Pan by clicking and dragging. Zoom with the mouse wheel.
102
+ </p>
103
+ <div class="h-[600px] rounded-lg border border-static p-4">
104
+ <MultiCFUCounter imageUrl={largeImage} onclick={handleUpdate} activeMarkerName="Yeast" />
105
+ </div>
106
+ </div>
107
107
  </Story>
108
108
 
109
109
  <Story name="Multi-Configuration Mode" asChild>
110
- <div class="p-4">
111
- <h3 class="mb-4 text-lg font-semibold">Multi-Configuration CFU Counter</h3>
112
- <p class="mb-4 text-sm text-secondary">
113
- This example demonstrates the multi-configuration mode used in assay analysis validation.
114
- Switch between different configurations to count different types of objects with color-coded
115
- markers.
116
- </p>
117
-
118
- <div class="mb-4 flex gap-2">
119
- {#each configurations as config, index}
120
- <button
121
- class="flex items-center gap-2 rounded-lg border px-3 py-2 text-sm transition-colors"
122
- class:border-interactive={activeConfigIndex === index}
123
- class:bg-surface-secondary={activeConfigIndex === index}
124
- class:border-neutral={activeConfigIndex !== index}
125
- onclick={() => switchConfiguration(index)}
126
- >
127
- <div
128
- class="h-3 w-3 rounded-full"
129
- style="background-color: var(--text-{config.color})"
130
- ></div>
131
- {config.name}
132
- <span class="text-xs text-tertiary">
133
- ({allMarksMultiConfig.filter((m) => m.configIndex === index).length})
134
- </span>
135
- </button>
136
- {/each}
137
- </div>
138
-
139
- <div class="mb-4 rounded-lg border border-neutral bg-surface-secondary p-3">
140
- <div class="mb-2 flex items-center gap-2">
141
- <div
142
- class="h-4 w-4 rounded-full"
143
- style="background-color: var(--text-{configurations[activeConfigIndex].color})"
144
- ></div>
145
- <span class="font-medium">Active: {configurations[activeConfigIndex].name}</span>
146
- </div>
147
- <p class="text-sm text-secondary">
148
- Click on the image to add markers for {configurations[
149
- activeConfigIndex
150
- ].name.toLowerCase()}. Each configuration maintains its own set of markers with distinct
151
- colors.
152
- </p>
153
- </div>
154
-
155
- <div class="h-[600px] rounded-lg border border-static p-4">
156
- <MultiCFUCounter
157
- imageUrl={largeImage}
158
- marks={activeConfigMarks}
159
- allMarks={allMarksMultiConfig}
160
- showMultiConfig={true}
161
- activeMarkerColor={configurations[activeConfigIndex].color}
162
- activeMarkerName={configurations[activeConfigIndex].name}
163
- editableConfigIndex={activeConfigIndex}
164
- onclick={handleMultiConfigUpdate}
165
- />
166
- </div>
167
-
168
- <div class="mt-4 grid grid-cols-3 gap-4">
169
- {#each configurations as config, index}
170
- <div class="rounded-lg border border-neutral bg-surface p-3">
171
- <div class="mb-1 flex items-center gap-2">
172
- <div
173
- class="h-3 w-3 rounded-full"
174
- style="background-color: var(--text-{config.color})"
175
- ></div>
176
- <span class="text-sm font-medium">{config.name}</span>
177
- </div>
178
- <p class="text-lg font-bold">
179
- {allMarksMultiConfig.filter((m) => m.configIndex === index).length}
180
- </p>
181
- <p class="text-xs text-tertiary">objects counted</p>
182
- </div>
183
- {/each}
184
- </div>
185
-
186
- <details class="mt-4 text-sm">
187
- <summary>All Marks Data:</summary>
188
- <pre class="mt-2 rounded bg-surface-secondary p-2 text-xs">{JSON.stringify(
189
- allMarksMultiConfig,
190
- null,
191
- 2
192
- )}</pre>
193
- </details>
194
- </div>
110
+ <div class="p-4">
111
+ <h3 class="mb-4 text-lg font-semibold">Multi-Configuration CFU Counter</h3>
112
+ <p class="mb-4 text-sm text-secondary">
113
+ This example demonstrates the multi-configuration mode used in assay analysis validation.
114
+ Switch between different configurations to count different types of objects with color-coded
115
+ markers.
116
+ </p>
117
+
118
+ <div class="mb-4 flex gap-2">
119
+ {#each configurations as config, index}
120
+ <button
121
+ class="flex items-center gap-2 rounded-lg border px-3 py-2 text-sm transition-colors"
122
+ class:border-interactive={activeConfigIndex === index}
123
+ class:bg-surface-secondary={activeConfigIndex === index}
124
+ class:border-neutral={activeConfigIndex !== index}
125
+ onclick={() => switchConfiguration(index)}
126
+ >
127
+ <div
128
+ class="h-3 w-3 rounded-full"
129
+ style="background-color: var(--text-{config.color})"
130
+ ></div>
131
+ {config.name}
132
+ <span class="text-xs text-tertiary">
133
+ ({allMarksMultiConfig.filter((m) => m.configIndex === index).length})
134
+ </span>
135
+ </button>
136
+ {/each}
137
+ </div>
138
+
139
+ <div class="mb-4 rounded-lg border border-neutral bg-surface-secondary p-3">
140
+ <div class="mb-2 flex items-center gap-2">
141
+ <div
142
+ class="h-4 w-4 rounded-full"
143
+ style="background-color: var(--text-{configurations[activeConfigIndex].color})"
144
+ ></div>
145
+ <span class="font-medium">Active: {configurations[activeConfigIndex].name}</span>
146
+ </div>
147
+ <p class="text-sm text-secondary">
148
+ Click on the image to add markers for {configurations[
149
+ activeConfigIndex
150
+ ].name.toLowerCase()}. Each configuration maintains its own set of markers with distinct
151
+ colors.
152
+ </p>
153
+ </div>
154
+
155
+ <div class="h-[600px] rounded-lg border border-static p-4">
156
+ <MultiCFUCounter
157
+ imageUrl={largeImage}
158
+ marks={activeConfigMarks}
159
+ allMarks={allMarksMultiConfig}
160
+ showMultiConfig={true}
161
+ activeMarkerColor={configurations[activeConfigIndex].color}
162
+ activeMarkerName={configurations[activeConfigIndex].name}
163
+ editableConfigIndex={activeConfigIndex}
164
+ onclick={handleMultiConfigUpdate}
165
+ />
166
+ </div>
167
+
168
+ <div class="mt-4 grid grid-cols-3 gap-4">
169
+ {#each configurations as config, index}
170
+ <div class="rounded-lg border border-neutral bg-surface p-3">
171
+ <div class="mb-1 flex items-center gap-2">
172
+ <div
173
+ class="h-3 w-3 rounded-full"
174
+ style="background-color: var(--text-{config.color})"
175
+ ></div>
176
+ <span class="text-sm font-medium">{config.name}</span>
177
+ </div>
178
+ <p class="text-lg font-bold">
179
+ {allMarksMultiConfig.filter((m) => m.configIndex === index).length}
180
+ </p>
181
+ <p class="text-xs text-tertiary">objects counted</p>
182
+ </div>
183
+ {/each}
184
+ </div>
185
+
186
+ <details class="mt-4 text-sm">
187
+ <summary>All Marks Data:</summary>
188
+ <pre class="mt-2 rounded bg-surface-secondary p-2 text-xs">{JSON.stringify(
189
+ allMarksMultiConfig,
190
+ null,
191
+ 2
192
+ )}</pre>
193
+ </details>
194
+ </div>
195
195
  </Story>
196
196
 
197
197
  <Story name="Disabled" asChild>
198
- <div class="p-4">
199
- <h3 class="mb-4 text-lg font-semibold">Disabled Counter</h3>
200
- <p class="mb-4 text-sm text-secondary">No interactions are possible in disabled mode.</p>
201
- <div class="h-[600px] rounded-lg border border-static p-4">
202
- <MultiCFUCounter
203
- imageUrl={largeImage}
204
- marks={activeConfigMarks}
205
- allMarks={allMarksMultiConfig}
206
- showMultiConfig={true}
207
- activeMarkerColor={configurations[activeConfigIndex].color}
208
- activeMarkerName={configurations[activeConfigIndex].name}
209
- editableConfigIndex={activeConfigIndex}
210
- onclick={handleMultiConfigUpdate}
211
- disabled
212
- />
213
- </div>
214
- </div>
198
+ <div class="p-4">
199
+ <h3 class="mb-4 text-lg font-semibold">Disabled Counter</h3>
200
+ <p class="mb-4 text-sm text-secondary">No interactions are possible in disabled mode.</p>
201
+ <div class="h-[600px] rounded-lg border border-static p-4">
202
+ <MultiCFUCounter
203
+ imageUrl={largeImage}
204
+ marks={activeConfigMarks}
205
+ allMarks={allMarksMultiConfig}
206
+ showMultiConfig={true}
207
+ activeMarkerColor={configurations[activeConfigIndex].color}
208
+ activeMarkerName={configurations[activeConfigIndex].name}
209
+ editableConfigIndex={activeConfigIndex}
210
+ onclick={handleMultiConfigUpdate}
211
+ disabled
212
+ />
213
+ </div>
214
+ </div>
215
215
  </Story>