@reshape-biotech/design-system 1.2.6 → 1.2.7
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 +3 -1
- package/dist/app.css +97 -97
- package/dist/components/activity/Activity.stories.svelte +104 -104
- package/dist/components/activity/Activity.svelte +112 -112
- package/dist/components/avatar/Avatar.stories.svelte +23 -23
- package/dist/components/avatar/Avatar.svelte +54 -54
- package/dist/components/banner/Banner.stories.svelte +105 -105
- package/dist/components/banner/Banner.svelte +42 -42
- package/dist/components/button/Button.stories.svelte +61 -61
- package/dist/components/button/Button.svelte +95 -95
- package/dist/components/card/Card.stories.svelte +112 -112
- package/dist/components/card/Card.svelte +18 -18
- package/dist/components/checkbox/Checkbox.stories.svelte +8 -8
- package/dist/components/checkbox/Checkbox.svelte +17 -17
- package/dist/components/collapsible/Collapsible.stories.svelte +26 -26
- package/dist/components/collapsible/components/collapsible-content.svelte +20 -20
- package/dist/components/collapsible/components/collapsible-trigger.svelte +12 -12
- package/dist/components/combobox/Combobox.stories.svelte +412 -412
- package/dist/components/combobox/components/combobox-add.svelte +8 -8
- package/dist/components/combobox/components/combobox-content.svelte +39 -39
- package/dist/components/combobox/components/combobox-indicator.svelte +1 -1
- package/dist/components/datepicker/DatePicker.stories.svelte +196 -196
- package/dist/components/datepicker/DatePicker.svelte +173 -173
- package/dist/components/divider/Divider.stories.svelte +7 -7
- package/dist/components/divider/Divider.svelte +9 -9
- package/dist/components/drawer/Drawer.stories.svelte +51 -51
- package/dist/components/drawer/Drawer.svelte +33 -33
- package/dist/components/drawer/DrawerLabel.svelte +10 -10
- package/dist/components/dropdown/Dropdown.stories.svelte +210 -210
- package/dist/components/dropdown/Dropdown.svelte +57 -57
- package/dist/components/dropdown/components/DropdownContent.svelte +16 -16
- package/dist/components/dropdown/components/DropdownMenu.svelte +10 -10
- package/dist/components/dropdown/components/DropdownTrigger.svelte +37 -37
- package/dist/components/dropdown/components/OutlinedButton.svelte +9 -9
- package/dist/components/empty-content/EmptyContent.stories.svelte +38 -38
- package/dist/components/empty-content/EmptyContent.svelte +12 -12
- package/dist/components/graphs/bar-chart/BarChart.stories.svelte +91 -91
- package/dist/components/graphs/bar-chart/BarChart.svelte +147 -147
- package/dist/components/graphs/bar-chart/StackedBarChart.stories.svelte +57 -57
- package/dist/components/graphs/bar-chart/StackedBarChart.svelte +198 -199
- package/dist/components/graphs/chart/Chart.stories.svelte +96 -96
- package/dist/components/graphs/chart/Chart.svelte +207 -207
- package/dist/components/graphs/line/LineChart.stories.svelte +138 -138
- package/dist/components/graphs/line/LineChart.svelte +140 -142
- package/dist/components/graphs/matrix/Matrix.stories.svelte +117 -117
- package/dist/components/graphs/matrix/Matrix.svelte +141 -141
- package/dist/components/graphs/multiline/MultiLineChart.stories.svelte +168 -168
- package/dist/components/graphs/multiline/MultiLineChart.svelte +236 -236
- package/dist/components/graphs/scatterplot/Scatterplot.stories.svelte +84 -84
- package/dist/components/graphs/scatterplot/Scatterplot.svelte +302 -302
- package/dist/components/graphs/utils/duration.d.ts +1 -0
- package/dist/components/graphs/utils/duration.js +33 -0
- package/dist/components/graphs/utils/tooltipFormatter.js +1 -1
- package/dist/components/icon-button/IconButton.stories.svelte +64 -64
- package/dist/components/icon-button/IconButton.svelte +88 -88
- package/dist/components/icons/AnalysisIcon.stories.svelte +18 -18
- package/dist/components/icons/AnalysisIcon.svelte +96 -96
- package/dist/components/icons/Icon.stories.svelte +111 -111
- package/dist/components/icons/Icon.svelte +17 -17
- package/dist/components/icons/PrincipalIcon.svelte +59 -59
- package/dist/components/icons/custom/Halo.svelte +31 -31
- package/dist/components/icons/custom/Well.svelte +27 -27
- package/dist/components/icons/index.js +1 -1
- package/dist/components/image/Image.svelte +42 -42
- package/dist/components/input/Input.stories.svelte +55 -55
- package/dist/components/input/Input.svelte +121 -121
- package/dist/components/label/Label.stories.svelte +18 -18
- package/dist/components/label/Label.svelte +11 -11
- package/dist/components/list/List.stories.svelte +84 -84
- package/dist/components/list/List.svelte +20 -20
- package/dist/components/logo/Logo.stories.svelte +15 -15
- package/dist/components/logo/Logo.svelte +30 -30
- package/dist/components/manual-cfu-counter/ManualCFUCounter.stories.svelte +102 -102
- package/dist/components/manual-cfu-counter/ManualCFUCounter.svelte +557 -557
- package/dist/components/manual-cfu-counter/test/ManualCFUCounterTestWrapper.svelte +11 -11
- package/dist/components/markdown/Markdown.stories.svelte +10 -10
- package/dist/components/markdown/Markdown.svelte +6 -6
- package/dist/components/modal/Modal.stories.svelte +29 -29
- package/dist/components/modal/Modal.svelte +71 -71
- package/dist/components/multi-cfu-counter/MultiCFUCounter.stories.svelte +201 -201
- package/dist/components/multi-cfu-counter/MultiCFUCounter.svelte +606 -606
- package/dist/components/multi-cfu-counter/test/MultiCFUCounterTestWrapper.svelte +17 -17
- package/dist/components/notification-popup/NotificationPopup.stories.svelte +18 -18
- package/dist/components/notification-popup/NotificationPopup.svelte +26 -26
- package/dist/components/notifications/Notifications.stories.svelte +101 -101
- package/dist/components/notifications/Notifications.svelte +9 -9
- package/dist/components/pill/Pill.stories.svelte +8 -8
- package/dist/components/pill/Pill.svelte +27 -27
- package/dist/components/progress-circle/ProgressCircle.stories.svelte +8 -8
- package/dist/components/progress-circle/ProgressCircle.svelte +54 -54
- package/dist/components/required-status-indicator/RequiredStatusIndicator.stories.svelte +18 -18
- package/dist/components/required-status-indicator/RequiredStatusIndicator.svelte +14 -14
- package/dist/components/segmented-control-buttons/ControlButton.svelte +36 -36
- package/dist/components/segmented-control-buttons/SegmentedControlButtons.stories.svelte +35 -35
- package/dist/components/segmented-control-buttons/SegmentedControlButtons.svelte +13 -13
- package/dist/components/select/Select.stories.svelte +77 -77
- package/dist/components/select/Select.svelte +114 -114
- package/dist/components/select-new/Select.stories.svelte +188 -188
- package/dist/components/select-new/components/Group.svelte +17 -17
- package/dist/components/select-new/components/MultiSelectTrigger.svelte +57 -57
- package/dist/components/select-new/components/SelectContent.svelte +22 -22
- package/dist/components/select-new/components/SelectGroupHeading.svelte +10 -10
- package/dist/components/select-new/components/SelectItem.svelte +25 -25
- package/dist/components/select-new/components/SelectTrigger.svelte +38 -38
- package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte +76 -76
- package/dist/components/sjsf-wrappers/SjsfNumberInputWrapper.svelte.d.ts +1 -1
- package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte +53 -53
- package/dist/components/sjsf-wrappers/SjsfTextInputWrapper.svelte.d.ts +1 -1
- package/dist/components/sjsf-wrappers/sjsfCustomTheme.js +1 -1
- package/dist/components/skeleton-loader/SkeletonLoader.stories.svelte +32 -32
- package/dist/components/skeleton-loader/SkeletonLoader.svelte +10 -10
- package/dist/components/skeleton-loader/StatcardSkeleton.svelte +9 -9
- package/dist/components/skeleton-loader/components/Skeleton.svelte +7 -7
- package/dist/components/skeleton-loader/components/SkeletonImage.svelte +12 -12
- package/dist/components/slider/Slider.stories.svelte +23 -23
- package/dist/components/slider/Slider.svelte +107 -107
- package/dist/components/spinner/Spinner.stories.svelte +8 -8
- package/dist/components/spinner/Spinner.svelte +18 -18
- package/dist/components/stat-card/StatCard.stories.svelte +26 -26
- package/dist/components/stat-card/StatCard.svelte +128 -128
- package/dist/components/status-badge/StatusBadge.stories.svelte +365 -365
- package/dist/components/status-badge/StatusBadge.svelte +54 -54
- package/dist/components/stepper/Stepper.stories.svelte +219 -219
- package/dist/components/stepper/components/stepper-root.svelte +12 -12
- package/dist/components/stepper/components/stepper-step.svelte +83 -83
- package/dist/components/table/Table.stories.svelte +87 -87
- package/dist/components/table/Table.svelte +32 -32
- package/dist/components/table/components/TBody.svelte +7 -7
- package/dist/components/table/components/THead.svelte +7 -7
- package/dist/components/table/components/Td.svelte +8 -8
- package/dist/components/table/components/Th.svelte +8 -8
- package/dist/components/table/components/Tr.svelte +11 -11
- package/dist/components/tabs/Tabs.stories.svelte +20 -20
- package/dist/components/tabs/Tabs.svelte +8 -8
- package/dist/components/tabs/components/Content.svelte +8 -8
- package/dist/components/tabs/components/Tab.svelte +14 -14
- package/dist/components/tabs/components/Tabs.svelte +7 -7
- package/dist/components/tag/Tag.stories.svelte +57 -57
- package/dist/components/tag/Tag.svelte +95 -95
- package/dist/components/textarea/Textarea.stories.svelte +70 -70
- package/dist/components/textarea/Textarea.svelte +76 -76
- package/dist/components/toast/Toast.stories.svelte +204 -204
- package/dist/components/toast/Toast.svelte +53 -53
- package/dist/components/toggle/Toggle.stories.svelte +9 -9
- package/dist/components/toggle/Toggle.svelte +53 -53
- package/dist/components/toggle-icon-button/ToggleIconButton.stories.svelte +152 -152
- package/dist/components/toggle-icon-button/ToggleIconButton.svelte +99 -99
- package/dist/components/tooltip/Tooltip.stories.svelte +105 -105
- package/dist/components/tooltip/Tooltip.svelte +26 -26
- package/dist/fonts/index.js +1 -1
- package/dist/notifications.d.ts +1 -4
- package/dist/notifications.js +1 -1
- package/dist/tailwind-safelist.js +406 -406
- package/dist/tailwind.preset.js +10 -10
- package/dist/tokens/colors.js +18 -18
- package/dist/tokens/typography.js +6 -6
- package/dist/tokens.js +19 -19
- package/dist/types/fonts.d.ts +2 -2
- package/package.json +199 -198
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { Icon } from '../../icons';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
4
|
+
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
type Props = { children: Snippet } & HTMLButtonAttributes;
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
let { children, ...props }: Props = $props();
|
|
9
9
|
</script>
|
|
10
10
|
|
|
11
11
|
<button {...props}>
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
<Icon iconName="Plus" class="text-icon-secondary" />
|
|
13
|
+
{@render children()}
|
|
14
14
|
</button>
|
|
15
15
|
|
|
16
16
|
<style>
|
|
17
|
-
|
|
17
|
+
button {
|
|
18
18
|
margin-left: 0.5rem;
|
|
19
19
|
display: flex;
|
|
20
20
|
height: 2.5rem;
|
|
@@ -1,49 +1,49 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
import { Combobox } from 'bits-ui';
|
|
3
|
+
import type { ComboboxContentProps } from '../types';
|
|
4
|
+
import { Icon } from '../../icons';
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
children,
|
|
8
|
+
class: className,
|
|
9
|
+
showScroll = true,
|
|
10
|
+
portalled = true,
|
|
11
|
+
header,
|
|
12
|
+
footer,
|
|
13
|
+
...props
|
|
14
|
+
}: ComboboxContentProps = $props();
|
|
15
15
|
</script>
|
|
16
16
|
|
|
17
17
|
{#snippet content()}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
18
|
+
<Combobox.Content {...props} class={className}>
|
|
19
|
+
{@render header?.()}
|
|
20
|
+
{#if showScroll}
|
|
21
|
+
<Combobox.ScrollUpButton class="flex justify-center">
|
|
22
|
+
<Icon iconName="CaretUp" />
|
|
23
|
+
</Combobox.ScrollUpButton>
|
|
24
|
+
<Combobox.Viewport class="p-1">
|
|
25
|
+
{@render children()}
|
|
26
|
+
</Combobox.Viewport>
|
|
27
|
+
<Combobox.ScrollDownButton class="flex justify-center">
|
|
28
|
+
<Icon iconName="CaretDown" />
|
|
29
|
+
</Combobox.ScrollDownButton>
|
|
30
|
+
{:else}
|
|
31
|
+
{@render children()}
|
|
32
|
+
{/if}
|
|
33
|
+
{@render footer?.()}
|
|
34
|
+
</Combobox.Content>
|
|
35
35
|
{/snippet}
|
|
36
36
|
|
|
37
37
|
{#if portalled}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
<Combobox.Portal>
|
|
39
|
+
{@render content()}
|
|
40
|
+
</Combobox.Portal>
|
|
41
41
|
{:else}
|
|
42
|
-
|
|
42
|
+
{@render content()}
|
|
43
43
|
{/if}
|
|
44
44
|
|
|
45
45
|
<style>
|
|
46
|
-
|
|
46
|
+
:global([data-combobox-content]) {
|
|
47
47
|
|
|
48
48
|
width: 100%;
|
|
49
49
|
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
outline-offset: 2px
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
:global([data-combobox-input]) {
|
|
70
70
|
|
|
71
71
|
width: 100%;
|
|
72
72
|
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
outline-offset: 2px
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
:global([data-combobox-item]) {
|
|
95
95
|
|
|
96
96
|
display: flex;
|
|
97
97
|
|
|
@@ -115,12 +115,12 @@
|
|
|
115
115
|
|
|
116
116
|
line-height: 1.25rem
|
|
117
117
|
}
|
|
118
|
-
|
|
118
|
+
:global([data-combobox-item][data-highlighted]) {
|
|
119
119
|
|
|
120
120
|
background-color: #12192a0A
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
:global([data-combobox-group-label]) {
|
|
124
124
|
|
|
125
125
|
padding-left: 0.75rem;
|
|
126
126
|
|
|
@@ -1,53 +1,53 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
2
|
+
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
+
import { userEvent, within } from '@storybook/test';
|
|
4
|
+
import { DateTime } from 'luxon';
|
|
5
|
+
import DatePicker from './DatePicker.svelte';
|
|
6
|
+
import Dropdown from '../dropdown/Dropdown.svelte';
|
|
7
|
+
import { Icon } from '../icons';
|
|
8
|
+
|
|
9
|
+
const { Story } = defineMeta({
|
|
10
|
+
component: DatePicker,
|
|
11
|
+
title: 'Design System/DatePicker',
|
|
12
|
+
tags: ['autodocs'],
|
|
13
|
+
parameters: {
|
|
14
|
+
design: {
|
|
15
|
+
type: 'figma',
|
|
16
|
+
url: 'https://www.figma.com/design/WkxhG4H2Ybc7STFi1VJIau/%F0%9F%92%A0-Reshape-Design-System%3A-V1?node-id=4381-32638&t=Epi2Ul7Cw7sCJpGy-0',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const staticDate = DateTime.local(2023, 10, 15);
|
|
22
|
+
|
|
23
|
+
let selectedDate = $state<DateTime | undefined>(undefined);
|
|
24
|
+
let loggedDate = $state<string | undefined>(undefined);
|
|
25
|
+
|
|
26
|
+
function handleDateSelection(date: DateTime) {
|
|
27
|
+
loggedDate = date.toFormat('yyyy-MM-dd');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// States for the dropdown story
|
|
31
|
+
let dropdownDate = $state<DateTime | undefined>(undefined);
|
|
32
|
+
let displayText = $state('Select a date');
|
|
33
|
+
let isOpen = $state(false);
|
|
34
|
+
|
|
35
|
+
// States for the form test
|
|
36
|
+
let formDropdownDate = $state<DateTime | undefined>(undefined);
|
|
37
|
+
let formDisplayText = $state('Select a date');
|
|
38
|
+
let formIsOpen = $state(false);
|
|
39
|
+
|
|
40
|
+
function handleDropdownSelection(date: DateTime) {
|
|
41
|
+
dropdownDate = date;
|
|
42
|
+
displayText = date.toFormat('MMM dd, yyyy');
|
|
43
|
+
isOpen = false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function handleFormDateSelection(date: DateTime) {
|
|
47
|
+
formDropdownDate = date;
|
|
48
|
+
formDisplayText = date.toFormat('MMM dd, yyyy');
|
|
49
|
+
formIsOpen = false;
|
|
50
|
+
}
|
|
51
51
|
</script>
|
|
52
52
|
|
|
53
53
|
<Story name="Default" args={{ selectedDate: undefined }} />
|
|
@@ -55,168 +55,168 @@
|
|
|
55
55
|
<Story name="With Selected Date" args={{ selectedDate: staticDate }} />
|
|
56
56
|
|
|
57
57
|
<Story name="With Date Change Handler" asChild>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
58
|
+
<div class="p-4">
|
|
59
|
+
<div class="mb-4">
|
|
60
|
+
<DatePicker {selectedDate} onClick={handleDateSelection} />
|
|
61
|
+
</div>
|
|
62
|
+
{#if loggedDate}
|
|
63
|
+
<div class="mt-4 rounded bg-neutral p-2">
|
|
64
|
+
<p>Selected date: <strong>{loggedDate}</strong></p>
|
|
65
|
+
</div>
|
|
66
|
+
{/if}
|
|
67
|
+
</div>
|
|
68
68
|
</Story>
|
|
69
69
|
|
|
70
70
|
<Story name="Month Navigation" asChild>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
71
|
+
<div class="p-4">
|
|
72
|
+
<DatePicker selectedDate={staticDate} />
|
|
73
|
+
<div class="mt-4 text-sm text-tertiary">
|
|
74
|
+
<p>Click the arrow buttons to navigate between months</p>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
77
|
</Story>
|
|
78
78
|
|
|
79
79
|
<Story
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
80
|
+
name="Interaction Test"
|
|
81
|
+
asChild
|
|
82
|
+
play={async ({ canvasElement }) => {
|
|
83
|
+
const canvas = within(canvasElement);
|
|
84
|
+
|
|
85
|
+
// Click next month button
|
|
86
|
+
const nextMonthButton = canvas.getAllByRole('button')[1]; // Second button is next month
|
|
87
|
+
await userEvent.click(nextMonthButton);
|
|
88
|
+
|
|
89
|
+
// Wait a moment
|
|
90
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
91
|
+
|
|
92
|
+
// Click a date (the 15th of the month)
|
|
93
|
+
const dateButtons = canvas.getAllByRole('button').filter((button) => {
|
|
94
|
+
// Find buttons with just numbers as their text content
|
|
95
|
+
const text = button.textContent?.trim();
|
|
96
|
+
return text && !isNaN(Number(text));
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Find the button with text "15" if it exists
|
|
100
|
+
const date15Button = dateButtons.find((button) => button.textContent?.trim() === '15');
|
|
101
|
+
|
|
102
|
+
if (date15Button) {
|
|
103
|
+
await userEvent.click(date15Button);
|
|
104
|
+
}
|
|
105
|
+
}}
|
|
106
106
|
>
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
<div class="p-4">
|
|
108
|
+
<DatePicker bind:selectedDate />
|
|
109
|
+
{#if selectedDate}
|
|
110
|
+
<div class="mt-4 rounded bg-neutral p-2">
|
|
111
|
+
<p>Selected date: <strong>{selectedDate.toFormat('yyyy-MM-dd')}</strong></p>
|
|
112
|
+
</div>
|
|
113
|
+
{/if}
|
|
114
|
+
</div>
|
|
115
115
|
</Story>
|
|
116
116
|
|
|
117
117
|
<Story name="Multiple DatePickers" asChild>
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
118
|
+
<div class="flex flex-col gap-4 p-4 md:flex-row">
|
|
119
|
+
<div>
|
|
120
|
+
<h3 class="mb-2 text-sm font-medium">Start Date</h3>
|
|
121
|
+
<DatePicker selectedDate={staticDate.minus({ days: 7 })} />
|
|
122
|
+
</div>
|
|
123
|
+
<div>
|
|
124
|
+
<h3 class="mb-2 text-sm font-medium">End Date</h3>
|
|
125
|
+
<DatePicker selectedDate={staticDate} />
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
128
|
</Story>
|
|
129
129
|
|
|
130
130
|
<Story name="In Dropdown" asChild>
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
131
|
+
<div class="p-4">
|
|
132
|
+
<Dropdown bind:open={isOpen} side="dropdown-bottom" alignEnd={false}>
|
|
133
|
+
{#snippet trigger({ Trigger })}
|
|
134
|
+
<Trigger>
|
|
135
|
+
<Icon iconName="CalendarBlank" class="mr-2" size={16} />
|
|
136
|
+
{displayText}
|
|
137
|
+
</Trigger>
|
|
138
|
+
{/snippet}
|
|
139
|
+
|
|
140
|
+
{#snippet content()}
|
|
141
|
+
<DatePicker selectedDate={dropdownDate} onClick={handleDropdownSelection} />
|
|
142
|
+
{/snippet}
|
|
143
|
+
</Dropdown>
|
|
144
|
+
|
|
145
|
+
{#if dropdownDate}
|
|
146
|
+
<div class="mt-4 rounded bg-neutral p-2">
|
|
147
|
+
<p>You selected: <strong>{dropdownDate.toFormat('MMMM dd, yyyy')}</strong></p>
|
|
148
|
+
</div>
|
|
149
|
+
{/if}
|
|
150
|
+
</div>
|
|
151
151
|
</Story>
|
|
152
152
|
|
|
153
153
|
<Story
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
154
|
+
name="Form Submit Prevention Test"
|
|
155
|
+
asChild
|
|
156
|
+
play={async ({ canvasElement }) => {
|
|
157
|
+
const canvas = within(canvasElement);
|
|
158
|
+
|
|
159
|
+
// Setup spy on form submission
|
|
160
|
+
const form = canvas.getByTestId('test-form');
|
|
161
|
+
let submissionCount = 0;
|
|
162
|
+
form.addEventListener('submit', (e) => {
|
|
163
|
+
e.preventDefault();
|
|
164
|
+
submissionCount++;
|
|
165
|
+
console.log('Form was submitted!');
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// First open the dropdown
|
|
169
|
+
const dropdownTrigger = canvas.getByTestId('form-date-trigger');
|
|
170
|
+
await userEvent.click(dropdownTrigger);
|
|
171
|
+
|
|
172
|
+
// Click prev/next month and verify no submission
|
|
173
|
+
const buttons = document.querySelectorAll('button');
|
|
174
|
+
const prevMonthButton = Array.from(buttons).find((btn) => btn.innerHTML.includes('CaretLeft'));
|
|
175
|
+
const nextMonthButton = Array.from(buttons).find((btn) => btn.innerHTML.includes('CaretRight'));
|
|
176
|
+
|
|
177
|
+
if (prevMonthButton) {
|
|
178
|
+
await userEvent.click(prevMonthButton);
|
|
179
|
+
console.log('Clicked prev month, submission count:', submissionCount);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (nextMonthButton) {
|
|
183
|
+
await userEvent.click(nextMonthButton);
|
|
184
|
+
console.log('Clicked next month, submission count:', submissionCount);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Success message if no form submission occurred
|
|
188
|
+
if (submissionCount === 0) {
|
|
189
|
+
console.log('TEST PASSED: Month navigation did not trigger form submission');
|
|
190
|
+
} else {
|
|
191
|
+
console.error('TEST FAILED: Month navigation triggered form submission');
|
|
192
|
+
}
|
|
193
|
+
}}
|
|
194
194
|
>
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
195
|
+
<div class="p-4">
|
|
196
|
+
<form data-testid="test-form" onsubmit={(e) => e.preventDefault()}>
|
|
197
|
+
<div class="mb-4">
|
|
198
|
+
<label for="name" class="mb-1 block text-sm font-medium">Name</label>
|
|
199
|
+
<input id="name" type="text" class="input input-bordered w-full" />
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<div class="mb-4">
|
|
203
|
+
<Dropdown bind:open={formIsOpen} side="dropdown-bottom" alignEnd={false}>
|
|
204
|
+
{#snippet trigger({ Trigger })}
|
|
205
|
+
<Trigger>
|
|
206
|
+
<div data-testid="form-date-trigger" class="flex items-center gap-2">
|
|
207
|
+
<Icon iconName="CalendarBlank" class="mr-2" size={16} />
|
|
208
|
+
{formDisplayText}
|
|
209
|
+
</div>
|
|
210
|
+
</Trigger>
|
|
211
|
+
{/snippet}
|
|
212
|
+
|
|
213
|
+
{#snippet content()}
|
|
214
|
+
<DatePicker selectedDate={formDropdownDate} onClick={handleFormDateSelection} />
|
|
215
|
+
{/snippet}
|
|
216
|
+
</Dropdown>
|
|
217
|
+
</div>
|
|
218
|
+
|
|
219
|
+
<button type="submit" class="btn btn-primary mt-4">Submit Form</button>
|
|
220
|
+
</form>
|
|
221
|
+
</div>
|
|
222
222
|
</Story>
|