@reshape-biotech/design-system 0.0.23 → 0.0.25

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 (175) hide show
  1. package/README.md +30 -38
  2. package/dist/app.css +4 -4
  3. package/dist/components/avatar/index.d.ts +1 -0
  4. package/dist/components/avatar/index.js +1 -0
  5. package/dist/components/banner/Banner.stories.svelte +129 -0
  6. package/dist/components/banner/Banner.svelte +59 -0
  7. package/dist/components/banner/Banner.svelte.d.ts +11 -0
  8. package/dist/components/banner/index.d.ts +1 -0
  9. package/dist/components/banner/index.js +1 -0
  10. package/dist/components/button/Button.stories.svelte +37 -0
  11. package/dist/components/button/Button.svelte +85 -0
  12. package/dist/components/button/Button.svelte.d.ts +17 -0
  13. package/dist/components/button/index.d.ts +1 -0
  14. package/dist/components/button/index.js +1 -0
  15. package/dist/components/datepicker/DatePicker.svelte +283 -0
  16. package/dist/components/datepicker/DatePicker.svelte.d.ts +8 -0
  17. package/dist/components/datepicker/index.d.ts +1 -0
  18. package/dist/components/datepicker/index.js +1 -0
  19. package/dist/components/divider/Divider.stories.svelte +14 -0
  20. package/dist/components/divider/Divider.svelte +9 -0
  21. package/dist/components/divider/Divider.svelte.d.ts +6 -0
  22. package/dist/components/divider/index.d.ts +1 -0
  23. package/dist/components/divider/index.js +1 -0
  24. package/dist/components/drawer/Drawer.stories.svelte +99 -0
  25. package/dist/components/drawer/Drawer.svelte +45 -0
  26. package/dist/components/drawer/Drawer.svelte.d.ts +12 -0
  27. package/dist/components/drawer/DrawerLabel.svelte +13 -0
  28. package/dist/components/drawer/DrawerLabel.svelte.d.ts +9 -0
  29. package/dist/components/drawer/index.d.ts +1 -0
  30. package/dist/components/drawer/index.js +1 -0
  31. package/dist/components/dropdown/Dropdown.stories.svelte +214 -0
  32. package/dist/components/dropdown/Dropdown.svelte +69 -0
  33. package/dist/components/dropdown/Dropdown.svelte.d.ts +14 -0
  34. package/dist/components/dropdown/components/DropdownContent.svelte +29 -0
  35. package/dist/components/dropdown/components/DropdownContent.svelte.d.ts +10 -0
  36. package/dist/components/dropdown/components/DropdownMenu.svelte +23 -0
  37. package/dist/components/dropdown/components/DropdownMenu.svelte.d.ts +8 -0
  38. package/dist/components/dropdown/components/DropdownTrigger.svelte +44 -0
  39. package/dist/components/dropdown/components/DropdownTrigger.svelte.d.ts +12 -0
  40. package/dist/components/dropdown/index.d.ts +1 -0
  41. package/dist/components/dropdown/index.js +1 -0
  42. package/dist/components/icon-button/IconButton.stories.svelte +52 -0
  43. package/dist/components/icon-button/IconButton.svelte +72 -0
  44. package/dist/components/icon-button/IconButton.svelte.d.ts +14 -0
  45. package/dist/components/icon-button/index.d.ts +1 -0
  46. package/dist/components/icon-button/index.js +1 -0
  47. package/dist/components/image/Image.svelte +56 -0
  48. package/dist/components/image/Image.svelte.d.ts +7 -0
  49. package/dist/components/image/index.d.ts +1 -0
  50. package/dist/components/image/index.js +1 -0
  51. package/dist/components/input/Input.stories.svelte +81 -0
  52. package/dist/components/input/Input.svelte +131 -0
  53. package/dist/components/input/Input.svelte.d.ts +20 -0
  54. package/dist/components/input/index.d.ts +1 -0
  55. package/dist/components/input/index.js +1 -0
  56. package/dist/components/list/List.stories.svelte +97 -0
  57. package/dist/components/list/List.svelte +75 -0
  58. package/dist/components/list/List.svelte.d.ts +24 -0
  59. package/dist/components/list/index.d.ts +1 -0
  60. package/dist/components/list/index.js +1 -0
  61. package/dist/components/markdown/Markdown.stories.svelte +41 -0
  62. package/dist/components/markdown/Markdown.svelte +12 -0
  63. package/dist/components/markdown/Markdown.svelte.d.ts +6 -0
  64. package/dist/components/markdown/index.d.ts +1 -0
  65. package/dist/components/markdown/index.js +1 -0
  66. package/dist/components/modal/Modal.stories.svelte +41 -0
  67. package/dist/components/modal/Modal.svelte +56 -0
  68. package/dist/components/modal/Modal.svelte.d.ts +16 -0
  69. package/dist/components/modal/index.d.ts +1 -0
  70. package/dist/components/modal/index.js +1 -0
  71. package/dist/components/notification-popup/NotificationPopup.stories.svelte +27 -0
  72. package/dist/components/notification-popup/NotificationPopup.svelte +31 -0
  73. package/dist/components/notification-popup/NotificationPopup.svelte.d.ts +11 -0
  74. package/dist/components/notification-popup/index.d.ts +1 -0
  75. package/dist/components/notification-popup/index.js +1 -0
  76. package/dist/components/pill/Pill.svelte +39 -0
  77. package/dist/components/pill/Pill.svelte.d.ts +10 -0
  78. package/dist/components/pill/index.d.ts +1 -0
  79. package/dist/components/pill/index.js +1 -0
  80. package/dist/components/progress-circle/ProgressCircle.svelte +79 -0
  81. package/dist/components/progress-circle/ProgressCircle.svelte.d.ts +7 -0
  82. package/dist/components/progress-circle/index.d.ts +1 -0
  83. package/dist/components/progress-circle/index.js +1 -0
  84. package/dist/components/segmented-control-buttons/ControlButton.svelte +59 -0
  85. package/dist/components/segmented-control-buttons/ControlButton.svelte.d.ts +14 -0
  86. package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte +45 -0
  87. package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte +21 -0
  88. package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte.d.ts +10 -0
  89. package/dist/components/segmented-control-buttons/index.d.ts +2 -0
  90. package/dist/components/segmented-control-buttons/index.js +2 -0
  91. package/dist/components/select/Select.stories.svelte +113 -0
  92. package/dist/components/select/Select.svelte +137 -0
  93. package/dist/components/select/Select.svelte.d.ts +60 -0
  94. package/dist/components/select/index.d.ts +7 -0
  95. package/dist/components/select/index.js +1 -0
  96. package/dist/components/skeleton-loader/SkeletonLoader.stories.svelte +71 -0
  97. package/dist/components/skeleton-loader/SkeletonLoader.svelte +17 -0
  98. package/dist/components/skeleton-loader/SkeletonLoader.svelte.d.ts +9 -0
  99. package/dist/components/skeleton-loader/StatcardSkeleton.svelte +17 -0
  100. package/dist/components/skeleton-loader/StatcardSkeleton.svelte.d.ts +18 -0
  101. package/dist/components/skeleton-loader/components/Skeleton.svelte +14 -0
  102. package/dist/components/skeleton-loader/components/Skeleton.svelte.d.ts +8 -0
  103. package/dist/components/skeleton-loader/components/SkeletonImage.svelte +14 -0
  104. package/dist/components/{tooltip/Tooltip.stories.svelte.d.ts → skeleton-loader/components/SkeletonImage.svelte.d.ts} +3 -4
  105. package/dist/components/skeleton-loader/index.d.ts +3 -0
  106. package/dist/components/skeleton-loader/index.js +3 -0
  107. package/dist/components/slider/Slider.stories.svelte +37 -0
  108. package/dist/components/slider/Slider.svelte +117 -0
  109. package/dist/components/slider/Slider.svelte.d.ts +29 -0
  110. package/dist/components/slider/index.d.ts +1 -0
  111. package/dist/components/slider/index.js +1 -0
  112. package/dist/components/spinner/Spinner.svelte +27 -0
  113. package/dist/components/spinner/Spinner.svelte.d.ts +6 -0
  114. package/dist/components/spinner/index.d.ts +1 -0
  115. package/dist/components/spinner/index.js +1 -0
  116. package/dist/components/stat-card/StatCard.stories.svelte +32 -0
  117. package/dist/components/stat-card/StatCard.svelte +52 -0
  118. package/dist/components/stat-card/StatCard.svelte.d.ts +10 -0
  119. package/dist/components/stat-card/index.d.ts +1 -0
  120. package/dist/components/stat-card/index.js +1 -0
  121. package/dist/components/status-badge/StatusBadge.stories.svelte +401 -0
  122. package/dist/components/status-badge/StatusBadge.svelte +147 -0
  123. package/dist/components/status-badge/StatusBadge.svelte.d.ts +12 -0
  124. package/dist/components/status-badge/index.d.ts +1 -0
  125. package/dist/components/status-badge/index.js +1 -0
  126. package/dist/components/table/Table.stories.svelte +86 -0
  127. package/dist/components/table/Table.svelte +33 -0
  128. package/dist/components/table/Table.svelte.d.ts +8 -0
  129. package/dist/components/table/components/Td.svelte +14 -0
  130. package/dist/components/table/components/Td.svelte.d.ts +8 -0
  131. package/dist/components/table/components/Th.svelte +15 -0
  132. package/dist/components/table/components/Th.svelte.d.ts +9 -0
  133. package/dist/components/table/components/Tr.svelte +31 -0
  134. package/dist/components/table/components/Tr.svelte.d.ts +8 -0
  135. package/dist/components/table/index.d.ts +1 -0
  136. package/dist/components/table/index.js +1 -0
  137. package/dist/components/tabs/Tabs.stories.svelte +30 -0
  138. package/dist/components/tabs/Tabs.svelte +15 -0
  139. package/dist/components/tabs/Tabs.svelte.d.ts +8 -0
  140. package/dist/components/tabs/components/Content.svelte +15 -0
  141. package/dist/components/tabs/components/Content.svelte.d.ts +9 -0
  142. package/dist/components/tabs/components/Tab.svelte +21 -0
  143. package/dist/components/tabs/components/Tab.svelte.d.ts +10 -0
  144. package/dist/components/tabs/components/Tabs.svelte +14 -0
  145. package/dist/components/tabs/components/Tabs.svelte.d.ts +8 -0
  146. package/dist/components/tabs/index.d.ts +1 -0
  147. package/dist/components/tabs/index.js +1 -0
  148. package/dist/components/tag/Tag.stories.svelte +50 -0
  149. package/dist/components/tag/Tag.svelte +104 -0
  150. package/dist/components/tag/Tag.svelte.d.ts +11 -0
  151. package/dist/components/tag/index.d.ts +1 -0
  152. package/dist/components/tag/index.js +1 -0
  153. package/dist/components/toast/Toast.svelte +66 -0
  154. package/dist/components/toast/Toast.svelte.d.ts +5 -0
  155. package/dist/components/toast/index.d.ts +1 -0
  156. package/dist/components/toast/index.js +1 -0
  157. package/dist/components/tooltip/index.d.ts +1 -0
  158. package/dist/components/tooltip/index.js +1 -0
  159. package/dist/fonts/MDSystem-Medium.woff +0 -0
  160. package/dist/fonts/MDSystem-Medium.woff2 +0 -0
  161. package/dist/fonts/MDSystem-Regular.woff +0 -0
  162. package/dist/fonts/MDSystem-Regular.woff2 +0 -0
  163. package/dist/fonts/MDSystem-Semibold.woff +0 -0
  164. package/dist/fonts/MDSystem-Semibold.woff2 +0 -0
  165. package/dist/fonts/MDSystemMono-Regular.woff +0 -0
  166. package/dist/fonts/MDSystemMono-Regular.woff2 +0 -0
  167. package/dist/fonts/index.d.ts +6 -0
  168. package/dist/fonts/index.js +10 -0
  169. package/dist/index.d.ts +29 -3
  170. package/dist/index.js +31 -4
  171. package/dist/tailwind.preset.d.ts +1 -0
  172. package/dist/tokens.d.ts +314 -36
  173. package/dist/tokens.js +235 -248
  174. package/dist/types/fonts.d.ts +4 -0
  175. package/package.json +9 -15
