@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,28 +1,35 @@
1
1
  <script lang="ts">
2
- import type { Snippet } from 'svelte';
2
+ import { type Snippet } from 'svelte';
3
3
  import { v4 as uuidv4 } from 'uuid';
4
4
  import IconButton from '../icon-button/IconButton.svelte';
5
5
  import { Icon } from '../icons';
6
+ import Divider from '../divider/Divider.svelte';
6
7
 
7
8
  type ModalProps = {
8
9
  Trigger?: Snippet<[{ openModal: () => void; closeModal: () => void }]>;
10
+ Header?: Snippet;
9
11
  Content: Snippet;
12
+ Footer?: Snippet;
10
13
  onclose?: () => void;
11
14
  defaultOpen?: boolean;
12
15
  id?: string;
13
16
  withClose?: boolean;
14
17
  closeOnClickOutside?: boolean;
15
18
  class?: string;
19
+ contentClass?: string;
16
20
  };
17
21
  let {
18
22
  Trigger,
23
+ Header,
19
24
  Content,
25
+ Footer,
20
26
  onclose,
21
27
  defaultOpen = false,
22
28
  id = 'modal-' + uuidv4(),
23
29
  withClose = true,
24
30
  closeOnClickOutside = true,
25
- class: modalClass
31
+ class: modalClass,
32
+ contentClass = 'p-4'
26
33
  }: ModalProps = $props();
27
34
 
28
35
  const modalOpen = $state(defaultOpen);
@@ -42,15 +49,29 @@
42
49
  {@render Trigger({ openModal, closeModal })}
43
50
  {/if}
44
51
  <dialog {id} class="modal w-full max-w-full" class:modal-open={modalOpen}>
