@reshape-biotech/design-system 2.7.51 → 2.7.53

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 (132) hide show
  1. package/dist/components/activity/Activity.figma.d.ts +7 -0
  2. package/dist/components/activity/Activity.figma.js +24 -0
  3. package/dist/components/activity/Activity.stories.svelte +0 -6
  4. package/dist/components/avatar/Avatar.figma.d.ts +7 -0
  5. package/dist/components/avatar/Avatar.figma.js +17 -0
  6. package/dist/components/avatar/Avatar.stories.svelte +0 -6
  7. package/dist/components/banner/Banner.figma.d.ts +7 -0
  8. package/dist/components/banner/Banner.figma.js +26 -0
  9. package/dist/components/button/Button.figma.d.ts +7 -0
  10. package/dist/components/button/Button.figma.js +51 -0
  11. package/dist/components/button/Button.stories.svelte +37 -41
  12. package/dist/components/button/Button.svelte +18 -13
  13. package/dist/components/button/Button.svelte.d.ts +1 -1
  14. package/dist/components/checkbox/Checkbox.figma.d.ts +7 -0
  15. package/dist/components/checkbox/Checkbox.figma.js +24 -0
  16. package/dist/components/checkbox/Checkbox.stories.svelte +69 -10
  17. package/dist/components/checkbox/Checkbox.svelte +32 -8
  18. package/dist/components/checkbox/Checkbox.svelte.d.ts +4 -2
  19. package/dist/components/collapsible/Collapsible.figma.d.ts +7 -0
  20. package/dist/components/collapsible/Collapsible.figma.js +21 -0
  21. package/dist/components/combobox/Combobox.stories.svelte +0 -6
  22. package/dist/components/datepicker/DatePicker.figma.d.ts +7 -0
  23. package/dist/components/datepicker/DatePicker.figma.js +14 -0
  24. package/dist/components/datepicker/DatePicker.stories.svelte +0 -6
  25. package/dist/components/divider/Divider.figma.d.ts +7 -0
  26. package/dist/components/divider/Divider.figma.js +12 -0
  27. package/dist/components/drawer/Drawer.figma.d.ts +7 -0
  28. package/dist/components/drawer/Drawer.figma.js +26 -0
  29. package/dist/components/dropdown/Dropdown.figma.d.ts +7 -0
  30. package/dist/components/dropdown/Dropdown.figma.js +22 -0
  31. package/dist/components/empty-content/EmptyContent.figma.d.ts +7 -0
  32. package/dist/components/empty-content/EmptyContent.figma.js +20 -0
  33. package/dist/components/empty-content/EmptyContent.stories.svelte +43 -0
  34. package/dist/components/empty-content/EmptyContent.svelte +11 -2
  35. package/dist/components/empty-content/EmptyContent.svelte.d.ts +1 -0
  36. package/dist/components/icon-button/IconButton.figma.d.ts +7 -0
  37. package/dist/components/icon-button/IconButton.figma.js +42 -0
  38. package/dist/components/icon-button/IconButton.stories.svelte +72 -28
  39. package/dist/components/icon-button/IconButton.stories.svelte.d.ts +1 -1
  40. package/dist/components/icon-button/IconButton.svelte +80 -84
  41. package/dist/components/icon-button/IconButton.svelte.d.ts +10 -4
  42. package/dist/components/icons/Icon.stories.svelte +0 -6
  43. package/dist/components/input/Input.figma.d.ts +7 -0
  44. package/dist/components/input/Input.figma.js +23 -0
  45. package/dist/components/input/Input.stories.svelte +42 -16
  46. package/dist/components/input/Input.stories.svelte.d.ts +2 -17
  47. package/dist/components/input/Input.svelte +18 -18
  48. package/dist/components/input/Input.svelte.d.ts +2 -2
  49. package/dist/components/label/Label.figma.d.ts +7 -0
  50. package/dist/components/label/Label.figma.js +12 -0
  51. package/dist/components/legend/Legend.figma.d.ts +7 -0
  52. package/dist/components/legend/Legend.figma.js +14 -0
  53. package/dist/components/list/List.figma.d.ts +7 -0
  54. package/dist/components/list/List.figma.js +23 -0
  55. package/dist/components/logo/Logo.figma.d.ts +7 -0
  56. package/dist/components/logo/Logo.figma.js +21 -0
  57. package/dist/components/logo/Logo.stories.svelte +17 -0
  58. package/dist/components/logo/Logo.svelte +44 -18
  59. package/dist/components/logo/Logo.svelte.d.ts +1 -0
  60. package/dist/components/markdown/Markdown.figma.d.ts +7 -0
  61. package/dist/components/markdown/Markdown.figma.js +14 -0
  62. package/dist/components/modal/Modal.figma.d.ts +7 -0
  63. package/dist/components/modal/Modal.figma.js +31 -0
  64. package/dist/components/nav/Nav.figma.d.ts +7 -0
  65. package/dist/components/nav/Nav.figma.js +21 -0
  66. package/dist/components/notification-popup/NotificationPopup.figma.d.ts +7 -0
  67. package/dist/components/notification-popup/NotificationPopup.figma.js +19 -0
  68. package/dist/components/notifications/Notifications.figma.d.ts +7 -0
  69. package/dist/components/notifications/Notifications.figma.js +26 -0
  70. package/dist/components/pill/Pill.figma.d.ts +7 -0
  71. package/dist/components/pill/Pill.figma.js +11 -0
  72. package/dist/components/progress-circle/ProgressCircle.figma.d.ts +7 -0
  73. package/dist/components/progress-circle/ProgressCircle.figma.js +15 -0
  74. package/dist/components/progress-circle/ProgressCircle.stories.svelte +12 -0
  75. package/dist/components/progress-circle/ProgressCircle.svelte +19 -11
  76. package/dist/components/progress-circle/ProgressCircle.svelte.d.ts +1 -1
  77. package/dist/components/required-status-indicator/RequiredStatusIndicator.figma.d.ts +7 -0
  78. package/dist/components/required-status-indicator/RequiredStatusIndicator.figma.js +18 -0
  79. package/dist/components/segmented-control-buttons/SegmentedControlButtons.figma.d.ts +7 -0
  80. package/dist/components/segmented-control-buttons/SegmentedControlButtons.figma.js +27 -0
  81. package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte +29 -0
  82. package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte +8 -6
  83. package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte.d.ts +3 -1
  84. package/dist/components/select/Select.figma.d.ts +7 -0
  85. package/dist/components/select/Select.figma.js +17 -0
  86. package/dist/components/skeleton-loader/SkeletonLoader.figma.d.ts +7 -0
  87. package/dist/components/skeleton-loader/SkeletonLoader.figma.js +16 -0
  88. package/dist/components/slider/Slider.figma.d.ts +7 -0
  89. package/dist/components/slider/Slider.figma.js +12 -0
  90. package/dist/components/spinner/Spinner.figma.d.ts +7 -0
  91. package/dist/components/spinner/Spinner.figma.js +11 -0
  92. package/dist/components/stat-card/StatCard.figma.d.ts +7 -0
  93. package/dist/components/stat-card/StatCard.figma.js +18 -0
  94. package/dist/components/status-badge/StatusBadge.figma.d.ts +7 -0
  95. package/dist/components/status-badge/StatusBadge.figma.js +29 -0
  96. package/dist/components/stepper/Stepper.figma.d.ts +7 -0
  97. package/dist/components/stepper/Stepper.figma.js +15 -0
  98. package/dist/components/table/Table.figma.d.ts +7 -0
  99. package/dist/components/table/Table.figma.js +26 -0
  100. package/dist/components/tabs/Tabs.figma.d.ts +7 -0
  101. package/dist/components/tabs/Tabs.figma.js +24 -0
  102. package/dist/components/tabs/Tabs.stories.svelte +23 -0
  103. package/dist/components/tabs/components/Tabs.svelte +6 -1
  104. package/dist/components/tabs/components/Tabs.svelte.d.ts +2 -0
  105. package/dist/components/tag/Tag.figma.d.ts +7 -0
  106. package/dist/components/tag/Tag.figma.js +33 -0
  107. package/dist/components/tag/Tag.svelte +0 -1
  108. package/dist/components/textarea/Textarea.figma.d.ts +7 -0
  109. package/dist/components/textarea/Textarea.figma.js +17 -0
  110. package/dist/components/toast/Toast.figma.d.ts +7 -0
  111. package/dist/components/toast/Toast.figma.js +17 -0
  112. package/dist/components/toast/Toast.stories.svelte +3 -24
  113. package/dist/components/toast/Toast.svelte +22 -40
  114. package/dist/components/toggle/Toggle.figma.d.ts +7 -0
  115. package/dist/components/toggle/Toggle.figma.js +23 -0
  116. package/dist/components/toggle/Toggle.stories.svelte +56 -4
  117. package/dist/components/toggle/Toggle.stories.svelte.d.ts +6 -14
  118. package/dist/components/toggle/Toggle.svelte +56 -58
  119. package/dist/components/toggle/Toggle.svelte.d.ts +2 -0
  120. package/dist/components/toggle-icon-button/ToggleIconButton.figma.d.ts +7 -0
  121. package/dist/components/toggle-icon-button/ToggleIconButton.figma.js +31 -0
  122. package/dist/components/tooltip/Tooltip.figma.d.ts +7 -0
  123. package/dist/components/tooltip/Tooltip.figma.js +22 -0
  124. package/dist/safelist-source.d.ts +1 -1
  125. package/dist/safelist-source.js +2 -2
  126. package/dist/safelist.css +1 -1
  127. package/dist/tailwind.preset.d.ts +2 -0
  128. package/dist/tokens/colors.d.ts +1 -0
  129. package/dist/tokens/colors.js +8 -7
  130. package/dist/tokens.d.ts +13 -0
  131. package/dist/tokens.js +8 -2
  132. package/package.json +3 -1