@@ -0,0 +1,214 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import Dropdown from './Dropdown.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ component: Dropdown,
7
+ title: 'Design System/Dropdown',
8
+ tags: ['autodocs']
9
+ });
10
+ </script>
11
+
12
+ <Story name="Primary">
13
+ <div class="py-12">
14
+ <Dropdown>
15
+ {#snippet trigger({ Trigger })}
16
+ <Trigger>Dropdown</Trigger>
17
+ {/snippet}
18
+ {#snippet content({ C })}
19
+ <div>
20
+ <C.DropdownMenu class="w-full">
21
+ <li>
22
+ <p>1st item</p>
23
+ </li>
24
+ <li>
25
+ <p>2nd item</p>
26
+ </li>
27
+ </C.DropdownMenu>
28
+ </div>
29
+ {/snippet}
30
+ </Dropdown>
31
+ </div>
32
+ </Story>
33
+
34
+ <Story name="Secondary">
35
+ <div class="py-12">
36
+ <Dropdown>
37
+ {#snippet trigger({ Trigger })}
38
+ <Trigger variant="secondary">Dropdown</Trigger>
39
+ {/snippet}
40
+ {#snippet content({ C })}
41
+ <div>
42
+ <C.DropdownMenu class="w-full">
43
+ <li>
44
+ <p>1st item</p>
45
+ </li>
46
+ <li>
47
+ <p>2nd item</p>
48
+ </li>
49
+ </C.DropdownMenu>
50
+ </div>
51
+ {/snippet}
52
+ </Dropdown>
53
+ </div>
54
+ </Story>
55
+ <Story name="Transparent">
56
+ <div class="py-12">
57
+ <Dropdown>
58
+ {#snippet trigger({ Trigger })}
59
+ <Trigger variant="transparent">Dropdown</Trigger>
60
+ {/snippet}
61
+ {#snippet content({ C })}
62
+ <div>
63
+ <C.DropdownMenu class="w-full">
64
+ <li>
65
+ <p>1st item</p>
66
+ </li>
67
+ <li>
68
+ <p>2nd item</p>
69
+ </li>
70
+ </C.DropdownMenu>
71
+ </div>
72
+ {/snippet}
73
+ </Dropdown>
74
+ </div>
75
+ </Story>
76
+ <Story name="Danger">
77
+ <div class="py-12">
78
+ <Dropdown>
79
+ {#snippet trigger({ Trigger })}
80
+ <Trigger variant="danger">Dropdown</Trigger>
81
+ {/snippet}
82
+ {#snippet content({ C })}
83
+ <div>
84
+ <C.DropdownMenu class="w-full">
85
+ <li>
86
+ <p>1st item</p>
87
+ </li>
88
+ <li>
89
+ <p>2nd item</p>
90
+ </li>
91
+ </C.DropdownMenu>
92
+ </div>
93
+ {/snippet}
94
+ </Dropdown>
95
+ </div>
96
+ </Story>
97
+
98
+ <Story name="Sides">
99
+ <div class="flex h-screen w-full items-center justify-center">
100
+ <div class="flex flex-1 justify-between">
101
+ <Dropdown open side="dropdown-bottom">
102
+ {#snippet trigger({ Trigger })}
103
+ <Trigger>Bottom</Trigger>
104
+ {/snippet}
105
+
106
+ {#snippet content({ C })}
107
+ <div>
108
+ <C.DropdownMenu class="w-[120px]">
109
+ <li>
110
+ <p>1st item</p>
111
+ </li>
112
+ <li>
113
+ <p>2nd item</p>
114
+ </li>
115
+ </C.DropdownMenu>
116
+ </div>
117
+ {/snippet}
118
+ </Dropdown>
119
+ <Dropdown open side="dropdown-top">
120
+ {#snippet trigger({ Trigger })}
121
+ <Trigger>Top</Trigger>
122
+ {/snippet}
123
+ {#snippet content({ C })}
124
+ <div>
125
+ <C.DropdownMenu class="w-[120px]">
126
+ <li>
127
+ <p>1st item</p>
128
+ </li>
129
+ <li>
130
+ <p>2nd item</p>
131
+ </li>
132
+ </C.DropdownMenu>
133
+ </div>
134
+ {/snippet}
135
+ </Dropdown>
136
+ <Dropdown open side="dropdown-right">
137
+ {#snippet trigger({ Trigger })}
138
+ <Trigger>Right</Trigger>
139
+ {/snippet}
140
+ {#snippet content({ C })}
141
+ <div>
142
+ <C.DropdownMenu class="w-[120px]">
143
+ <li>
144
+ <p>1st item</p>
145
+ </li>
146
+ <li>
147
+ <p>2nd item</p>
148
+ </li>
149
+ </C.DropdownMenu>
150
+ </div>
151
+ {/snippet}
152
+ </Dropdown>
153
+ <Dropdown open side="dropdown-left">
154
+ {#snippet trigger({ Trigger })}
155
+ <Trigger>Left</Trigger>
156
+ {/snippet}
157
+ {#snippet content({ C })}
158
+ <div>
159
+ <C.DropdownMenu class="w-[120px]">
160
+ <li>
161
+ <p>1st item</p>
162
+ </li>
163
+ <li>
164
+ <p>2nd item</p>
165
+ </li>
166
+ </C.DropdownMenu>
167
+ </div>
168
+ {/snippet}
169
+ </Dropdown>
170
+ </div>
171
+ </div>
172
+ </Story>
173
+
174
+ <Story name="End align">
175
+ <div class="py-12">
176
+ <Dropdown alignEnd open>
177
+ {#snippet trigger({ Trigger })}
178
+ <Trigger>Dropdown</Trigger>
179
+ {/snippet}
180
+ {#snippet content({ C })}
181
+ <div>
182
+ <C.DropdownMenu>
183
+ <li>
184
+ <p>1st item</p>
185
+ </li>
186
+ <li>
187
+ <p>2nd item</p>
188
+ </li>
189
+ </C.DropdownMenu>
190
+ </div>
191
+ {/snippet}
192
+ </Dropdown>
193
+ </div>
194
+ </Story>
195
+
196
+ <Story name="Other content">
197
+ <div class="py-12">
198
+ <Dropdown alignEnd open>
199
+ {#snippet trigger({ Trigger })}
200
+ <Trigger>Dropdown</Trigger>
201
+ {/snippet}
202
+ {#snippet content({ C })}
203
+ <div>
204
+ <C.DropdownContent>
205
+ <div>
206
+ <p>This is a dropdown with other content</p>
207
+ <p>It doesn't have to be list items</p>
208
+ </div>
209
+ </C.DropdownContent>
210
+ </div>
211
+ {/snippet}
212
+ </Dropdown>
213
+ </div>
214
+ </Story>
@@ -0,0 +1,69 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import DropdownContent from './components/DropdownContent.svelte';
4
+ import DropdownMenu from './components/DropdownMenu.svelte';
5
+ import DropdownTrigger from './components/DropdownTrigger.svelte';
6
+
7
+ interface Props {
8
+ side?: 'dropdown-top' | 'dropdown-bottom' | 'dropdown-left' | 'dropdown-right';
9
+ open?: boolean;
10
+ alignEnd?: boolean;
11
+ openOnHover?: boolean;
12
+ closeOnItemClick?: boolean;
13
+ class?: string;
14
+ trigger?: Snippet<[any]>;
15
+ content?: Snippet<[any]>;
16
+ }
17
+
18
+ let {
19
+ side = 'dropdown-bottom',
20
+ open = $bindable(false),
21
+ alignEnd = false,
22
+ openOnHover = false,
23
+ closeOnItemClick = false,
24
+ class: className = '',
25
+ trigger,
26
+ content
27
+ }: Props = $props();
28
+
29
+ let C = {
30
+ DropdownMenu,
31
+ DropdownContent
32
+ };
33
+
34
+ const closeDropdown = () => {
35
+ open = false;
36
+ // https://medium.com/@malikhamzav/how-to-close-daisyui-dropdown-on-click-ea65c5749410
37
+ document.activeElement instanceof HTMLElement && document.activeElement.blur();
38
+ };
39
+
40
+ function handleItemClick() {
41
+ if (closeOnItemClick) {
42
+ closeDropdown();
43
+ }
44
+ }
45
+
46
+ function handleKeyDown(event: KeyboardEvent) {
47
+ if (event.key === 'Escape') {
48
+ closeDropdown();
49
+ }
50
+ }
51
+ </script>
52
+
53
+ <div
54
+ class="dropdown {side} {className}"
55
+ class:dropdown-end={alignEnd}
56
+ class:dropdown-open={open}
57
+ class:dropdown-hover={openOnHover}
58
+ >
59
+ {@render trigger?.({ Trigger: DropdownTrigger })}
60
+ <div
61
+ class="dropdown-content z-10 w-full"
62
+ role="menu"
63
+ tabindex="-1"
64
+ onkeydown={handleKeyDown}
65
+ onclick={handleItemClick}
66
+ >
67
+ {@render content?.({ C })}
68
+ </div>
69
+ </div>
@@ -0,0 +1,14 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ side?: 'dropdown-top' | 'dropdown-bottom' | 'dropdown-left' | 'dropdown-right';
4
+ open?: boolean;
5
+ alignEnd?: boolean;
6
+ openOnHover?: boolean;
7
+ closeOnItemClick?: boolean;
8
+ class?: string;
9
+ trigger?: Snippet<[any]>;
10
+ content?: Snippet<[any]>;
11
+ }
12
+ declare const Dropdown: import("svelte").Component<Props, {}, "open">;
13
+ type Dropdown = ReturnType<typeof Dropdown>;
14
+ export default Dropdown;
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ type Variant = 'primary' | 'secondary';
5
+
6
+ interface Props {
7
+ class?: string;
8
+ variant?: Variant;
9
+ children?: Snippet;
10
+ }
11
+
12
+ const Variants: Record<Variant, string> = {
13
+ primary: 'bg-surface text-primary',
14
+ secondary: 'bg-base-inverse text-primary-inverse'
15
+ };
16
+
17
+ let { class: className = '', variant = 'primary', children }: Props = $props();
18
+
19
+ let variantClass = $derived(Variants[variant]);
20
+ </script>
21
+
22
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
23
+ <!-- DaisyUI have a bug wit safari dropdown. Requires tabindex=0-->
24
+ <div
25
+ class={`dropdown-content z-[1] mb-2 rounded-md p-1 shadow-2xl ${variantClass} ${className}`}
26
+ tabindex="0"
27
+ >
28
+ {@render children?.()}
29
+ </div>
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from 'svelte';
2
+ type Variant = 'primary' | 'secondary';
3
+ interface Props {
4
+ class?: string;
5
+ variant?: Variant;
6
+ children?: Snippet;
7
+ }
8
+ declare const DropdownContent: import("svelte").Component<Props, {}, "">;
9
+ type DropdownContent = ReturnType<typeof DropdownContent>;
10
+ export default DropdownContent;
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ interface Props {
5
+ class?: string;
6
+ children?: Snippet;
7
+ }
8
+
9
+ let { class: className = '', children }: Props = $props();
10
+ </script>
11
+
12
+ <ul
13
+ tabIndex="0"
14
+ class={`menu dropdown-content menu-md z-[1] rounded-md bg-surface p-1 shadow-2xl ${className}`}
15
+ >
16
+ {@render children?.()}
17
+ </ul>
18
+
19
+ <style>
20
+ :global(.menu li > *:not(ul):not(.menu-title):not(details):active) {
21
+ background-color: #12192A1A
22
+ }
23
+ </style>
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ class?: string;
4
+ children?: Snippet;
5
+ }
6
+ declare const DropdownMenu: import("svelte").Component<Props, {}, "">;
7
+ type DropdownMenu = ReturnType<typeof DropdownMenu>;
8
+ export default DropdownMenu;
@@ -0,0 +1,44 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ interface Props {
4
+ size?: 'sm' | 'md' | 'lg';
5
+ class?: string;
6
+ variant?: Color;
7
+ children?: Snippet;
8
+ noPadding?: boolean;
9
+ }
10
+ let {
11
+ size = 'md',
12
+ class: className = '',
13
+ variant = 'primary',
14
+ children,
15
+ noPadding = false
16
+ }: Props = $props();
17
+
18
+ type Color = 'primary' | 'secondary' | 'transparent' | 'danger';
19
+
20
+ const sizes = $derived({
21
+ sm: `h-8 ${noPadding ? 'px-0' : 'px-3'} ${noPadding ? 'py-0' : 'py-2'}`,
22
+ md: 'h-10 px-5 py-3',
23
+ lg: 'h-12 px-6 py-4'
24
+ });
25
+
26
+ const colors: Record<Color, string> = {
27
+ primary:
28
+ 'bg-accent-inverse text-primary-inverse hover:bg-accent-inverse-hover disabled:bg-neutral disabled:text-tertiary',
29
+ secondary:
30
+ 'bg-neutral text-primary hover:bg-neutral-hover disabled:bg-neutral disabled:text-tertiary',
31
+ transparent:
32
+ 'bg-transparent text-primary hover:bg-neutral disabled:bg-neutral disabled:text-tertiary',
33
+ danger:
34
+ 'bg-danger text-primary-inverse hover:bg-danger-hover disabled:bg-neutral disabled:text-tertiary'
35
+ };
36
+ </script>
37
+
38
+ <div
39
+ role="button"
40
+ tabindex="0"
41
+ class={`inline-flex items-center justify-center gap-2 rounded-full text-base font-medium leading-6 ${colors[variant]} ${sizes[size]} ${className}`}
42
+ >
43
+ {@render children?.()}
44
+ </div>
@@ -0,0 +1,12 @@
1
+ import type { Snippet } from 'svelte';
2
+ type Color = 'primary' | 'secondary' | 'transparent' | 'danger';
3
+ interface Props {
4
+ size?: 'sm' | 'md' | 'lg';
5
+ class?: string;
6
+ variant?: Color;
7
+ children?: Snippet;
8
+ noPadding?: boolean;
9
+ }
10
+ declare const DropdownTrigger: import("svelte").Component<Props, {}, "">;
11
+ type DropdownTrigger = ReturnType<typeof DropdownTrigger>;
12
+ export default DropdownTrigger;
@@ -0,0 +1 @@
1
+ export { default as Dropdown } from './Dropdown.svelte';
@@ -0,0 +1 @@
1
+ export { default as Dropdown } from './Dropdown.svelte';
@@ -0,0 +1,52 @@
1
+ <script module lang="ts">
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import IconButton from 'design-system/components/icon-button/IconButton.svelte';
4
+ import { Plus } from 'phosphor-svelte';
5
+
6
+ const { Story } = defineMeta({
7
+ component: IconButton,
8
+ title: 'Design System/IconButton',
9
+ tags: ['autodocs']
10
+ });
11
+ </script>
12
+
13
+ <Story name="Primary">
14
+ <IconButton color="primary">
15
+ <Plus />
16
+ </IconButton>
17
+ </Story>
18
+ <Story name="Danger">
19
+ <IconButton color="danger">
20
+ <Plus />
21
+ </IconButton>
22
+ </Story>
23
+ <Story name="Transparent">
24
+ <IconButton color="transparent">
25
+ <Plus />
26
+ </IconButton>
27
+ </Story>
28
+ <Story name="Secondary">
29
+ <IconButton color="secondary">
30
+ <Plus />
31
+ </IconButton>
32
+ </Story>
33
+ <Story name="Medium">
34
+ <IconButton color="secondary" size="md">
35
+ <Plus />
36
+ </IconButton>
37
+ </Story>
38
+ <Story name="Extra Small">
39
+ <IconButton color="secondary" size="xs">
40
+ <Plus />
41
+ </IconButton>
42
+ </Story>
43
+ <Story name="Disabled">
44
+ <IconButton disabled>
45
+ <Plus />
46
+ </IconButton>
47
+ </Story>
48
+ <Story name="Loading">
49
+ <IconButton loading>
50
+ <Plus />
51
+ </IconButton>
52
+ </Story>
@@ -0,0 +1,72 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import Spinner from '../spinner/';
4
+
5
+ type Color = 'primary' | 'secondary' | 'transparent' | 'danger';
6
+ interface Props {
7
+ color?: 'primary' | 'transparent' | 'secondary' | 'danger';
8
+ type?: 'button' | 'submit' | 'reset' | null | undefined;
9
+ loading?: boolean;
10
+ disabled?: boolean;
11
+ size?: 'xs' | 'sm' | 'md';
12
+ children?: Snippet;
13
+ onclick?: () => void;
14
+ tabindex?: number | undefined;
15
+ }
16
+
17
+ let {
18
+ color = 'transparent',
19
+ type = 'button',
20
+ loading = false,
21
+ disabled = false,
22
+ size = 'sm',
23
+ children,
24
+ onclick,
25
+ tabindex
26
+ }: Props = $props();
27
+
28
+ const sizeClass = {
29
+ xs: 'h-6 w-6 [&>svg]:w-4 [&>svg]:h-4',
30
+ sm: 'h-8 w-8 [&>svg]:w-4 [&>svg]:h-4',
31
+ md: 'h-10 w-10 [&>svg]:w-5 [&>svg]:h-5',
32
+ lg: 'h-8 w-8 '
33
+ };
34
+
35
+ const colors: Record<Color, string> = {
36
+ primary: 'bg-accent-inverse text-icon-primary-inverse hover:bg-accent-inverse-hover ',
37
+ secondary: 'bg-neutral text-icon-primary hover:bg-neutral-hover ',
38
+ transparent: 'bg-transparent text-icon-primary hover:bg-neutral-hover ',
39
+ danger: 'bg-danger-inverse text-icon-primary-inverse hover:bg-danger-inverse-hover '
40
+ };
41
+
42
+ const baseStyle = 'flex justify-center items-center rounded-full';
43
+ </script>
44
+
45
+ {#if disabled || loading}
46
+ <button
47
+ onclick={(e) => {
48
+ e.preventDefault();
49
+ }}
50
+ {type}
51
+ {disabled}
52
+ class="disabled:bg-neutral disabled:text-tertiary {baseStyle} {sizeClass[
53
+ size
54
+ ]} cursor-default {colors['secondary']}"
55
+ >
56
+ {#if loading}
57
+ <Spinner />
58
+ {:else}
59
+ {@render children?.()}
60
+ {/if}
61
+ </button>
62
+ {:else}
63
+ <button
64
+ {onclick}
65
+ {type}
66
+ {disabled}
67
+ {tabindex}
68
+ class="{colors[color]} {sizeClass[size]} {baseStyle} cursor-pointer"
69
+ >
70
+ {@render children?.()}
71
+ </button>
72
+ {/if}
@@ -0,0 +1,14 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ color?: 'primary' | 'transparent' | 'secondary' | 'danger';
4
+ type?: 'button' | 'submit' | 'reset' | null | undefined;
5
+ loading?: boolean;
6
+ disabled?: boolean;
7
+ size?: 'xs' | 'sm' | 'md';
8
+ children?: Snippet;
9
+ onclick?: () => void;
10
+ tabindex?: number | undefined;
11
+ }
12
+ declare const IconButton: import("svelte").Component<Props, {}, "">;
13
+ type IconButton = ReturnType<typeof IconButton>;
14
+ export default IconButton;
@@ -0,0 +1 @@
1
+ export { default } from './IconButton.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './IconButton.svelte';
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import SkeletonLoader from '../skeleton-loader/';
4
+
5
+ interface Props {
6
+ src: string;
7
+ alt: string;
8
+ }
9
+
10
+ let { src, alt }: Props = $props();
11
+
12
+ let loaded = $state(false);
13
+ let failed = $state(false);
14
+ let loading = $state(false);
15
+
16
+ onMount(() => {
17
+ const img = new Image();
18
+ img.src = src;
19
+ loading = true;
20
+
21
+ img.onload = () => {
22
+ loading = false;
23
+ loaded = true;
24
+ };
25
+ img.onerror = () => {
26
+ loading = false;
27
+ failed = true;
28
+ };
29
+ });
30
+ </script>
31
+
32
+ <div class="h-full w-full">
33
+ {#if loaded}
34
+ <img {src} {alt} class="image h-full w-full object-cover" />
35
+ {:else if failed}
36
+ <img src="/imgs/MissingImageListRectangle.png" {alt} class="image" />
37
+ {:else if loading}
38
+ <div class="flex h-full flex-grow flex-col content-center justify-center">
39
+ <SkeletonLoader>
40
+ {#snippet children({ Skeleton, SkeletonImage })}
41
+ <!-- TODO: BG color is to match design, but we want to change the color, therefore not a token -->
42
+ <Skeleton class=" h-full w-full rounded-s-lg bg-[#D9E6E9]">
43
+ <SkeletonImage />
44
+ </Skeleton>
45
+ {/snippet}
46
+ </SkeletonLoader>
47
+ </div>
48
+ {/if}
49
+ </div>
50
+
51
+ <style>
52
+ .image {
53
+ border-start-start-radius: 0.5rem;
54
+ border-end-start-radius: 0.5rem
55
+ }
56
+ </style>
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ src: string;
3
+ alt: string;
4
+ }
5
+ declare const Image: import("svelte").Component<Props, {}, "">;
6
+ type Image = ReturnType<typeof Image>;
7
+ export default Image;
@@ -0,0 +1 @@
1
+ export { default } from './Image.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './Image.svelte';