45
- <div class="modal-box {modalClass}">
52
+ <div class="modal-box relative flex max-w-full flex-col rounded-xl bg-surface p-0 {modalClass}">
53
+ {#if Header}
54
+ <div class="flex h-12 items-center px-4">
55
+ {@render Header()}
56
+ </div>
57
+ <Divider />
58
+ {/if}
46
59
  {#if withClose}
47
- <div class="close-button">
48
- <IconButton onclick={closeModal} size="md" variant="secondary">
60
+ <div class="absolute right-0 top-0 z-10 p-2">
61
+ <IconButton onclick={closeModal} size="md" variant="transparent" rounded={false}>
49
62
  <Icon iconName="X" />
50
63
  </IconButton>
51
64
  </div>
52
65
  {/if}
53
- {@render Content()}
66
+ <div class="flex-1 {contentClass}">
67
+ {@render Content()}
68
+ </div>
69
+ {#if Footer}
70
+ <Divider />
71
+ <div class="px-4 py-2">
72
+ {@render Footer()}
73
+ </div>
74
+ {/if}
54
75
  </div>
55
76
  {#if closeOnClickOutside}
56
77
  <form method="dialog" class="modal-backdrop">
@@ -58,19 +79,3 @@
58
79
  </form>
59
80
  {/if}
60
81
  </dialog>
61
-
62
- <style>
63
- .modal-box {
64
- position: relative;
65
- max-width: 100%;
66
- border-radius: 0.75rem;
67
- --tw-bg-opacity: 1;
68
- background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1))
69
- }
70
- .close-button {
71
- position: absolute;
72
- right: 0px;
73
- top: 0px;
74
- padding: 1.5rem
75
- }
76
- </style>
@@ -1,16 +1,19 @@
1
- import type { Snippet } from 'svelte';
1
+ import { type Snippet } from 'svelte';
2
2
  type ModalProps = {
3
3
  Trigger?: Snippet<[{
4
4
  openModal: () => void;
5
5
  closeModal: () => void;
6
6
  }]>;
7
+ Header?: Snippet;
7
8
  Content: Snippet;
9
+ Footer?: Snippet;
8
10
  onclose?: () => void;
9
11
  defaultOpen?: boolean;
10
12
  id?: string;
11
13
  withClose?: boolean;
12
14
  closeOnClickOutside?: boolean;
13
15
  class?: string;
16
+ contentClass?: string;
14
17
  };
15
18
  declare const Modal: import("svelte").Component<ModalProps, {}, "">;
16
19
  type Modal = ReturnType<typeof Modal>;
@@ -16,7 +16,7 @@
16
16
  }
17
17
  </script>
18
18
 
19
- <Story name="Primary">
19
+ <Story name="Primary" asChild>
20
20
  <NotificationPopup onClose={handleClick} title="See what's new" {visible}>
21
21
  <a href="_blank" color="transparent" class="flex items-center gap-2">
22
22
  <Icon iconName="Sparkle" />
@@ -0,0 +1,13 @@
1
+ <script lang="ts" module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import Pill from './Pill.svelte';
4
+
5
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
6
+ const { Story } = defineMeta({
7
+ title: 'Design System/Pill',
8
+ component: Pill,
9
+ tags: ['autodocs']
10
+ });
11
+ </script>
12
+
13
+ <Story name="Base" args={{ text: 'Example Pill' }} />
@@ -0,0 +1,19 @@
1
+ import Pill from './Pill.svelte';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const Pill: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type Pill = InstanceType<typeof Pill>;
19
+ export default Pill;
@@ -0,0 +1,15 @@
1
+ <script lang="ts" module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import ProgressCircle from './ProgressCircle.svelte';
4
+
5
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
6
+ const { Story } = defineMeta({
7
+ title: 'Design System/ProgressCircle',
8
+ component: ProgressCircle,
9
+ tags: ['autodocs']
10
+ });
11
+ </script>
12
+
13
+ <Story name="Base" args={{ progress: 20 }} />
14
+
15
+ <Story name="Small" args={{ progress: 20, size: 'sm' }} />
@@ -0,0 +1,19 @@
1
+ import ProgressCircle from './ProgressCircle.svelte';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const ProgressCircle: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type ProgressCircle = InstanceType<typeof ProgressCircle>;
19
+ export default ProgressCircle;
@@ -0,0 +1,28 @@
1
+ <script module lang="ts">
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import RequiredStatusIndicator from './RequiredStatusIndicator.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'Design System/RequiredStatusIndicator',
7
+ component: RequiredStatusIndicator,
8
+ tags: ['autodocs'],
9
+ argTypes: {
10
+ currentCount: { control: 'number', description: 'Current number of completed items' },
11
+ requiredCount: { control: 'number', description: 'Total number of required items' },
12
+ class: { control: 'text', description: 'Optional additional CSS classes' }
13
+ }
14
+ });
15
+ </script>
16
+
17
+ <Story name="Incomplete" args={{ currentCount: 1, requiredCount: 3 }} />
18
+
19
+ <Story name="Complete" args={{ currentCount: 3, requiredCount: 3 }} />
20
+
21
+ <Story
22
+ name="CustomClass"
23
+ args={{
24
+ currentCount: 2,
25
+ requiredCount: 4,
26
+ class: 'text-lg text-warning'
27
+ }}
28
+ />
@@ -0,0 +1,19 @@
1
+ import RequiredStatusIndicator from './RequiredStatusIndicator.svelte';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const RequiredStatusIndicator: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type RequiredStatusIndicator = InstanceType<typeof RequiredStatusIndicator>;
19
+ export default RequiredStatusIndicator;
@@ -0,0 +1,22 @@
1
+ <script lang="ts">
2
+ import { Icon } from '../icons';
3
+
4
+ type Props = {
5
+ currentCount: number;
6
+ requiredCount: number;
7
+ class?: string;
8
+ };
9
+
10
+ let { currentCount, requiredCount, class: className = '' }: Props = $props();
11
+
12
+ const isComplete = $derived(currentCount >= requiredCount);
13
+ </script>
14
+
15
+ <span class={`flex items-center gap-1 text-sm text-tertiary ${className}`}>
16
+ {currentCount} of {requiredCount} required
17
+ {#if isComplete}
18
+ <Icon iconName="CheckCircle" weight="fill" color="accent" size={16} />
19
+ {:else}
20
+ <Icon iconName="CheckCircle" size={16} />
21
+ {/if}
22
+ </span>
@@ -0,0 +1,8 @@
1
+ type Props = {
2
+ currentCount: number;
3
+ requiredCount: number;
4
+ class?: string;
5
+ };
6
+ declare const RequiredStatusIndicator: import("svelte").Component<Props, {}, "">;
7
+ type RequiredStatusIndicator = ReturnType<typeof RequiredStatusIndicator>;
8
+ export default RequiredStatusIndicator;
@@ -0,0 +1 @@
1
+ export { default as RequiredStatusIndicator } from './RequiredStatusIndicator.svelte';
@@ -0,0 +1 @@
1
+ export { default as RequiredStatusIndicator } from './RequiredStatusIndicator.svelte';
@@ -10,7 +10,7 @@
10
10
  });
