@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 @@
1
+ export { default } from './Select.svelte';
@@ -0,0 +1,71 @@
1
+ <script module>
2
+ import SkeletonLoader from './index';
3
+ import { HorizontalCardSkeleton, StatcardSkeleton, ProjectCardSkeleton } from './index';
4
+ import { defineMeta } from '@storybook/addon-svelte-csf';
5
+
6
+ const { Story } = defineMeta({
7
+ component: SkeletonLoader,
8
+ title: 'Design System/SkeletonLoader'
9
+ });
10
+ </script>
11
+
12
+ <Story name="Primary">
13
+ <SkeletonLoader class="h-[20px] w-[200px]">
14
+ {#snippet children({ Skeleton })}
15
+ <Skeleton class="h-full w-full" />
16
+ {/snippet}
17
+ </SkeletonLoader>
18
+ </Story>
19
+
20
+ <Story name="ImagePlaceholder">
21
+ <SkeletonLoader class="h-[100px] w-[500px]">
22
+ {#snippet children({ Skeleton, SkeletonImage })}
23
+ <div class="flex h-full gap-2">
24
+ <Skeleton class="flex h-full w-[160px] items-center justify-center">
25
+ <SkeletonImage />
26
+ </Skeleton>
27
+ <div class="flex flex-1 flex-col gap-2">
28
+ <Skeleton class="flex h-[20px] w-full" />
29
+ <Skeleton class="flex h-[20px] w-full" />
30
+ <Skeleton class="flex h-[20px] w-full" />
31
+ <Skeleton class="flex h-[20px] w-full" />
32
+ </div>
33
+ </div>
34
+ {/snippet}
35
+ </SkeletonLoader>
36
+ </Story>
37
+
38
+ <Story name="HorizontalCardWithIcon">
39
+ <div class="flex w-[900px] flex-col gap-4">
40
+ <HorizontalCardSkeleton />
41
+ <HorizontalCardSkeleton />
42
+ <HorizontalCardSkeleton />
43
+ <HorizontalCardSkeleton />
44
+ </div>
45
+ </Story>
46
+ <Story name="HorizontalCardWithoutIcon">
47
+ <div class="flex w-[900px] flex-col gap-4">
48
+ <HorizontalCardSkeleton withImage={false} />
49
+ <HorizontalCardSkeleton withImage={false} />
50
+ <HorizontalCardSkeleton withImage={false} />
51
+ <HorizontalCardSkeleton withImage={false} />
52
+ </div>
53
+ </Story>
54
+ <Story name="StatCard">
55
+ <div class="flex w-[900px] gap-4">
56
+ <StatcardSkeleton />
57
+ <StatcardSkeleton />
58
+ <StatcardSkeleton />
59
+ </div>
60
+ </Story>
61
+
62
+ <Story name="ProjectCard">
63
+ <div class="grid grid-cols-2 justify-start gap-2">
64
+ <ProjectCardSkeleton />
65
+ <ProjectCardSkeleton />
66
+ <ProjectCardSkeleton />
67
+ <ProjectCardSkeleton />
68
+ <ProjectCardSkeleton />
69
+ <ProjectCardSkeleton />
70
+ </div>
71
+ </Story>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import Skeleton from './components/Skeleton.svelte';
4
+ import SkeletonImage from './components/SkeletonImage.svelte';
5
+
6
+ interface Props {
7
+ class?: string;
8
+ dataTestId?: string;
9
+ children?: Snippet<[any]>;
10
+ }
11
+
12
+ let { class: className = '', dataTestId = '', children }: Props = $props();
13
+ </script>
14
+
15
+ <div role="status" class={`h-full w-full animate-pulse ${className}`} data-testid={dataTestId}>
16
+ {@render children?.({ Skeleton, SkeletonImage })}
17
+ </div>
@@ -0,0 +1,9 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ class?: string;
4
+ dataTestId?: string;
5
+ children?: Snippet<[any]>;
6
+ }
7
+ declare const SkeletonLoader: import("svelte").Component<Props, {}, "">;
8
+ type SkeletonLoader = ReturnType<typeof SkeletonLoader>;
9
+ export default SkeletonLoader;
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import SkeletonLoader from './SkeletonLoader.svelte';
3
+ </script>
4
+
5
+ <SkeletonLoader>
6
+ {#snippet children({ Skeleton })}
7
+ <div
8
+ class="flex h-24 flex-1 flex-col justify-between gap-2 rounded-lg bg-surface p-4 shadow-field"
9
+ >
10
+ <Skeleton class="h-4 w-1/2 "></Skeleton>
11
+ <div class="flex items-baseline gap-2">
12
+ <Skeleton class="h-8 w-8 " />
13
+ <Skeleton class="h-4 w-16 " />
14
+ </div>
15
+ </div>
16
+ {/snippet}
17
+ </SkeletonLoader>
@@ -0,0 +1,18 @@
1
+ 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> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const StatcardSkeleton: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type StatcardSkeleton = InstanceType<typeof StatcardSkeleton>;
18
+ export default StatcardSkeleton;
@@ -0,0 +1,14 @@
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
+ <div class={`bg-neutral ${className}`}>
13
+ {@render children?.()}
14
+ </div>
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ class?: string;
4
+ children?: Snippet;
5
+ }
6
+ declare const Skeleton: import("svelte").Component<Props, {}, "">;
7
+ type Skeleton = ReturnType<typeof Skeleton>;
8
+ export default Skeleton;
@@ -0,0 +1,14 @@
1
+ <svg width="100%" height="100%" viewBox="0 0 160 97" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path
3
+ d="M71 46.4792C67.1348 46.4792 64 43.3117 64 39.4062C64 35.5008 67.1348 32.3333 71 32.3333C74.8652 32.3333 78 35.5008 78 39.4062C78.0045 43.3117 74.8697 46.4792 71 46.4792Z"
4
+ fill="#FFFFFF"
5
+ />
6
+ <path
7
+ d="M89 46.4792C85.1348 46.4792 82 43.3117 82 39.4062C82 35.5008 85.1348 32.3333 89 32.3333C92.8652 32.3333 96 35.5008 96 39.4062C96.0045 43.3117 92.8697 46.4792 89 46.4792Z"
8
+ fill="#FFFFFF"
9
+ />
10
+ <path
11
+ d="M64 57.5937C64 53.6883 67.1348 50.5208 71 50.5208C74.8652 50.5208 78 53.6883 78 57.5937C78 61.4992 74.8652 64.6667 71 64.6667C67.1348 64.6667 64 61.4992 64 57.5937Z"
12
+ fill="#FFFFFF"
13
+ />
14
+ </svg>
@@ -1,17 +1,16 @@
1
- export default Tooltip;
2
- type Tooltip = SvelteComponent<{
1
+ export default SkeletonImage;
2
+ type SkeletonImage = SvelteComponent<{
3
3
  [x: string]: never;
4
4
  }, {
5
5
  [evt: string]: CustomEvent<any>;
6
6
  }, {}> & {
7
7
  $$bindings?: string | undefined;
8
8
  };
9
- declare const Tooltip: $$__sveltets_2_IsomorphicComponent<{
9
+ declare const SkeletonImage: $$__sveltets_2_IsomorphicComponent<{
10
10
  [x: string]: never;
11
11
  }, {
12
12
  [evt: string]: CustomEvent<any>;
13
13
  }, {}, {}, string>;
14
- import Tooltip from './Tooltip.svelte';
15
14
  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
15
  new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
17
16
  $$bindings?: Bindings;
@@ -0,0 +1,3 @@
1
+ export { default } from './SkeletonLoader.svelte';
2
+ export { default as StatcardSkeleton } from './StatcardSkeleton.svelte';
3
+ export { default as SkeletonImage } from './components/SkeletonImage.svelte';
@@ -0,0 +1,3 @@
1
+ export { default } from './SkeletonLoader.svelte';
2
+ export { default as StatcardSkeleton } from './StatcardSkeleton.svelte';
3
+ export { default as SkeletonImage } from './components/SkeletonImage.svelte';
@@ -0,0 +1,37 @@
1
+ <script module>
2
+ import Slider from './Slider.svelte';
3
+
4
+ import { defineMeta } from '@storybook/addon-svelte-csf';
5
+
6
+ const { Story } = defineMeta({
7
+ component: Slider,
8
+ title: 'Design System/Slider',
9
+ tags: ['autodocs']
10
+ });
11
+
12
+ let value = 3;
13
+ </script>
14
+
15
+ <Story name="Default">
16
+ Value: {value + 1}
17
+ <Slider bind:value bind:buffer={value} max={4}></Slider>
18
+ </Story>
19
+ <Story name="Playback Controls Running Job">
20
+ Value: {value + 1}
21
+ <Slider bind:value buffer={35} max={49} bufferColorClass="bg-warning-inverse"></Slider>
22
+ </Story>
23
+ <Story name="Modern stepStyle">
24
+ Value: {value + 1}
25
+ <Slider bind:value bind:buffer={value} max={4} showSteps={true}></Slider>
26
+ </Story>
27
+ <Story name="Create Job Capture Interval">
28
+ Value: {value + 1}
29
+ <Slider
30
+ bind:value
31
+ max={6}
32
+ showSteps={true}
33
+ buffer={2}
34
+ bufferMin={1}
35
+ bufferColorClass="bg-danger-inverse"
36
+ ></Slider>
37
+ </Story>
@@ -0,0 +1,117 @@
1
+ <script lang="ts">
2
+ import { CaretLeft, CaretRight } from 'phosphor-svelte';
3
+ let className = '';
4
+ export { className as class };
5
+ export let value = 0;
6
+ export let max: number;
7
+ export let buffer = 0;
8
+ export let bufferMin = 0;
9
+ export let bufferColorClass = 'bg-accent-inverse';
10
+ export let showSteps = false;
11
+ export let onMousedown: () => void = () => {};
12
+ export let onMouseup: () => void = () => {};
13
+ export let id: string | undefined = undefined;
14
+
15
+ $: if (value > max) {
16
+ value = max;
17
+ } else if (value < 0) {
18
+ value = 0;
19
+ }
20
+
21
+ $: visualMax = Math.max(max, 1);
22
+ $: buffer = Math.min(buffer, visualMax);
23
+
24
+ function calculatePosition(positionFactor: number): string {
25
+ return `calc((${positionFactor / visualMax} * (100% - 2.5rem))`;
26
+ }
27
+ </script>
28
+
29
+ <div class={`relative flex h-10 items-center ${className}`}>
30
+ <div class="track-overlay"></div>
31
+ <div
32
+ class="pointer-events-none absolute h-2 rounded-full {bufferColorClass}"
33
+ style="
34
+ width: {calculatePosition(buffer - bufferMin)} + 0.5rem);
35
+ left: {calculatePosition(bufferMin)} + 1rem)
36
+ "
37
+ ></div>
38
+ {#if showSteps}
39
+ <div class="h-2">
40
+ {#each Array(visualMax + 1) as _, index}
41
+ <div
42
+ class="absolute h-1 w-1 translate-y-1/2 rounded-full bg-surface"
43
+ style="left: {calculatePosition(index)} + 1.125rem"
44
+ ></div>
45
+ {/each}
46
+ </div>
47
+ {/if}
48
+ <input
49
+ {id}
50
+ data-testid={id}
51
+ type="range"
52
+ max={visualMax}
53
+ bind:value
54
+ on:mousedown={onMousedown}
55
+ on:mouseup={onMouseup}
56
+ />
57
+ <div class="thumb-overlay" style="left: {calculatePosition(value)} + 1.25rem)">
58
+ <CaretLeft class="text-primary" size="0.75rem" weight="bold" />
59
+ <CaretRight class="text-primary" size="0.75rem" weight="bold" />
60
+ </div>
61
+ </div>
62
+
63
+ <style>
64
+ .track-overlay {
65
+ width: calc(100% - 2rem);
66
+ cursor: pointer;
67
+ pointer-events: none;
68
+ position: absolute;
69
+ margin-left: 1rem;
70
+ margin-right: 1rem;
71
+ height: 0.5rem;
72
+ border-radius: 9999px;
73
+ background-color: #12192A26;
74
+ }
75
+
76
+ .thumb-overlay {
77
+ transform: translate(-50%, 50%);
78
+ pointer-events: none;
79
+ position: absolute;
80
+ bottom: 1.25rem;
81
+ display: inline-flex;
82
+ height: 2.5rem;
83
+ width: 2.5rem;
84
+ align-items: center;
85
+ justify-content: center;
86
+ border-radius: 9999px;
87
+ --tw-bg-opacity: 1;
88
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
89
+ --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
90
+ --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
91
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
92
+ }
93
+
94
+ input[type='range'] {
95
+ -webkit-appearance: none;
96
+ -moz-appearance: none;
97
+ appearance: none;
98
+ position: relative;
99
+ cursor: pointer;
100
+ height: 2.5rem;
101
+ width: 100%;
102
+ background-color: transparent;
103
+ }
104
+
105
+ input[type='range']::-webkit-slider-thumb {
106
+ -webkit-appearance: none;
107
+ appearance: none;
108
+ width: 0;
109
+ height: 0;
110
+ }
111
+
112
+ input[type='range']::-moz-range-thumb {
113
+ width: 0;
114
+ height: 0;
115
+ border: none;
116
+ }
117
+ </style>
@@ -0,0 +1,29 @@
1
+ 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> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: Props & {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const Slider: $$__sveltets_2_IsomorphicComponent<{
15
+ class?: string;
16
+ value?: number;
17
+ max: number;
18
+ buffer?: number;
19
+ bufferMin?: number;
20
+ bufferColorClass?: string;
21
+ showSteps?: boolean;
22
+ onMousedown?: () => void;
23
+ onMouseup?: () => void;
24
+ id?: string | undefined;
25
+ }, {
26
+ [evt: string]: CustomEvent<any>;
27
+ }, {}, {}, string>;
28
+ type Slider = InstanceType<typeof Slider>;
29
+ export default Slider;
@@ -0,0 +1 @@
1
+ export { default } from './Slider.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './Slider.svelte';
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ testID?: string;
4
+ }
5
+
6
+ let { testID = '' }: Props = $props();
7
+ </script>
8
+
9
+ <div data-testid={testID} class="spinner"></div>
10
+
11
+ <style>
12
+ .spinner {
13
+ background: conic-gradient(#0000 10%, currentColor);
14
+ mask: radial-gradient(farthest-side, #0000 calc(100% - 2px), #000 0);
15
+ -webkit-mask: radial-gradient(farthest-side, #0000 calc(100% - 2px), #000 0);
16
+ animation: spinner 1s infinite linear;
17
+ height: 0.75rem;
18
+ width: 0.75rem;
19
+ border-radius: 9999px;
20
+ }
21
+
22
+ @keyframes spinner {
23
+ to {
24
+ transform: rotate(1turn);
25
+ }
26
+ }
27
+ </style>
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ testID?: string;
3
+ }
4
+ declare const Spinner: import("svelte").Component<Props, {}, "">;
5
+ type Spinner = ReturnType<typeof Spinner>;
6
+ export default Spinner;
@@ -0,0 +1 @@
1
+ export { default } from './Spinner.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './Spinner.svelte';
@@ -0,0 +1,32 @@
1
+ <script module>
2
+ import StatCard from './StatCard.svelte';
3
+ import { defineMeta } from '@storybook/addon-svelte-csf';
4
+
5
+ const { Story } = defineMeta({
6
+ component: StatCard,
7
+ title: 'Design System/StatCard',
8
+ tags: ['autodocs']
9
+ });
10
+ </script>
11
+
12
+ <Story name="Default">
13
+ <StatCard title="Title" value="Value" unit="unit" titleTooltip="Title tooltip" />
14
+ </Story>
15
+
16
+ <Story name="Germination Rate">
17
+ <StatCard
18
+ title="Germination Rate"
19
+ value="2"
20
+ unit="%"
21
+ titleTooltip="Something that explains what this is..."
22
+ showTitleTooltip={true}
23
+ />
24
+ </Story>
25
+
26
+ <Story name="Home Page">
27
+ <div class="flex w-full gap-4">
28
+ <StatCard title="Current jobs" value="3" unit="of 5" />
29
+ <StatCard title="Run time" value="5.4" unit="hours" />
30
+ <StatCard title="Images taken" value="1366" />
31
+ </div>
32
+ </Story>
@@ -0,0 +1,52 @@
1
+ <script lang="ts">
2
+ import { Info } from 'phosphor-svelte';
3
+ import Spinner from '../spinner/Spinner.svelte';
4
+ import Tooltip from '../tooltip/Tooltip.svelte';
5
+
6
+ interface Props {
7
+ title: string;
8
+ value?: string | number | null;
9
+ unit?: string | null;
10
+ titleTooltip?: string;
11
+ showTitleTooltip?: boolean;
12
+ }
13
+
14
+ let {
15
+ title,
16
+ value = null,
17
+ unit = '',
18
+ titleTooltip = '',
19
+ showTitleTooltip = false
20
+ }: Props = $props();
21
+ const formattedValue = $derived(typeof value === 'number' ? value.toLocaleString() : value);
22
+ </script>
23
+
24
+ <div
25
+ class="flex h-24 min-w-[130px] flex-shrink-0 flex-grow basis-0 flex-col items-start gap-2 rounded-lg bg-surface p-4 shadow-field"
26
+ >
27
+ <h5 class="flex items-center justify-start gap-1 text-secondary">
28
+ {title}
29
+ {#if titleTooltip && showTitleTooltip}
30
+ <Tooltip>
31
+ {#snippet trigger()}
32
+ <Info class="icon" size="1rem" weight="bold" />
33
+ {/snippet}
34
+ {#snippet content()}
35
+ <span>
36
+ {titleTooltip}
37
+ </span>
38
+ {/snippet}
39
+ </Tooltip>
40
+ {/if}
41
+ </h5>
42
+ <div class="flex items-baseline gap-1">
43
+ {#if value !== null}
44
+ <h3>{formattedValue}</h3>
45
+ {#if unit}
46
+ <h5>{unit}</h5>
47
+ {/if}
48
+ {:else}
49
+ <Spinner />
50
+ {/if}
51
+ </div>
52
+ </div>
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ title: string;
3
+ value?: string | number | null;
4
+ unit?: string | null;
5
+ titleTooltip?: string;
6
+ showTitleTooltip?: boolean;
7
+ }
8
+ declare const StatCard: import("svelte").Component<Props, {}, "">;
9
+ type StatCard = ReturnType<typeof StatCard>;
10
+ export default StatCard;
@@ -0,0 +1 @@
1
+ export { default } from './StatCard.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './StatCard.svelte';