@reshape-biotech/design-system 2.5.3 → 2.6.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 (33) hide show
  1. package/dist/components/button/Button.svelte +10 -2
  2. package/dist/components/card/Card.svelte +7 -3
  3. package/dist/components/dropdown/components/OutlinedButton.svelte +1 -1
  4. package/dist/components/empty-content/EmptyContent.svelte +2 -2
  5. package/dist/components/icon-button/IconButton.svelte +22 -6
  6. package/dist/components/icon-button/IconButton.svelte.d.ts +1 -1
  7. package/dist/components/icons/index.d.ts +1 -1
  8. package/dist/components/icons/index.js +2 -0
  9. package/dist/components/input/Input.stories.svelte +24 -4
  10. package/dist/components/input/Input.stories.svelte.d.ts +6 -14
  11. package/dist/components/input/Input.svelte +72 -12
  12. package/dist/components/input/Input.svelte.d.ts +3 -1
  13. package/dist/components/select/components/MultiSelectTrigger.svelte +3 -3
  14. package/dist/components/select/components/SelectContent.svelte +2 -2
  15. package/dist/components/select/components/SelectItem.svelte +1 -1
  16. package/dist/components/select/components/SelectTrigger.svelte +1 -1
  17. package/dist/components/slider/Slider.svelte +1 -0
  18. package/dist/components/tooltip/Tooltip.svelte +3 -1
  19. package/dist/components/tooltip/Tooltip.svelte.d.ts +1 -0
  20. package/dist/index.d.ts +0 -1
  21. package/dist/index.js +0 -1
  22. package/dist/tokens.js +1 -1
  23. package/package.json +1 -7
  24. package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte +0 -107
  25. package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte.d.ts +0 -3
  26. package/dist/components/sjsf-wrappers/SjsfSelectWidgetWrapper.svelte +0 -77
  27. package/dist/components/sjsf-wrappers/SjsfSelectWidgetWrapper.svelte.d.ts +0 -3
  28. package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte +0 -65
  29. package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte.d.ts +0 -3
  30. package/dist/components/sjsf-wrappers/index.d.ts +0 -2
  31. package/dist/components/sjsf-wrappers/index.js +0 -2
  32. package/dist/components/sjsf-wrappers/sjsfCustomTheme.d.ts +0 -2
  33. package/dist/components/sjsf-wrappers/sjsfCustomTheme.js +0 -12
@@ -256,11 +256,19 @@
256
256
 
257
257
  border-color: #12192A1A;
258
258
 
259
- background-color: transparent;
259
+ --tw-bg-opacity: 1;
260
+
261
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
260
262
 
261
263
  --tw-text-opacity: 1;
262
264
 
263
- color: rgb(18 25 42 / var(--tw-text-opacity, 1))
265
+ color: rgb(18 25 42 / var(--tw-text-opacity, 1));
266
+
267
+ --tw-shadow: 0 1px 4px 0 rgba(18, 25, 42, 0.02);
268
+
269
+ --tw-shadow-colored: 0 1px 4px 0 var(--tw-shadow-color);
270
+
271
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)
264
272
  }