@@ -0,0 +1,7 @@
1
+ import figma from 'figma';
2
+ declare const _default: {
3
+ example: figma.TemplateStringResult;
4
+ imports: string[];
5
+ id: string;
6
+ };
7
+ export default _default;
@@ -0,0 +1,24 @@
1
+ // url=https://www.figma.com/design/WkxhG4H2Ybc7STFi1VJIau/%F0%9F%92%A0-Reshape-Design-System--V1?node-id=5302-18990
2
+ // source=src/lib/components/activity/Activity.svelte
3
+ // component=Activity
4
+ import figma from 'figma';
5
+ const instance = figma.selectedInstance;
6
+ const type = instance.getEnum('type', {
7
+ 'job': 'job',
8
+ 'plate': 'plate',
9
+ 'project': 'project',
10
+ 'well': 'well',
11
+ });
12
+ export default {
13
+ example: figma.code `
14
+ <Activity
15
+ activities={[{
16
+ icon: "${type}",
17
+ label: "Activity description",
18
+ timestamp: new Date().toISOString(),
19
+ }]}
20
+ />
21
+ `,
22
+ imports: ["import Activity from './Activity.svelte'"],
23
+ id: 'activity',
24
+ };
@@ -10,12 +10,6 @@
10
10
  component: Activity,