11
11
  </script>
12
12
 
13
- <Story name="Primary">
13
+ <Story name="Primary" asChild>
14
14
  <SegmentedControlButtons class="w-[350px]">
15
15
  {#snippet children({ ControlButton })}
16
16
  <ControlButton active><Icon iconName="Star" /> Low</ControlButton>
@@ -19,7 +19,7 @@
19
19
  {/snippet}
20
20
  </SegmentedControlButtons>
21
21
  </Story>
22
- <Story name="Large">
22
+ <Story name="Large" asChild>
23
23
  <SegmentedControlButtons size="lg" class="w-[350px]">
24
24
  {#snippet children({ ControlButton })}
25
25
  <ControlButton active><Icon iconName="Star" /> Low</ControlButton>
@@ -28,7 +28,7 @@
28
28
  {/snippet}
29
29
  </SegmentedControlButtons>
30
30
  </Story>
31
- <Story name="Secondary">
31
+ <Story name="Secondary" asChild>
32
32
  <SegmentedControlButtons class="w-[350px]">
33
33
  {#snippet children({ ControlButton })}
34
34
  <ControlButton active color="secondary">
@@ -23,55 +23,55 @@
23
23
  }
24
24
  </script>
25
25
 
26
- <Story name="Default">
26
+ <Story name="Default" asChild>
27
27
  <div class="py-12">
28
28
  <Select listOpen {items} />
29
29
  </div>
30
30
  </Story>
31
- <Story name="Grouped">
31
+ <Story name="Grouped" asChild>
32
32
  <div class="py-12">
33
33
  <Select listOpen {items} withGroup />
34
34
  </div>
35
35
  </Story>
36
36
 
37
- <Story name="DefaultValue">
37
+ <Story name="DefaultValue" asChild>
38
38
  <div class="py-12">
39
39
  <Select listOpen {items} withGroup value={{ value: '1', label: 'One', group: 'Group 1' }} />
40
40
  </div>
41
41
  </Story>
42
42
 
43
- <Story name="Disabled">
43
+ <Story name="Disabled" asChild>
44
44
  <div class="py-12">
45
45
  <Select listOpen {items} disabled />
46
46
  </div>
47
47
  </Story>
48
- <Story name="Searchable">
48
+ <Story name="Searchable" asChild>
49
49
  <div class="py-12">
50
50
  <Select listOpen {items} searchable />
51
51
  </div>
52
52
  </Story>
53
- <Story name="Open">
53
+ <Story name="Open" asChild>
54
54
  <div class="py-12">
55
55
  <Select listOpen {items} />
56
56
  </div>
57
57
  </Story>
58
- <Story name="Error">
58
+ <Story name="Error" asChild>
59
59
  <div class="py-12">
60
60
  <Select listOpen {items} hasError />
61
61
  </div>
62
62
  </Story>
63
- <Story name="Placeholder">
63
+ <Story name="Placeholder" asChild>
64
64
  <div class="py-12">
65
65
  <Select listOpen {items} placeholder="Select a value" />
66
66
  </div>
67
67
  </Story>
68
- <Story name="Multiple">
68
+ <Story name="Multiple" asChild>
69
69
  <div class="py-12">
70
70
  <Select listOpen {items} multiple bind:value />
71
71
  </div>
72
72
  </Story>
73
73
 
74
- <Story name="Bind value input changed">
74
+ <Story name="Bind value input changed" asChild>
75
75
  <div class="py-12">
76
76
  <Select listOpen {items} bind:value on:input={handleInput} />
77
77
  {#if thisChanged}
@@ -79,7 +79,7 @@
79
79
  </div>
80
80
  </Story>
81
81
 
82
- <Story name="Custom Item">
82
+ <Story name="Custom Item" asChild>
83
83
  <div class="py-12">
84
84
  <Select listOpen {items} value={{ value: '1', label: 'One', group: 'Group 1' }}>
85
85
  <!-- @migration-task: migrate this slot by hand, `custom-item` is an invalid identifier -->
@@ -101,7 +101,7 @@
101
101
  </div>
102
102
  </Story>
103
103
 
104
- <Story name="Custom selection label">
104
+ <Story name="Custom selection label" asChild>
105
105
  <div class="py-12">
106
106
  <Select {items} value={{ value: '1', label: 'One', group: 'Group 1' }}>
107
107
  <!-- @migration-task: migrate this slot by hand, `custom-selection` is an invalid identifier -->
@@ -9,8 +9,6 @@
9
9
  import SvelteSelect from 'svelte-select';
10
10
  import type { SelectItemProps } from '.';
11
11
 
12
- // Docs: https://github.com/rob-balfre/svelte-select
13
-
14
12
  const dispatch = createEventDispatcher();
15
13
 
16
14
  export let items: SelectItemProps[] = [];
@@ -0,0 +1,219 @@
1
+ <script module lang="ts">
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import * as Select from './index';
4
+ import { Icon, type IconName } from '../icons';
5
+
6
+ const { Story } = defineMeta({
7
+ title: 'Design System/Select(New)',
8
+
9
+ argTypes: {
10
+ placeholder: { control: 'text', defaultValue: 'Select an option...' },
11
+ disabled: { control: 'boolean', defaultValue: false },
12
+ multiple: { control: 'boolean', defaultValue: false }
13
+ }
14
+ });
15
+
16
+ const foodGroups = [
17
+ { value: 'fruits', label: 'Fruits' },
18
+ { value: 'vegetables', label: 'Vegetables' },
19
+ { value: 'grains', label: 'Grains' },
20
+ { value: 'protein', label: 'Protein Foods' },
21
+ { value: 'dairy', label: 'Dairy' }
22
+ ];
23
+
24
+ const moreFruits = [
25
+ { value: 'apple', label: 'Apple' },
26
+ { value: 'banana', label: 'Banana' },
27
+ { value: 'blueberry', label: 'Blueberry' },
28
+ { value: 'grapes', label: 'Grapes' },
29
+ { value: 'mango', label: 'Mango' }
30
+ ];
31
+
32
+ let selectedValueSingle = $state<string | undefined>(undefined);
33
+ let selectedValueMultiple = $state<string[]>([]);
34
+ let selectedValueSinglePreselected = $state<string | undefined>('vegetables');
35
+ let selectedValueMultiplePreselected = $state<string[]>(['fruits', 'grains']);
36
+
37
+ const customIconItems = [
38
+ { value: 'insect_count', label: 'Insect count', iconName: 'Hash' },
39
+ { value: 'insect_health', label: 'Insect health', iconName: 'Hash' },
40
+ { value: 'leaf_area', label: 'Leaf area', iconName: 'Ruler' },
41
+ { value: 'time_spent', label: 'Time spent on leaf', iconName: 'Timer' }
42
+ ];
43
+ let selectedCustomItems = $state<string[]>(['insect_count', 'leaf_area']);
44
+
45
+ const handleRemoveCustomItem = (itemValue: string) => {
46
+ selectedCustomItems = selectedCustomItems.filter((v) => v !== itemValue);
47
+ };
48
+ const handleRemoveValueMultiple = (itemValue: string) => {
49
+ selectedValueMultiple = selectedValueMultiple.filter((v) => v !== itemValue);
50
+ };
51
+ const handleRemoveValueMultiplePreselected = (itemValue: string) => {
52
+ selectedValueMultiplePreselected = selectedValueMultiplePreselected.filter(
53
+ (v) => v !== itemValue
54
+ );
55
+ };
56
+ </script>
57
+
58
+ <Story name="Default (Single Select)" asChild>
59
+ <div class="p-4">
60
+ <Select.Root bind:value={selectedValueSingle} items={foodGroups} type="single" open>
61
+ <Select.Trigger
62
+ class="w-[250px]"
63
+ placeholder={'Select a food group'}
64
+ displayValue={foodGroups.find((f) => f.value === selectedValueSingle)?.label}
65
+ />
66
+
67
+ <Select.Content>
68
+ {#each foodGroups as item (item.value)}
69
+ <Select.Item value={item.value} label={item.label} />
70
+ {/each}
71
+ </Select.Content>
72
+ </Select.Root>
73
+ <div class="mt-2 rounded bg-gray-100 p-2 text-sm">
74
+ Selected: {selectedValueSingle ?? 'Nothing'}
75
+ </div>
76
+ </div>
77
+ </Story>
78
+
79
+ <Story name="With Groups (Single Select)" asChild>
80
+ <div class="p-4">
81
+ <Select.Root bind:value={selectedValueSingle} items={moreFruits} type="single">
82
+ <Select.Trigger
83
+ class="w-[250px]"
84
+ placeholder={'Select a fruit'}
85
+ displayValue={moreFruits.find((f) => f.value === selectedValueSingle)?.label}
86
+ />
87
+ <Select.Portal>
88
+ <Select.Content>
89
+ <Select.Group label="Fruits">
90
+ {#each moreFruits.slice(0, 2) as item (item.value)}
91
+ <Select.Item value={item.value} label={item.label} />
92
+ {/each}
93
+ </Select.Group>
94
+ <Select.Group label="More Fruits">
95
+ {#each moreFruits.slice(2) as item (item.value)}
96
+ <Select.Item value={item.value} label={item.label} />
97
+ {/each}
98
+ </Select.Group>
99
+ </Select.Content>
100
+ </Select.Portal>
101
+ </Select.Root>
102
+ <div class="mt-2 rounded bg-gray-100 p-2 text-sm">
103
+ Selected: {selectedValueSingle ?? 'Nothing'}
104
+ </div>
105
+ </div>
106
+ </Story>
107
+
108
+ <Story name="Multiple Select Example" asChild>
109
+ <div class="p-4">
110
+ <Select.Root bind:value={selectedValueMultiple} items={foodGroups} type="multiple">
111
+ <Select.MultiSelectTrigger
112
+ selectedValues={selectedValueMultiple}
113
+ items={foodGroups}
114
+ onRemoveItem={handleRemoveValueMultiple}
115
+ />
116
+ <Select.Portal>
117
+ <Select.Content>
118
+ {#each foodGroups as item (item.value)}
119
+ <Select.Item value={item.value} label={item.label} />
120
+ {/each}
121
+ </Select.Content>
122
+ </Select.Portal>
123
+ </Select.Root>
124
+ <div class="mt-2 rounded bg-gray-100 p-2 text-sm">
125
+ Selected: {selectedValueMultiple.join(', ') || 'Nothing'}
126
+ </div>
127
+ </div>
128
+ </Story>
129
+
130
+ <Story name="Disabled Select" asChild>
131
+ <div class="p-4">
132
+ <Select.Root items={foodGroups} type="single" disabled={true}>
133
+ <Select.Trigger class="w-[250px]" placeholder={'Cannot select (disabled)'} disabled={true} />
134
+ <Select.Portal>
135
+ <Select.Content>
136
+ {#each foodGroups as item (item.value)}
137
+ <Select.Item value={item.value} label={item.label} disabled={true} />
138
+ {/each}
139
+ </Select.Content>
140
+ </Select.Portal>
141
+ </Select.Root>
142
+ <div class="mt-2 rounded bg-gray-100 p-2 text-sm">Selected: Nothing (disabled)</div>
143
+ </div>
144
+ </Story>
145
+
146
+ <Story name="Pre-selected (Single Select)" asChild>
147
+ <div class="p-4">
148
+ <Select.Root bind:value={selectedValueSinglePreselected} items={foodGroups} type="single">
149
+ <Select.Trigger
150
+ class="w-[250px]"
151
+ placeholder={'Select a food group'}
152
+ displayValue={foodGroups.find((f) => f.value === selectedValueSinglePreselected)?.label}
153
+ />
154
+ <Select.Portal>
155
+ <Select.Content>
156
+ {#each foodGroups as item (item.value)}
157
+ <Select.Item value={item.value} label={item.label} />
158
+ {/each}
159
+ </Select.Content>
160
+ </Select.Portal>
161
+ </Select.Root>
162
+ <div class="mt-2 rounded bg-gray-100 p-2 text-sm">
163
+ Selected: {selectedValueSinglePreselected ?? 'Nothing'}
164
+ </div>
165
+ </div>
166
+ </Story>
167
+
168
+ <Story name="Pre-selected (Multiple Select)" asChild>
169
+ <div class="p-4">
170
+ <Select.Root bind:value={selectedValueMultiplePreselected} items={foodGroups} type="multiple">
171
+ <Select.MultiSelectTrigger
172
+ selectedValues={selectedValueMultiplePreselected}
173
+ items={foodGroups}
174
+ onRemoveItem={handleRemoveValueMultiplePreselected}
175
+ />
176
+ <Select.Portal>
177
+ <Select.Content>
178
+ {#each foodGroups as item (item.value)}
179
+ <Select.Item value={item.value} label={item.label} />
180
+ {/each}
181
+ </Select.Content>
182
+ </Select.Portal>
183
+ </Select.Root>
184
+ <div class="mt-2 rounded bg-gray-100 p-2 text-sm">
185
+ Selected: {selectedValueMultiplePreselected.join(', ') || 'Nothing'}
186
+ </div>
187
+ </div>
188
+ </Story>
189
+
190
+ <Story name="Multiple Select with Custom Icons and Dismissible Tags" asChild>
191
+ <div class="p-4">
192
+ <Select.Root bind:value={selectedCustomItems} items={customIconItems} type="multiple">
193
+ <Select.MultiSelectTrigger
194
+ class="w-[350px]"
195
+ selectedValues={selectedCustomItems}
196
+ items={customIconItems}
197
+ placeholder="Select metrics..."
198
+ onRemoveItem={handleRemoveCustomItem}
199
+ />
200
+ <Select.Portal>
201
+ <Select.Content>
202
+ {#each customIconItems as item (item.value)}
203
+ <Select.Item value={item.value} label={item.label}>
204
+ {#snippet children()}
205
+ <div class="flex items-center gap-2">
206
+ <Icon iconName={item.iconName as IconName} class="h-4 w-4" />
207
+ <span>{item.label}</span>
208
+ </div>
209
+ {/snippet}
210
+ </Select.Item>
211
+ {/each}
212
+ </Select.Content>
213
+ </Select.Portal>
214
+ </Select.Root>
215
+ <div class="mt-2 rounded bg-neutral p-2 text-sm">
216
+ Selected Values: {selectedCustomItems.join(', ') || 'Nothing'}
217
+ </div>
218
+ </div>
219
+ </Story>
@@ -0,0 +1,19 @@
1
+ import * as Select from './index';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const Select: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type Select = InstanceType<typeof Select>;
19
+ export default Select;
@@ -0,0 +1,24 @@
1
+ <script lang="ts">
2
+ import { Select as SelectPrimitive } from 'bits-ui';
3
+ import type { Snippet } from 'svelte';
4
+ import type { GroupProps as PrimitiveGroupProps } from '../types';
5
+ import GroupHeading from './SelectGroupHeading.svelte';
6
+
7
+ interface Props extends PrimitiveGroupProps {
8
+ label?: string;
9
+ children: Snippet;
10
+ class?: string;
11
+ contentClass?: string;
12
+ }
13
+
14
+ let { label, children, class: className, contentClass, ...restProps }: Props = $props();
15
+ </script>
16
+
17
+ <SelectPrimitive.Group class={className} {...restProps}>
18
+ {#if label}
19
+ <GroupHeading>{label}</GroupHeading>
20
+ {/if}
21
+ <div class={contentClass}>
22
+ {@render children()}
23
+ </div>
24
+ </SelectPrimitive.Group>