265
273
  .btn-outline:hover {
266
274
 
@@ -11,14 +11,18 @@
11
11
  const { Header, children, headerBorder = false, class: additionalClasses = '' }: Props = $props();
12
12
  </script>
13
13
 
14
- <div class="rounded-lg border border-static bg-surface shadow-sm {additionalClasses}">
14
+ <div class="rounded-xl border border-static bg-surface shadow-container {additionalClasses}">
15
15
  {#if Header}
16
- <header class="px-6 py-4" class:border-b={headerBorder} class:border-static={headerBorder}>
16
+ <header
17
+ class="flex h-12 items-center px-4"
18
+ class:border-b={headerBorder}
19
+ class:border-static={headerBorder}
20
+ >
17
21
  {@render Header()}
18
22
  </header>
19
23
  {/if}
20
24
  {#if children}
21
- <div class="p-6">
25
+ <div class="p-4 pb-5">
22
26
  {@render children()}
23
27
  </div>
24
28
  {/if}
@@ -40,7 +40,7 @@
40
40
 
41
41
  color: rgb(18 25 42 / var(--tw-text-opacity, 1));
42
42
 
43
- --tw-shadow: 0 1px 4px 0 rgba(18, 25, 42, 0.04);
43
+ --tw-shadow: 0 1px 4px 0 rgba(18, 25, 42, 0.02);
44
44
 
45
45
  --tw-shadow-colored: 0 1px 4px 0 var(--tw-shadow-color);
46
46
 
@@ -10,9 +10,9 @@
10
10
  </script>
11
11
 
12
12
  <div class="flex w-full justify-center">
13
- <div class="flex max-w-[180px] flex-col items-center justify-center gap-5 py-5 text-tertiary">
13
+ <div class="flex max-w-96 flex-col items-center justify-center gap-5 py-5 text-tertiary">
14
14
  {@render icon()}
15
- <div class="flex w-full flex-col items-center justify-center gap-2">
15
+ <div class="flex w-full flex-col items-center justify-center gap-2 text-center">
16
16
  {@render children()}
17
17
  </div>
18
18
  </div>
@@ -7,6 +7,7 @@
7
7
  | 'primary'
8
8
  | 'secondary'
9
9
  | 'transparent'
10
+ | 'outline'
10
11
  | 'danger'
11
12
  | 'secondary-inverse'
12
13
  | 'transparent-inverse';
@@ -79,7 +80,7 @@
79
80
  cursor: pointer;
80
81
  align-items: center;
81
82
  justify-content: center;
82
- border-radius: 0.375rem;
83
+ border-radius: 0.5rem;
83
84
  transition-duration: 150ms
84
85
  }
85
86
  .rounded {
@@ -96,7 +97,8 @@
96
97
 
97
98
  .size-xs {
98
99
  width: 1.5rem;
99
- height: 1.5rem
100
+ height: 1.5rem;
101
+ border-radius: 0.375rem
100
102
  }
101
103
 
102
104
  .size-xs :global(svg) {
@@ -116,8 +118,8 @@
116
118
  height: 2.5rem
117
119
  }
118
120
  .size-md :global(svg) {
119
- width: 1.25rem;
120
- height: 1.25rem
121
+ width: 1rem;
122
+ height: 1rem
121
123
  }
122
124
 
123
125
  .size-lg {
@@ -126,8 +128,22 @@
126
128
  }
127
129
 
128
130
  .size-lg :global(svg) {
129
- width: 1.5rem;
130
- height: 1.5rem
131
+ width: 1.25rem;
132
+ height: 1.25rem
133
+ }
134
+
135
+ .color-outline {
136
+ border-width: 1px;
137
+ border-color: #12192A1A;
138
+ --tw-bg-opacity: 1;
139
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
140
+ --tw-shadow: 0 1px 4px 0 rgba(18, 25, 42, 0.02);
141
+ --tw-shadow-colored: 0 1px 4px 0 var(--tw-shadow-color);
142
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)
143
+ }
144
+
145
+ .color-outline:hover {
146
+ background-color: #12192a0A
131
147
  }
132
148
 
133
149
  .color-primary {
@@ -1,6 +1,6 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLButtonAttributes } from 'svelte/elements';
3
- type Variant = 'primary' | 'secondary' | 'transparent' | 'danger' | 'secondary-inverse' | 'transparent-inverse';
3
+ type Variant = 'primary' | 'secondary' | 'transparent' | 'outline' | 'danger' | 'secondary-inverse' | 'transparent-inverse';
4
4
  interface Props extends HTMLButtonAttributes {
5
5
  variant?: Variant;
6
6
  type?: 'button' | 'submit' | 'reset' | null | undefined;
@@ -4,7 +4,7 @@ import type { textColor, backgroundColor } from './../../tokens';
4
4
  export * from './custom';
5
5
  import type { CustomIconName } from './custom';
6
6
  export type PhosphorIconProps = Component<IconComponentProps, object, ''>;
7
- export type IconName = 'Aperture' | 'Archive' | 'ArrowFatLineRight' | 'ArrowCounterClockwise' | 'ArrowRight' | 'ArrowUpRight' | 'ArrowUpLeft' | 'ArrowUUpLeft' | 'Barcode' | 'Bell' | 'BookOpen' | 'BookOpenText' | 'BowlingBall' | 'BugBeetle' | 'Calendar' | 'CalendarBlank' | 'Camera' | 'CameraSlash' | 'CaretDown' | 'CaretLeft' | 'CaretRight' | 'CaretUp' | 'CaretUpDown' | 'ChatTeardropDots' | 'Check' | 'CheckCircle' | 'CheckFat' | 'Circle' | 'CircleDashed' | 'CircleHalf' | 'CirclesFour' | 'CirclesThreePlus' | 'Clock' | 'ClockCountdown' | 'Copy' | 'Crop' | 'Cube' | 'CursorClick' | 'CraneTower' | 'Database' | 'Dna' | 'DotsThree' | 'DotsThreeOutlineVertical' | 'DownloadSimple' | 'Drop' | 'EnvelopeSimple' | 'Eye' | 'Eyedropper' | 'EyeSlash' | 'FileCsv' | 'Flag' | 'Flask' | 'Folder' | 'FolderDashed' | 'FolderSimplePlus' | 'FunnelSimple' | 'Gear' | 'GlobeSimple' | 'GlobeSimpleX' | 'GridFour' | 'Hash' | 'House' | 'ImageSquare' | 'ImagesSquare' | 'Info' | 'Lock' | 'LineSegments' | 'List' | 'Link' | 'ListMagnifyingGlass' | 'MagnifyingGlass' | 'MegaphoneSimple' | 'MicrosoftExcelLogo' | 'Moon' | 'Minus' | 'Palette' | 'Pause' | 'Pencil' | 'PencilSimple' | 'Percent' | 'Phone' | 'Plant' | 'Play' | 'Plus' | 'PlusMinus' | 'Ruler' | 'Question' | 'SealCheck' | 'RadioButton' | 'SealQuestion' | 'SealWarning' | 'SelectionAll' | 'Share' | 'SidebarSimple' | 'SkipBack' | 'SkipForward' | 'SignIn' | 'SignOut' | 'SortAscending' | 'Sparkle' | 'SpinnerGap' | 'SquaresFour' | 'Star' | 'Stop' | 'StopCircle' | 'Sun' | 'Table' | 'Tag' | 'Target' | 'TestTube' | 'Trash' | 'TrashSimple' | 'TreeStructure' | 'UserCircle' | 'UserPlus' | 'Video' | 'Warning' | 'WarningCircle' | 'WifiSlash' | 'X';
7
+ export type IconName = 'Aperture' | 'Archive' | 'ArrowFatLineRight' | 'ArrowCounterClockwise' | 'ArrowRight' | 'ArrowUpRight' | 'ArrowUpLeft' | 'ArrowUUpLeft' | 'Barcode' | 'Bell' | 'BookOpen' | 'BookOpenText' | 'BowlingBall' | 'BugBeetle' | 'Calendar' | 'CalendarBlank' | 'Camera' | 'CameraSlash' | 'CaretDown' | 'CaretLeft' | 'CaretRight' | 'CaretUp' | 'CaretUpDown' | 'ChatTeardropDots' | 'Check' | 'CheckCircle' | 'CheckFat' | 'Circle' | 'CircleDashed' | 'CircleHalf' | 'CirclesFour' | 'CirclesThreePlus' | 'Clock' | 'ClockCountdown' | 'Copy' | 'Crop' | 'Cube' | 'CursorClick' | 'CraneTower' | 'Database' | 'Dna' | 'DotsThree' | 'DotsThreeOutlineVertical' | 'DownloadSimple' | 'Drop' | 'EnvelopeSimple' | 'Eye' | 'Eyedropper' | 'EyeSlash' | 'FileCsv' | 'Flag' | 'Flask' | 'Folder' | 'FolderDashed' | 'FolderSimplePlus' | 'FunnelSimple' | 'Gear' | 'GlobeSimple' | 'GlobeSimpleX' | 'GridFour' | 'Hash' | 'House' | 'ImageSquare' | 'ImagesSquare' | 'Info' | 'Lock' | 'LineSegments' | 'List' | 'Link' | 'ListMagnifyingGlass' | 'MagnifyingGlass' | 'MegaphoneSimple' | 'MicrosoftExcelLogo' | 'Moon' | 'Minus' | 'Palette' | 'Pause' | 'Pencil' | 'PencilSimple' | 'Percent' | 'Phone' | 'Plant' | 'Play' | 'Plus' | 'PlusMinus' | 'Ruler' | 'Question' | 'SealCheck' | 'RadioButton' | 'SealQuestion' | 'SealWarning' | 'SelectionAll' | 'Share' | 'SidebarSimple' | 'SkipBack' | 'SkipForward' | 'SignIn' | 'SignOut' | 'SortAscending' | 'Sparkle' | 'SpinnerGap' | 'SquaresFour' | 'Star' | 'Stop' | 'StopCircle' | 'Sun' | 'Table' | 'Tag' | 'Target' | 'TestTube' | 'Trash' | 'TrashSimple' | 'TreeStructure' | 'UserCircle' | 'UserPlus' | 'Video' | 'Warning' | 'WarningCircle' | 'WifiSlash' | 'X' | 'XCircle';
8
8
  export type AllIconName = IconName | CustomIconName;
9
9
  export declare const iconMap: Record<IconName, PhosphorIconProps>;
10
10
  export declare function renderIcon(iconName: keyof typeof iconMap): PhosphorIconProps;
@@ -118,6 +118,7 @@ import Warning from 'phosphor-svelte/lib/Warning';
118
118
  import WarningCircle from 'phosphor-svelte/lib/WarningCircle';
119
119
  import WifiSlash from 'phosphor-svelte/lib/WifiSlash';
120
120
  import X from 'phosphor-svelte/lib/X';
121
+ import XCircle from 'phosphor-svelte/lib/XCircle';
121
122
  // Custom Icons
122
123
  export * from './custom';
123
124
  export const iconMap = {
@@ -241,6 +242,7 @@ export const iconMap = {
241
242
  WarningCircle,
242
243
  WifiSlash,
243
244
  X,
245
+ XCircle,
244
246
  };
245
247
  export function renderIcon(iconName) {
246
248
  const Icon = iconMap[iconName];
@@ -1,5 +1,5 @@
1
- <script module>
2
- import Input from './Input.svelte';
1
+ <script module lang="ts">
2
+ import Input, { type InputVariant, type InputSize } from './Input.svelte';
3
3
 
4
4
  import { defineMeta } from '@storybook/addon-svelte-csf';
5
5
 
@@ -20,13 +20,33 @@
20
20
  let password = 'wordpass';
21
21
 
22
22
  let textareaValue = '';
23
+
24
+ const variants = ['primary', 'secondary', 'transparent', 'borderless'];
25
+
26
+ const sizes = ['xs', 'sm', 'md', 'lg', 'dynamic'];
23
27
  </script>
24
28
 
25
29
  <Story name="Base" args={{ autofocus: true, value: 'Hello' }} />
26
30
 
27
- <Story name="XSmall" args={{ size: 'xs' }} />
31
+ <Story name="Variants" asChild>
32
+ <div class="flex flex-col gap-4">
33
+ {#each variants as variant}
34
+ {#if variant === 'secondary-inverse'}
35
+ <Input label={variant} variant={variant as InputVariant} placeholder="Placeholder" />
36
+ {:else}
37
+ <Input label={variant} variant={variant as InputVariant} placeholder="Placeholder" />
38
+ {/if}
39
+ {/each}
40
+ </div>
41
+ </Story>
28
42
 
29
- <Story name="Small" args={{ size: 'sm' }} />
43
+ <Story name="Sizes" asChild>
44
+ <div class="flex flex-col gap-4">
45
+ {#each sizes as size}
46
+ <Input label={size} size={size as InputSize} placeholder="Placeholder" />
47
+ {/each}
48
+ </div>
49
+ </Story>
30
50
 
31
51
  <Story name="Login" asChild>
32
52
  <div class="flex flex-col gap-2">
@@ -1,19 +1,6 @@
1
- export default Input;
2
- type Input = SvelteComponent<{
3
- [x: string]: never;
4
- }, {
5
- [evt: string]: CustomEvent<any>;
6
- }, {}> & {
7
- $$bindings?: string | undefined;
8
- };
9
- declare const Input: $$__sveltets_2_IsomorphicComponent<{
10
- [x: string]: never;
11
- }, {
12
- [evt: string]: CustomEvent<any>;
13
- }, {}, {}, string>;
14
1
  import Input from './Input.svelte';
15
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> {
16
- new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
17
4
  $$bindings?: Bindings;
18
5
  } & Exports;
19
6
  (internal: unknown, props: {
@@ -25,3 +12,8 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
25
12
  };
26
13
  z_$$bindings?: Bindings;
27
14
  }
15
+ declare const Input: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type Input = InstanceType<typeof Input>;
19
+ export default Input;
@@ -7,7 +7,7 @@
7
7
  interface InputProps extends Omit<HTMLInputAttributes, 'size' | 'prefix' | 'suffix'> {
8
8
  label?: string | null;
9
9
  id?: string | undefined;
10
- variant?: 'default' | 'transparent' | 'borderless';
10
+ variant?: 'primary' | 'secondary' | 'transparent' | 'borderless';
11
11
  validator?: (a: string | number) => boolean;
12
12
  prefix?: Snippet<[any]>;
13
13
  suffix?: Snippet;
@@ -23,7 +23,7 @@
23
23
 
24
24
  let {
25
25
  label = null,
26
- variant = 'default',
26
+ variant = 'primary',
27
27
  value = $bindable(),
28
28
  type = 'text',
29
29
  validator = (_) => {
@@ -61,11 +61,15 @@
61
61
  valid = validator(value);
62
62
  onblur?.(event);
63
63
  }
64
+
65
+ export type InputVariant = 'primary' | 'secondary' | 'transparent' | 'borderless';
66
+
67
+ export type InputSize = 'xs' | 'sm' | 'md' | 'lg' | 'dynamic';
64
68
  </script>
65
69
 
66
- <div class="w-full">
70
+ <div class="flex w-full flex-col gap-2">
67
71
  {#if label}
68
- <label for={id ?? inputId} class="block px-1 py-2 text-sm text-secondary">
72
+ <label for={id ?? inputId} class="block px-1 text-sm capitalize text-secondary">
69
73
  {label}
70
74
  {#if rest.required}
71
75
  <span class="ml-0.5 text-danger">*</span>
@@ -74,10 +78,11 @@
74
78
  {/if}
75
79
 
76
80
  <div
77
- class="flex w-full items-center gap-1 rounded-lg border border-input bg-surface shadow-input size-{size}"
78
- class:border-transparent={variant === 'transparent'}
79
- class:shadow-input={!(variant === 'transparent')}
81
+ class="flex w-full items-center gap-1 size-{size} transition-colors"
80
82
  class:!border-error={!valid}
83
+ class:primary={variant === 'primary'}
84
+ class:secondary={variant === 'secondary'}
85
+ class:transparent={variant === 'transparent'}
81
86
  class:borderless={variant === 'borderless'}
82
87
  >
83
88
  <div class="whitespace-nowrap text-secondary">
@@ -126,6 +131,8 @@
126
131
 
127
132
  resize: none;
128
133
 
134
+ background-color: transparent;
135
+
129
136
  padding: 0.25rem;
130
137
 
131
138
  outline: 2px solid transparent;
@@ -133,6 +140,20 @@
133
140
  outline-offset: 2px
134
141
  }
135
142
 
143
+ input::-moz-placeholder {
144
+
145
+ --tw-text-opacity: 1;
146
+
147
+ color: rgb(136 140 148 / var(--tw-text-opacity, 1))
148
+ }
149
+
150
+ input::placeholder {
151
+
152
+ --tw-text-opacity: 1;
153
+
154
+ color: rgb(136 140 148 / var(--tw-text-opacity, 1))
155
+ }
156
+
136
157
  div:not(:focus-within):hover {
137
158
 
138
159
  border-color: #5750ee40
@@ -145,17 +166,46 @@
145
166
  border-color: rgb(87 80 238 / var(--tw-border-opacity, 1))
146
167
  }
147
168
 
148
- .borderless {
169
+ .primary {
149
170
 
150
- border-style: none;
171
+ border-width: 1px;
172
+
173
+ border-color: #12192A1A;
151
174
 
152
- --tw-shadow: 0 0 #0000;
175
+ --tw-bg-opacity: 1;
153
176
 
154
- --tw-shadow-colored: 0 0 #0000;
177
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
178
+
179
+ --tw-shadow: 0 1px 4px 0 rgba(18, 25, 42, 0.02);
180
+
181
+ --tw-shadow-colored: 0 1px 4px 0 var(--tw-shadow-color);
155
182
 
156
183
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)
157
184
  }
158
185
 
186
+ .secondary {
187
+
188
+ border-width: 1px;
189
+
190
+ border-color: #12192A1A;
191
+
192
+ --tw-bg-opacity: 1;
193
+
194
+ background-color: rgb(251 251 251 / var(--tw-bg-opacity, 1))
195
+ }
196
+
197
+ .transparent {
198
+
199
+ border-width: 1px;
200
+
201
+ border-color: transparent
202
+ }
203
+
204
+ .borderless {
205
+
206
+ border-style: none
207
+ }
208
+
159
209
  .borderless input {
160
210
 
161
211
  border-style: none;
@@ -175,6 +225,8 @@
175
225
 
176
226
  height: 1.5rem;
177
227
 
228
+ border-radius: 0.375rem;
229
+
178
230
  padding: 0.25rem;
179
231
 
180
232
  font-size: 0.75rem;
@@ -186,6 +238,8 @@
186
238
 
187
239
  height: 2rem;
188
240
 
241
+ border-radius: 0.375rem;
242
+
189
243
  padding: 0.25rem
190
244
  }
191
245
 
@@ -193,13 +247,17 @@
193
247
 
194
248
  height: 2.5rem;
195
249
 
196
- padding: 0.5rem
250
+ border-radius: 0.5rem;
251
+
252
+ padding: 0.25rem
197
253
  }
198
254
 
199
255
  .size-lg {
200
256
 
201
257
  height: 3rem;
202
258
 
259
+ border-radius: 0.5rem;
260
+
203
261
  padding-left: 0.5rem;
204
262
 
205
263
  padding-right: 0.5rem;
@@ -217,6 +275,8 @@
217
275
 
218
276
  height: auto;
219
277
 
278
+ border-radius: 0.5rem;
279
+
220
280
  padding-left: 0.75rem;
221
281
 
222
282
  padding-right: 0.75rem;
@@ -3,7 +3,7 @@ import type { HTMLInputAttributes } from 'svelte/elements';
3
3
  interface InputProps extends Omit<HTMLInputAttributes, 'size' | 'prefix' | 'suffix'> {
4
4
  label?: string | null;
5
5
  id?: string | undefined;
6
- variant?: 'default' | 'transparent' | 'borderless';
6
+ variant?: 'primary' | 'secondary' | 'transparent' | 'borderless';
7
7
  validator?: (a: string | number) => boolean;
8
8
  prefix?: Snippet<[any]>;
9
9
  suffix?: Snippet;
@@ -16,6 +16,8 @@ interface InputProps extends Omit<HTMLInputAttributes, 'size' | 'prefix' | 'suff
16
16
  oninput?: (event: Event) => void;
17
17
  onblur?: (event: FocusEvent) => void;
18
18
  }
19
+ export type InputVariant = 'primary' | 'secondary' | 'transparent' | 'borderless';
20
+ export type InputSize = 'xs' | 'sm' | 'md' | 'lg' | 'dynamic';
19
21
  declare const Input: import("svelte").Component<InputProps, {
20
22
  focus: () => void;
21
23
  }, "value" | "input">;
@@ -30,19 +30,19 @@
30
30
  </script>
31
31
 
32
32
  <Select.Trigger
33
- class={'flex h-fit min-h-10 w-full items-center justify-between rounded-lg border border-input bg-surface py-1 pl-1 text-sm placeholder:text-tertiary focus:outline-none disabled:cursor-not-allowed disabled:opacity-50' +
33
+ class={'flex h-fit min-h-10 w-full items-center justify-between rounded-lg border border-input bg-surface py-1 text-sm placeholder:text-tertiary focus:outline-none disabled:cursor-not-allowed disabled:border-transparent disabled:bg-neutral disabled:opacity-75' +
34
34
  (className || '')}
35
35
  {...restProps}
36
36
  >
37
37
  {#if selectedValues.length === 0}
38
- <span class="flex-grow px-2 text-tertiary">{placeholder}</span>
38
+ <span class="flex-grow px-1 text-tertiary">{placeholder}</span>
39
39
  {:else}
40
40
  <div class="flex flex-grow flex-wrap items-center gap-1">
41
41
  {#each selectedValues as selectedVal (selectedVal)}
42
42
  {@const item = items.find((i) => i.value === selectedVal)}
43
43
  {#if item}
44
44
  <div
45
- class="flex h-7 w-fit items-center gap-1 rounded bg-neutral py-0.5 pl-2 pr-0.5 text-sm"
45
+ class="flex h-7 w-fit items-center gap-1 rounded-md bg-neutral py-0.5 pl-2 pr-0.5 text-sm"
46
46
  aria-label={`Selected item ${item.label}`}
47
47
  >
48
48
  {#if item.iconName}
@@ -21,13 +21,13 @@
21
21
  <SelectPrimitive.Portal>
22
22
  <SelectPrimitive.Content {...restProps} {sideOffset} class={baseClasses + ' ' + className}>
23
23
  <SelectPrimitive.ScrollUpButton class="flex justify-center">
24
- <Icon iconName="CaretUp" />
24
+ <Icon iconName="CaretUp" color="tertiary" />
25
25
  </SelectPrimitive.ScrollUpButton>
26
26
  <SelectPrimitive.Viewport class="p-1 ">
27
27
  {@render children()}
28
28
  </SelectPrimitive.Viewport>
29
29
  <SelectPrimitive.ScrollDownButton class="flex justify-center">
30
- <Icon iconName="CaretDown" />
30
+ <Icon iconName="CaretDown" color="tertiary" />
31
31
  </SelectPrimitive.ScrollDownButton>
32
32
  </SelectPrimitive.Content>
33
33
  </SelectPrimitive.Portal>
@@ -13,7 +13,7 @@
13
13
  let { class: className = '', children, ...restProps }: Props = $props();
14
14
 
15
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
16
+ relative flex w-full h-auto gap-2 cursor-default select-none items-center justify-between rounded-md p-3 text-sm outline-none
17
17
  focus:bg-neutral focus:text-accent-foreground
18
18
  data-[disabled]:pointer-events-none data-[disabled]:opacity-50
19
19
  data-[highlighted]:bg-neutral data-[highlighted]:text-accent-foreground
@@ -23,7 +23,7 @@
23
23
  }: Props = $props();
24
24
 
25
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';
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 focus:ring-0 disabled:cursor-not-allowed disabled:border-transparent disabled:bg-neutral disabled:opacity-75 transition-colors shadow-input';
27
27
  </script>
28
28
 
29
29
  <SelectPrimitive.Trigger
@@ -91,6 +91,7 @@
91
91
  display: inline-flex;
92
92
  height: 2rem;
93
93
  width: 2rem;
94
+ cursor: grab;
94
95
  align-items: center;
95
96
  justify-content: center;
96
97
  border-radius: 9999px;
@@ -11,6 +11,7 @@
11
11
  align?: 'start' | 'center' | 'end';
12
12
  trigger?: Snippet;
13
13
  content?: Snippet;
14
+ delayDuration?: number;
14
15
  }
15
16
 
16
17
  let {
@@ -21,6 +22,7 @@
21
22
  align = 'center',
22
23
  trigger,
23
24
  content,
25
+ delayDuration = 400,
24
26
  }: Props = $props();
25
27
 
26
28
  const sideMap = {
@@ -36,7 +38,7 @@
36
38
  </script>
37
39
 
38
40
  <Tooltip.Provider>
39
- <Tooltip.Root open={forceOpen} delayDuration={400}>
41
+ <Tooltip.Root open={forceOpen} {delayDuration}>
40
42
  <Tooltip.Trigger>
41
43
  {#if trigger}
42
44
  {@render trigger()}
@@ -8,6 +8,7 @@ interface Props {
8
8
  align?: 'start' | 'center' | 'end';
9
9
  trigger?: Snippet;
10
10
  content?: Snippet;
11
+ delayDuration?: number;
11
12
  }
12
13
  declare const Tooltip: import("svelte").Component<Props, {}, "">;
13
14
  type Tooltip = ReturnType<typeof Tooltip>;
package/dist/index.d.ts CHANGED
@@ -44,7 +44,6 @@ export * from './components/textarea/index';
44
44
  export * from './components/tooltip/';
45
45
  export * from './components/toggle/';
46
46
  export * from './components/checkbox/';
47
- export * from './components/sjsf-wrappers/';
48
47
  export { tokens } from './tokens';
49
48
  export { notifications } from './notifications';
50
49
  export { colors, borderColor, textColor, backgroundColor, boxShadow, outlineColor } from './tokens';
package/dist/index.js CHANGED
@@ -45,7 +45,6 @@ export * from './components/textarea/index';
45
45
  export * from './components/tooltip/';
46
46
  export * from './components/toggle/';
47
47
  export * from './components/checkbox/';
48
- export * from './components/sjsf-wrappers/';
49
48
  // Styles and Tokens
50
49
  export { tokens } from './tokens';
51
50
  export { notifications } from './notifications';
package/dist/tokens.js CHANGED
@@ -355,7 +355,7 @@ const outlineColor = {
355
355
  ...darkOutlineColor,
356
356
  };
357
357
  const boxShadow = {
358
- input: `0 1px 4px 0 ${colors.shadow[4]}`,
358
+ input: `0 1px 4px 0 ${colors.shadow[2]}`,
359
359
  container: `0 2px 16px 0 ${colors.shadow[2]}`,
360
360
  menu: `0 4px 20px 0 ${colors.shadow[6]}, 0 0 0 1px ${colors.shadow[8]}`,
361
361
  hover: `0 0 0 1px ${colors.periwinkle[5][25]}`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reshape-biotech/design-system",
3
- "version": "2.5.3",
3
+ "version": "2.6.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build",
@@ -70,12 +70,6 @@
70
70
  "import": "./dist/components/datepicker/index.js",
71
71
  "default": "./dist/components/datepicker/index.js"
72
72
  },
73
- "./components/sjsf-wrappers": {
74
- "types": "./dist/components/sjsf-wrappers/index.d.ts",
75
- "svelte": "./dist/components/sjsf-wrappers/index.js",
76
- "import": "./dist/components/sjsf-wrappers/index.js",
77
- "default": "./dist/components/sjsf-wrappers/index.js"
78
- },
79
73
  "./components/empty-content": {
80
74
  "types": "./dist/components/empty-content/index.d.ts",
81
75
  "svelte": "./dist/components/empty-content/index.js",
@@ -1,107 +0,0 @@
1
- <script lang="ts">
2
- import type { ComponentProps } from '@sjsf/form';
3
- import { getFormContext, inputAttributes } from '@sjsf/form';
4
- import Input from '../input/Input.svelte';
5
- import type { FocusEventHandler } from 'svelte/elements';
6
-
7
- type Props = ComponentProps['numberWidget'];
8
-
9
- let { value = $bindable(), config, handlers, errors }: Props = $props();
10
-
11
- const ctx = getFormContext();
12
-
13
- const derivedAttrs = $derived(
14
- inputAttributes(ctx, config, 'number', handlers, {
15
- type: 'number',
16
- })
17
- );
18
- const placeholder = $derived(
19
- config?.uiSchema?.['ui:placeholder'] ||
20
- config?.schema?.description ||
21
- (Array.isArray(config?.schema?.examples) && config.schema.examples.length > 0
22
- ? String(config.schema.examples[0]) // Ensure the example is also a string
23
- : '') ||
24
- ''
25
- );
26
-
27
- const readonly = $derived(config?.schema?.readOnly ?? false);
28
- const currentClass = $derived(derivedAttrs?.class ?? 'w-full');
29
-
30
- const onBlurHandler = $derived(
31
- derivedAttrs.onblur
32
- ? (event: FocusEvent) =>
33
- (derivedAttrs.onblur as FocusEventHandler<HTMLInputElement>)(event as any)
34
- : undefined
35
- );
36
-
37
- const onChangeHandler = $derived(
38
- derivedAttrs.onchange
39
- ? (event: Event) =>
40
- (derivedAttrs.onchange as FocusEventHandler<HTMLInputElement>)(event as any)
41
- : undefined
42
- );
43
-
44
- const onInputHandler = $derived(
45
- derivedAttrs.oninput
46
- ? (event: Event) =>
47
- (derivedAttrs.oninput as FocusEventHandler<HTMLInputElement>)(event as any)
48
- : undefined
49
- );
50
-
51
- let displayValue = $state('');
52
-
53
- const getStringValue = () => {
54
- if (displayValue !== '') {
55
- return displayValue;
56
- }
57
-
58
- if (value === undefined || value === null || isNaN(value)) {
59
- return '';
60
- }
61
- return String(value);
62
- };
63
-
64
- const setNumericValue = (newValueFromInput: unknown) => {
65
- const stringifiedInput =
66
- newValueFromInput === null || newValueFromInput === undefined
67
- ? ''
68
- : String(newValueFromInput);
69
-
70
- const validNumberPattern = /^-?\d*\.?\d*$/;
71
- if (stringifiedInput !== '' && !validNumberPattern.test(stringifiedInput)) {
72
- return;
73
- }
74
-
75
- displayValue = stringifiedInput;
76
-
77
- if (stringifiedInput.trim() === '') {
78
- value = undefined;
79
- } else {
80
- const num = parseFloat(stringifiedInput);
81
- value = isNaN(num) ? undefined : num;
82
- }
83
- };
84
- </script>
85
-
86
- <Input
87
- bind:value={() => getStringValue(), (v) => setNumericValue(v)}
88
- placeholder={String(placeholder)}
89
- type={'text'}
90
- inputmode={'decimal'}
91
- pattern={config?.schema?.type === 'integer' ? '-?\\d*' : '-?\\d*\\.?\\d*'}
92
- {readonly}
93
- id={String(derivedAttrs.id)}
94
- name={String(derivedAttrs.name)}
95
- disabled={derivedAttrs.disabled}
96
- required={derivedAttrs.required}
97
- step={config?.schema?.multipleOf ?? (config?.schema?.type === 'integer' ? 1 : 'any')}
98
- min={config?.schema?.minimum ?? config?.schema?.exclusiveMinimum}
99
- max={config?.schema?.maximum ?? config?.schema?.exclusiveMaximum}
100
- aria-invalid={errors && errors.length > 0 ? true : undefined}
101
- aria-describedby={errors && errors.length > 0 ? `${String(derivedAttrs.id)}-errors` : undefined}
102
- class={String(currentClass)}
103
- autocomplete="off"
104
- oninput={onInputHandler}
105
- onchange={onChangeHandler}
106
- onblur={onBlurHandler}
107
- />
@@ -1,3 +0,0 @@
1
- declare const SjsfNumberInputWrapper: import("svelte").Component<ComponentProps, {}, "value">;
2
- type SjsfNumberInputWrapper = ReturnType<typeof SjsfNumberInputWrapper>;
3
- export default SjsfNumberInputWrapper;
@@ -1,77 +0,0 @@
1
- <script lang="ts">
2
- import { getFormContext, selectAttributes } from '@sjsf/form';
3
- import type { ComponentProps } from '@sjsf/form';
4
- import * as Select from '../select';
5
-
6
- type Props = ComponentProps['selectWidget'];
7
- let { handlers, value = $bindable(), options = [], config }: Props = $props();
8
-
9
- const ctx = getFormContext();
10
- const attributes = $derived(
11
- selectAttributes(ctx, config, 'select', handlers, { style: 'flex-grow: 1' })
12
- );
13
-
14
- const isPrimitive = (v: unknown): v is string | number | boolean =>
15
- ['string', 'number', 'boolean'].includes(typeof v);
16
-
17
- let domValue = $derived.by(() => {
18
- const primitiveMatch = options.find((o) => isPrimitive(o.value) && o.value === value);
19
- if (primitiveMatch) return String(primitiveMatch.value);
20
- const idx = options.findIndex((o) => o.value === value);
21
- return idx >= 0 ? String(idx) : '';
22
- });
23
-
24
- const onSelectChange = (v: string | undefined) => {
25
- if (v === undefined || v === '') {
26
- value = undefined;
27
- } else {
28
- const primitiveMatch = options.find((o) => isPrimitive(o.value) && String(o.value) === v);
29
- if (primitiveMatch) {
30
- value = primitiveMatch.value;
31
- } else {
32
- const idx = Number(v);
33
- if (!Number.isNaN(idx) && options[idx]) {
34
- value = options[idx].value;
35
- }
36
- }
37
- }
38
- if (typeof (attributes as any).onchange === 'function') {
39
- (attributes as any).onchange(new Event('change'));
40
- }
41
- };
42
- </script>
43
-
44
- <input
45
- type="hidden"
46
- name={String(attributes.name)}
47
- id={String(attributes.id)}
48
- value={domValue}
49
- disabled={attributes.disabled}
50
- />
51
-
52
- <Select.Root value={domValue} type="single" items={[]} onValueChange={onSelectChange}>
53
- <Select.Trigger
54
- placeholder={attributes.placeholder ?? undefined}
55
- displayValue={options.find((o) => isPrimitive(o.value) && String(o.value) === domValue)
56
- ?.label || options.find((o, idx) => String(idx) === domValue && !isPrimitive(o.value))?.label}
57
- disabled={attributes.disabled}
58
- />
59
- <Select.Portal>
60
- <Select.Content>
61
- {#if config.schema.default === undefined}
62
- <Select.Item value="" label={attributes.placeholder ?? undefined} />
63
- {/if}
64
- {#each options as option, index (option.id)}
65
- {#if isPrimitive(option.value)}
66
- <Select.Item
67
- value={String(option.value)}
68
- label={option.label}
69
- disabled={option.disabled}
70
- />
71
- {:else}
72
- <Select.Item value={String(index)} label={option.label} disabled={option.disabled} />
73
- {/if}
74
- {/each}
75
- </Select.Content>
76
- </Select.Portal>
77
- </Select.Root>
@@ -1,3 +0,0 @@
1
- declare const SjsfSelectWidgetWrapper: import("svelte").Component<ComponentProps, {}, "value">;
2
- type SjsfSelectWidgetWrapper = ReturnType<typeof SjsfSelectWidgetWrapper>;
3
- export default SjsfSelectWidgetWrapper;
@@ -1,65 +0,0 @@
1
- <script lang="ts">
2
- import type { ComponentProps } from '@sjsf/form';
3
- import { getFormContext, inputAttributes } from '@sjsf/form';
4
- import Input from '../input/Input.svelte';
5
- import type { FormEventHandler, FocusEventHandler } from 'svelte/elements';
6
-
7
- type Props = ComponentProps['textWidget'];
8
-
9
- let { value = $bindable(), config, handlers, errors }: Props = $props();
10
-
11
- const ctx = getFormContext();
12
-
13
- const derivedAttrs = $derived(
14
- inputAttributes(ctx, config, 'text', handlers, {
15
- type: 'text',
16
- })
17
- );
18
-
19
- const placeholder = $derived(
20
- config?.uiSchema?.['ui:placeholder'] ||
21
- config?.schema?.description ||
22
- (Array.isArray(config?.schema?.examples) && config.schema.examples.length > 0
23
- ? String(config.schema.examples[0])
24
- : '') ||
25
- ''
26
- );
27
-
28
- const readonly = $derived(config?.schema?.readOnly ?? false);
29
- const currentClass = $derived(derivedAttrs?.class ?? 'w-full');
30
-
31
- const onInput = $derived(
32
- derivedAttrs.oninput
33
- ? (event: Event) => (derivedAttrs.oninput as FormEventHandler<HTMLInputElement>)(event as any)
34
- : undefined
35
- );
36
- const onChange = $derived(
37
- derivedAttrs.onchange
38
- ? (event: Event) =>
39
- (derivedAttrs.onchange as FormEventHandler<HTMLInputElement>)(event as any)
40
- : undefined
41
- );
42
- const onBlur = $derived(
43
- derivedAttrs.onblur
44
- ? (event: FocusEvent) =>
45
- (derivedAttrs.onblur as FocusEventHandler<HTMLInputElement>)(event as any)
46
- : undefined
47
- );
48
- </script>
49
-
50
- <Input
51
- bind:value
52
- placeholder={String(placeholder)}
53
- type="text"
54
- {readonly}
55
- id={String(derivedAttrs.id)}
56
- name={String(derivedAttrs.name)}
57
- disabled={derivedAttrs.disabled}
58
- required={derivedAttrs.required}
59
- oninput={onInput}
60
- onchange={onChange}
61
- onblur={onBlur}
62
- aria-invalid={errors && errors.length > 0 ? true : undefined}
63
- aria-describedby={errors && errors.length > 0 ? `${String(derivedAttrs.id)}-errors` : undefined}
64
- class={String(currentClass)}
65
- />
@@ -1,3 +0,0 @@
1
- declare const SjsfTextInputWrapper: import("svelte").Component<ComponentProps, {}, "value">;
2
- type SjsfTextInputWrapper = ReturnType<typeof SjsfTextInputWrapper>;
3
- export default SjsfTextInputWrapper;
@@ -1,2 +0,0 @@
1
- export { default as SjsfTextInputWrapper } from './SjsfTextInputWrapper.svelte';
2
- export { default as SjsfNumberInputWrapper } from './SjsfNumberInputWrapper.svelte';
@@ -1,2 +0,0 @@
1
- export { default as SjsfTextInputWrapper } from './SjsfTextInputWrapper.svelte';
2
- export { default as SjsfNumberInputWrapper } from './SjsfNumberInputWrapper.svelte';
@@ -1,2 +0,0 @@
1
- import type { Theme } from '@sjsf/form';
2
- export declare const sjsfCustomTheme: Theme;
@@ -1,12 +0,0 @@
1
- import { theme as BasicTheme } from '@sjsf/basic-theme';
2
- import { overrideByRecord } from '@sjsf/form/lib/resolver';
3
- import SjsfNumberInputWrapper from './SjsfNumberInputWrapper.svelte';
4
- import SjsfTextInputWrapper from './SjsfTextInputWrapper.svelte';
5
- import EnumField from '@sjsf/form/fields/extra-fields/enum.svelte';
6
- import SjsfSelectWidgetWrapper from './SjsfSelectWidgetWrapper.svelte';
7
- export const sjsfCustomTheme = overrideByRecord(BasicTheme, {
8
- numberWidget: SjsfNumberInputWrapper,
9
- textWidget: SjsfTextInputWrapper,
10
- enumField: EnumField,
11
- selectWidget: SjsfSelectWidgetWrapper,
12
- });