11
11
  title: 'Components/Activity',
12
12
  tags: ['autodocs'],
13
- parameters: {
14
- design: {
15
- type: 'figma',
16
- url: 'https://www.figma.com/design/VHTMNdy8PAXAMx43edNZGW/%F0%9F%92%A0--Reshape-Design-System%3A-V1?node-id=2248-7688&t=sCuBI8dX6K6NjNR6-0',
17
- },
18
- },
19
13
  });
20
14
 
21
15
  let activities = $state([
@@ -0,0 +1,7 @@
1
+ import figma from 'figma';
2
+ declare const _default: {
3
+ example: figma.TemplateStringResult;
4
+ imports: string[];
5
+ id: string;
6
+ };
7
+ export default _default;
@@ -0,0 +1,17 @@
1
+ // url=https://www.figma.com/design/WkxhG4H2Ybc7STFi1VJIau/%F0%9F%92%A0-Reshape-Design-System--V1?node-id=9-9326
2
+ // source=src/lib/components/avatar/Avatar.svelte
3
+ // component=Avatar
4
+ import figma from 'figma';
5
+ const instance = figma.selectedInstance;
6
+ const size = instance.getEnum('size', {
7
+ 'sm': 'sm',
8
+ 'xs': 'sm',
9
+ 'md': 'md',
10
+ 'lg': 'md',
11
+ });
12
+ const showTooltip = instance.getBoolean('showTooltip');
13
+ export default {
14
+ example: figma.code `<Avatar name="John Doe" size="${size}" ${showTooltip ? '' : 'showTooltip={false}'} />`,
15
+ imports: ["import Avatar from './Avatar.svelte'"],
16
+ id: 'avatar',
17
+ };
@@ -6,12 +6,6 @@
6
6
  component: Avatar,
7
7
  title: 'Components/Avatar',
8
8
  tags: ['autodocs'],
9
- parameters: {
10
- design: {
11
- type: 'figma',
12
- url: 'https://www.figma.com/design/VHTMNdy8PAXAMx43edNZGW/%F0%9F%92%A0--Reshape-Design-System%3A-V1?node-id=9-9253&t=sCuBI8dX6K6NjNR6-0',
13
- },
14
- },
15
9
  });
16
10
  </script>
17
11
 
