@getmicdrop/svelte-components 5.5.5 → 5.6.0
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/calendar/AboutShow/AboutShow.svelte +172 -172
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
- package/dist/calendar/FAQs/FAQs.svelte +75 -75
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
- package/dist/calendar/OrderSummary/OrderSummary.svelte +367 -367
- package/dist/calendar/PublicCard/PublicCard.svelte +134 -134
- package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
- package/dist/components/Layout/AppShell.svelte +104 -0
- package/dist/components/Layout/AppShell.svelte.d.ts +26 -0
- package/dist/components/Layout/AppShell.svelte.d.ts.map +1 -0
- package/dist/components/Layout/ContentSection.svelte +80 -0
- package/dist/components/Layout/ContentSection.svelte.d.ts +23 -0
- package/dist/components/Layout/ContentSection.svelte.d.ts.map +1 -0
- package/dist/components/Layout/Grid.svelte +4 -4
- package/dist/components/Layout/Heading.svelte +81 -0
- package/dist/components/Layout/Heading.svelte.d.ts +24 -0
- package/dist/components/Layout/Heading.svelte.d.ts.map +1 -0
- package/dist/components/Layout/PageContainer.svelte +69 -0
- package/dist/components/Layout/PageContainer.svelte.d.ts +23 -0
- package/dist/components/Layout/PageContainer.svelte.d.ts.map +1 -0
- package/dist/components/Layout/Responsive.svelte +75 -0
- package/dist/components/Layout/Responsive.svelte.d.ts +19 -0
- package/dist/components/Layout/Responsive.svelte.d.ts.map +1 -0
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/ShowOnDesktop.svelte +37 -0
- package/dist/components/Layout/ShowOnDesktop.svelte.d.ts +16 -0
- package/dist/components/Layout/ShowOnDesktop.svelte.d.ts.map +1 -0
- package/dist/components/Layout/ShowOnMobile.svelte +37 -0
- package/dist/components/Layout/ShowOnMobile.svelte.d.ts +16 -0
- package/dist/components/Layout/ShowOnMobile.svelte.d.ts.map +1 -0
- package/dist/components/Layout/Sidebar.svelte +108 -108
- package/dist/components/Layout/Stack.spec.js +1 -1
- package/dist/components/Layout/Stack.svelte +6 -6
- package/dist/components/Layout/Text.svelte +87 -0
- package/dist/components/Layout/Text.svelte.d.ts +28 -0
- package/dist/components/Layout/Text.svelte.d.ts.map +1 -0
- package/dist/components/Layout/TwoColumn.svelte +108 -0
- package/dist/components/Layout/TwoColumn.svelte.d.ts +28 -0
- package/dist/components/Layout/TwoColumn.svelte.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/Heading.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/Heading.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/Heading.test.js +123 -0
- package/dist/components/Layout/__tests__/ShowOnDesktop.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/ShowOnDesktop.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/ShowOnDesktop.test.js +84 -0
- package/dist/components/Layout/__tests__/ShowOnMobile.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/ShowOnMobile.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/ShowOnMobile.test.js +80 -0
- package/dist/components/Layout/__tests__/Text.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/Text.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/Text.test.js +146 -0
- package/dist/components/Layout/__tests__/TwoColumn.test.d.ts +2 -0
- package/dist/components/Layout/__tests__/TwoColumn.test.d.ts.map +1 -0
- package/dist/components/Layout/__tests__/TwoColumn.test.js +129 -0
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/datetime/__tests__/format.test.js +1 -1
- package/dist/datetime/__tests__/parse.test.js +1 -1
- package/dist/datetime/__tests__/timezone.test.js +1 -1
- package/dist/datetime/parse.js +1 -1
- package/dist/forms/createFormStore.svelte.js +1 -0
- package/dist/index.js +40 -40
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.svelte +24 -24
- package/dist/patterns/data/DataTable.svelte +36 -36
- package/dist/patterns/forms/FormActions.spec.js +95 -95
- package/dist/patterns/forms/FormActions.stories.svelte +97 -97
- package/dist/patterns/forms/FormActions.svelte +46 -46
- package/dist/patterns/forms/FormGrid.svelte +33 -33
- package/dist/patterns/forms/FormSection.svelte +32 -32
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
- package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/layout/index.d.ts +9 -0
- package/dist/patterns/layout/index.js +22 -0
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +64 -64
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +193 -193
- package/dist/patterns/page/PageHeader.svelte +18 -18
- package/dist/patterns/page/PageLayout.svelte +40 -40
- package/dist/patterns/page/PageLoader.spec.js +57 -57
- package/dist/patterns/page/PageLoader.stories.svelte +137 -137
- package/dist/patterns/page/PageLoader.svelte +24 -24
- package/dist/patterns/page/SectionHeader.svelte +29 -29
- package/dist/presets/badges.js +112 -112
- package/dist/presets/buttons.js +76 -76
- package/dist/presets/index.js +9 -9
- package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
- package/dist/primitives/Accordion/Accordion.svelte +42 -42
- package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
- package/dist/primitives/Alert/Alert.spec.js +173 -173
- package/dist/primitives/Alert/Alert.stories.svelte +88 -88
- package/dist/primitives/Alert/Alert.svelte +27 -27
- package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
- package/dist/primitives/Avatar/Avatar.svelte +66 -66
- package/dist/primitives/Badges/Badge.spec.js +144 -144
- package/dist/primitives/Badges/Badge.stories.svelte +86 -86
- package/dist/primitives/Badges/Badge.svelte +79 -79
- package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -136
- package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
- package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -122
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
- package/dist/primitives/Button/Button.spec.js +223 -223
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +270 -270
- package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
- package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
- package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
- package/dist/primitives/Card.spec.js +49 -49
- package/dist/primitives/Card.stories.svelte +22 -22
- package/dist/primitives/Card.svelte +28 -28
- package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
- package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
- package/dist/primitives/DarkModeToggle.spec.js +390 -390
- package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
- package/dist/primitives/DarkModeToggle.svelte +136 -136
- package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
- package/dist/primitives/Drawer/Drawer.svelte +120 -120
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
- package/dist/primitives/Icons/ArrowRight.svelte +8 -8
- package/dist/primitives/Icons/Availability.svelte +14 -14
- package/dist/primitives/Icons/Back.svelte +14 -14
- package/dist/primitives/Icons/CheckCircle.svelte +6 -6
- package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
- package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
- package/dist/primitives/Icons/ChevronRight.svelte +4 -4
- package/dist/primitives/Icons/Copy.svelte +15 -15
- package/dist/primitives/Icons/Cross.svelte +5 -5
- package/dist/primitives/Icons/DownArrow.svelte +8 -8
- package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
- package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
- package/dist/primitives/Icons/Home.svelte +15 -15
- package/dist/primitives/Icons/Icon.spec.js +169 -169
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +52 -52
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/Info.svelte +7 -7
- package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
- package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
- package/dist/primitives/Icons/Message.svelte +15 -15
- package/dist/primitives/Icons/MoonIcon.svelte +5 -5
- package/dist/primitives/Icons/More.svelte +21 -21
- package/dist/primitives/Icons/MoreHori.spec.js +61 -61
- package/dist/primitives/Icons/MoreHori.svelte +22 -22
- package/dist/primitives/Icons/Notification.svelte +14 -14
- package/dist/primitives/Icons/Payment.svelte +14 -14
- package/dist/primitives/Icons/Profile.svelte +21 -21
- package/dist/primitives/Icons/Reload.svelte +29 -29
- package/dist/primitives/Icons/Shows.svelte +21 -21
- package/dist/primitives/Icons/Signout.svelte +21 -21
- package/dist/primitives/Icons/SunIcon.svelte +8 -8
- package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
- package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
- package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
- package/dist/primitives/Icons/WarningIcon.svelte +5 -5
- package/dist/primitives/Input/Input.spec.js +573 -573
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/Input.svelte +417 -417
- package/dist/primitives/Input/Select.spec.js +212 -212
- package/dist/primitives/Input/Select.stories.svelte +112 -112
- package/dist/primitives/Input/Select.svelte +128 -128
- package/dist/primitives/Input/Textarea.stories.svelte +137 -137
- package/dist/primitives/Input/Textarea.svelte +35 -35
- package/dist/primitives/Label/Label.svelte +37 -37
- package/dist/primitives/Modal/Modal.spec.js +99 -99
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Modal/Modal.svelte +158 -158
- package/dist/primitives/NumberInput/NumberInput.svelte +106 -106
- package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
- package/dist/primitives/Pagination/Pagination.svelte +261 -261
- package/dist/primitives/Radio/Radio.stories.svelte +80 -80
- package/dist/primitives/Radio/Radio.svelte +67 -67
- package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
- package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
- package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
- package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
- package/dist/primitives/Spinner/Spinner.spec.js +71 -71
- package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
- package/dist/primitives/Spinner/Spinner.svelte +20 -20
- package/dist/primitives/Tabs/TabItem.svelte +49 -49
- package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
- package/dist/primitives/Tabs/Tabs.svelte +123 -123
- package/dist/primitives/Toggle.spec.js +143 -143
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Toggle.svelte +71 -71
- package/dist/primitives/Typography/Typography.svelte +53 -53
- package/dist/primitives/ValidationError.spec.js +103 -103
- package/dist/primitives/ValidationError.stories.svelte +69 -69
- package/dist/primitives/ValidationError.svelte +29 -29
- package/dist/primitives/index.js +84 -84
- package/dist/recipes/CropImage/CropImage.spec.js +208 -208
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +238 -238
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
- package/dist/recipes/SuperLogin/SuperLogin.spec.js +17 -17
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
- package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
- package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
- package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
- package/dist/recipes/fields/CheckboxField.svelte +85 -85
- package/dist/recipes/fields/FormField.svelte +58 -58
- package/dist/recipes/fields/RadioGroup.svelte +95 -95
- package/dist/recipes/fields/SelectField.svelte +80 -80
- package/dist/recipes/fields/TextareaField.svelte +97 -97
- package/dist/recipes/fields/ToggleField.svelte +60 -60
- package/dist/recipes/fields/index.js +7 -7
- package/dist/recipes/inputs/MultiSelect.spec.js +258 -258
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/MultiSelect.svelte +256 -256
- package/dist/recipes/inputs/OTPInput.spec.js +251 -251
- package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
- package/dist/recipes/inputs/OTPInput.svelte +29 -29
- package/dist/recipes/inputs/PasswordInput.svelte +22 -22
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +117 -117
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +326 -326
- package/dist/recipes/inputs/Search.svelte +37 -37
- package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
- package/dist/recipes/modals/AlertModal.svelte +130 -130
- package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
- package/dist/recipes/modals/InputModal.svelte +182 -182
- package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
- package/dist/recipes/modals/ModalStateManager.svelte +77 -77
- package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
- package/dist/recipes/modals/StatusModal.svelte +206 -206
- package/dist/services/EventService.js +75 -75
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.spec.js +345 -345
- package/dist/stores/auth.js +36 -36
- package/dist/stores/auth.spec.js +139 -139
- package/dist/stores/toaster.js +13 -13
- package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
- package/dist/stories/ButtonAuditReview.svelte +427 -427
- package/dist/stories/PatternsGallery.stories.svelte +19 -19
- package/dist/stories/PatternsGallery.svelte +206 -206
- package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
- package/dist/stories/PrimitivesGallery.svelte +725 -725
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +271 -271
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/telemetry.js +405 -405
- package/dist/telemetry.spec.js +1144 -1144
- package/dist/tokens/__tests__/typography-base.test.d.ts +2 -0
- package/dist/tokens/__tests__/typography-base.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/typography-base.test.js +138 -0
- package/dist/tokens/tokens.css +87 -87
- package/dist/tokens/typography-base.css +163 -0
- package/dist/utils/apiConfig.spec.js +219 -219
- package/dist/utils/transitions.js +62 -62
- package/dist/utils/utils.js +354 -354
- package/package.json +292 -291
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
-
import Avatar from './Avatar.svelte';
|
|
4
|
-
|
|
5
|
-
const { Story } = defineMeta({
|
|
6
|
-
title: 'Primitives/Avatar',
|
|
7
|
-
component: Avatar,
|
|
8
|
-
tags: ['autodocs'],
|
|
9
|
-
argTypes: {
|
|
10
|
-
size: {
|
|
11
|
-
control: 'select',
|
|
12
|
-
options: ['xs', 'sm', 'md', 'lg', 'xl'],
|
|
13
|
-
},
|
|
14
|
-
src: { control: 'text' },
|
|
15
|
-
alt: { control: 'text' },
|
|
16
|
-
initials: { control: 'text' },
|
|
17
|
-
},
|
|
18
|
-
parameters: {
|
|
19
|
-
docs: {
|
|
20
|
-
description: {
|
|
21
|
-
component: 'User profile picture component with fallback to initials.',
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
</script>
|
|
27
|
-
|
|
28
|
-
<Story name="Default">
|
|
29
|
-
{#snippet template()}
|
|
30
|
-
<Avatar />
|
|
31
|
-
{/snippet}
|
|
32
|
-
</Story>
|
|
33
|
-
|
|
34
|
-
<Story name="With Initials" args={{ initials: 'JD' }}>
|
|
35
|
-
{#snippet template(args)}
|
|
36
|
-
<Avatar {...args} />
|
|
37
|
-
{/snippet}
|
|
38
|
-
</Story>
|
|
39
|
-
|
|
40
|
-
<Story name="With Image" args={{ src: 'https://i.pravatar.cc/150?img=3', alt: 'User avatar' }}>
|
|
41
|
-
{#snippet template(args)}
|
|
42
|
-
<Avatar {...args} />
|
|
43
|
-
{/snippet}
|
|
44
|
-
</Story>
|
|
45
|
-
|
|
46
|
-
<Story name="All Sizes">
|
|
47
|
-
{#snippet template()}
|
|
48
|
-
<div class="flex items-end gap-4">
|
|
49
|
-
<div class="text-center">
|
|
50
|
-
<Avatar size="xs" initials="XS" />
|
|
51
|
-
<p class="text-xs text-gray-500 mt-1">xs</p>
|
|
52
|
-
</div>
|
|
53
|
-
<div class="text-center">
|
|
54
|
-
<Avatar size="sm" initials="SM" />
|
|
55
|
-
<p class="text-xs text-gray-500 mt-1">sm</p>
|
|
56
|
-
</div>
|
|
57
|
-
<div class="text-center">
|
|
58
|
-
<Avatar size="md" initials="MD" />
|
|
59
|
-
<p class="text-xs text-gray-500 mt-1">md</p>
|
|
60
|
-
</div>
|
|
61
|
-
<div class="text-center">
|
|
62
|
-
<Avatar size="lg" initials="LG" />
|
|
63
|
-
<p class="text-xs text-gray-500 mt-1">lg</p>
|
|
64
|
-
</div>
|
|
65
|
-
<div class="text-center">
|
|
66
|
-
<Avatar size="xl" initials="XL" />
|
|
67
|
-
<p class="text-xs text-gray-500 mt-1">xl</p>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
70
|
-
{/snippet}
|
|
71
|
-
</Story>
|
|
72
|
-
|
|
73
|
-
<Story name="Image Sizes">
|
|
74
|
-
{#snippet template()}
|
|
75
|
-
<div class="flex items-end gap-4">
|
|
76
|
-
<Avatar size="xs" src="https://i.pravatar.cc/150?img=1" />
|
|
77
|
-
<Avatar size="sm" src="https://i.pravatar.cc/150?img=2" />
|
|
78
|
-
<Avatar size="md" src="https://i.pravatar.cc/150?img=3" />
|
|
79
|
-
<Avatar size="lg" src="https://i.pravatar.cc/150?img=4" />
|
|
80
|
-
<Avatar size="xl" src="https://i.pravatar.cc/150?img=5" />
|
|
81
|
-
</div>
|
|
82
|
-
{/snippet}
|
|
83
|
-
</Story>
|
|
84
|
-
|
|
85
|
-
<Story name="Group">
|
|
86
|
-
{#snippet template()}
|
|
87
|
-
<div class="flex -space-x-4">
|
|
88
|
-
<Avatar src="https://i.pravatar.cc/150?img=1" class="ring-2 ring-white" />
|
|
89
|
-
<Avatar src="https://i.pravatar.cc/150?img=2" class="ring-2 ring-white" />
|
|
90
|
-
<Avatar src="https://i.pravatar.cc/150?img=3" class="ring-2 ring-white" />
|
|
91
|
-
<Avatar initials="+5" class="ring-2 ring-white" />
|
|
92
|
-
</div>
|
|
93
|
-
{/snippet}
|
|
94
|
-
</Story>
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
+
import Avatar from './Avatar.svelte';
|
|
4
|
+
|
|
5
|
+
const { Story } = defineMeta({
|
|
6
|
+
title: 'Primitives/Avatar',
|
|
7
|
+
component: Avatar,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
argTypes: {
|
|
10
|
+
size: {
|
|
11
|
+
control: 'select',
|
|
12
|
+
options: ['xs', 'sm', 'md', 'lg', 'xl'],
|
|
13
|
+
},
|
|
14
|
+
src: { control: 'text' },
|
|
15
|
+
alt: { control: 'text' },
|
|
16
|
+
initials: { control: 'text' },
|
|
17
|
+
},
|
|
18
|
+
parameters: {
|
|
19
|
+
docs: {
|
|
20
|
+
description: {
|
|
21
|
+
component: 'User profile picture component with fallback to initials.',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<Story name="Default">
|
|
29
|
+
{#snippet template()}
|
|
30
|
+
<Avatar />
|
|
31
|
+
{/snippet}
|
|
32
|
+
</Story>
|
|
33
|
+
|
|
34
|
+
<Story name="With Initials" args={{ initials: 'JD' }}>
|
|
35
|
+
{#snippet template(args)}
|
|
36
|
+
<Avatar {...args} />
|
|
37
|
+
{/snippet}
|
|
38
|
+
</Story>
|
|
39
|
+
|
|
40
|
+
<Story name="With Image" args={{ src: 'https://i.pravatar.cc/150?img=3', alt: 'User avatar' }}>
|
|
41
|
+
{#snippet template(args)}
|
|
42
|
+
<Avatar {...args} />
|
|
43
|
+
{/snippet}
|
|
44
|
+
</Story>
|
|
45
|
+
|
|
46
|
+
<Story name="All Sizes">
|
|
47
|
+
{#snippet template()}
|
|
48
|
+
<div class="flex items-end gap-4">
|
|
49
|
+
<div class="text-center">
|
|
50
|
+
<Avatar size="xs" initials="XS" />
|
|
51
|
+
<p class="text-xs text-gray-500 mt-1">xs</p>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="text-center">
|
|
54
|
+
<Avatar size="sm" initials="SM" />
|
|
55
|
+
<p class="text-xs text-gray-500 mt-1">sm</p>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="text-center">
|
|
58
|
+
<Avatar size="md" initials="MD" />
|
|
59
|
+
<p class="text-xs text-gray-500 mt-1">md</p>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="text-center">
|
|
62
|
+
<Avatar size="lg" initials="LG" />
|
|
63
|
+
<p class="text-xs text-gray-500 mt-1">lg</p>
|
|
64
|
+
</div>
|
|
65
|
+
<div class="text-center">
|
|
66
|
+
<Avatar size="xl" initials="XL" />
|
|
67
|
+
<p class="text-xs text-gray-500 mt-1">xl</p>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
{/snippet}
|
|
71
|
+
</Story>
|
|
72
|
+
|
|
73
|
+
<Story name="Image Sizes">
|
|
74
|
+
{#snippet template()}
|
|
75
|
+
<div class="flex items-end gap-4">
|
|
76
|
+
<Avatar size="xs" src="https://i.pravatar.cc/150?img=1" />
|
|
77
|
+
<Avatar size="sm" src="https://i.pravatar.cc/150?img=2" />
|
|
78
|
+
<Avatar size="md" src="https://i.pravatar.cc/150?img=3" />
|
|
79
|
+
<Avatar size="lg" src="https://i.pravatar.cc/150?img=4" />
|
|
80
|
+
<Avatar size="xl" src="https://i.pravatar.cc/150?img=5" />
|
|
81
|
+
</div>
|
|
82
|
+
{/snippet}
|
|
83
|
+
</Story>
|
|
84
|
+
|
|
85
|
+
<Story name="Group">
|
|
86
|
+
{#snippet template()}
|
|
87
|
+
<div class="flex -space-x-4">
|
|
88
|
+
<Avatar src="https://i.pravatar.cc/150?img=1" class="ring-2 ring-white" />
|
|
89
|
+
<Avatar src="https://i.pravatar.cc/150?img=2" class="ring-2 ring-white" />
|
|
90
|
+
<Avatar src="https://i.pravatar.cc/150?img=3" class="ring-2 ring-white" />
|
|
91
|
+
<Avatar initials="+5" class="ring-2 ring-white" />
|
|
92
|
+
</div>
|
|
93
|
+
{/snippet}
|
|
94
|
+
</Story>
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* Avatar Component - Flowbite-style native implementation
|
|
4
|
-
*
|
|
5
|
-
* Displays a user avatar image with optional fallback initials
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
interface Props {
|
|
9
|
-
/** Image source URL */
|
|
10
|
-
src?: string;
|
|
11
|
-
/** Alt text for the image */
|
|
12
|
-
alt?: string;
|
|
13
|
-
/** Whether to use rounded (circle) shape */
|
|
14
|
-
rounded?: boolean;
|
|
15
|
-
/** Size variant */
|
|
16
|
-
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
17
|
-
/** Fallback initials when no image */
|
|
18
|
-
initials?: string;
|
|
19
|
-
/** Additional CSS classes */
|
|
20
|
-
class?: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
let {
|
|
24
|
-
src = '',
|
|
25
|
-
alt = '',
|
|
26
|
-
rounded = false,
|
|
27
|
-
size = 'md',
|
|
28
|
-
initials = '',
|
|
29
|
-
class: className = ''
|
|
30
|
-
}: Props = $props();
|
|
31
|
-
|
|
32
|
-
// Size classes
|
|
33
|
-
const sizeClasses: Record<string, string> = {
|
|
34
|
-
xs: 'w-6 h-6 text-xs',
|
|
35
|
-
sm: 'w-8 h-8 text-xs',
|
|
36
|
-
md: 'w-10 h-10 text-sm',
|
|
37
|
-
lg: 'w-14 h-14 text-base',
|
|
38
|
-
xl: 'w-20 h-20 text-lg'
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
let sizeClass = $derived(sizeClasses[size] || sizeClasses.md);
|
|
42
|
-
let roundedClass = $derived(rounded ? 'rounded-full' : 'rounded');
|
|
43
|
-
</script>
|
|
44
|
-
|
|
45
|
-
{#if src}
|
|
46
|
-
<img
|
|
47
|
-
{src}
|
|
48
|
-
{alt}
|
|
49
|
-
class="object-cover {sizeClass} {roundedClass} {className}"
|
|
50
|
-
/>
|
|
51
|
-
{:else if initials}
|
|
52
|
-
<div
|
|
53
|
-
class="flex items-center justify-center font-medium text-gray-600 bg-gray-200 dark:bg-gray-700 dark:text-gray-300 {sizeClass} {roundedClass} {className}"
|
|
54
|
-
>
|
|
55
|
-
{initials}
|
|
56
|
-
</div>
|
|
57
|
-
{:else}
|
|
58
|
-
<!-- Default placeholder -->
|
|
59
|
-
<div
|
|
60
|
-
class="flex items-center justify-center bg-gray-200 dark:bg-gray-700 {sizeClass} {roundedClass} {className}"
|
|
61
|
-
>
|
|
62
|
-
<svg class="w-1/2 h-1/2 text-gray-400" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
|
63
|
-
<path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"></path>
|
|
64
|
-
</svg>
|
|
65
|
-
</div>
|
|
66
|
-
{/if}
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Avatar Component - Flowbite-style native implementation
|
|
4
|
+
*
|
|
5
|
+
* Displays a user avatar image with optional fallback initials
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
/** Image source URL */
|
|
10
|
+
src?: string;
|
|
11
|
+
/** Alt text for the image */
|
|
12
|
+
alt?: string;
|
|
13
|
+
/** Whether to use rounded (circle) shape */
|
|
14
|
+
rounded?: boolean;
|
|
15
|
+
/** Size variant */
|
|
16
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
17
|
+
/** Fallback initials when no image */
|
|
18
|
+
initials?: string;
|
|
19
|
+
/** Additional CSS classes */
|
|
20
|
+
class?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let {
|
|
24
|
+
src = '',
|
|
25
|
+
alt = '',
|
|
26
|
+
rounded = false,
|
|
27
|
+
size = 'md',
|
|
28
|
+
initials = '',
|
|
29
|
+
class: className = ''
|
|
30
|
+
}: Props = $props();
|
|
31
|
+
|
|
32
|
+
// Size classes
|
|
33
|
+
const sizeClasses: Record<string, string> = {
|
|
34
|
+
xs: 'w-6 h-6 text-xs',
|
|
35
|
+
sm: 'w-8 h-8 text-xs',
|
|
36
|
+
md: 'w-10 h-10 text-sm',
|
|
37
|
+
lg: 'w-14 h-14 text-base',
|
|
38
|
+
xl: 'w-20 h-20 text-lg'
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
let sizeClass = $derived(sizeClasses[size] || sizeClasses.md);
|
|
42
|
+
let roundedClass = $derived(rounded ? 'rounded-full' : 'rounded');
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
{#if src}
|
|
46
|
+
<img
|
|
47
|
+
{src}
|
|
48
|
+
{alt}
|
|
49
|
+
class="object-cover {sizeClass} {roundedClass} {className}"
|
|
50
|
+
/>
|
|
51
|
+
{:else if initials}
|
|
52
|
+
<div
|
|
53
|
+
class="flex items-center justify-center font-medium text-gray-600 bg-gray-200 dark:bg-gray-700 dark:text-gray-300 {sizeClass} {roundedClass} {className}"
|
|
54
|
+
>
|
|
55
|
+
{initials}
|
|
56
|
+
</div>
|
|
57
|
+
{:else}
|
|
58
|
+
<!-- Default placeholder -->
|
|
59
|
+
<div
|
|
60
|
+
class="flex items-center justify-center bg-gray-200 dark:bg-gray-700 {sizeClass} {roundedClass} {className}"
|
|
61
|
+
>
|
|
62
|
+
<svg class="w-1/2 h-1/2 text-gray-400" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
|
63
|
+
<path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"></path>
|
|
64
|
+
</svg>
|
|
65
|
+
</div>
|
|
66
|
+
{/if}
|
|
@@ -1,144 +1,144 @@
|
|
|
1
|
-
import { render, screen } from '@testing-library/svelte';
|
|
2
|
-
import userEvent from '@testing-library/user-event';
|
|
3
|
-
import { describe, test, expect, vi } from 'vitest';
|
|
4
|
-
import Badge from './Badge.svelte';
|
|
5
|
-
|
|
6
|
-
describe('Badge Component Tests', () => {
|
|
7
|
-
test('Renders with default props', () => {
|
|
8
|
-
const { container } = render(Badge);
|
|
9
|
-
const badge = container.querySelector('div');
|
|
10
|
-
expect(badge).toBeInTheDocument();
|
|
11
|
-
expect(badge).toHaveClass('inline-flex');
|
|
12
|
-
expect(badge).toHaveClass('items-center');
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test('Renders with size prop', () => {
|
|
16
|
-
// Default md size renders with text classes
|
|
17
|
-
const { container: mdContainer } = render(Badge, { size: 'md' });
|
|
18
|
-
const mdBadge = mdContainer.querySelector('div');
|
|
19
|
-
expect(mdBadge).toHaveClass('font-medium');
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test('Accepts size prop without error', () => {
|
|
23
|
-
// Test that various sizes render without errors
|
|
24
|
-
expect(() => render(Badge, { size: 'xs' })).not.toThrow();
|
|
25
|
-
expect(() => render(Badge, { size: 'sm' })).not.toThrow();
|
|
26
|
-
expect(() => render(Badge, { size: 'md' })).not.toThrow();
|
|
27
|
-
expect(() => render(Badge, { size: 'lg' })).not.toThrow();
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test('Accepts large prop without error', () => {
|
|
31
|
-
expect(() => render(Badge, { large: true })).not.toThrow();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
test('Handles variant props for colors', () => {
|
|
35
|
-
// neutral variant (default)
|
|
36
|
-
const { container: neutralContainer } = render(Badge, { variant: 'neutral' });
|
|
37
|
-
const neutralBadge = neutralContainer.querySelector('div');
|
|
38
|
-
expect(neutralBadge).toHaveClass('bg-gray-100');
|
|
39
|
-
|
|
40
|
-
// success variant
|
|
41
|
-
const { container: successContainer } = render(Badge, { variant: 'success' });
|
|
42
|
-
const successBadge = successContainer.querySelector('div');
|
|
43
|
-
expect(successBadge).toHaveClass('bg-green-100');
|
|
44
|
-
|
|
45
|
-
// warning variant
|
|
46
|
-
const { container: warningContainer } = render(Badge, { variant: 'warning' });
|
|
47
|
-
const warningBadge = warningContainer.querySelector('div');
|
|
48
|
-
expect(warningBadge).toHaveClass('bg-yellow-100');
|
|
49
|
-
|
|
50
|
-
// error variant
|
|
51
|
-
const { container: errorContainer } = render(Badge, { variant: 'error' });
|
|
52
|
-
const errorBadge = errorContainer.querySelector('div');
|
|
53
|
-
expect(errorBadge).toHaveClass('bg-red-100');
|
|
54
|
-
|
|
55
|
-
// info variant
|
|
56
|
-
const { container: infoContainer } = render(Badge, { variant: 'info' });
|
|
57
|
-
const infoBadge = infoContainer.querySelector('div');
|
|
58
|
-
expect(infoBadge).toHaveClass('bg-blue-100');
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
test('Handles case-insensitive variants', () => {
|
|
62
|
-
const { container: upperContainer } = render(Badge, { variant: 'SUCCESS' });
|
|
63
|
-
const upperBadge = upperContainer.querySelector('div');
|
|
64
|
-
expect(upperBadge).toHaveClass('bg-green-100');
|
|
65
|
-
|
|
66
|
-
const { container: mixedContainer } = render(Badge, { variant: 'Warning' });
|
|
67
|
-
const mixedBadge = mixedContainer.querySelector('div');
|
|
68
|
-
expect(mixedBadge).toHaveClass('bg-yellow-100');
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test('Falls back to neutral variant for unknown variants', () => {
|
|
72
|
-
const { container } = render(Badge, { variant: 'unknown' });
|
|
73
|
-
const badge = container.querySelector('div');
|
|
74
|
-
expect(badge).toHaveClass('bg-gray-100');
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test('Shows status dot when showDot is true', () => {
|
|
78
|
-
const { container } = render(Badge, { showDot: true });
|
|
79
|
-
const dot = container.querySelector('span.rounded-full');
|
|
80
|
-
expect(dot).toBeInTheDocument();
|
|
81
|
-
expect(dot).toHaveClass('w-1.5');
|
|
82
|
-
expect(dot).toHaveClass('h-1.5');
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
test('Does not show status dot by default', () => {
|
|
86
|
-
const { container } = render(Badge, { showDot: false });
|
|
87
|
-
const dot = container.querySelector('span.rounded-full');
|
|
88
|
-
expect(dot).not.toBeInTheDocument();
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test('Renders as pill shape', () => {
|
|
92
|
-
const { container } = render(Badge, { pill: true });
|
|
93
|
-
const badge = container.querySelector('div');
|
|
94
|
-
expect(badge).toHaveClass('rounded-full');
|
|
95
|
-
expect(badge).toHaveClass('min-w-5');
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
test('Renders with rounded shape by default', () => {
|
|
99
|
-
const { container } = render(Badge, { shape: 'rounded' });
|
|
100
|
-
const badge = container.querySelector('div');
|
|
101
|
-
expect(badge).toHaveClass('rounded');
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
test('Renders with pill shape option', () => {
|
|
105
|
-
const { container } = render(Badge, { shape: 'pill' });
|
|
106
|
-
const badge = container.querySelector('div');
|
|
107
|
-
expect(badge).toHaveClass('rounded-full');
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test('Applies custom className', () => {
|
|
111
|
-
const { container } = render(Badge, { className: 'custom-class' });
|
|
112
|
-
const badge = container.querySelector('div');
|
|
113
|
-
expect(badge).toHaveClass('custom-class');
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
test('Applies custom text color', () => {
|
|
117
|
-
const { container } = render(Badge, { textColor: '#ff0000' });
|
|
118
|
-
const badge = container.querySelector('div');
|
|
119
|
-
// Browser may convert hex to rgb
|
|
120
|
-
expect(badge.style.color).toBeTruthy();
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test('Applies custom background color', () => {
|
|
124
|
-
const { container } = render(Badge, { bgColor: '#00ff00' });
|
|
125
|
-
const badge = container.querySelector('div');
|
|
126
|
-
// Browser may convert hex to rgb
|
|
127
|
-
expect(badge.style.backgroundColor).toBeTruthy();
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
test('Dispatches click event', async () => {
|
|
131
|
-
const user = userEvent.setup();
|
|
132
|
-
const onClickMock = vi.fn();
|
|
133
|
-
const { container } = render(Badge, { onclick: onClickMock });
|
|
134
|
-
const badge = container.querySelector('div');
|
|
135
|
-
await user.click(badge);
|
|
136
|
-
expect(onClickMock).toHaveBeenCalledOnce();
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
test('Gap class is present for icon spacing', () => {
|
|
140
|
-
const { container } = render(Badge);
|
|
141
|
-
const badge = container.querySelector('div');
|
|
142
|
-
expect(badge).toHaveClass('gap-1.5');
|
|
143
|
-
});
|
|
144
|
-
});
|
|
1
|
+
import { render, screen } from '@testing-library/svelte';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import { describe, test, expect, vi } from 'vitest';
|
|
4
|
+
import Badge from './Badge.svelte';
|
|
5
|
+
|
|
6
|
+
describe('Badge Component Tests', () => {
|
|
7
|
+
test('Renders with default props', () => {
|
|
8
|
+
const { container } = render(Badge);
|
|
9
|
+
const badge = container.querySelector('div');
|
|
10
|
+
expect(badge).toBeInTheDocument();
|
|
11
|
+
expect(badge).toHaveClass('inline-flex');
|
|
12
|
+
expect(badge).toHaveClass('items-center');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test('Renders with size prop', () => {
|
|
16
|
+
// Default md size renders with text classes
|
|
17
|
+
const { container: mdContainer } = render(Badge, { size: 'md' });
|
|
18
|
+
const mdBadge = mdContainer.querySelector('div');
|
|
19
|
+
expect(mdBadge).toHaveClass('font-medium');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('Accepts size prop without error', () => {
|
|
23
|
+
// Test that various sizes render without errors
|
|
24
|
+
expect(() => render(Badge, { size: 'xs' })).not.toThrow();
|
|
25
|
+
expect(() => render(Badge, { size: 'sm' })).not.toThrow();
|
|
26
|
+
expect(() => render(Badge, { size: 'md' })).not.toThrow();
|
|
27
|
+
expect(() => render(Badge, { size: 'lg' })).not.toThrow();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('Accepts large prop without error', () => {
|
|
31
|
+
expect(() => render(Badge, { large: true })).not.toThrow();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('Handles variant props for colors', () => {
|
|
35
|
+
// neutral variant (default)
|
|
36
|
+
const { container: neutralContainer } = render(Badge, { variant: 'neutral' });
|
|
37
|
+
const neutralBadge = neutralContainer.querySelector('div');
|
|
38
|
+
expect(neutralBadge).toHaveClass('bg-gray-100');
|
|
39
|
+
|
|
40
|
+
// success variant
|
|
41
|
+
const { container: successContainer } = render(Badge, { variant: 'success' });
|
|
42
|
+
const successBadge = successContainer.querySelector('div');
|
|
43
|
+
expect(successBadge).toHaveClass('bg-green-100');
|
|
44
|
+
|
|
45
|
+
// warning variant
|
|
46
|
+
const { container: warningContainer } = render(Badge, { variant: 'warning' });
|
|
47
|
+
const warningBadge = warningContainer.querySelector('div');
|
|
48
|
+
expect(warningBadge).toHaveClass('bg-yellow-100');
|
|
49
|
+
|
|
50
|
+
// error variant
|
|
51
|
+
const { container: errorContainer } = render(Badge, { variant: 'error' });
|
|
52
|
+
const errorBadge = errorContainer.querySelector('div');
|
|
53
|
+
expect(errorBadge).toHaveClass('bg-red-100');
|
|
54
|
+
|
|
55
|
+
// info variant
|
|
56
|
+
const { container: infoContainer } = render(Badge, { variant: 'info' });
|
|
57
|
+
const infoBadge = infoContainer.querySelector('div');
|
|
58
|
+
expect(infoBadge).toHaveClass('bg-blue-100');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('Handles case-insensitive variants', () => {
|
|
62
|
+
const { container: upperContainer } = render(Badge, { variant: 'SUCCESS' });
|
|
63
|
+
const upperBadge = upperContainer.querySelector('div');
|
|
64
|
+
expect(upperBadge).toHaveClass('bg-green-100');
|
|
65
|
+
|
|
66
|
+
const { container: mixedContainer } = render(Badge, { variant: 'Warning' });
|
|
67
|
+
const mixedBadge = mixedContainer.querySelector('div');
|
|
68
|
+
expect(mixedBadge).toHaveClass('bg-yellow-100');
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test('Falls back to neutral variant for unknown variants', () => {
|
|
72
|
+
const { container } = render(Badge, { variant: 'unknown' });
|
|
73
|
+
const badge = container.querySelector('div');
|
|
74
|
+
expect(badge).toHaveClass('bg-gray-100');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test('Shows status dot when showDot is true', () => {
|
|
78
|
+
const { container } = render(Badge, { showDot: true });
|
|
79
|
+
const dot = container.querySelector('span.rounded-full');
|
|
80
|
+
expect(dot).toBeInTheDocument();
|
|
81
|
+
expect(dot).toHaveClass('w-1.5');
|
|
82
|
+
expect(dot).toHaveClass('h-1.5');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('Does not show status dot by default', () => {
|
|
86
|
+
const { container } = render(Badge, { showDot: false });
|
|
87
|
+
const dot = container.querySelector('span.rounded-full');
|
|
88
|
+
expect(dot).not.toBeInTheDocument();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('Renders as pill shape', () => {
|
|
92
|
+
const { container } = render(Badge, { pill: true });
|
|
93
|
+
const badge = container.querySelector('div');
|
|
94
|
+
expect(badge).toHaveClass('rounded-full');
|
|
95
|
+
expect(badge).toHaveClass('min-w-5');
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('Renders with rounded shape by default', () => {
|
|
99
|
+
const { container } = render(Badge, { shape: 'rounded' });
|
|
100
|
+
const badge = container.querySelector('div');
|
|
101
|
+
expect(badge).toHaveClass('rounded');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('Renders with pill shape option', () => {
|
|
105
|
+
const { container } = render(Badge, { shape: 'pill' });
|
|
106
|
+
const badge = container.querySelector('div');
|
|
107
|
+
expect(badge).toHaveClass('rounded-full');
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('Applies custom className', () => {
|
|
111
|
+
const { container } = render(Badge, { className: 'custom-class' });
|
|
112
|
+
const badge = container.querySelector('div');
|
|
113
|
+
expect(badge).toHaveClass('custom-class');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('Applies custom text color', () => {
|
|
117
|
+
const { container } = render(Badge, { textColor: '#ff0000' });
|
|
118
|
+
const badge = container.querySelector('div');
|
|
119
|
+
// Browser may convert hex to rgb
|
|
120
|
+
expect(badge.style.color).toBeTruthy();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('Applies custom background color', () => {
|
|
124
|
+
const { container } = render(Badge, { bgColor: '#00ff00' });
|
|
125
|
+
const badge = container.querySelector('div');
|
|
126
|
+
// Browser may convert hex to rgb
|
|
127
|
+
expect(badge.style.backgroundColor).toBeTruthy();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test('Dispatches click event', async () => {
|
|
131
|
+
const user = userEvent.setup();
|
|
132
|
+
const onClickMock = vi.fn();
|
|
133
|
+
const { container } = render(Badge, { onclick: onClickMock });
|
|
134
|
+
const badge = container.querySelector('div');
|
|
135
|
+
await user.click(badge);
|
|
136
|
+
expect(onClickMock).toHaveBeenCalledOnce();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test('Gap class is present for icon spacing', () => {
|
|
140
|
+
const { container } = render(Badge);
|
|
141
|
+
const badge = container.querySelector('div');
|
|
142
|
+
expect(badge).toHaveClass('gap-1.5');
|
|
143
|
+
});
|
|
144
|
+
});
|