@reshape-biotech/design-system 0.0.22 → 0.0.24
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.
- package/README.md +30 -38
- package/dist/components/banner/Banner.stories.svelte +129 -0
- package/dist/components/banner/Banner.stories.svelte.d.ts +19 -0
- package/dist/components/banner/Banner.svelte +59 -0
- package/dist/components/banner/Banner.svelte.d.ts +11 -0
- package/dist/components/button/Button.stories.svelte +37 -0
- package/dist/components/button/Button.stories.svelte.d.ts +19 -0
- package/dist/components/button/Button.svelte +85 -0
- package/dist/components/button/Button.svelte.d.ts +17 -0
- package/dist/components/datepicker/DatePicker.svelte +283 -0
- package/dist/components/datepicker/DatePicker.svelte.d.ts +8 -0
- package/dist/components/divider/Divider.stories.svelte +14 -0
- package/dist/components/divider/Divider.stories.svelte.d.ts +27 -0
- package/dist/components/divider/Divider.svelte +9 -0
- package/dist/components/divider/Divider.svelte.d.ts +6 -0
- package/dist/components/drawer/Drawer.stories.svelte +99 -0
- package/dist/components/drawer/Drawer.stories.svelte.d.ts +27 -0
- package/dist/components/drawer/Drawer.svelte +45 -0
- package/dist/components/drawer/Drawer.svelte.d.ts +12 -0
- package/dist/components/drawer/DrawerLabel.svelte +13 -0
- package/dist/components/drawer/DrawerLabel.svelte.d.ts +9 -0
- package/dist/components/dropdown/Dropdown.stories.svelte +214 -0
- package/dist/components/dropdown/Dropdown.stories.svelte.d.ts +27 -0
- package/dist/components/dropdown/Dropdown.svelte +69 -0
- package/dist/components/dropdown/Dropdown.svelte.d.ts +14 -0
- package/dist/components/dropdown/components/DropdownContent.svelte +29 -0
- package/dist/components/dropdown/components/DropdownContent.svelte.d.ts +10 -0
- package/dist/components/dropdown/components/DropdownMenu.svelte +23 -0
- package/dist/components/dropdown/components/DropdownMenu.svelte.d.ts +8 -0
- package/dist/components/dropdown/components/DropdownTrigger.svelte +44 -0
- package/dist/components/dropdown/components/DropdownTrigger.svelte.d.ts +12 -0
- package/dist/components/icon-button/IconButton.stories.svelte +52 -0
- package/dist/components/icon-button/IconButton.stories.svelte.d.ts +19 -0
- package/dist/components/icon-button/IconButton.svelte +71 -0
- package/dist/components/icon-button/IconButton.svelte.d.ts +14 -0
- package/dist/components/image/Image.svelte +56 -0
- package/dist/components/image/Image.svelte.d.ts +7 -0
- package/dist/components/input/Input.stories.svelte +81 -0
- package/dist/components/input/Input.stories.svelte.d.ts +27 -0
- package/dist/components/input/Input.svelte +131 -0
- package/dist/components/input/Input.svelte.d.ts +20 -0
- package/dist/components/list/List.stories.svelte +97 -0
- package/dist/components/list/List.stories.svelte.d.ts +19 -0
- package/dist/components/list/List.svelte +75 -0
- package/dist/components/list/List.svelte.d.ts +24 -0
- package/dist/components/markdown/Markdown.stories.svelte +41 -0
- package/dist/components/markdown/Markdown.stories.svelte.d.ts +27 -0
- package/dist/components/markdown/Markdown.svelte +12 -0
- package/dist/components/markdown/Markdown.svelte.d.ts +6 -0
- package/dist/components/modal/Modal.stories.svelte +41 -0
- package/dist/components/modal/Modal.stories.svelte.d.ts +19 -0
- package/dist/components/modal/Modal.svelte +56 -0
- package/dist/components/modal/Modal.svelte.d.ts +16 -0
- package/dist/components/notification-popup/NotificationPopup.stories.svelte +27 -0
- package/dist/components/notification-popup/NotificationPopup.stories.svelte.d.ts +27 -0
- package/dist/components/notification-popup/NotificationPopup.svelte +31 -0
- package/dist/components/notification-popup/NotificationPopup.svelte.d.ts +11 -0
- package/dist/components/pill/Pill.svelte +39 -0
- package/dist/components/pill/Pill.svelte.d.ts +10 -0
- package/dist/components/progress-circle/ProgressCircle.svelte +79 -0
- package/dist/components/progress-circle/ProgressCircle.svelte.d.ts +7 -0
- package/dist/components/segmented-control-buttons/ControlButton.svelte +59 -0
- package/dist/components/segmented-control-buttons/ControlButton.svelte.d.ts +14 -0
- package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte +45 -0
- package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte.d.ts +19 -0
- package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte +21 -0
- package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte.d.ts +10 -0
- package/dist/components/select/Select.stories.svelte +113 -0
- package/dist/components/select/Select.stories.svelte.d.ts +19 -0
- package/dist/components/select/Select.svelte +137 -0
- package/dist/components/select/Select.svelte.d.ts +60 -0
- package/dist/components/select/index.d.ts +6 -0
- package/dist/components/select/index.js +1 -0
- package/dist/components/skeleton-loader/HorizontalCardSkeleton.svelte +31 -0
- package/dist/components/skeleton-loader/HorizontalCardSkeleton.svelte.d.ts +5 -0
- package/dist/components/skeleton-loader/ProjectCardSkeleton.svelte +12 -0
- package/dist/components/skeleton-loader/ProjectCardSkeleton.svelte.d.ts +18 -0
- package/dist/components/skeleton-loader/SkeletonLoader.stories.svelte +71 -0
- package/dist/components/skeleton-loader/SkeletonLoader.stories.svelte.d.ts +27 -0
- package/dist/components/skeleton-loader/SkeletonLoader.svelte +17 -0
- package/dist/components/skeleton-loader/SkeletonLoader.svelte.d.ts +9 -0
- package/dist/components/skeleton-loader/StatcardSkeleton.svelte +17 -0
- package/dist/components/skeleton-loader/StatcardSkeleton.svelte.d.ts +18 -0
- package/dist/components/skeleton-loader/components/Skeleton.svelte +14 -0
- package/dist/components/skeleton-loader/components/Skeleton.svelte.d.ts +8 -0
- package/dist/components/skeleton-loader/components/SkeletonImage.svelte +14 -0
- package/dist/components/skeleton-loader/components/SkeletonImage.svelte.d.ts +26 -0
- package/dist/components/skeleton-loader/index.d.ts +5 -0
- package/dist/components/skeleton-loader/index.js +5 -0
- package/dist/components/slider/Slider.stories.svelte +37 -0
- package/dist/components/slider/Slider.stories.svelte.d.ts +27 -0
- package/dist/components/slider/Slider.svelte +117 -0
- package/dist/components/slider/Slider.svelte.d.ts +29 -0
- package/dist/components/spinner/Spinner.svelte +27 -0
- package/dist/components/spinner/Spinner.svelte.d.ts +6 -0
- package/dist/components/stat-card/StatCard.stories.svelte +31 -0
- package/dist/components/stat-card/StatCard.stories.svelte.d.ts +27 -0
- package/dist/components/stat-card/StatCard.svelte +46 -0
- package/dist/components/stat-card/StatCard.svelte.d.ts +9 -0
- package/dist/components/status-badge/StatusBadge.stories.svelte +401 -0
- package/dist/components/status-badge/StatusBadge.stories.svelte.d.ts +19 -0
- package/dist/components/status-badge/StatusBadge.svelte +147 -0
- package/dist/components/status-badge/StatusBadge.svelte.d.ts +12 -0
- package/dist/components/table/Table.stories.svelte +86 -0
- package/dist/components/table/Table.stories.svelte.d.ts +24 -0
- package/dist/components/table/Table.svelte +33 -0
- package/dist/components/table/Table.svelte.d.ts +8 -0
- package/dist/components/table/components/Td.svelte +14 -0
- package/dist/components/table/components/Td.svelte.d.ts +8 -0
- package/dist/components/table/components/Th.svelte +15 -0
- package/dist/components/table/components/Th.svelte.d.ts +9 -0
- package/dist/components/table/components/Tr.svelte +31 -0
- package/dist/components/table/components/Tr.svelte.d.ts +8 -0
- package/dist/components/tabs/Tabs.stories.svelte +30 -0
- package/dist/components/tabs/Tabs.stories.svelte.d.ts +27 -0
- package/dist/components/tabs/Tabs.svelte +15 -0
- package/dist/components/tabs/Tabs.svelte.d.ts +8 -0
- package/dist/components/tabs/components/Content.svelte +15 -0
- package/dist/components/tabs/components/Content.svelte.d.ts +9 -0
- package/dist/components/tabs/components/Tab.svelte +21 -0
- package/dist/components/tabs/components/Tab.svelte.d.ts +10 -0
- package/dist/components/tabs/components/Tabs.svelte +14 -0
- package/dist/components/tabs/components/Tabs.svelte.d.ts +8 -0
- package/dist/components/tag/Tag.stories.svelte +50 -0
- package/dist/components/tag/Tag.stories.svelte.d.ts +19 -0
- package/dist/components/tag/Tag.svelte +104 -0
- package/dist/components/tag/Tag.svelte.d.ts +11 -0
- package/dist/components/toast/Toast.svelte +66 -0
- package/dist/components/toast/Toast.svelte.d.ts +5 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/tailwind-safelist.d.ts +14 -0
- package/dist/tailwind-safelist.js +148 -0
- package/dist/tailwind.preset.d.ts +1 -0
- package/dist/tokens.d.ts +314 -36
- package/dist/tokens.js +235 -248
- package/package.json +5 -6
- package/dist/tailwind-safelist.txt +0 -142
|
@@ -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,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,31 @@
|
|
|
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
|
+
/>
|
|
23
|
+
</Story>
|
|
24
|
+
|
|
25
|
+
<Story name="Home Page">
|
|
26
|
+
<div class="flex w-full gap-4">
|
|
27
|
+
<StatCard title="Current jobs" value="3" unit="of 5" />
|
|
28
|
+
<StatCard title="Run time" value="5.4" unit="hours" />
|
|
29
|
+
<StatCard title="Images taken" value="1366" />
|
|
30
|
+
</div>
|
|
31
|
+
</Story>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export default StatCard;
|
|
2
|
+
type StatCard = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const StatCard: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
+
[x: string]: never;
|
|
11
|
+
}, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {}, {}, string>;
|
|
14
|
+
import StatCard from './StatCard.svelte';
|
|
15
|
+
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> & {
|
|
17
|
+
$$bindings?: Bindings;
|
|
18
|
+
} & Exports;
|
|
19
|
+
(internal: unknown, props: {
|
|
20
|
+
$$events?: Events;
|
|
21
|
+
$$slots?: Slots;
|
|
22
|
+
}): Exports & {
|
|
23
|
+
$set?: any;
|
|
24
|
+
$on?: any;
|
|
25
|
+
};
|
|
26
|
+
z_$$bindings?: Bindings;
|
|
27
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Info } from 'phosphor-svelte';
|
|
3
|
+
import Spinner from 'design-system/components/spinner/Spinner.svelte';
|
|
4
|
+
import Tooltip from 'design-system/components/tooltip/Tooltip.svelte';
|
|
5
|
+
import { featureFlags } from '../../stores';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
title: string;
|
|
9
|
+
value?: string | number | null;
|
|
10
|
+
unit?: string | null;
|
|
11
|
+
titleTooltip?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let { title, value = null, unit = '', titleTooltip = '' }: Props = $props();
|
|
15
|
+
const formattedValue = $derived(typeof value === 'number' ? value.toLocaleString() : value);
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<div
|
|
19
|
+
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"
|
|
20
|
+
>
|
|
21
|
+
<h5 class="flex items-center justify-start gap-1 text-secondary">
|
|
22
|
+
{title}
|
|
23
|
+
{#if titleTooltip && $featureFlags.analTooltip}
|
|
24
|
+
<Tooltip>
|
|
25
|
+
{#snippet trigger()}
|
|
26
|
+
<Info class="icon" size="1rem" weight="bold" />
|
|
27
|
+
{/snippet}
|
|
28
|
+
{#snippet content()}
|
|
29
|
+
<span>
|
|
30
|
+
{titleTooltip}
|
|
31
|
+
</span>
|
|
32
|
+
{/snippet}
|
|
33
|
+
</Tooltip>
|
|
34
|
+
{/if}
|
|
35
|
+
</h5>
|
|
36
|
+
<div class="flex items-baseline gap-1">
|
|
37
|
+
{#if value !== null}
|
|
38
|
+
<h3>{formattedValue}</h3>
|
|
39
|
+
{#if unit}
|
|
40
|
+
<h5>{unit}</h5>
|
|
41
|
+
{/if}
|
|
42
|
+
{:else}
|
|
43
|
+
<Spinner />
|
|
44
|
+
{/if}
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
title: string;
|
|
3
|
+
value?: string | number | null;
|
|
4
|
+
unit?: string | null;
|
|
5
|
+
titleTooltip?: string;
|
|
6
|
+
}
|
|
7
|
+
declare const StatCard: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type StatCard = ReturnType<typeof StatCard>;
|
|
9
|
+
export default StatCard;
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import StatusBadge from 'design-system/components/status-badge/StatusBadge.svelte';
|
|
3
|
+
import Tooltip from 'design-system/components/tooltip/Tooltip.svelte';
|
|
4
|
+
import ProgressCircle from 'design-system/components/progress-circle/ProgressCircle.svelte';
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
SpinnerGap,
|
|
8
|
+
CheckCircle,
|
|
9
|
+
Moon,
|
|
10
|
+
StopCircle,
|
|
11
|
+
WifiSlash,
|
|
12
|
+
WarningCircle
|
|
13
|
+
} from 'phosphor-svelte';
|
|
14
|
+
|
|
15
|
+
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
16
|
+
const { Story } = defineMeta({
|
|
17
|
+
component: StatusBadge,
|
|
18
|
+
title: 'Design System/StatusBadge',
|
|
19
|
+
tags: ['autodocs']
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
let calculated_progress = 32;
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<Story name="Neutral">
|
|
26
|
+
<p class="font-mono text-xs">Medium:</p>
|
|
27
|
+
<div class="flex flex-row gap-4">
|
|
28
|
+
<div class="flex flex-row gap-1">
|
|
29
|
+
<StatusBadge type="neutral">
|
|
30
|
+
{#snippet icon()}
|
|
31
|
+
<SpinnerGap size="100%" weight="bold" />
|
|
32
|
+
{/snippet}
|
|
33
|
+
{#snippet content()}
|
|
34
|
+
<div>Pending</div>
|
|
35
|
+
{/snippet}
|
|
36
|
+
</StatusBadge>
|
|
37
|
+
<StatusBadge type="neutral">
|
|
38
|
+
{#snippet icon()}
|
|
39
|
+
<SpinnerGap size="100%" weight="bold" />
|
|
40
|
+
{/snippet}
|
|
41
|
+
</StatusBadge>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="flex flex-row gap-1">
|
|
44
|
+
<StatusBadge type="neutral">
|
|
45
|
+
{#snippet icon()}
|
|
46
|
+
<Moon size="100%" weight="bold" />
|
|
47
|
+
{/snippet}
|
|
48
|
+
{#snippet content()}
|
|
49
|
+
<div>Idle</div>
|
|
50
|
+
{/snippet}
|
|
51
|
+
</StatusBadge>
|
|
52
|
+
<StatusBadge type="neutral">
|
|
53
|
+
{#snippet icon()}
|
|
54
|
+
<Moon size="100%" weight="bold" />
|
|
55
|
+
{/snippet}
|
|
56
|
+
</StatusBadge>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
<br />
|
|
60
|
+
<p class="font-mono text-xs">Small:</p>
|
|
61
|
+
<div class="flex flex-row gap-10">
|
|
62
|
+
<div class="flex flex-row gap-1">
|
|
63
|
+
<StatusBadge type="neutral" size="sm">
|
|
64
|
+
{#snippet icon()}
|
|
65
|
+
<SpinnerGap size="100%" weight="bold" />
|
|
66
|
+
{/snippet}
|
|
67
|
+
{#snippet content()}
|
|
68
|
+
<div>Pending</div>
|
|
69
|
+
{/snippet}
|
|
70
|
+
</StatusBadge>
|
|
71
|
+
<StatusBadge type="neutral" size="sm">
|
|
72
|
+
{#snippet icon()}
|
|
73
|
+
<SpinnerGap size="100%" weight="bold" />
|
|
74
|
+
{/snippet}
|
|
75
|
+
</StatusBadge>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="flex flex-row gap-1">
|
|
78
|
+
<StatusBadge type="neutral" size="sm">
|
|
79
|
+
{#snippet icon()}
|
|
80
|
+
<Moon size="100%" weight="bold" />
|
|
81
|
+
{/snippet}
|
|
82
|
+
{#snippet content()}
|
|
83
|
+
<div>Idle</div>
|
|
84
|
+
{/snippet}
|
|
85
|
+
</StatusBadge>
|
|
86
|
+
<StatusBadge type="neutral" size="sm">
|
|
87
|
+
{#snippet icon()}
|
|
88
|
+
<Moon size="100%" weight="bold" />
|
|
89
|
+
{/snippet}
|
|
90
|
+
</StatusBadge>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</Story>
|
|
94
|
+
|
|
95
|
+
<Story name="Success">
|
|
96
|
+
<p class="font-mono text-xs">Medium:</p>
|
|
97
|
+
<div class="flex flex-row gap-4">
|
|
98
|
+
<div class="flex flex-row gap-1">
|
|
99
|
+
<Tooltip>
|
|
100
|
+
{#snippet trigger()}
|
|
101
|
+
<div>
|
|
102
|
+
<StatusBadge type="success">
|
|
103
|
+
{#snippet icon()}
|
|
104
|
+
<CheckCircle size="100%" weight="fill" />
|
|
105
|
+
{/snippet}
|
|
106
|
+
{#snippet content()}
|
|
107
|
+
<div>Completed</div>
|
|
108
|
+
{/snippet}
|
|
109
|
+
</StatusBadge>
|
|
110
|
+
</div>
|
|
111
|
+
{/snippet}
|
|
112
|
+
{#snippet content()}
|
|
113
|
+
<div class="flex flex-col text-left">
|
|
114
|
+
<p class="font-bold">Job completed</p>
|
|
115
|
+
<p class="text-xs">8/30/2024, 11:07 AM</p>
|
|
116
|
+
</div>
|
|
117
|
+
{/snippet}
|
|
118
|
+
</Tooltip>
|
|
119
|
+
<StatusBadge type="success">
|
|
120
|
+
{#snippet icon()}
|
|
121
|
+
<CheckCircle size="100%" weight="fill" />
|
|
122
|
+
{/snippet}
|
|
123
|
+
</StatusBadge>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="flex flex-row gap-1">
|
|
126
|
+
<Tooltip>
|
|
127
|
+
{#snippet trigger()}
|
|
128
|
+
<div>
|
|
129
|
+
<StatusBadge type="success">
|
|
130
|
+
{#snippet icon()}
|
|
131
|
+
<StopCircle size="100%" weight="bold" />
|
|
132
|
+
{/snippet}
|
|
133
|
+
{#snippet content()}
|
|
134
|
+
<div>Stopped</div>
|
|
135
|
+
{/snippet}
|
|
136
|
+
</StatusBadge>
|
|
137
|
+
</div>
|
|
138
|
+
{/snippet}
|
|
139
|
+
{#snippet content()}
|
|
140
|
+
<div class="flex flex-col text-left">
|
|
141
|
+
<p class="font-bold">Job stopped</p>
|
|
142
|
+
<p class="text-xs">8/30/2024, 11:07 AM</p>
|
|
143
|
+
</div>
|
|
144
|
+
{/snippet}
|
|
145
|
+
</Tooltip>
|
|
146
|
+
<StatusBadge type="success">
|
|
147
|
+
{#snippet icon()}
|
|
148
|
+
<StopCircle size="100%" weight="bold" />
|
|
149
|
+
{/snippet}
|
|
150
|
+
</StatusBadge>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
<br />
|
|
154
|
+
<p class="font-mono text-xs">Small:</p>
|
|
155
|
+
<div class="flex flex-row gap-10">
|
|
156
|
+
<div class="flex flex-row gap-1">
|
|
157
|
+
<Tooltip>
|
|
158
|
+
{#snippet trigger()}
|
|
159
|
+
<StatusBadge type="success" size="sm">
|
|
160
|
+
{#snippet icon()}
|
|
161
|
+
<CheckCircle size="100%" weight="fill" />
|
|
162
|
+
{/snippet}
|
|
163
|
+
{#snippet content()}
|
|
164
|
+
<div>Completed</div>
|
|
165
|
+
{/snippet}
|
|
166
|
+
</StatusBadge>
|
|
167
|
+
{/snippet}
|
|
168
|
+
{#snippet content()}
|
|
169
|
+
<div class="flex flex-col text-left">
|
|
170
|
+
<p class="font-bold">Job completed</p>
|
|
171
|
+
<p class="text-xs">8/30/2024, 11:07 AM</p>
|
|
172
|
+
</div>
|
|
173
|
+
{/snippet}
|
|
174
|
+
</Tooltip>
|
|
175
|
+
<StatusBadge type="success" size="sm">
|
|
176
|
+
{#snippet icon()}
|
|
177
|
+
<CheckCircle size="100%" weight="fill" />
|
|
178
|
+
{/snippet}
|
|
179
|
+
</StatusBadge>
|
|
180
|
+
</div>
|
|
181
|
+
<div class="flex flex-row gap-1">
|
|
182
|
+
<Tooltip>
|
|
183
|
+
{#snippet trigger()}
|
|
184
|
+
<StatusBadge type="success" size="sm">
|
|
185
|
+
{#snippet icon()}
|
|
186
|
+
<StopCircle size="100%" weight="bold" />
|
|
187
|
+
{/snippet}
|
|
188
|
+
{#snippet content()}
|
|
189
|
+
<div>Stopped</div>
|
|
190
|
+
{/snippet}
|
|
191
|
+
</StatusBadge>
|
|
192
|
+
{/snippet}
|
|
193
|
+
{#snippet content()}
|
|
194
|
+
<div class="flex flex-col text-left">
|
|
195
|
+
<p class="font-bold">Job stopped</p>
|
|
196
|
+
<p class="text-xs">8/30/2024, 11:07 AM</p>
|
|
197
|
+
</div>
|
|
198
|
+
{/snippet}
|
|
199
|
+
</Tooltip>
|
|
200
|
+
<StatusBadge type="success" size="sm">
|
|
201
|
+
{#snippet icon()}
|
|
202
|
+
<StopCircle size="100%" weight="bold" />
|
|
203
|
+
{/snippet}
|
|
204
|
+
</StatusBadge>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
</Story>
|
|
208
|
+
|
|
209
|
+
<Story name="Progress">
|
|
210
|
+
<p class="font-mono text-xs">Medium:</p>
|
|
211
|
+
<div class="flex flex-row gap-1">
|
|
212
|
+
<Tooltip>
|
|
213
|
+
{#snippet trigger()}
|
|
214
|
+
<StatusBadge type="progress">
|
|
215
|
+
{#snippet icon()}
|
|
216
|
+
<ProgressCircle progress={calculated_progress} size="md" />
|
|
217
|
+
{/snippet}
|
|
218
|
+
{#snippet content()}
|
|
219
|
+
<div>Running</div>
|
|
220
|
+
{/snippet}
|
|
221
|
+
{#snippet progress()}
|
|
222
|
+
<div>{calculated_progress}%</div>
|
|
223
|
+
{/snippet}
|
|
224
|
+
</StatusBadge>
|
|
225
|
+
{/snippet}
|
|
226
|
+
{#snippet content()}
|
|
227
|
+
<div class="flex flex-col text-left">
|
|
228
|
+
<p class="font-bold">Job running</p>
|
|
229
|
+
<p class="text-xs">1d 3h 2m left</p>
|
|
230
|
+
</div>
|
|
231
|
+
{/snippet}
|
|
232
|
+
</Tooltip>
|
|
233
|
+
|
|
234
|
+
<StatusBadge type="progress">
|
|
235
|
+
{#snippet icon()}
|
|
236
|
+
<ProgressCircle progress={calculated_progress} size="md" />
|
|
237
|
+
{/snippet}
|
|
238
|
+
{#snippet progress()}
|
|
239
|
+
<div>{calculated_progress}%</div>
|
|
240
|
+
{/snippet}
|
|
241
|
+
</StatusBadge>
|
|
242
|
+
</div>
|
|
243
|
+
<br />
|
|
244
|
+
<p class="font-mono text-xs">Small:</p>
|
|
245
|
+
<div class="flex flex-row gap-1">
|
|
246
|
+
<Tooltip>
|
|
247
|
+
{#snippet trigger()}
|
|
248
|
+
<StatusBadge type="progress" size="sm">
|
|
249
|
+
{#snippet icon()}
|
|
250
|
+
<ProgressCircle progress={calculated_progress} size="sm" />
|
|
251
|
+
{/snippet}
|
|
252
|
+
{#snippet content()}
|
|
253
|
+
<div>Running</div>
|
|
254
|
+
{/snippet}
|
|
255
|
+
{#snippet progress()}
|
|
256
|
+
<div>{calculated_progress}%</div>
|
|
257
|
+
{/snippet}
|
|
258
|
+
</StatusBadge>
|
|
259
|
+
{/snippet}
|
|
260
|
+
{#snippet content()}
|
|
261
|
+
<div class="flex flex-col text-left">
|
|
262
|
+
<p class="font-bold">Job running</p>
|
|
263
|
+
<p class="text-xs">1d 3h 2m left</p>
|
|
264
|
+
</div>
|
|
265
|
+
{/snippet}
|
|
266
|
+
</Tooltip>
|
|
267
|
+
|
|
268
|
+
<StatusBadge type="progress" size="sm">
|
|
269
|
+
{#snippet icon()}
|
|
270
|
+
<ProgressCircle progress={calculated_progress} size="sm" />
|
|
271
|
+
{/snippet}
|
|
272
|
+
{#snippet progress()}
|
|
273
|
+
<div>{calculated_progress}%</div>
|
|
274
|
+
{/snippet}
|
|
275
|
+
</StatusBadge>
|
|
276
|
+
</div>
|
|
277
|
+
</Story>
|
|
278
|
+
|
|
279
|
+
<Story name="Warning">
|
|
280
|
+
<p class="font-mono text-xs">Medium:</p>
|
|
281
|
+
<div class="flex flex-row gap-1">
|
|
282
|
+
<Tooltip>
|
|
283
|
+
{#snippet trigger()}
|
|
284
|
+
<StatusBadge type="warning">
|
|
285
|
+
{#snippet icon()}
|
|
286
|
+
<WifiSlash size="100%" weight="bold" />
|
|
287
|
+
{/snippet}
|
|
288
|
+
{#snippet content()}
|
|
289
|
+
<div>Offline</div>
|
|
290
|
+
{/snippet}
|
|
291
|
+
</StatusBadge>
|
|
292
|
+
{/snippet}
|
|
293
|
+
{#snippet content()}
|
|
294
|
+
<div class="flex flex-col text-left">
|
|
295
|
+
<p class="font-bold">Device is offline</p>
|
|
296
|
+
<p class="text-xs">Connect to the internet to start a Job</p>
|
|
297
|
+
</div>
|
|
298
|
+
{/snippet}
|
|
299
|
+
</Tooltip>
|
|
300
|
+
|
|
301
|
+
<StatusBadge type="warning">
|
|
302
|
+
{#snippet icon()}
|
|
303
|
+
<WifiSlash size="100%" weight="bold" />
|
|
304
|
+
{/snippet}
|
|
305
|
+
</StatusBadge>
|
|
306
|
+
</div>
|
|
307
|
+
<br />
|
|
308
|
+
<p class="font-mono text-xs">Small:</p>
|
|
309
|
+
<div class="flex flex-row gap-1">
|
|
310
|
+
<Tooltip>
|
|
311
|
+
{#snippet trigger()}
|
|
312
|
+
<StatusBadge type="warning" size="sm">
|
|
313
|
+
{#snippet icon()}
|
|
314
|
+
<WifiSlash size="100%" weight="bold" />
|
|
315
|
+
{/snippet}
|
|
316
|
+
{#snippet content()}
|
|
317
|
+
<div>Offline</div>
|
|
318
|
+
{/snippet}
|
|
319
|
+
</StatusBadge>
|
|
320
|
+
{/snippet}
|
|
321
|
+
{#snippet content()}
|
|
322
|
+
<div class="flex flex-col text-left">
|
|
323
|
+
<p class="font-bold">Device is offline</p>
|
|
324
|
+
<p class="text-xs">Connect to the internet to start a Job</p>
|
|
325
|
+
</div>
|
|
326
|
+
{/snippet}
|
|
327
|
+
</Tooltip>
|
|
328
|
+
|
|
329
|
+
<StatusBadge type="warning" size="sm">
|
|
330
|
+
{#snippet icon()}
|
|
331
|
+
<WifiSlash size="100%" weight="bold" />
|
|
332
|
+
{/snippet}
|
|
333
|
+
</StatusBadge>
|
|
334
|
+
</div>
|
|
335
|
+
</Story>
|
|
336
|
+
|
|
337
|
+
<Story name="Error">
|
|
338
|
+
<p class="font-mono text-xs">Medium:</p>
|
|
339
|
+
<div class="flex flex-row gap-1">
|
|
340
|
+
<Tooltip>
|
|
341
|
+
{#snippet trigger()}
|
|
342
|
+
<StatusBadge type="error">
|
|
343
|
+
{#snippet icon()}
|
|
344
|
+
<WarningCircle size="100%" weight="fill" />
|
|
345
|
+
{/snippet}
|
|
346
|
+
{#snippet content()}
|
|
347
|
+
<div>Failed</div>
|
|
348
|
+
{/snippet}
|
|
349
|
+
</StatusBadge>
|
|
350
|
+
{/snippet}
|
|
351
|
+
{#snippet content()}
|
|
352
|
+
<div class="flex flex-col text-left">
|
|
353
|
+
<p class="font-bold">Job failed</p>
|
|
354
|
+
<p class="text-xs">8/30/2024, 11:07 AM</p>
|
|
355
|
+
</div>
|
|
356
|
+
{/snippet}</Tooltip
|
|
357
|
+
>
|
|
358
|
+
|
|
359
|
+
<StatusBadge type="error">
|
|
360
|
+
{#snippet icon()}
|
|
361
|
+
<WarningCircle size="100%" weight="fill" />
|
|
362
|
+
{/snippet}
|
|
363
|
+
</StatusBadge>
|
|
364
|
+
</div>
|
|
365
|
+
<br />
|
|
366
|
+
<p class="font-mono text-xs">Small:</p>
|
|
367
|
+
<div class="flex flex-row gap-1">
|
|
368
|
+
<Tooltip>
|
|
369
|
+
{#snippet trigger()}
|
|
370
|
+
<StatusBadge type="error" size="sm">
|
|
371
|
+
{#snippet icon()}
|
|
372
|
+
<WarningCircle size="100%" weight="fill" />
|
|
373
|
+
{/snippet}
|
|
374
|
+
{#snippet content()}
|
|
375
|
+
<div>Failed</div>
|
|
376
|
+
{/snippet}
|
|
377
|
+
</StatusBadge>
|
|
378
|
+
{/snippet}
|
|
379
|
+
{#snippet content()}
|
|
380
|
+
<div class="flex flex-col text-left">
|
|
381
|
+
<p class="font-bold">Job failed</p>
|
|
382
|
+
<p class="text-xs">8/30/2024, 11:07 AM</p>
|
|
383
|
+
</div>
|
|
384
|
+
{/snippet}</Tooltip
|
|
385
|
+
>
|
|
386
|
+
|
|
387
|
+
<StatusBadge type="error" size="sm">
|
|
388
|
+
{#snippet icon()}
|
|
389
|
+
<WarningCircle size="100%" weight="fill" />
|
|
390
|
+
{/snippet}
|
|
391
|
+
</StatusBadge>
|
|
392
|
+
</div>
|
|
393
|
+
</Story>
|
|
394
|
+
|
|
395
|
+
<Story name="Icon only">
|
|
396
|
+
<StatusBadge type="neutral" iconOnly>
|
|
397
|
+
{#snippet icon()}
|
|
398
|
+
<SpinnerGap size="100%" weight="bold" />
|
|
399
|
+
{/snippet}
|
|
400
|
+
</StatusBadge>
|
|
401
|
+
</Story>
|