@@ -0,0 +1,7 @@
1
+ import figma from 'figma';
2
+ declare const _default: {
3
+ example: figma.TemplateStringResult;
4
+ imports: string[];
5
+ id: string;
6
+ };
7
+ export default _default;
@@ -0,0 +1,26 @@
1
+ // url=https://www.figma.com/design/WkxhG4H2Ybc7STFi1VJIau/%F0%9F%92%A0-Reshape-Design-System--V1?node-id=9-3351
2
+ // source=src/lib/components/banner/Banner.svelte
3
+ // component=Banner
4
+ import figma from 'figma';
5
+ const instance = figma.selectedInstance;
6
+ const type = instance.getEnum('type', {
7
+ 'neutral': 'neutral',
8
+ 'success': 'success',
9
+ 'info': 'info',
10
+ 'warning': 'warning',
11
+ 'error': 'error',
12
+ 'elevated': 'neutral',
13
+ 'primary': 'info',
14
+ });
15
+ const closable = instance.getBoolean('closable');
16
+ const compact = instance.getBoolean('compact');
17
+ const title = instance.getString('Title');
18
+ export default {
19
+ example: figma.code `
20
+ <Banner type="${type}" ${compact ? 'compact' : ''} ${closable ? '' : 'closable={false}'}>
21
+ {#snippet content()}${title || 'Banner message'}{/snippet}
22
+ </Banner>
23
+ `,
24
+ imports: ["import Banner from './Banner.svelte'"],
25
+ id: 'banner',
26
+ };
@@ -0,0 +1,7 @@
1
+ import figma from 'figma';
2
+ declare const _default: {
3
+ example: figma.TemplateStringResult;
4
+ imports: string[];
5
+ id: string;
6
+ };
7
+ export default _default;
@@ -0,0 +1,51 @@
1
+ // url=https://www.figma.com/design/WkxhG4H2Ybc7STFi1VJIau/%F0%9F%92%A0-Reshape-Design-System--V1?node-id=9-3073
2
+ // source=src/lib/components/button/Button.svelte
3
+ // component=Button
4
+ import figma from 'figma';
5
+ const instance = figma.selectedInstance;
6
+ const variant = instance.getEnum('variant', {
7
+ 'primary': 'primary',
8
+ 'secondary': 'secondary',
9
+ 'outline': 'outline',
10
+ 'transparent': 'transparent',
11
+ 'danger': 'danger',
12
+ 'secondary-inverse': 'secondary-inverse',
13
+ 'transparent-inverse': 'transparent-inverse',
14
+ });
15
+ const size = instance.getEnum('size', {
16
+ 'xs': 'xs',
17
+ 'sm': 'sm',
18
+ 'md': 'md',
19
+ 'lg': 'lg',
20
+ });
21
+ const rounded = instance.getEnum('rounded', { 'true': true, 'false': false });
22
+ const disabled = instance.getEnum('disabled', { 'true': true, 'false': false });
23
+ const label = instance.findText('label');
24
+ const hasLeftIcon = instance.getBoolean('left icon');
25
+ const leftIcon = hasLeftIcon ? instance.getInstanceSwap('left instance') : null;
26
+ let leftIconSnippet;
27
+ if (leftIcon && leftIcon.type === 'INSTANCE' && leftIcon.hasCodeConnect()) {
28
+ leftIconSnippet = leftIcon.executeTemplate().example;
29
+ }
30
+ const hasRightIcon = instance.getBoolean('right icon');
31
+ const rightIcon = hasRightIcon ? instance.getInstanceSwap('right instance') : null;
32
+ let rightIconSnippet;
33
+ if (rightIcon && rightIcon.type === 'INSTANCE' && rightIcon.hasCodeConnect()) {
34
+ rightIconSnippet = rightIcon.executeTemplate().example;
35
+ }
36
+ export default {
37
+ example: figma.code `
38
+ <Button
39
+ variant="${variant}"
40
+ size="${size}"
41
+ ${rounded ? 'rounded' : ''}
42
+ ${disabled ? 'disabled' : ''}
43
+ >
44
+ ${leftIconSnippet ? figma.code `${leftIconSnippet}` : ''}
45
+ ${label ? label.textContent : 'Button'}
46
+ ${rightIconSnippet ? figma.code `${rightIconSnippet}` : ''}
47
+ </Button>
48
+ `,
49
+ imports: ["import Button from './Button.svelte'"],
50
+ id: 'button',
51
+ };
@@ -6,12 +6,6 @@
6
6
  component: Button,
7
7
  title: 'Components/Button',
8
8
  tags: ['autodocs'],
9
- parameters: {
10
- design: {
11
- type: 'figma',
12
- url: 'https://www.figma.com/design/VHTMNdy8PAXAMx43edNZGW/%F0%9F%92%A0--Reshape-Design-System%3A-V1?node-id=9-3068&t=sCuBI8dX6K6NjNR6-0',
13
- },
14
- },
15
9
  });
16
10
 
