@reshape-biotech/design-system 0.0.52 → 1.1.1
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/dist/components/activity/Activity.stories.svelte +21 -8
- package/dist/components/activity/Activity.svelte +49 -9
- package/dist/components/activity/Activity.svelte.d.ts +1 -1
- package/dist/components/avatar/Avatar.stories.svelte +7 -17
- package/dist/components/avatar/Avatar.svelte +2 -2
- package/dist/components/avatar/Avatar.svelte.d.ts +2 -2
- package/dist/components/banner/Banner.stories.svelte +5 -5
- package/dist/components/button/Button.stories.svelte +54 -21
- package/dist/components/button/Button.svelte +58 -11
- package/dist/components/button/Button.svelte.d.ts +4 -3
- package/dist/components/card/Card.stories.svelte +130 -0
- package/dist/components/card/Card.stories.svelte.d.ts +19 -0
- package/dist/components/card/Card.svelte +25 -0
- package/dist/components/card/Card.svelte.d.ts +10 -0
- package/dist/components/card/index.d.ts +1 -0
- package/dist/components/card/index.js +1 -0
- package/dist/components/checkbox/Checkbox.stories.svelte +22 -0
- package/dist/components/checkbox/Checkbox.stories.svelte.d.ts +19 -0
- package/dist/components/checkbox/Checkbox.svelte +24 -0
- package/dist/components/checkbox/Checkbox.svelte.d.ts +5 -0
- package/dist/components/checkbox/index.d.ts +1 -0
- package/dist/components/checkbox/index.js +1 -0
- package/dist/components/collapsible/Collapsible.stories.svelte +5 -4
- package/dist/components/collapsible/components/collapsible-trigger.svelte +1 -1
- package/dist/components/combobox/Combobox.stories.svelte +7 -5
- package/dist/components/combobox/components/combobox-add.svelte +2 -1
- package/dist/components/combobox/components/combobox-content.svelte +4 -0
- package/dist/components/combobox/types.d.ts +2 -0
- package/dist/components/datepicker/DatePicker.stories.svelte +8 -14
- package/dist/components/divider/Divider.stories.svelte +1 -3
- package/dist/components/divider/Divider.svelte +8 -2
- package/dist/components/divider/Divider.svelte.d.ts +2 -0
- package/dist/components/drawer/Drawer.stories.svelte +3 -3
- package/dist/components/dropdown/Dropdown.stories.svelte +8 -8
- package/dist/components/empty-content/EmptyContent.stories.svelte +2 -2
- package/dist/components/graphs/bar-chart/BarChart.stories.svelte +81 -0
- package/dist/components/graphs/bar-chart/BarChart.stories.svelte.d.ts +19 -0
- package/dist/components/graphs/bar-chart/BarChart.svelte +136 -0
- package/dist/components/graphs/bar-chart/BarChart.svelte.d.ts +15 -0
- package/dist/components/graphs/bar-chart/StackedBarChart.stories.svelte +42 -0
- package/dist/components/graphs/bar-chart/StackedBarChart.stories.svelte.d.ts +19 -0
- package/dist/components/graphs/bar-chart/StackedBarChart.svelte +177 -0
- package/dist/components/graphs/bar-chart/StackedBarChart.svelte.d.ts +16 -0
- package/dist/components/graphs/chart/Chart.stories.svelte +31 -23
- package/dist/components/graphs/chart/Chart.svelte +104 -32
- package/dist/components/graphs/chart/Chart.svelte.d.ts +15 -5
- package/dist/components/graphs/index.d.ts +3 -0
- package/dist/components/graphs/index.js +3 -0
- package/dist/components/graphs/line/LineChart.stories.svelte +107 -15
- package/dist/components/graphs/line/LineChart.svelte +90 -51
- package/dist/components/graphs/line/LineChart.svelte.d.ts +6 -13
- package/dist/components/graphs/matrix/Matrix.stories.svelte +156 -0
- package/dist/components/graphs/matrix/Matrix.stories.svelte.d.ts +19 -0
- package/dist/components/graphs/matrix/Matrix.svelte +149 -0
- package/dist/components/graphs/matrix/Matrix.svelte.d.ts +24 -0
- package/dist/components/graphs/matrix/index.d.ts +3 -0
- package/dist/components/graphs/matrix/index.js +3 -0
- package/dist/components/graphs/multiline/MultiLineChart.stories.svelte +130 -18
- package/dist/components/graphs/multiline/MultiLineChart.svelte +187 -50
- package/dist/components/graphs/multiline/MultiLineChart.svelte.d.ts +9 -12
- package/dist/components/graphs/scatterplot/Scatterplot.stories.svelte +68 -41
- package/dist/components/graphs/scatterplot/Scatterplot.svelte +312 -45
- package/dist/components/graphs/scatterplot/Scatterplot.svelte.d.ts +23 -13
- package/dist/components/graphs/utils/tooltipFormatter.d.ts +10 -0
- package/dist/components/graphs/utils/tooltipFormatter.js +52 -0
- package/dist/components/icon-button/IconButton.stories.svelte +6 -6
- package/dist/components/icon-button/IconButton.svelte +50 -9
- package/dist/components/icon-button/IconButton.svelte.d.ts +3 -5
- package/dist/components/icons/AnalysisIcon.stories.svelte +15 -21
- package/dist/components/icons/AnalysisIcon.svelte +53 -43
- package/dist/components/icons/Icon.stories.svelte +4 -4
- package/dist/components/icons/Icon.svelte +1 -1
- package/dist/components/icons/PrincipalIcon.svelte +96 -0
- package/dist/components/icons/PrincipalIcon.svelte.d.ts +10 -0
- package/dist/components/icons/custom/Halo.svelte +14 -8
- package/dist/components/icons/custom/Halo.svelte.d.ts +7 -25
- package/dist/components/icons/custom/Well.svelte +14 -6
- package/dist/components/icons/custom/Well.svelte.d.ts +7 -25
- package/dist/components/icons/index.d.ts +3 -2
- package/dist/components/icons/index.js +26 -0
- package/dist/components/input/Input.stories.svelte +16 -22
- package/dist/components/input/Input.svelte +140 -134
- package/dist/components/input/Input.svelte.d.ts +12 -13
- package/dist/components/label/Label.stories.svelte +28 -0
- package/dist/components/label/Label.stories.svelte.d.ts +19 -0
- package/dist/components/label/Label.svelte +17 -0
- package/dist/components/label/Label.svelte.d.ts +9 -0
- package/dist/components/list/List.stories.svelte +3 -3
- package/dist/components/logo/Logo.stories.svelte +1 -1
- package/dist/components/manual-cfu-counter/ManualCFUCounter.stories.svelte +125 -0
- package/dist/components/manual-cfu-counter/ManualCFUCounter.stories.svelte.d.ts +3 -0
- package/dist/components/manual-cfu-counter/ManualCFUCounter.svelte +577 -0
- package/dist/components/manual-cfu-counter/ManualCFUCounter.svelte.d.ts +16 -0
- package/dist/components/manual-cfu-counter/index.d.ts +1 -0
- package/dist/components/manual-cfu-counter/index.js +1 -0
- package/dist/components/manual-cfu-counter/test/ManualCFUCounterTestWrapper.svelte +22 -0
- package/dist/components/manual-cfu-counter/test/ManualCFUCounterTestWrapper.svelte.d.ts +19 -0
- package/dist/components/markdown/Markdown.stories.svelte +1 -1
- package/dist/components/markdown/Markdown.svelte +1 -1
- package/dist/components/modal/Modal.stories.svelte +2 -2
- package/dist/components/modal/Modal.svelte +27 -22
- package/dist/components/modal/Modal.svelte.d.ts +4 -1
- package/dist/components/notification-popup/NotificationPopup.stories.svelte +1 -1
- package/dist/components/pill/Pill.stories.svelte +13 -0
- package/dist/components/pill/Pill.stories.svelte.d.ts +19 -0
- package/dist/components/progress-circle/ProgressCircle.stories.svelte +15 -0
- package/dist/components/progress-circle/ProgressCircle.stories.svelte.d.ts +19 -0
- package/dist/components/required-status-indicator/RequiredStatusIndicator.stories.svelte +28 -0
- package/dist/components/required-status-indicator/RequiredStatusIndicator.stories.svelte.d.ts +19 -0
- package/dist/components/required-status-indicator/RequiredStatusIndicator.svelte +22 -0
- package/dist/components/required-status-indicator/RequiredStatusIndicator.svelte.d.ts +8 -0
- package/dist/components/required-status-indicator/index.d.ts +1 -0
- package/dist/components/required-status-indicator/index.js +1 -0
- package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte +3 -3
- package/dist/components/select/Select.stories.svelte +12 -12
- package/dist/components/select/Select.svelte +0 -2
- package/dist/components/select-new/Select.stories.svelte +219 -0
- package/dist/components/select-new/Select.stories.svelte.d.ts +19 -0
- package/dist/components/select-new/components/Group.svelte +23 -0
- package/dist/components/select-new/components/Group.svelte.d.ts +10 -0
- package/dist/components/select-new/components/MultiSelectTrigger.svelte +66 -0
- package/dist/components/select-new/components/MultiSelectTrigger.svelte.d.ts +17 -0
- package/dist/components/select-new/components/SelectContent.svelte +33 -0
- package/dist/components/select-new/components/SelectContent.svelte.d.ts +10 -0
- package/dist/components/select-new/components/SelectGroupHeading.svelte +19 -0
- package/dist/components/select-new/components/SelectGroupHeading.svelte.d.ts +9 -0
- package/dist/components/select-new/components/SelectItem.svelte +41 -0
- package/dist/components/select-new/components/SelectItem.svelte.d.ts +9 -0
- package/dist/components/select-new/components/SelectTrigger.svelte +48 -0
- package/dist/components/select-new/components/SelectTrigger.svelte.d.ts +12 -0
- package/dist/components/select-new/index.d.ts +10 -0
- package/dist/components/select-new/index.js +12 -0
- package/dist/components/select-new/types.d.ts +25 -0
- package/dist/components/select-new/types.js +1 -0
- package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte +92 -0
- package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte.d.ts +3 -0
- package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte +65 -0
- package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte.d.ts +3 -0
- package/dist/components/sjsf-wrappers/index.d.ts +2 -0
- package/dist/components/sjsf-wrappers/index.js +2 -0
- package/dist/components/sjsf-wrappers/sjsfCustomTheme.d.ts +2 -0
- package/dist/components/sjsf-wrappers/sjsfCustomTheme.js +8 -0
- package/dist/components/skeleton-loader/SkeletonLoader.stories.svelte +4 -4
- package/dist/components/slider/Slider.stories.svelte +4 -4
- package/dist/components/spinner/Spinner.stories.svelte +13 -0
- package/dist/components/spinner/Spinner.stories.svelte.d.ts +19 -0
- package/dist/components/stat-card/StatCard.stories.svelte +27 -19
- package/dist/components/stat-card/StatCard.svelte +100 -6
- package/dist/components/stat-card/StatCard.svelte.d.ts +3 -0
- package/dist/components/status-badge/StatusBadge.stories.svelte +6 -6
- package/dist/components/status-badge/StatusBadge.svelte +5 -3
- package/dist/components/table/Table.stories.svelte +1 -1
- package/dist/components/table/components/Td.svelte +3 -2
- package/dist/components/table/components/Td.svelte.d.ts +1 -0
- package/dist/components/table/components/Tr.svelte +3 -2
- package/dist/components/table/components/Tr.svelte.d.ts +1 -0
- package/dist/components/tabs/Tabs.stories.svelte +1 -1
- package/dist/components/tag/Tag.stories.svelte +38 -7
- package/dist/components/tag/Tag.svelte +34 -21
- package/dist/components/tag/Tag.svelte.d.ts +1 -1
- package/dist/components/textarea/Textarea.stories.svelte +97 -0
- package/dist/components/textarea/Textarea.stories.svelte.d.ts +19 -0
- package/dist/components/textarea/Textarea.svelte +94 -0
- package/dist/components/textarea/Textarea.svelte.d.ts +17 -0
- package/dist/components/textarea/index.d.ts +1 -0
- package/dist/components/textarea/index.js +1 -0
- package/dist/components/toggle/Toggle.stories.svelte +1 -1
- package/dist/components/toggle/Toggle.svelte +3 -2
- package/dist/components/toggle/Toggle.svelte.d.ts +1 -0
- package/dist/components/toggle-icon-button/ToggleIconButton.stories.svelte +173 -0
- package/dist/components/toggle-icon-button/ToggleIconButton.stories.svelte.d.ts +19 -0
- package/dist/components/toggle-icon-button/ToggleIconButton.svelte +117 -0
- package/dist/components/toggle-icon-button/ToggleIconButton.svelte.d.ts +15 -0
- package/dist/components/toggle-icon-button/index.d.ts +3 -0
- package/dist/components/toggle-icon-button/index.js +3 -0
- package/dist/components/tooltip/Tooltip.stories.svelte +6 -6
- package/dist/components/tooltip/Tooltip.svelte +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/tailwind-safelist.js +2 -0
- package/dist/tailwind.preset.d.ts +2 -0
- package/dist/tokens.d.ts +4 -0
- package/dist/tokens.js +3 -1
- package/package.json +1 -2
|
@@ -8,24 +8,39 @@
|
|
|
8
8
|
title: 'Design System/Tag',
|
|
9
9
|
tags: ['autodocs']
|
|
10
10
|
});
|
|
11
|
+
|
|
12
|
+
const variants = [
|
|
13
|
+
'default',
|
|
14
|
+
'transparent',
|
|
15
|
+
'default-inverse',
|
|
16
|
+
'orange',
|
|
17
|
+
'sky',
|
|
18
|
+
'pink',
|
|
19
|
+
'lime',
|
|
20
|
+
'lilac',
|
|
21
|
+
'pear',
|
|
22
|
+
'blue',
|
|
23
|
+
'accent',
|
|
24
|
+
'warning'
|
|
25
|
+
];
|
|
11
26
|
</script>
|
|
12
27
|
|
|
13
|
-
<Story name="Default">
|
|
28
|
+
<Story name="Default" asChild>
|
|
14
29
|
<div class="w-fit">
|
|
15
30
|
<Tag>Default</Tag>
|
|
16
31
|
</div>
|
|
17
32
|
</Story>
|
|
18
|
-
<Story name="Default small">
|
|
33
|
+
<Story name="Default small" asChild>
|
|
19
34
|
<div class="w-fit">
|
|
20
35
|
<Tag variant="default" size="sm">Default</Tag>
|
|
21
36
|
</div>
|
|
22
37
|
</Story>
|
|
23
|
-
<Story name="Default onclick">
|
|
38
|
+
<Story name="Default onclick" asChild>
|
|
24
39
|
<div class="w-fit">
|
|
25
40
|
<Tag onclick={() => {}}>Default</Tag>
|
|
26
41
|
</div>
|
|
27
42
|
</Story>
|
|
28
|
-
<Story name="Default icon onclick">
|
|
43
|
+
<Story name="Default icon onclick" asChild>
|
|
29
44
|
<div class="w-fit">
|
|
30
45
|
<Tag onclick={() => {}}>
|
|
31
46
|
<Icon iconName="Folder" />
|
|
@@ -34,18 +49,34 @@
|
|
|
34
49
|
</div>
|
|
35
50
|
</Story>
|
|
36
51
|
|
|
37
|
-
<Story name="Transparent">
|
|
52
|
+
<Story name="Transparent" asChild>
|
|
38
53
|
<div class="w-fit">
|
|
39
54
|
<Tag variant="transparent">Transparent</Tag>
|
|
40
55
|
</div>
|
|
41
56
|
</Story>
|
|
42
|
-
<Story name="Transparent small">
|
|
57
|
+
<Story name="Transparent small" asChild>
|
|
43
58
|
<div class="w-fit">
|
|
44
59
|
<Tag variant="transparent" size="sm">Transparent</Tag>
|
|
45
60
|
</div>
|
|
46
61
|
</Story>
|
|
47
|
-
<Story name="Transparent onclick">
|
|
62
|
+
<Story name="Transparent onclick" asChild>
|
|
48
63
|
<div class="w-fit">
|
|
49
64
|
<Tag variant="transparent" onclick={() => {}}>Transparent</Tag>
|
|
50
65
|
</div>
|
|
51
66
|
</Story>
|
|
67
|
+
|
|
68
|
+
<Story name="Variants" asChild>
|
|
69
|
+
{#each variants as variant}
|
|
70
|
+
<div class="w-fit">
|
|
71
|
+
<Tag variant={variant as any}>{variant}</Tag>
|
|
72
|
+
</div>
|
|
73
|
+
{/each}
|
|
74
|
+
</Story>
|
|
75
|
+
|
|
76
|
+
<Story name="Button variants" asChild>
|
|
77
|
+
{#each variants as variant}
|
|
78
|
+
<div class="w-fit">
|
|
79
|
+
<Tag variant={variant as any} onclick={() => {}}>Click me</Tag>
|
|
80
|
+
</div>
|
|
81
|
+
{/each}
|
|
82
|
+
</Story>
|
|
@@ -4,7 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
interface Props {
|
|
6
6
|
children: Snippet;
|
|
7
|
-
variant?:
|
|
7
|
+
variant?:
|
|
8
|
+
| 'default'
|
|
9
|
+
| 'outline'
|
|
10
|
+
| 'transparent'
|
|
11
|
+
| 'default-inverse'
|
|
12
|
+
| 'orange'
|
|
13
|
+
| 'sky'
|
|
14
|
+
| 'pink'
|
|
15
|
+
| 'lime'
|
|
16
|
+
| 'lilac'
|
|
17
|
+
| 'pear'
|
|
18
|
+
| 'blue'
|
|
19
|
+
| 'accent'
|
|
20
|
+
| 'warning';
|
|
8
21
|
size?: 'sm' | 'md';
|
|
9
22
|
tooltip?: string;
|
|
10
23
|
onclick?: (event: MouseEvent) => void;
|
|
@@ -30,14 +43,32 @@
|
|
|
30
43
|
default: 'bg-neutral text-primary',
|
|
31
44
|
outline: 'bg-transparent text-secondary border',
|
|
32
45
|
transparent: 'bg-transparent text-secondary',
|
|
33
|
-
'default-inverse': 'bg-base-inverse text-secondary-inverse'
|
|
46
|
+
'default-inverse': 'bg-base-inverse text-secondary-inverse',
|
|
47
|
+
orange: 'bg-orange text-orange',
|
|
48
|
+
sky: 'bg-sky text-sky',
|
|
49
|
+
pink: 'bg-pink text-pink',
|
|
50
|
+
lime: 'bg-lime text-lime',
|
|
51
|
+
lilac: 'bg-lilac text-lilac',
|
|
52
|
+
pear: 'bg-pear text-pear',
|
|
53
|
+
blue: 'bg-blue text-blue',
|
|
54
|
+
accent: 'bg-accent text-accent',
|
|
55
|
+
warning: 'bg-warning text-warning'
|
|
34
56
|
};
|
|
35
57
|
|
|
36
58
|
const buttonClassVariants = {
|
|
37
59
|
default: 'hover:bg-neutral-hover',
|
|
38
60
|
outline: 'hover:bg-neutral hover:text-primary',
|
|
39
61
|
transparent: 'hover:bg-neutral hover:text-primary',
|
|
40
|
-
'default-inverse': 'hover:bg-base-inverse hover:text-secondary-inverse'
|
|
62
|
+
'default-inverse': 'hover:bg-base-inverse hover:text-secondary-inverse',
|
|
63
|
+
orange: 'hover:bg-orange-hover hover:text-orange-hover',
|
|
64
|
+
sky: 'hover:bg-sky-hover hover:text-sky-hover',
|
|
65
|
+
pink: 'hover:bg-pink-hover hover:text-pink-hover',
|
|
66
|
+
lime: 'hover:bg-lime-hover hover:text-lime-hover',
|
|
67
|
+
lilac: 'hover:bg-lilac-hover hover:text-lilac-hover',
|
|
68
|
+
pear: 'hover:bg-pear-hover hover:text-pear-hover',
|
|
69
|
+
blue: 'hover:bg-blue-hover hover:text-blue-hover',
|
|
70
|
+
accent: 'hover:bg-accent-hover hover:text-accent-hover',
|
|
71
|
+
warning: 'hover:bg-warning-hover hover:text-warning-hover'
|
|
41
72
|
};
|
|
42
73
|
|
|
43
74
|
let variantClassName = $derived(variants[variant]);
|
|
@@ -75,30 +106,12 @@
|
|
|
75
106
|
|
|
76
107
|
<style>
|
|
77
108
|
.outer {
|
|
78
|
-
|
|
79
109
|
display: flex;
|
|
80
|
-
|
|
81
110
|
align-items: center;
|
|
82
|
-
|
|
83
111
|
gap: 0.5rem;
|
|
84
|
-
|
|
85
112
|
overflow: hidden;
|
|
86
|
-
|
|
87
113
|
text-overflow: ellipsis;
|
|
88
|
-
|
|
89
114
|
white-space: nowrap;
|
|
90
|
-
|
|
91
115
|
border-radius: 0.25rem
|
|
92
116
|
}
|
|
93
|
-
|
|
94
|
-
svg {
|
|
95
|
-
|
|
96
|
-
height: 1rem;
|
|
97
|
-
|
|
98
|
-
width: 1rem;
|
|
99
|
-
|
|
100
|
-
--tw-text-opacity: 1;
|
|
101
|
-
|
|
102
|
-
color: rgb(136 140 148 / var(--tw-text-opacity, 1))
|
|
103
|
-
}
|
|
104
117
|
</style>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
interface Props {
|
|
3
3
|
children: Snippet;
|
|
4
|
-
variant?: 'default' | 'outline' | 'transparent' | 'default-inverse';
|
|
4
|
+
variant?: 'default' | 'outline' | 'transparent' | 'default-inverse' | 'orange' | 'sky' | 'pink' | 'lime' | 'lilac' | 'pear' | 'blue' | 'accent' | 'warning';
|
|
5
5
|
size?: 'sm' | 'md';
|
|
6
6
|
tooltip?: string;
|
|
7
7
|
onclick?: (event: MouseEvent) => void;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
+
import Textarea from './Textarea.svelte';
|
|
4
|
+
|
|
5
|
+
const { Story } = defineMeta({
|
|
6
|
+
title: 'Design System/Textarea',
|
|
7
|
+
component: Textarea,
|
|
8
|
+
argTypes: {
|
|
9
|
+
value: { control: 'text' },
|
|
10
|
+
placeholder: { control: 'text' },
|
|
11
|
+
size: {
|
|
12
|
+
control: { type: 'select' },
|
|
13
|
+
options: ['xs', 'sm', 'md', 'lg', 'dynamic']
|
|
14
|
+
},
|
|
15
|
+
required: { control: 'boolean' },
|
|
16
|
+
readonly: { control: 'boolean' },
|
|
17
|
+
autofocus: { control: 'boolean' },
|
|
18
|
+
error: { control: 'object' },
|
|
19
|
+
maxlength: { control: 'number' }
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<Story
|
|
25
|
+
name="Default"
|
|
26
|
+
args={{
|
|
27
|
+
value: 'This is some default text.',
|
|
28
|
+
placeholder: 'Enter text here...',
|
|
29
|
+
size: 'md'
|
|
30
|
+
}}
|
|
31
|
+
/>
|
|
32
|
+
|
|
33
|
+
<Story
|
|
34
|
+
name="Empty and Required"
|
|
35
|
+
args={{
|
|
36
|
+
value: '',
|
|
37
|
+
placeholder: 'This field is required',
|
|
38
|
+
required: true,
|
|
39
|
+
size: 'sm'
|
|
40
|
+
}}
|
|
41
|
+
/>
|
|
42
|
+
|
|
43
|
+
<Story
|
|
44
|
+
name="With Max Length"
|
|
45
|
+
args={{
|
|
46
|
+
value: 'Short text',
|
|
47
|
+
placeholder: 'Max 20 chars',
|
|
48
|
+
maxlength: 20,
|
|
49
|
+
size: 'dynamic'
|
|
50
|
+
}}
|
|
51
|
+
/>
|
|
52
|
+
<Story
|
|
53
|
+
name="With Label"
|
|
54
|
+
args={{
|
|
55
|
+
value: 'Short text',
|
|
56
|
+
placeholder: 'Max 20 chars',
|
|
57
|
+
maxlength: 20,
|
|
58
|
+
size: 'dynamic',
|
|
59
|
+
label: 'Label'
|
|
60
|
+
}}
|
|
61
|
+
/>
|
|
62
|
+
|
|
63
|
+
<Story
|
|
64
|
+
name="Readonly"
|
|
65
|
+
args={{
|
|
66
|
+
value: 'This text cannot be edited.',
|
|
67
|
+
readonly: true,
|
|
68
|
+
size: 'md'
|
|
69
|
+
}}
|
|
70
|
+
/>
|
|
71
|
+
|
|
72
|
+
<Story name="Invalid State" asChild>
|
|
73
|
+
<Textarea size="md" placeholder="Error here" value="This input is invalid.">
|
|
74
|
+
{#snippet error()}
|
|
75
|
+
<p class="text-danger">This is an error</p>
|
|
76
|
+
{/snippet}
|
|
77
|
+
</Textarea>
|
|
78
|
+
</Story>
|
|
79
|
+
|
|
80
|
+
<Story name="Autofocus" args={{ placeholder: 'I should be focused', autofocus: true }} />
|
|
81
|
+
|
|
82
|
+
<!-- Story to demonstrate auto-resizing. Requires interaction -->
|
|
83
|
+
<Story
|
|
84
|
+
name="Auto Resizing"
|
|
85
|
+
args={{
|
|
86
|
+
value: 'Initial line.\nAnother line to start with.',
|
|
87
|
+
placeholder: 'Type here...',
|
|
88
|
+
size: 'dynamic'
|
|
89
|
+
}}
|
|
90
|
+
>
|
|
91
|
+
{#snippet template(args)}
|
|
92
|
+
<div class="w-96">
|
|
93
|
+
<p class="mb-2 text-sm">Type or paste multiple lines to see it resize (max height 200px):</p>
|
|
94
|
+
<Textarea {...args} />
|
|
95
|
+
</div>
|
|
96
|
+
{/snippet}
|
|
97
|
+
</Story>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Textarea from './Textarea.svelte';
|
|
2
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
3
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
4
|
+
$$bindings?: Bindings;
|
|
5
|
+
} & Exports;
|
|
6
|
+
(internal: unknown, props: {
|
|
7
|
+
$$events?: Events;
|
|
8
|
+
$$slots?: Slots;
|
|
9
|
+
}): Exports & {
|
|
10
|
+
$set?: any;
|
|
11
|
+
$on?: any;
|
|
12
|
+
};
|
|
13
|
+
z_$$bindings?: Bindings;
|
|
14
|
+
}
|
|
15
|
+
declare const Textarea: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
16
|
+
[evt: string]: CustomEvent<any>;
|
|
17
|
+
}, {}, {}, string>;
|
|
18
|
+
type Textarea = InstanceType<typeof Textarea>;
|
|
19
|
+
export default Textarea;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { HTMLTextareaAttributes } from 'svelte/elements';
|
|
4
|
+
|
|
5
|
+
interface TextareaProps extends HTMLTextareaAttributes {
|
|
6
|
+
oninput?: (event: Event) => void;
|
|
7
|
+
onblur?: (event: Event) => void;
|
|
8
|
+
onkeydown?: (event: KeyboardEvent) => void;
|
|
9
|
+
input?: HTMLTextAreaElement;
|
|
10
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'dynamic';
|
|
11
|
+
label?: string;
|
|
12
|
+
error?: Snippet;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
value = $bindable(),
|
|
18
|
+
oninput = () => {},
|
|
19
|
+
onblur = () => {},
|
|
20
|
+
onkeydown = () => {},
|
|
21
|
+
input = $bindable(),
|
|
22
|
+
label,
|
|
23
|
+
placeholder,
|
|
24
|
+
error,
|
|
25
|
+
id,
|
|
26
|
+
size = 'md',
|
|
27
|
+
class: className,
|
|
28
|
+
...rest
|
|
29
|
+
}: TextareaProps = $props();
|
|
30
|
+
|
|
31
|
+
const textareaId = crypto.randomUUID();
|
|
32
|
+
const inputId = $derived(id ?? textareaId);
|
|
33
|
+
|
|
34
|
+
function handleInputInternal(event: Event) {
|
|
35
|
+
if (rest.readonly) return;
|
|
36
|
+
const target = event.target as HTMLTextAreaElement;
|
|
37
|
+
value = target.value;
|
|
38
|
+
autoResizeTextarea(target);
|
|
39
|
+
oninput(event);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function autoResizeTextarea(textarea: HTMLTextAreaElement) {
|
|
43
|
+
const maxHeight = 200;
|
|
44
|
+
textarea.style.height = 'auto';
|
|
45
|
+
if (textarea.scrollHeight < maxHeight) {
|
|
46
|
+
textarea.style.height = `${textarea.scrollHeight}px`;
|
|
47
|
+
textarea.style.overflowY = 'hidden';
|
|
48
|
+
} else {
|
|
49
|
+
textarea.style.height = `${maxHeight}px`;
|
|
50
|
+
textarea.style.overflowY = 'auto';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function handleBlurInternal(event: Event) {
|
|
55
|
+
onblur(event);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function focus() {
|
|
59
|
+
input?.focus();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
$effect(() => {
|
|
63
|
+
if (input && value) {
|
|
64
|
+
autoResizeTextarea(input);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
{#if label}
|
|
70
|
+
<label for={inputId} class="block px-1 py-2 text-sm text-secondary">
|
|
71
|
+
{label}
|
|
72
|
+
{#if rest.required}
|
|
73
|
+
<span class="ml-0.5 text-danger">*</span>
|
|
74
|
+
{/if}
|
|
75
|
+
</label>
|
|
76
|
+
{/if}
|
|
77
|
+
|
|
78
|
+
<textarea
|
|
79
|
+
id={inputId}
|
|
80
|
+
class="flex w-full items-center gap-1 rounded-lg border border-input bg-surface px-3 py-2 shadow-input focus-within:border-focus hover:border-hover {className ??
|
|
81
|
+
''}"
|
|
82
|
+
class:!border-error={error}
|
|
83
|
+
class:has-text={value}
|
|
84
|
+
class:has-placeholder={placeholder}
|
|
85
|
+
{placeholder}
|
|
86
|
+
oninput={handleInputInternal}
|
|
87
|
+
onblur={handleBlurInternal}
|
|
88
|
+
bind:this={input}
|
|
89
|
+
{value}
|
|
90
|
+
{...rest}
|
|
91
|
+
{onkeydown}
|
|
92
|
+
></textarea>
|
|
93
|
+
|
|
94
|
+
{@render error?.()}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLTextareaAttributes } from 'svelte/elements';
|
|
3
|
+
interface TextareaProps extends HTMLTextareaAttributes {
|
|
4
|
+
oninput?: (event: Event) => void;
|
|
5
|
+
onblur?: (event: Event) => void;
|
|
6
|
+
onkeydown?: (event: KeyboardEvent) => void;
|
|
7
|
+
input?: HTMLTextAreaElement;
|
|
8
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'dynamic';
|
|
9
|
+
label?: string;
|
|
10
|
+
error?: Snippet;
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
}
|
|
13
|
+
declare const Textarea: import("svelte").Component<TextareaProps, {
|
|
14
|
+
focus: () => void;
|
|
15
|
+
}, "value" | "input">;
|
|
16
|
+
type Textarea = ReturnType<typeof Textarea>;
|
|
17
|
+
export default Textarea;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Textarea } from './Textarea.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Textarea } from './Textarea.svelte';
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
value?: boolean;
|
|
4
4
|
onclick?: (event?: MouseEvent) => void;
|
|
5
5
|
id: string;
|
|
6
|
+
'data-testid'?: string;
|
|
6
7
|
}
|
|
7
8
|
|
|
8
|
-
let { value = $bindable(false), onclick, id }: Props = $props();
|
|
9
|
+
let { value = $bindable(false), onclick, id, 'data-testid': testId }: Props = $props();
|
|
9
10
|
</script>
|
|
10
11
|
|
|
11
12
|
<label class="switch">
|
|
12
|
-
<input type="checkbox" bind:checked={value} {onclick} {id} />
|
|
13
|
+
<input type="checkbox" bind:checked={value} {onclick} {id} data-testid={testId} />
|
|
13
14
|
<span class="slider round"></span>
|
|
14
15
|
</label>
|
|
15
16
|
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
+
import ToggleIconButton from './ToggleIconButton.svelte';
|
|
4
|
+
import { Icon } from '../icons';
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
component: ToggleIconButton,
|
|
8
|
+
title: 'Design System/ToggleIconButton',
|
|
9
|
+
tags: ['autodocs']
|
|
10
|
+
});
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<Story name="States" asChild>
|
|
14
|
+
<div class="flex flex-col gap-4">
|
|
15
|
+
<div class="bg-neutral-dark flex gap-4 p-4">
|
|
16
|
+
<div class="flex flex-col items-center gap-2">
|
|
17
|
+
<p class="text-sm">Normal</p>
|
|
18
|
+
<ToggleIconButton variant="primary-inverse">
|
|
19
|
+
<Icon iconName="DownloadSimple" />
|
|
20
|
+
</ToggleIconButton>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="flex flex-col items-center gap-2">
|
|
23
|
+
<p class="text-sm">Active</p>
|
|
24
|
+
<ToggleIconButton variant="primary-inverse" isActive={true}>
|
|
25
|
+
<Icon iconName="DownloadSimple" />
|
|
26
|
+
</ToggleIconButton>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</Story>
|
|
31
|
+
|
|
32
|
+
<Story name="Variants" asChild>
|
|
33
|
+
<div class="flex flex-col gap-4">
|
|
34
|
+
<div class="flex gap-8">
|
|
35
|
+
<div class="flex flex-col gap-2">
|
|
36
|
+
<p class="text-sm">Primary Inverse</p>
|
|
37
|
+
<div class="flex gap-4">
|
|
38
|
+
<ToggleIconButton variant="primary-inverse">
|
|
39
|
+
<Icon iconName="DownloadSimple" />
|
|
40
|
+
</ToggleIconButton>
|
|
41
|
+
<ToggleIconButton variant="primary-inverse" isActive={true}>
|
|
42
|
+
<Icon iconName="DownloadSimple" />
|
|
43
|
+
</ToggleIconButton>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="flex gap-8">
|
|
48
|
+
<div class="flex flex-col gap-2">
|
|
49
|
+
<p class="text-sm">Secondary</p>
|
|
50
|
+
<div class="flex gap-4">
|
|
51
|
+
<ToggleIconButton variant="secondary">
|
|
52
|
+
<Icon iconName="DownloadSimple" />
|
|
53
|
+
</ToggleIconButton>
|
|
54
|
+
<ToggleIconButton variant="secondary" isActive={true}>
|
|
55
|
+
<Icon iconName="DownloadSimple" />
|
|
56
|
+
</ToggleIconButton>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
</Story>
|
|
62
|
+
|
|
63
|
+
<Story name="Sizes" asChild>
|
|
64
|
+
<div class="flex gap-8">
|
|
65
|
+
<div class="flex flex-col items-center gap-2">
|
|
66
|
+
<p class="text-sm">XS</p>
|
|
67
|
+
<div class="flex gap-4">
|
|
68
|
+
<ToggleIconButton variant="primary-inverse" size="xs">
|
|
69
|
+
<Icon iconName="DownloadSimple" />
|
|
70
|
+
</ToggleIconButton>
|
|
71
|
+
<ToggleIconButton variant="primary-inverse" size="xs" isActive={true}>
|
|
72
|
+
<Icon iconName="DownloadSimple" />
|
|
73
|
+
</ToggleIconButton>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="flex flex-col items-center gap-2">
|
|
77
|
+
<p class="text-sm">SM</p>
|
|
78
|
+
<div class="flex gap-4">
|
|
79
|
+
<ToggleIconButton variant="primary-inverse" size="sm">
|
|
80
|
+
<Icon iconName="DownloadSimple" />
|
|
81
|
+
</ToggleIconButton>
|
|
82
|
+
<ToggleIconButton variant="primary-inverse" size="sm" isActive={true}>
|
|
83
|
+
<Icon iconName="DownloadSimple" />
|
|
84
|
+
</ToggleIconButton>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="flex flex-col items-center gap-2">
|
|
88
|
+
<p class="text-sm">MD</p>
|
|
89
|
+
<div class="flex gap-4">
|
|
90
|
+
<ToggleIconButton variant="primary-inverse" size="md">
|
|
91
|
+
<Icon iconName="DownloadSimple" />
|
|
92
|
+
</ToggleIconButton>
|
|
93
|
+
<ToggleIconButton variant="primary-inverse" size="md" isActive={true}>
|
|
94
|
+
<Icon iconName="DownloadSimple" />
|
|
95
|
+
</ToggleIconButton>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
<div class="flex flex-col items-center gap-2">
|
|
99
|
+
<p class="text-sm">LG</p>
|
|
100
|
+
<div class="flex gap-4">
|
|
101
|
+
<ToggleIconButton variant="primary-inverse" size="lg">
|
|
102
|
+
<Icon iconName="DownloadSimple" />
|
|
103
|
+
</ToggleIconButton>
|
|
104
|
+
<ToggleIconButton variant="primary-inverse" size="lg" isActive={true}>
|
|
105
|
+
<Icon iconName="DownloadSimple" />
|
|
106
|
+
</ToggleIconButton>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</Story>
|
|
111
|
+
|
|
112
|
+
<Story name="Rounded vs Square" asChild>
|
|
113
|
+
<div class="flex gap-8">
|
|
114
|
+
<div class="flex flex-col items-center gap-2">
|
|
115
|
+
<p class="text-sm">Rounded</p>
|
|
116
|
+
<div class="flex gap-4">
|
|
117
|
+
<ToggleIconButton variant="primary-inverse" rounded>
|
|
118
|
+
<Icon iconName="DownloadSimple" />
|
|
119
|
+
</ToggleIconButton>
|
|
120
|
+
<ToggleIconButton variant="primary-inverse" rounded isActive={true}>
|
|
121
|
+
<Icon iconName="DownloadSimple" />
|
|
122
|
+
</ToggleIconButton>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="flex flex-col items-center gap-2">
|
|
126
|
+
<p class="text-sm">Square</p>
|
|
127
|
+
<div class="flex gap-4">
|
|
128
|
+
<ToggleIconButton variant="primary-inverse" rounded={false}>
|
|
129
|
+
<Icon iconName="DownloadSimple" />
|
|
130
|
+
</ToggleIconButton>
|
|
131
|
+
<ToggleIconButton variant="primary-inverse" rounded={false} isActive={true}>
|
|
132
|
+
<Icon iconName="DownloadSimple" />
|
|
133
|
+
</ToggleIconButton>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
</Story>
|
|
138
|
+
|
|
139
|
+
<Story name="Primary Inverse Example" asChild>
|
|
140
|
+
<div class="bg-neutral-dark p-8">
|
|
141
|
+
<div class="flex gap-8">
|
|
142
|
+
<div class="flex flex-col items-center gap-2">
|
|
143
|
+
<p class="text-neutral-light text-sm">Normal</p>
|
|
144
|
+
<ToggleIconButton variant="primary-inverse">
|
|
145
|
+
<Icon iconName="DownloadSimple" />
|
|
146
|
+
</ToggleIconButton>
|
|
147
|
+
</div>
|
|
148
|
+
<div class="flex flex-col items-center gap-2">
|
|
149
|
+
<p class="text-neutral-light text-sm">Active</p>
|
|
150
|
+
<ToggleIconButton variant="primary-inverse" isActive={true}>
|
|
151
|
+
<Icon iconName="DownloadSimple" />
|
|
152
|
+
</ToggleIconButton>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
</Story>
|
|
157
|
+
|
|
158
|
+
<Story name="Disabled and Loading" asChild>
|
|
159
|
+
<div class="flex gap-8">
|
|
160
|
+
<div class="flex flex-col items-center gap-2">
|
|
161
|
+
<p class="text-sm">Disabled</p>
|
|
162
|
+
<ToggleIconButton disabled>
|
|
163
|
+
<Icon iconName="DownloadSimple" />
|
|
164
|
+
</ToggleIconButton>
|
|
165
|
+
</div>
|
|
166
|
+
<div class="flex flex-col items-center gap-2">
|
|
167
|
+
<p class="text-sm">Loading</p>
|
|
168
|
+
<ToggleIconButton loading>
|
|
169
|
+
<Icon iconName="DownloadSimple" />
|
|
170
|
+
</ToggleIconButton>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
</Story>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import ToggleIconButton from './ToggleIconButton.svelte';
|
|
2
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
3
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
4
|
+
$$bindings?: Bindings;
|
|
5
|
+
} & Exports;
|
|
6
|
+
(internal: unknown, props: {
|
|
7
|
+
$$events?: Events;
|
|
8
|
+
$$slots?: Slots;
|
|
9
|
+
}): Exports & {
|
|
10
|
+
$set?: any;
|
|
11
|
+
$on?: any;
|
|
12
|
+
};
|
|
13
|
+
z_$$bindings?: Bindings;
|
|
14
|
+
}
|
|
15
|
+
declare const ToggleIconButton: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
16
|
+
[evt: string]: CustomEvent<any>;
|
|
17
|
+
}, {}, {}, string>;
|
|
18
|
+
type ToggleIconButton = InstanceType<typeof ToggleIconButton>;
|
|
19
|
+
export default ToggleIconButton;
|