@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,139 +0,0 @@
1
- <!-- @migration-task Error while migrating Svelte code: Cannot overwrite a zero-length range – use appendLeft or prependRight instead -->
2
- <!-- @migration-task Error while migrating Svelte code: This migration would change the name of a slot making the component unusable -->
3
- <script lang="ts">
4
- import { backgroundColor, borderColor, textColor } from '../../tokens';
5
- import { Icon } from '../icons';
6
- import { createEventDispatcher } from 'svelte';
7
- let className = '';
8
- export { className as class };
9
- import SvelteSelect from 'svelte-select';
10
- import type { SelectItemProps } from '.';
11
-
12
- const dispatch = createEventDispatcher();
13
-
14
- export let items: SelectItemProps[] = [];
15
- export let id: string | undefined = undefined;
16
- export let value: SelectItemProps | SelectItemProps[] | null = null;
17
- export let searchable = false;
18
- export let listOpen = false;
19
- export let placeholder: string | undefined = undefined;
20
- export let disabled = false;
21
- export let hasError = false;
22
- export let withGroup = false;
23
- export let multiple = false;
24
- export let clearable = true;
25
- export let required = false;
26
- export let onChange: (value: SelectItemProps | SelectItemProps[]) => void = () => {};
27
-
28
- const groupBy = withGroup ? (item: SelectItemProps) => item.group : undefined;
29
- </script>
30
-
31
- <SvelteSelect
32
- {items}
33
- {searchable}
34
- {placeholder}
35
- {disabled}
36
- {id}
37
- {hasError}
38
- {multiple}
39
- {clearable}
40
- {groupBy}
41
- on:select={(e) => dispatch('change', e.detail)}
42
- on:input={(e) => dispatch('input', e.detail)}
43
- on:change={(e) => {
44
- dispatch('change', e.detail);
45
- onChange(e.detail);
46
- }}
47
- class={`select ${className} h-10`}
48
- {required}
49
- bind:value
50
- bind:listOpen
51
- showChevron={true}
52
- floatingConfig={{
53
- placement: 'bottom'
54
- }}
55
- createGroupHeaderItem={(groupValue) => {
56
- return {
57
- value: groupValue,
58
- label: groupValue
59
- };
60
- }}
61
- --group-title-border-style="1px solid black"
62
- --group-item-padding-left="1rem"
63
- --item-height="100%"
64
- --group-title-color={textColor['secondary']}
65
- --group-title-font-size="0.75rem"
66
- --group-title-font-weight="400"
67
- --group-title-text-transform="none"
68
- --placeholder-color={textColor['secondary']}
69
- --item-is-active-bg={backgroundColor['accent']}
70
- --item-is-active-color={textColor['primary']}
71
- --item-hover-bg={backgroundColor['neutral']}
72
- --border="1px solid {borderColor['input']}"
73
- --border-hover="1px solid {borderColor['hover']}"
74
- --border-focused="1px solid {borderColor['focus']}"
75
- --border-radius="8px"
76
- --font-size="text-sm"
77
- >
78
- <div slot="chevron-icon" class="">
79
- <Icon iconName="CaretDown" color="icon-secondary" />
80
- </div>
81
-
82
- <div slot="selection" let:selection>
83
- {#if $$slots['custom-selection']}
84
- <slot name="custom-selection" {selection} />
85
- {:else}
86
- {selection.label}
87
- {/if}
88
- </div>
89
-
90
- <div slot="clear-icon">
91
- <Icon iconName="X" />
92
- </div>
93
-
94
- <div slot="item" let:item let:index class="flex">
95
- <div class="relative flex flex-1 justify-between">
96
- {#if $$slots['custom-item']}
97
- <slot name="custom-item" {item} {index} />
98
- {:else}
99
- <div class="flex h-full flex-1 items-center text-ellipsis whitespace-nowrap">
100
- <p>{item.label}</p>
101
- </div>
102
- {/if}
103
- </div>
104
- <slot />
105
- </div>
106
- </SvelteSelect>
107
-
108
- <style>
109
- :global(.svelte-select.focused) {
110
- outline: 1px solid var(--colors-gray-1) !important;
111
- }
112
-
113
- :global(.svelte-select) {
114
- width: 100%;
115
- --tw-shadow: 0 1px 4px 0 rgba(18, 25, 42, 0.04);
116
- --tw-shadow-colored: 0 1px 4px 0 var(--tw-shadow-color);
117
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
118
- }
119
-
120
- :global(.svelte-select .item.active) {
121
- background-color: #5750ee1A;
122
- }
123
-
124
- :global(.svelte-select .list-item:not(:first-of-type) > .list-group-title) {
125
- padding-top: 0.5rem;
126
- }
127
-
128
- :global(.svelte-select .list-item:not(:first-of-type) > .list-group-title)::before {
129
- position: relative;
130
- bottom: 0px;
131
- left: 0px;
132
- clear: both;
133
- display: block;
134
- border-top-width: 1px;
135
- border-color: #12192A26;
136
- --tw-content: '';
137
- content: var(--tw-content);
138
- }
139
- </style>
@@ -1,60 +0,0 @@
1
- import type { SelectItemProps } from '.';
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: Props & {
7
- $$events?: Events;
8
- $$slots?: Slots;
9
- }): Exports & {
10
- $set?: any;
11
- $on?: any;
12
- };
13
- z_$$bindings?: Bindings;
14
- }
15
- type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
16
- default: any;
17
- } ? Props extends Record<string, never> ? any : {
18
- children?: any;
19
- } : {});
20
- declare const Select: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
21
- class?: string;
22
- items?: SelectItemProps[];
23
- id?: string | undefined;
24
- value?: SelectItemProps | SelectItemProps[] | null;
25
- searchable?: boolean;
26
- listOpen?: boolean;
27
- placeholder?: string | undefined;
28
- disabled?: boolean;
29
- hasError?: boolean;
30
- withGroup?: boolean;
31
- multiple?: boolean;
32
- clearable?: boolean;
33
- required?: boolean;
34
- onChange?: (value: SelectItemProps | SelectItemProps[]) => void;
35
- }, {
36
- 'custom-selection': {
37
- selection: any;
38
- };
39
- 'custom-item': {
40
- item: any;
41
- index: any;
42
- };
43
- default: {};
44
- }>, {
45
- change: CustomEvent<any>;
46
- input: CustomEvent<any>;
47
- } & {
48
- [evt: string]: CustomEvent<any>;
49
- }, {
50
- 'custom-selection': {
51
- selection: any;
52
- };
53
- 'custom-item': {
54
- item: any;
55
- index: any;
56
- };
57
- default: {};
58
- }, {}, string>;
59
- type Select = InstanceType<typeof Select>;
60
- export default Select;
@@ -1,219 +0,0 @@
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>
@@ -1,19 +0,0 @@
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;
@@ -1,24 +0,0 @@
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>
@@ -1,66 +0,0 @@
1
- <script lang="ts">
2
- import * as Select from '../index';
3
- import { Icon, type IconName } from '../../icons';
4
- import IconButton from '../../icon-button/IconButton.svelte';
5
-
6
- type ItemType = {
7
- value: string;
8
- label: string;
9
- iconName?: IconName | string;
10
- };
11
-
12
- interface Props {
13
- selectedValues: string[];
14
- items: ItemType[];
15
- onRemoveItem: (itemValue: string) => void;
16
- placeholder?: string;
17
- class?: string;
18
- [key: string]: any;
19
- }
20
-
21
- let {
22
- selectedValues,
23
- items,
24
- onRemoveItem,
25
- placeholder = 'Select items...',
26
- class: className,
27
- ...restProps
28
- }: Props = $props();
29
- </script>
30
-
31
- <Select.Trigger
32
- class={'bg-background ring-offset-background placeholder:text-muted-foreground focus:ring-ring flex h-10 w-full items-center justify-between rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50' +
33
- (className || '')}
34
- {...restProps}
35
- >
36
- {#if selectedValues.length === 0}
37
- <span class="flex-grow px-2 text-tertiary">{placeholder}</span>
38
- {:else}
39
- <div class="flex flex-grow flex-wrap items-center gap-1">
40
- {#each selectedValues as selectedVal (selectedVal)}
41
- {@const item = items.find((i) => i.value === selectedVal)}
42
- {#if item}
43
- <div
44
- class="flex w-fit items-center gap-1 rounded-sm bg-neutral px-1 py-0.5 text-sm"
45
- aria-label={`Selected item ${item.label}`}
46
- >
47
- {#if item.iconName}
48
- <Icon iconName={item.iconName as IconName} />
49
- {/if}
50
- <span>{item.label}</span>
51
- <IconButton
52
- type="button"
53
- aria-label={`Remove ${item.label}`}
54
- onclick={() => onRemoveItem(item.value)}
55
- size="xs"
56
- variant="transparent"
57
- class="text-primary focus:outline-none"
58
- >
59
- <Icon iconName="X" />
60
- </IconButton>
61
- </div>
62
- {/if}
63
- {/each}
64
- </div>
65
- {/if}
66
- </Select.Trigger>
@@ -1,33 +0,0 @@
1
- <script lang="ts">
2
- import { Select as SelectPrimitive } from 'bits-ui';
3
- import type { ContentProps } from '../types';
4
-
5
- import type { Snippet } from 'svelte';
6
- import Icon from '../../icons/Icon.svelte';
7
-
8
- interface Props extends ContentProps {
9
- children: Snippet;
10
- class?: string;
11
- sideOffset?: number;
12
- }
13
-
14
- let { class: className = '', sideOffset = 4, children, ...restProps }: Props = $props();
15
-
16
- const baseClasses = `
17
- w-[var(--bits-select-anchor-width)] relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-surface text-surface-foreground shadow-md
18
- `;
19
- </script>
20
-
21
- <SelectPrimitive.Portal>
22
- <SelectPrimitive.Content {...restProps} {sideOffset} class={baseClasses + ' ' + className}>
23
- <SelectPrimitive.ScrollUpButton class="flex justify-center">
24
- <Icon iconName="CaretUp" />
25
- </SelectPrimitive.ScrollUpButton>
26
- <SelectPrimitive.Viewport class="p-1 ">
27
- {@render children()}
28
- </SelectPrimitive.Viewport>
29
- <SelectPrimitive.ScrollDownButton class="flex justify-center">
30
- <Icon iconName="CaretDown" />
31
- </SelectPrimitive.ScrollDownButton>
32
- </SelectPrimitive.Content>
33
- </SelectPrimitive.Portal>
@@ -1,19 +0,0 @@
1
- <script lang="ts">
2
- import { Select as SelectPrimitive } from 'bits-ui';
3
- import type { GroupHeadingProps } from '../types';
4
-
5
- import type { Snippet } from 'svelte';
6
-
7
- interface Props extends GroupHeadingProps {
8
- children: Snippet;
9
- class?: string;
10
- }
11
-
12
- let { class: className = '', children, ...restProps }: Props = $props();
13
-
14
- const baseClasses = 'py-1.5 pl-2 pr-2 text-sm font-semibold text-muted-foreground';
15
- </script>
16
-
17
- <SelectPrimitive.GroupHeading {...restProps} class="{baseClasses} {className}">
18
- {@render children()}
19
- </SelectPrimitive.GroupHeading>
@@ -1,39 +0,0 @@
1
- <script lang="ts">
2
- import { Select as SelectPrimitive } from 'bits-ui';
3
- import type { ItemProps, ItemSlotProps } from '../types';
4
-
5
- import type { Snippet } from 'svelte';
6
- import Icon from '../../icons/Icon.svelte';
7
-
8
- interface Props extends ItemProps {
9
- children?: Snippet<[ItemSlotProps]>;
10
- class?: string;
11
- }
12
-
13
- let { class: className = '', children, ...restProps }: Props = $props();
14
-
15
- const baseClasses = `
16
- relative flex w-full h-auto gap-2 cursor-default select-none items-center justify-between rounded-lg p-3 text-sm outline-none
17
- focus:bg-neutral focus:text-accent-foreground
18
- data-[disabled]:pointer-events-none data-[disabled]:opacity-50
19
- data-[highlighted]:bg-neutral data-[highlighted]:text-accent-foreground
20
- `;
21
- </script>
22
-
23
- <SelectPrimitive.Item {...restProps} class={baseClasses + ' ' + className}>
24
- {#snippet children(params: ItemSlotProps)}
25
- {#if children}
26
- {@render children(params)}
27
- {:else}
28
- <span>
29
- {restProps.label ??
30
- (typeof restProps.value === 'string' || typeof restProps.value === 'number'
31
- ? restProps.value
32
- : 'Item')}</span
33
- >
34
- {/if}
35
- {#if params.selected}
36
- <Icon iconName="Check" color="accent" />
37
- {/if}
38
- {/snippet}
39
- </SelectPrimitive.Item>
@@ -1,48 +0,0 @@
1
- <script lang="ts">
2
- import { Select as SelectPrimitive } from 'bits-ui';
3
- import type { TriggerProps, IconSnippet } from '../types';
4
-
5
- import type { Snippet } from 'svelte';
6
- import { Icon } from '../../icons';
7
-
8
- interface Props extends TriggerProps {
9
- TriggerIcon?: IconSnippet;
10
- children?: Snippet;
11
- class?: string;
12
- placeholder?: string;
13
- displayValue?: string;
14
- }
15
-
16
- let {
17
- class: className = '',
18
- TriggerIcon = undefined,
19
- children,
20
- placeholder = 'Select an option',
21
- displayValue = undefined,
22
- ...restProps
23
- }: Props = $props();
24
-
25
- const baseClasses =
26
- 'flex h-10 w-full items-center justify-between rounded-lg border border-input bg-surface p-2 text-sm placeholder:text-tertiary focus:outline-none hover:border-hover focus:border-accent disabled:cursor-not-allowed disabled:opacity-50 transition-colors shadow-input';
27
- </script>
28
-
29
- <SelectPrimitive.Trigger
30
- {...restProps}
31
- class={baseClasses + ' ' + className}
32
- aria-label={placeholder}
33
- >
34
- <div class="flex-1 truncate text-left">
35
- {#if children}
36
- {@render children()}
37
- {:else if displayValue !== undefined}
38
- {displayValue}
39
- {:else}
40
- <span class="text-tertiary">{placeholder}</span>
41
- {/if}
42
- </div>
43
- {#if TriggerIcon}
44
- {@render TriggerIcon()}
45
- {:else}
46
- <Icon iconName="CaretDown" color="secondary" class="mx-1 shrink-0" />
47
- {/if}
48
- </SelectPrimitive.Trigger>
@@ -1,10 +0,0 @@
1
- import Content from './components/SelectContent.svelte';
2
- import Item from './components/SelectItem.svelte';
3
- import GroupHeading from './components/SelectGroupHeading.svelte';
4
- import Trigger from './components/SelectTrigger.svelte';
5
- import MultiSelectTrigger from './components/MultiSelectTrigger.svelte';
6
- import Group from './components/Group.svelte';
7
- export declare const Root: import("svelte").Component<import("bits-ui").ComboboxRootPropsWithoutHTML, {}, "open" | "value">;
8
- export declare const Portal: import("svelte").Component<import("bits-ui").PortalProps, {}, "">;
9
- export { Content, Item, Group, GroupHeading, Trigger, MultiSelectTrigger };
10
- export * from './types';