17
11
  const variants = [
@@ -27,23 +21,19 @@
27
21
  </script>
28
22
 
29
23
  <Story name="Variants" asChild>
30
- <div class="flex flex-col gap-4">
24
+ <div class="flex flex-col">
31
25
  {#each variants as variant}
32
26
  {#if variant === 'secondary-inverse' || variant === 'transparent-inverse'}
33
- <div class="bg-base-inverse p-4 text-primary-inverse">
34
- <p>{variant}</p>
35
- <div class="flex gap-4">
36
- <Button variant={variant as ButtonVariant}>Button</Button>
37
- <Button variant={variant as ButtonVariant} rounded>Button</Button>
38
- </div>
27
+ <div class="grid grid-cols-3 items-center justify-center gap-4 bg-surface-inverse px-8 py-6 text-primary-inverse">
28
+ <p class="text-secondary-inverse">{variant}</p>
29
+ <Button variant={variant as ButtonVariant} class="w-fit">Button</Button>
30
+ <Button variant={variant as ButtonVariant} class="w-fit" rounded>Button</Button>
39
31
  </div>
40
32
  {:else}
41
- <div>
42
- <p>{variant}</p>
43
- <div class="flex gap-4">
44
- <Button variant={variant as ButtonVariant}>Button</Button>
45
- <Button variant={variant as ButtonVariant} rounded>Button</Button>
46
- </div>
33
+ <div class="grid grid-cols-3 items-center justify-center gap-4 px-8 py-6">
34
+ <p class="text-secondary">{variant}</p>
35
+ <Button variant={variant as ButtonVariant} class="w-fit">Button</Button>
36
+ <Button variant={variant as ButtonVariant} class="w-fit" rounded>Button</Button>
47
37
  </div>
48
38
  {/if}
49
39
  {/each}
@@ -51,46 +41,52 @@
51
41
  </Story>
52
42
 
53
43
  <Story name="Sizes" asChild>
54
- <div class="flex flex-col gap-4">
44
+ <div class="flex flex-col">
55
45
  {#each sizes as size}
56
- <div>
57
- <p>{size}</p>
58
- <Button variant="primary" size={size as ButtonSize}>Button</Button>
46
+ <div class="grid grid-cols-3 items-center justify-center gap-4 px-8 py-6">
47
+ <p class="text-secondary">{size}</p>
48
+ <Button variant="primary" size={size as ButtonSize} class="w-fit">Button</Button>
49
+ <Button variant="primary" size={size as ButtonSize} class="w-fit" rounded>Button</Button>
59
50
  </div>
60
51
  {/each}
61
52
  </div>
62
53
  </Story>
63
54
 
64
55
  <Story name="Disabled" asChild>
65
- <div class="flex flex-col gap-4">
56
+ <div class="flex flex-col">
66
57
  {#each variants as variant}
67
58
  {#if variant === 'secondary-inverse' || variant === 'transparent-inverse'}
68
- <div class="bg-base-inverse p-4 text-primary-inverse">
69
- <p>{variant}</p>
70
- <div class="flex gap-4">
71
- <Button variant={variant as ButtonVariant} disabled>Button</Button>
72
- <Button variant={variant as ButtonVariant} rounded disabled>Button</Button>
73
- </div>
59
+ <div class="grid grid-cols-3 items-center justify-center gap-4 bg-surface-inverse px-8 py-6 text-primary-inverse">
60
+ <p class="text-secondary-inverse">{variant}</p>
61
+ <Button variant={variant as ButtonVariant} class="w-fit" disabled>Button</Button>
62
+ <Button variant={variant as ButtonVariant} class="w-fit" rounded disabled>Button</Button>
74
63
  </div>
75
64
  {:else}
76
- <div>
77
- <p>{variant}</p>
78
- <div class="flex gap-4">
79
- <Button variant={variant as ButtonVariant} disabled>Button</Button>
80
- <Button variant={variant as ButtonVariant} rounded disabled>Button</Button>
81
- </div>
65
+ <div class="grid grid-cols-3 items-center justify-center gap-4 px-8 py-6">
66
+ <p class="text-secondary">{variant}</p>
67
+ <Button variant={variant as ButtonVariant} class="w-fit" disabled>Button</Button>
68
+ <Button variant={variant as ButtonVariant} class="w-fit" rounded disabled>Button</Button>
82
69
  </div>
83
70
  {/if}
84
71
  {/each}
85
72
  </div>
86
73
  </Story>
87
74
  <Story name="Loading" asChild>
88
- <div class="flex flex-col gap-4">
75
+ <div class="flex flex-col">
89
76
  {#each variants as variant}
90
- <div>
91
- <p>{variant}</p>
92
- <Button variant={variant as ButtonVariant} loading>Button</Button>
93
- </div>
77
+ {#if variant === 'secondary-inverse' || variant === 'transparent-inverse'}
78
+ <div class="grid grid-cols-3 items-center justify-center gap-4 bg-surface-inverse px-8 py-6 text-primary-inverse">
79
+ <p class="text-secondary-inverse">{variant}</p>
80
+ <Button variant={variant as ButtonVariant} class="w-fit" loading>Button</Button>
81
+ <Button variant={variant as ButtonVariant} class="w-fit" rounded loading>Button</Button>
82
+ </div>
83
+ {:else}
84
+ <div class="grid grid-cols-3 items-center justify-center gap-4 px-8 py-6">
85
+ <p class="text-secondary">{variant}</p>
86
+ <Button variant={variant as ButtonVariant} class="w-fit" loading>Button</Button>
87
+ <Button variant={variant as ButtonVariant} class="w-fit" rounded loading>Button</Button>
88
+ </div>
89
+ {/if}
94
90
  {/each}
95
91
  </div>
96
92
  </Story>
@@ -22,7 +22,7 @@
22
22
  type?: 'button' | 'submit' | 'reset' | null | undefined;
23
23
  loading?: boolean;
24
24
  disabled?: boolean;
25
- accessibilityLabel?: string;
25
+ accessibilityLabel?: string | undefined;
26
26
  size?: ButtonSize;
27
27
  id?: string | undefined;
28
28
  tabindex?: number | undefined;
@@ -34,11 +34,12 @@
34
34
 
35
35
  let {
36
36
  class: className = '',
37
- onClick = () => {},
37
+ onClick,
38
+ onclick: onclickProp,
38
39
  type = 'button',
39
40
  loading = false,
40
41
  disabled = false,
41
- accessibilityLabel = '',
42
+ accessibilityLabel = undefined,
42
43
  size = 'md',
43
44
  id = undefined,
44
45
  tabindex = undefined,
@@ -57,7 +58,8 @@
57
58
  aria-label={accessibilityLabel}
58
59
  onclick={(e) => {
59
60
  if (!loading && !disabled) {
60
- onClick(e);
61
+ onClick?.(e);
62
+ onclickProp?.(e);
61
63
  } else {
62
64
  e.preventDefault();
63
65
  }
@@ -70,7 +72,6 @@
70
72
  class={twMerge('button', variantClass, sizeClass, className)}
71
73
  data-testid={dataTestId}
72
74
  class:rounded
73
- class:disabled
74
75
  {...rest}
75
76
  >
76
77
  {#if loading}
@@ -83,7 +84,7 @@
83
84
  <style>
84
85
  @reference "../../app.css";
85
86
  .button {
86
- @apply inline-flex items-center justify-center gap-2 truncate text-nowrap rounded-lg border border-transparent text-sm font-medium transition-colors disabled:cursor-not-allowed;
87
+ @apply inline-flex items-center justify-center gap-2 truncate text-nowrap rounded-lg border border-transparent text-sm font-medium transition-colors hover:cursor-pointer disabled:cursor-not-allowed;
87
88
  }
88
89
 
89
90
  .rounded {
@@ -92,23 +93,27 @@
92
93
 
93
94
  /* Size variants */
94
95
  .btn-size-xs {
95
- @apply h-7 rounded-md px-2;
96
+ @apply h-7 rounded-md px-2 text-label;
96
97
  }
97
98
  .btn-size-sm {
98
99
  @apply h-8 px-3;
99
100
  }
100
101
  .btn-size-md {
101
- @apply h-10 px-4;
102
+ @apply h-9 px-4;
102
103
  }
103
104
  .btn-size-lg {
104
- @apply h-12 rounded-xl px-5 xl:text-base;
105
+ @apply h-10 px-5;
106
+ }
107
+
108
+ /* Gradient sheen */
109
+ .btn-primary, .btn-danger {
110
+ @apply bg-origin-border bg-gradient-to-b from-white/5 to-transparent to-75% disabled:bg-none;
105
111
  }
106
112
 
107
113
  /* Button variants */
108
114
  .btn-primary {
109
- @apply border-input bg-accent-inverse text-primary-inverse shadow-input hover:bg-accent-inverse-hover disabled:border-transparent disabled:bg-neutral disabled:text-tertiary disabled:hover:bg-neutral;
115
+ @apply border-input bg-accent-inverse text-primary-inverse shadow-button hover:bg-accent-inverse-hover disabled:border-transparent disabled:bg-neutral disabled:text-tertiary disabled:hover:bg-neutral;
110
116
  }
111
-
112
117
  .btn-secondary {
113
118
  @apply bg-neutral text-primary hover:bg-neutral-hover active:bg-neutral disabled:border-transparent disabled:bg-neutral disabled:text-tertiary disabled:hover:bg-neutral;
114
119
  }
@@ -116,10 +121,10 @@
116
121
  @apply bg-transparent text-inherit hover:bg-neutral disabled:bg-transparent disabled:text-tertiary disabled:hover:bg-transparent;
117
122
  }
118
123
  .btn-danger {
119
- @apply border-input bg-danger-inverse text-primary-inverse shadow-input hover:bg-danger-inverse-hover disabled:border-transparent disabled:bg-neutral disabled:text-tertiary disabled:hover:bg-neutral;
124
+ @apply border-input bg-danger-inverse text-primary-inverse shadow-button hover:bg-danger-inverse-hover disabled:border-transparent disabled:bg-neutral disabled:text-tertiary disabled:hover:bg-neutral;
120
125
  }
121
126
  .btn-outline {
122
- @apply border-input bg-surface text-primary shadow-input hover:border-input hover:bg-neutral hover:text-primary disabled:border-static disabled:bg-surface disabled:text-tertiary disabled:shadow-none disabled:hover:bg-surface disabled:hover:border-static;
127
+ @apply border-input bg-surface text-primary shadow-button hover:bg-surface-secondary hover:text-primary disabled:border-static disabled:bg-transparent disabled:text-tertiary disabled:shadow-none;
123
128
  }
124
129
  .btn-secondary-inverse {
125
130
  @apply bg-neutral-inverse text-primary-inverse hover:bg-neutral-inverse-hover active:bg-neutral-inverse disabled:border-transparent disabled:bg-neutral-inverse disabled:text-tertiary disabled:hover:bg-neutral-inverse;
@@ -8,7 +8,7 @@ interface Props extends HTMLButtonAttributes {
8
8
  type?: 'button' | 'submit' | 'reset' | null | undefined;
9
9
  loading?: boolean;
10
10
  disabled?: boolean;
11
- accessibilityLabel?: string;
11
+ accessibilityLabel?: string | undefined;
12
12
  size?: ButtonSize;
13
13
  id?: string | undefined;
14
14
  tabindex?: number | undefined;
@@ -0,0 +1,7 @@
1
+ import figma from 'figma';
2
+ declare const _default: {
3
+ example: figma.TemplateStringResult;
4
+ imports: string[];
5
+ id: string;
6
+ };
7
+ export default _default;
@@ -0,0 +1,24 @@
1
+ // url=https://www.figma.com/design/WkxhG4H2Ybc7STFi1VJIau/%F0%9F%92%A0-Reshape-Design-System--V1?node-id=155-6227
2
+ // source=src/lib/components/checkbox/Checkbox.svelte
3
+ // component=Checkbox
4
+ import figma from 'figma';
5
+ const instance = figma.selectedInstance;
6
+ const size = instance.getEnum('size', {
7
+ 'sm': 'sm',
8
+ 'md': 'md',
9
+ 'lg': 'lg',
10
+ });
11
+ const disabled = instance.getEnum('disabled', {
12
+ 'true': true,
13
+ 'false': false,
14
+ });
15
+ const checked = instance.getEnum('state', {
16
+ 'on': true,
17
+ 'off': false,
18
+ 'indeterminate': false,
19
+ });
20
+ export default {
21
+ example: figma.code `<Checkbox size="${size}" checked={${checked}} ${disabled ? 'disabled' : ''} />`,
22
+ imports: ["import Checkbox from './Checkbox.svelte'"],
23
+ id: 'checkbox',
24
+ };
@@ -6,17 +6,76 @@
6
6
  component: Checkbox,
7
7
  title: 'Components/Checkbox',
8
8
  tags: ['autodocs'],
9
+ parameters: {
10
+ layout: 'fullscreen',
11
+ },
9
12
  });
10
13
 
11
- let checked = $state<boolean>(false);
14
+ const sizes = ['sm', 'md', 'lg'] as const;
12
15
  </script>
13
16
 
14
- <Story name="Default" args={{ checked: false }} />
15
-
16
- <Story name="Checked" args={{ checked: true }} />
17
-
18
- <Story name="Unchecked" args={{ checked: false }} />
19
-
20
- <Story name="Disabled" args={{ checked: true, disabled: true }} />
21
-
22
- <Story name="Indeterminate" args={{ checked: false, indeterminate: true }} />
17
+ <Story name="Overview" asChild>
18
+ <div class="flex flex-col gap-8 text-sm">
19
+ <div class="overflow-x-auto">
20
+ <table class="w-full min-w-[640px] table-fixed border-collapse text-center">
21
+ <colgroup>
22
+ <col class="w-24" />
23
+ <col />
24
+ <col />
25
+ <col />
26
+ <col />
27
+ <col />
28
+ <col />
29
+ </colgroup>
30
+ <thead>
31
+ <tr class="border-b border-static text-left text-label font-medium text-secondary">
32
+ <th class="bg-base p-4 text-left">Size</th>
33
+ <th class="p-4 text-center">Off</th>
34
+ <th class="p-4 text-center">On</th>
35
+ <th class="p-4 text-center">Indeterminate</th>
36
+ <th class="p-4 text-center">Disabled off</th>
37
+ <th class="p-4 text-center">Disabled on</th>
38
+ <th class="p-4 text-center">Indeterminate disabled</th>
39
+ </tr>
40
+ </thead>
41
+ <tbody>
42
+ {#each sizes as size}
43
+ <tr class="border-b last:border-none border-static">
44
+ <td class="bg-base p-4 text-left font-mono text-label text-secondary">{size}</td>
45
+ <td class="p-4">
46
+ <div class="flex w-full justify-center">
47
+ <Checkbox {size} checked={false} />
48
+ </div>
49
+ </td>
50
+ <td class="p-4">
51
+ <div class="flex w-full justify-center">
52
+ <Checkbox {size} checked />
53
+ </div>
54
+ </td>
55
+ <td class="p-4">
56
+ <div class="flex w-full justify-center">
57
+ <Checkbox {size} indeterminate />
58
+ </div>
59
+ </td>
60
+ <td class="p-4">
61
+ <div class="flex w-full justify-center">
62
+ <Checkbox {size} checked={false} disabled />
63
+ </div>
64
+ </td>
65
+ <td class="p-4">
66
+ <div class="flex w-full justify-center">
67
+ <Checkbox {size} checked disabled />
68
+ </div>
69
+ </td>
70
+ <td class="p-4">
71
+ <div class="flex w-full justify-center">
72
+ <Checkbox {size} indeterminate disabled />
73
+ </div>
74
+ </td>
75
+ </tr>
76
+ {/each}
77
+ </tbody>
78
+ </table>
79
+ </div>
80
+ </div>
81
+ </Story>
@@ -5,22 +5,46 @@
5
5
  import { Icon } from '../icons/index.js';
6
6
  import { Checkbox, type CheckboxRootProps } from 'bits-ui';
7
7
 
8
- export type CheckboxProps = CheckboxRootProps;
8
+ export type CheckboxProps = CheckboxRootProps & {
9
+ size?: 'sm' | 'md' | 'lg';
10
+ };
9
11
 
10
- let { checked = $bindable(false), onCheckedChange, name, class: className, ...props }: CheckboxProps = $props();
12
+ let {
13
+ checked = $bindable(false),
14
+ onCheckedChange,
15
+ name,
16
+ class: className,
17
+ size = 'sm',
18
+ disabled = false,
19
+ ...props
20
+ }: CheckboxProps = $props();
21
+
22
+ const sizeConfig = {
23
+ sm: { box: 'size-4.5 rounded-sm', iconSize: 14 },
24
+ md: { box: 'size-5 rounded-sm', iconSize: 16 },
25
+ lg: { box: 'size-6 rounded-md', iconSize: 16 },
26
+ };
27
+
28
+ const config = $derived(sizeConfig[size]);
11
29
  </script>
12
30
 
13
- <Checkbox.Root bind:checked {onCheckedChange} {...props}>
31
+ <Checkbox.Root bind:checked {name} {onCheckedChange} {disabled} {...props}>
14
32
  {#snippet children({ checked, indeterminate })}
33
+ {@const on = Boolean(checked || indeterminate)}
15
34
  <div
16
- class={twMerge('flex items-center justify-center rounded border border-static', checked && 'bg-dark-accent-inverse-hover', className)}
35
+ class={twMerge(
36
+ 'flex shrink-0 items-center justify-center transition-colors border border-interactive shadow-input cursor-pointer',
37
+ config.box,
38
+ disabled && 'cursor-not-allowed border-transparent bg-neutral-darker shadow-none',
39
+ !disabled && on && 'bg-accent-inverse hover:bg-accent-inverse-hover',
40
+ !disabled && !on && 'bg-surface hover:border-hover',
41
+ className,
42
+ )}
17
43
  >
18
44
  {#if checked}
19
- <Icon class="text-primary-inverse" icon={Check} />
45
+ <Icon class={disabled ? 'text-tertiary' : 'text-primary-inverse'} icon={Check} size={config.iconSize}/>
20
46
  {:else if indeterminate}
21
- <Icon icon={Minus} />
22
- {:else}
23
- <div class="h-4 w-4"></div>
47
+ <Icon class={disabled ? 'text-tertiary' : 'text-primary-inverse'} icon={Minus} size={config.iconSize} />
24
48
  {/if}
25
49
  </div>
26
50
  {/snippet}
@@ -1,5 +1,7 @@
1
1
  import { Checkbox, type CheckboxRootProps } from 'bits-ui';
2
- export type CheckboxProps = CheckboxRootProps;
3
- declare const Checkbox: import("svelte").Component<Checkbox.RootProps, {}, "checked">;
2
+ export type CheckboxProps = CheckboxRootProps & {
3
+ size?: 'sm' | 'md' | 'lg';
4
+ };
5
+ declare const Checkbox: import("svelte").Component<CheckboxProps, {}, "checked">;
4
6
  type Checkbox = ReturnType<typeof Checkbox>;
5
7
  export default Checkbox;
@@ -0,0 +1,7 @@
1
+ import figma from 'figma';
2
+ declare const _default: {
3
+ example: figma.TemplateStringResult;
4
+ imports: string[];
5
+ id: string;
6
+ };
7
+ export default _default;
@@ -0,0 +1,21 @@
1
+ // url=https://www.figma.com/design/WkxhG4H2Ybc7STFi1VJIau/%F0%9F%92%A0-Reshape-Design-System--V1?node-id=6534-8043
2
+ // source=src/lib/components/collapsible/index.ts
3
+ // component=Collapsible
4
+ import figma from 'figma';
5
+ const instance = figma.selectedInstance;
6
+ const open = instance.getEnum('open', {
7
+ 'true': true,
8
+ 'false': false,
9
+ });
10
+ export default {
11
+ example: figma.code `
12
+ <Collapsible.Root open={${open}}>
13
+ <Collapsible.Trigger>Section title</Collapsible.Trigger>
14
+ <Collapsible.Content>
15
+ Section content goes here
16
+ </Collapsible.Content>
17
+ </Collapsible.Root>
18
+ `,
19
+ imports: ["import * as Collapsible from './'"],
20
+ id: 'collapsible',
21
+ };
@@ -18,12 +18,6 @@
18
18
  component: ComboboxRootForMeta,
19
19
  title: 'Components/Combobox',
20
20
  tags: ['autodocs'],
21
- parameters: {
22
- design: {
23
- type: 'figma',
24
- url: 'https://www.figma.com/design/VHTMNdy8PAXAMx43edNZGW/%F0%9F%92%A0--Reshape-Design-System%3A-V1?node-id=9-3294&t=sCuBI8dX6K6NjNR6-0',
25
- },
26
- },
27
21
  });
28
22
 
29
23
  const fruits = [
@@ -0,0 +1,7 @@
1
+ import figma from 'figma';
2
+ declare const _default: {
3
+ example: figma.TemplateStringResult;
4
+ imports: string[];
5
+ id: string;
6
+ };
7
+ export default _default;