@windstream/react-shared-components 0.1.92 → 0.1.94
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 +635 -635
- package/dist/contentful/index.d.ts +1 -0
- package/dist/contentful/index.esm.js +2 -2
- package/dist/contentful/index.esm.js.map +1 -1
- package/dist/contentful/index.js +3 -3
- package/dist/contentful/index.js.map +1 -1
- package/dist/core.d.ts +5 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.js +1 -1
- package/package.json +191 -185
- package/src/components/accordion/Accordion.stories.tsx +230 -230
- package/src/components/accordion/index.test.tsx +270 -0
- package/src/components/accordion/index.tsx +70 -70
- package/src/components/accordion/types.ts +12 -12
- package/src/components/alert-card/AlertCard.stories.tsx +171 -171
- package/src/components/alert-card/index.test.tsx +152 -0
- package/src/components/alert-card/index.tsx +41 -41
- package/src/components/alert-card/types.ts +13 -13
- package/src/components/animation-wrapper/index.test.tsx +424 -0
- package/src/components/animation-wrapper/index.tsx +129 -129
- package/src/components/animation-wrapper/types.ts +11 -11
- package/src/components/brand-button/BrandButton.stories.tsx +223 -223
- package/src/components/brand-button/helpers.ts +35 -35
- package/src/components/brand-button/index.test.tsx +292 -0
- package/src/components/brand-button/index.tsx +120 -120
- package/src/components/brand-button/types.ts +38 -38
- package/src/components/button/Button.stories.tsx +108 -108
- package/src/components/button/index.test.tsx +91 -0
- package/src/components/button/index.tsx +27 -27
- package/src/components/button/types.ts +14 -14
- package/src/components/call-button/CallButton.stories.tsx +324 -324
- package/src/components/call-button/index.test.tsx +260 -0
- package/src/components/call-button/index.tsx +106 -106
- package/src/components/call-button/types.ts +16 -16
- package/src/components/checkbox/Checkbox.stories.tsx +247 -247
- package/src/components/checkbox/index.test.tsx +252 -0
- package/src/components/checkbox/index.tsx +197 -197
- package/src/components/checkbox/types.ts +27 -27
- package/src/components/checklist/Checklist.stories.tsx +150 -150
- package/src/components/checklist/index.test.tsx +231 -0
- package/src/components/checklist/index.tsx +96 -61
- package/src/components/checklist/types.ts +23 -17
- package/src/components/collapse/Collapse.stories.tsx +255 -255
- package/src/components/collapse/index.test.tsx +277 -0
- package/src/components/collapse/index.tsx +47 -46
- package/src/components/collapse/types.ts +6 -6
- package/src/components/divider/Divider.stories.tsx +205 -205
- package/src/components/divider/index.test.tsx +53 -0
- package/src/components/divider/index.tsx +22 -22
- package/src/components/divider/type.ts +3 -3
- package/src/components/image/Image.stories.tsx +113 -113
- package/src/components/image/index.test.tsx +174 -0
- package/src/components/image/index.tsx +25 -25
- package/src/components/image/types.ts +40 -40
- package/src/components/input/Input.stories.tsx +325 -325
- package/src/components/input/index.test.tsx +348 -0
- package/src/components/input/index.tsx +177 -177
- package/src/components/input/types.ts +37 -37
- package/src/components/link/Link.stories.tsx +163 -163
- package/src/components/link/index.test.tsx +199 -0
- package/src/components/link/index.tsx +116 -116
- package/src/components/link/types.ts +25 -25
- package/src/components/list/List.stories.tsx +272 -272
- package/src/components/list/index.test.tsx +166 -0
- package/src/components/list/index.tsx +88 -88
- package/src/components/list/list-item/index.tsx +38 -38
- package/src/components/list/list-item/types.ts +13 -13
- package/src/components/list/types.ts +29 -29
- package/src/components/material-icon/MaterialIcon.stories.tsx +322 -322
- package/src/components/material-icon/constants.ts +99 -99
- package/src/components/material-icon/index.test.tsx +130 -0
- package/src/components/material-icon/index.tsx +47 -47
- package/src/components/material-icon/types.ts +31 -31
- package/src/components/modal/Modal.stories.tsx +171 -171
- package/src/components/modal/index.test.tsx +310 -0
- package/src/components/modal/index.tsx +164 -164
- package/src/components/modal/types.ts +24 -24
- package/src/components/next-image/index.test.tsx +406 -0
- package/src/components/next-image/index.tsx +74 -74
- package/src/components/next-image/types.ts +1 -1
- package/src/components/pagination/index.test.tsx +521 -0
- package/src/components/pagination/index.tsx +91 -91
- package/src/components/pagination/types.ts +6 -6
- package/src/components/radio-button/RadioButton.stories.tsx +307 -307
- package/src/components/radio-button/index.test.tsx +151 -0
- package/src/components/radio-button/index.tsx +75 -75
- package/src/components/radio-button/types.ts +21 -21
- package/src/components/see-more/SeeMore.stories.tsx +181 -181
- package/src/components/see-more/index.test.tsx +96 -0
- package/src/components/see-more/index.tsx +44 -44
- package/src/components/see-more/types.ts +4 -4
- package/src/components/select/Select.stories.tsx +411 -411
- package/src/components/select/index.test.tsx +256 -0
- package/src/components/select/index.tsx +155 -155
- package/src/components/select/types.ts +36 -36
- package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
- package/src/components/select-plan-button/index.test.tsx +173 -0
- package/src/components/select-plan-button/index.tsx +63 -63
- package/src/components/select-plan-button/types.ts +17 -17
- package/src/components/skeleton/Skeleton.stories.tsx +179 -179
- package/src/components/skeleton/index.test.tsx +74 -0
- package/src/components/skeleton/index.tsx +61 -61
- package/src/components/skeleton/types.ts +4 -4
- package/src/components/spinner/Spinner.stories.tsx +335 -335
- package/src/components/spinner/index.test.tsx +76 -0
- package/src/components/spinner/index.tsx +44 -44
- package/src/components/spinner/types.ts +5 -5
- package/src/components/text/Text.stories.tsx +321 -321
- package/src/components/text/index.test.tsx +65 -0
- package/src/components/text/index.tsx +25 -25
- package/src/components/text/types.ts +45 -45
- package/src/components/tooltip/Tooltip.stories.tsx +219 -219
- package/src/components/tooltip/index.test.tsx +50 -0
- package/src/components/tooltip/index.tsx +74 -74
- package/src/components/tooltip/types.ts +7 -7
- package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
- package/src/components/view-cart-button/index.test.tsx +57 -0
- package/src/components/view-cart-button/index.tsx +42 -42
- package/src/components/view-cart-button/types.ts +5 -5
- package/src/contentful/blocks/accordion/Accordion.stories.mocks.tsx +128 -128
- package/src/contentful/blocks/accordion/Accordion.stories.tsx +98 -98
- package/src/contentful/blocks/accordion/index.test.tsx +218 -0
- package/src/contentful/blocks/accordion/index.tsx +114 -112
- package/src/contentful/blocks/accordion/types.ts +34 -34
- package/src/contentful/blocks/address-input-banner/index.test.tsx +132 -0
- package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
- package/src/contentful/blocks/address-input-banner/types.ts +14 -14
- package/src/contentful/blocks/anchored-bottom-banner/index.test.tsx +287 -0
- package/src/contentful/blocks/anchored-bottom-banner/index.tsx +181 -181
- package/src/contentful/blocks/anchored-bottom-banner/types.ts +13 -13
- package/src/contentful/blocks/blogs-grid/BlogGrid.stories.mocks.tsx +144 -144
- package/src/contentful/blocks/blogs-grid/BlogGrid.stories.tsx +157 -156
- package/src/contentful/blocks/blogs-grid/index.test.tsx +355 -0
- package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
- package/src/contentful/blocks/blogs-grid/types.ts +26 -26
- package/src/contentful/blocks/blogs-grid-base/index.test.tsx +274 -0
- package/src/contentful/blocks/blogs-grid-base/index.tsx +119 -119
- package/src/contentful/blocks/blogs-grid-base/types.ts +36 -36
- package/src/contentful/blocks/breadcrumbs/BreadcrumbNavigation.stories.tsx +147 -147
- package/src/contentful/blocks/breadcrumbs/index.test.tsx +281 -0
- package/src/contentful/blocks/breadcrumbs/index.tsx +95 -95
- package/src/contentful/blocks/breadcrumbs/types.ts +8 -8
- package/src/contentful/blocks/button/Button.stories.tsx +40 -40
- package/src/contentful/blocks/button/index.test.tsx +339 -0
- package/src/contentful/blocks/button/index.tsx +131 -131
- package/src/contentful/blocks/button/types.ts +39 -39
- package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
- package/src/contentful/blocks/callout/index.test.tsx +539 -0
- package/src/contentful/blocks/callout/index.tsx +277 -277
- package/src/contentful/blocks/callout/types.ts +78 -78
- package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
- package/src/contentful/blocks/cards/blog-card/index.test.tsx +218 -0
- package/src/contentful/blocks/cards/blog-card/index.tsx +129 -129
- package/src/contentful/blocks/cards/blog-card/types.ts +34 -34
- package/src/contentful/blocks/cards/floating-image-card/index.test.tsx +201 -0
- package/src/contentful/blocks/cards/floating-image-card/index.tsx +119 -119
- package/src/contentful/blocks/cards/floating-image-card/types.ts +30 -30
- package/src/contentful/blocks/cards/full-image-card/index.test.tsx +216 -0
- package/src/contentful/blocks/cards/full-image-card/index.tsx +130 -130
- package/src/contentful/blocks/cards/full-image-card/types.ts +29 -29
- package/src/contentful/blocks/cards/index.test.tsx +39 -0
- package/src/contentful/blocks/cards/index.tsx +13 -13
- package/src/contentful/blocks/cards/product-card/index.test.tsx +263 -0
- package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
- package/src/contentful/blocks/cards/product-card/types.ts +28 -28
- package/src/contentful/blocks/cards/simple-card/index.test.tsx +364 -0
- package/src/contentful/blocks/cards/simple-card/index.tsx +325 -325
- package/src/contentful/blocks/cards/simple-card/types.ts +71 -71
- package/src/contentful/blocks/cards/testimonial-card/index.test.tsx +180 -0
- package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
- package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
- package/src/contentful/blocks/cards/types.ts +1 -1
- package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
- package/src/contentful/blocks/carousel/helper.test.tsx +539 -0
- package/src/contentful/blocks/carousel/helper.tsx +494 -494
- package/src/contentful/blocks/carousel/index.test.tsx +308 -0
- package/src/contentful/blocks/carousel/index.tsx +87 -87
- package/src/contentful/blocks/carousel/types.test.ts +16 -0
- package/src/contentful/blocks/carousel/types.ts +145 -145
- package/src/contentful/blocks/cart-retention-banner/index.test.tsx +409 -0
- package/src/contentful/blocks/cart-retention-banner/index.tsx +109 -109
- package/src/contentful/blocks/cart-retention-banner/types.ts +11 -11
- package/src/contentful/blocks/comparison-table/index.test.tsx +114 -0
- package/src/contentful/blocks/comparison-table/index.tsx +29 -29
- package/src/contentful/blocks/comparison-table/types.ts +6 -6
- package/src/contentful/blocks/cookiebanner/index.test.tsx +277 -0
- package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
- package/src/contentful/blocks/cookiebanner/type.ts +7 -7
- package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
- package/src/contentful/blocks/cta-callout/index.test.tsx +244 -0
- package/src/contentful/blocks/cta-callout/index.tsx +73 -73
- package/src/contentful/blocks/cta-callout/types.ts +26 -26
- package/src/contentful/blocks/dynamic-tabs/index.test.tsx +240 -0
- package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
- package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
- package/src/contentful/blocks/email-input-block/index.test.tsx +213 -0
- package/src/contentful/blocks/email-input-block/index.tsx +121 -116
- package/src/contentful/blocks/email-input-block/types.ts +16 -16
- package/src/contentful/blocks/find-kinetic/FindKinetic.stories.tsx +23 -23
- package/src/contentful/blocks/find-kinetic/index.test.tsx +269 -0
- package/src/contentful/blocks/find-kinetic/index.tsx +138 -130
- package/src/contentful/blocks/find-kinetic/types.ts +20 -19
- package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
- package/src/contentful/blocks/floating-banner/index.test.tsx +246 -0
- package/src/contentful/blocks/floating-banner/index.tsx +97 -97
- package/src/contentful/blocks/floating-banner/types.ts +22 -22
- package/src/contentful/blocks/footer/Footer.stories.tsx +317 -317
- package/src/contentful/blocks/footer/index.test.tsx +302 -0
- package/src/contentful/blocks/footer/index.tsx +91 -91
- package/src/contentful/blocks/footer/types.ts +13 -13
- package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
- package/src/contentful/blocks/image-promo-bar/helper.test.tsx +61 -0
- package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
- package/src/contentful/blocks/image-promo-bar/index.test.tsx +467 -0
- package/src/contentful/blocks/image-promo-bar/index.tsx +246 -246
- package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.test.tsx +142 -0
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
- package/src/contentful/blocks/image-promo-bar/youtube-embed.test.tsx +104 -0
- package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -46
- package/src/contentful/blocks/modal/constants.ts +53 -53
- package/src/contentful/blocks/modal/index.test.tsx +209 -0
- package/src/contentful/blocks/modal/index.tsx +108 -108
- package/src/contentful/blocks/modal/types.ts +12 -12
- package/src/contentful/blocks/navigation/Navigation.stories.mocks.tsx +78 -0
- package/src/contentful/blocks/navigation/Navigation.stories.tsx +138 -0
- package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.test.tsx +208 -0
- package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +141 -139
- package/src/contentful/blocks/navigation/index.test.tsx +924 -0
- package/src/contentful/blocks/navigation/index.tsx +569 -568
- package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.test.tsx +131 -0
- package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
- package/src/contentful/blocks/navigation/types.ts +71 -71
- package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
- package/src/contentful/blocks/primary-hero/index.test.tsx +286 -0
- package/src/contentful/blocks/primary-hero/index.tsx +239 -236
- package/src/contentful/blocks/primary-hero/types.ts +37 -37
- package/src/contentful/blocks/search-block/index.test.tsx +268 -0
- package/src/contentful/blocks/search-block/index.tsx +90 -90
- package/src/contentful/blocks/search-block/types.ts +15 -15
- package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
- package/src/contentful/blocks/shape-background-wrapper/index.test.tsx +284 -0
- package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
- package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
- package/src/contentful/blocks/text/Text.stories.tsx +23 -23
- package/src/contentful/blocks/text/index.test.tsx +36 -0
- package/src/contentful/blocks/text/index.tsx +12 -12
- package/src/contentful/blocks/text/types.ts +1 -1
- package/src/contentful/index.test.ts +45 -0
- package/src/contentful/index.ts +105 -105
- package/src/global-mocks/contentful/to-document.ts +25 -0
- package/src/global-mocks/cookie.ts +48 -0
- package/src/global-mocks/cx.ts +37 -0
- package/src/global-mocks/index.ts +89 -0
- package/src/global-mocks/speed-card-bg.ts +27 -0
- package/src/global-mocks/utm.ts +49 -0
- package/src/hooks/contentful/use-contentful-rich-text.test.tsx +1758 -0
- package/src/hooks/contentful/use-contentful-rich-text.tsx +309 -309
- package/src/hooks/contentful/use-processed-check-list.test.tsx +277 -0
- package/src/hooks/contentful/use-processed-check-list.ts +63 -63
- package/src/hooks/use-body-scroll-lock.test.ts +134 -0
- package/src/hooks/use-body-scroll-lock.ts +34 -34
- package/src/hooks/use-carousel-swipe.test.ts +393 -0
- package/src/hooks/use-carousel-swipe.ts +264 -264
- package/src/hooks/use-outside-click.test.ts +142 -0
- package/src/hooks/use-outside-click.ts +17 -17
- package/src/index.ts +107 -107
- package/src/next/index.test.ts +7 -0
- package/src/next/index.ts +5 -5
- package/src/setupTests.ts +52 -46
- package/src/stories/DocsTemplate.tsx +24 -24
- package/src/styles/globals.css +343 -343
- package/src/types/global.d.ts +9 -9
- package/src/types/micro-components.ts +99 -99
- package/src/types/utm.ts +49 -49
- package/src/utils/contentful/to-document.test.ts +85 -0
- package/src/utils/contentful/to-document.ts +24 -24
- package/src/utils/cookie.test.ts +180 -0
- package/src/utils/cookie.ts +84 -84
- package/src/utils/cx.test.ts +90 -0
- package/src/utils/cx.ts +49 -49
- package/src/utils/index.test.ts +115 -0
- package/src/utils/index.ts +41 -41
- package/src/utils/speed-card-bg.test.ts +46 -0
- package/src/utils/speed-card-bg.ts +24 -24
- package/src/utils/utm.test.ts +359 -0
- package/src/utils/utm.ts +221 -221
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { InputHTMLAttributes, ReactNode } from "react";
|
|
2
|
-
|
|
3
|
-
type InfoIconProps = {
|
|
4
|
-
onClick?: () => void;
|
|
5
|
-
dataTestId?: string;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export type CheckboxProps = {
|
|
9
|
-
checked?: boolean;
|
|
10
|
-
onChange?: ((isChecked: boolean) => void) | (() => void);
|
|
11
|
-
state?: "default" | "focus" | "disabled";
|
|
12
|
-
className?: string;
|
|
13
|
-
containerClassName?: string;
|
|
14
|
-
label?: string | ReactNode;
|
|
15
|
-
labelClassName?: string;
|
|
16
|
-
name?: string;
|
|
17
|
-
value?: string | number | boolean;
|
|
18
|
-
id?: string;
|
|
19
|
-
disabled?: boolean;
|
|
20
|
-
required?: boolean;
|
|
21
|
-
error?: boolean;
|
|
22
|
-
"data-cy"?: string;
|
|
23
|
-
renderInfoIcon?: InfoIconProps;
|
|
24
|
-
} & Omit<
|
|
25
|
-
InputHTMLAttributes<HTMLInputElement>,
|
|
26
|
-
"type" | "checked" | "onChange"
|
|
27
|
-
>;
|
|
1
|
+
import { InputHTMLAttributes, ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
type InfoIconProps = {
|
|
4
|
+
onClick?: () => void;
|
|
5
|
+
dataTestId?: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type CheckboxProps = {
|
|
9
|
+
checked?: boolean;
|
|
10
|
+
onChange?: ((isChecked: boolean) => void) | (() => void);
|
|
11
|
+
state?: "default" | "focus" | "disabled";
|
|
12
|
+
className?: string;
|
|
13
|
+
containerClassName?: string;
|
|
14
|
+
label?: string | ReactNode;
|
|
15
|
+
labelClassName?: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
value?: string | number | boolean;
|
|
18
|
+
id?: string;
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
error?: boolean;
|
|
22
|
+
"data-cy"?: string;
|
|
23
|
+
renderInfoIcon?: InfoIconProps;
|
|
24
|
+
} & Omit<
|
|
25
|
+
InputHTMLAttributes<HTMLInputElement>,
|
|
26
|
+
"type" | "checked" | "onChange"
|
|
27
|
+
>;
|
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
import { Checklist } from "./index";
|
|
2
|
-
|
|
3
|
-
import { DocsPage } from "@shared/stories/DocsTemplate";
|
|
4
|
-
import type { Meta, StoryObj } from "@storybook/react";
|
|
5
|
-
|
|
6
|
-
const meta: Meta<typeof Checklist> = {
|
|
7
|
-
title: "Components/Checklist",
|
|
8
|
-
component: Checklist,
|
|
9
|
-
tags: ["autodocs"],
|
|
10
|
-
parameters: {
|
|
11
|
-
layout: "centered",
|
|
12
|
-
docs: {
|
|
13
|
-
page: DocsPage,
|
|
14
|
-
description: {
|
|
15
|
-
component:
|
|
16
|
-
"A checklist component that displays a list of items with icons, typically used for feature lists or task lists.",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
argTypes: {
|
|
21
|
-
items: {
|
|
22
|
-
control: { type: "object" },
|
|
23
|
-
description: "Array of strings to display as checklist items",
|
|
24
|
-
},
|
|
25
|
-
listIconName: {
|
|
26
|
-
control: { type: "select" },
|
|
27
|
-
options: ["check"],
|
|
28
|
-
description: "Icon name to display for each item",
|
|
29
|
-
},
|
|
30
|
-
listItemClassName: {
|
|
31
|
-
control: { type: "text" },
|
|
32
|
-
description: "Additional CSS classes for list items",
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
args: {
|
|
36
|
-
items: ["Feature 1", "Feature 2", "Feature 3"],
|
|
37
|
-
listIconName: "check",
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export default meta;
|
|
42
|
-
type Story = StoryObj<typeof meta>;
|
|
43
|
-
|
|
44
|
-
// Default checklist
|
|
45
|
-
export const Default: Story = {
|
|
46
|
-
args: {},
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
// With items
|
|
50
|
-
export const WithItems: Story = {
|
|
51
|
-
args: {
|
|
52
|
-
items: [
|
|
53
|
-
"High-speed internet connection",
|
|
54
|
-
"24/7 customer support",
|
|
55
|
-
"No data caps",
|
|
56
|
-
"Free installation",
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
// Custom icon
|
|
62
|
-
export const CustomIcon: Story = {
|
|
63
|
-
args: {
|
|
64
|
-
items: ["Item 1", "Item 2", "Item 3"],
|
|
65
|
-
listIconName: "check",
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// Custom styling
|
|
70
|
-
export const CustomStyling: Story = {
|
|
71
|
-
args: {
|
|
72
|
-
items: ["Styled item 1", "Styled item 2", "Styled item 3"],
|
|
73
|
-
listItemClassName: "body1 text-text-brand",
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
// Long list
|
|
78
|
-
export const LongList: Story = {
|
|
79
|
-
args: {
|
|
80
|
-
items: [
|
|
81
|
-
"Feature one with a longer description",
|
|
82
|
-
"Feature two",
|
|
83
|
-
"Feature three",
|
|
84
|
-
"Feature four",
|
|
85
|
-
"Feature five",
|
|
86
|
-
"Feature six",
|
|
87
|
-
"Feature seven",
|
|
88
|
-
"Feature eight",
|
|
89
|
-
],
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
// Single item
|
|
94
|
-
export const SingleItem: Story = {
|
|
95
|
-
args: {
|
|
96
|
-
items: ["Single checklist item"],
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
// Empty state (should not render)
|
|
101
|
-
export const Empty: Story = {
|
|
102
|
-
args: {
|
|
103
|
-
items: [],
|
|
104
|
-
},
|
|
105
|
-
parameters: {
|
|
106
|
-
docs: {
|
|
107
|
-
description: {
|
|
108
|
-
story: "Checklist with no items (component returns null).",
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
// All variants showcase
|
|
115
|
-
export const AllVariants: Story = {
|
|
116
|
-
render: () => (
|
|
117
|
-
<div className="space-y-8">
|
|
118
|
-
<div>
|
|
119
|
-
<h3 className="mb-3 text-lg font-semibold">Default Checklist</h3>
|
|
120
|
-
<Checklist items={["Item 1", "Item 2", "Item 3"]} />
|
|
121
|
-
</div>
|
|
122
|
-
<div>
|
|
123
|
-
<h3 className="mb-3 text-lg font-semibold">Custom Styled</h3>
|
|
124
|
-
<Checklist
|
|
125
|
-
items={["Styled item 1", "Styled item 2"]}
|
|
126
|
-
listItemClassName="body1 font-semibold"
|
|
127
|
-
/>
|
|
128
|
-
</div>
|
|
129
|
-
<div>
|
|
130
|
-
<h3 className="mb-3 text-lg font-semibold">Long List</h3>
|
|
131
|
-
<Checklist
|
|
132
|
-
items={[
|
|
133
|
-
"Feature one",
|
|
134
|
-
"Feature two",
|
|
135
|
-
"Feature three",
|
|
136
|
-
"Feature four",
|
|
137
|
-
"Feature five",
|
|
138
|
-
]}
|
|
139
|
-
/>
|
|
140
|
-
</div>
|
|
141
|
-
</div>
|
|
142
|
-
),
|
|
143
|
-
parameters: {
|
|
144
|
-
docs: {
|
|
145
|
-
description: {
|
|
146
|
-
story: "Showcase of all checklist variants and styling options.",
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
};
|
|
1
|
+
import { Checklist } from "./index";
|
|
2
|
+
|
|
3
|
+
import { DocsPage } from "@shared/stories/DocsTemplate";
|
|
4
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof Checklist> = {
|
|
7
|
+
title: "Components/Checklist",
|
|
8
|
+
component: Checklist,
|
|
9
|
+
tags: ["autodocs"],
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: "centered",
|
|
12
|
+
docs: {
|
|
13
|
+
page: DocsPage,
|
|
14
|
+
description: {
|
|
15
|
+
component:
|
|
16
|
+
"A checklist component that displays a list of items with icons, typically used for feature lists or task lists.",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
argTypes: {
|
|
21
|
+
items: {
|
|
22
|
+
control: { type: "object" },
|
|
23
|
+
description: "Array of strings to display as checklist items",
|
|
24
|
+
},
|
|
25
|
+
listIconName: {
|
|
26
|
+
control: { type: "select" },
|
|
27
|
+
options: ["check"],
|
|
28
|
+
description: "Icon name to display for each item",
|
|
29
|
+
},
|
|
30
|
+
listItemClassName: {
|
|
31
|
+
control: { type: "text" },
|
|
32
|
+
description: "Additional CSS classes for list items",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
args: {
|
|
36
|
+
items: ["Feature 1", "Feature 2", "Feature 3"],
|
|
37
|
+
listIconName: "check",
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export default meta;
|
|
42
|
+
type Story = StoryObj<typeof meta>;
|
|
43
|
+
|
|
44
|
+
// Default checklist
|
|
45
|
+
export const Default: Story = {
|
|
46
|
+
args: {},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// With items
|
|
50
|
+
export const WithItems: Story = {
|
|
51
|
+
args: {
|
|
52
|
+
items: [
|
|
53
|
+
"High-speed internet connection",
|
|
54
|
+
"24/7 customer support",
|
|
55
|
+
"No data caps",
|
|
56
|
+
"Free installation",
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Custom icon
|
|
62
|
+
export const CustomIcon: Story = {
|
|
63
|
+
args: {
|
|
64
|
+
items: ["Item 1", "Item 2", "Item 3"],
|
|
65
|
+
listIconName: "check",
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// Custom styling
|
|
70
|
+
export const CustomStyling: Story = {
|
|
71
|
+
args: {
|
|
72
|
+
items: ["Styled item 1", "Styled item 2", "Styled item 3"],
|
|
73
|
+
listItemClassName: "body1 text-text-brand",
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Long list
|
|
78
|
+
export const LongList: Story = {
|
|
79
|
+
args: {
|
|
80
|
+
items: [
|
|
81
|
+
"Feature one with a longer description",
|
|
82
|
+
"Feature two",
|
|
83
|
+
"Feature three",
|
|
84
|
+
"Feature four",
|
|
85
|
+
"Feature five",
|
|
86
|
+
"Feature six",
|
|
87
|
+
"Feature seven",
|
|
88
|
+
"Feature eight",
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// Single item
|
|
94
|
+
export const SingleItem: Story = {
|
|
95
|
+
args: {
|
|
96
|
+
items: ["Single checklist item"],
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// Empty state (should not render)
|
|
101
|
+
export const Empty: Story = {
|
|
102
|
+
args: {
|
|
103
|
+
items: [],
|
|
104
|
+
},
|
|
105
|
+
parameters: {
|
|
106
|
+
docs: {
|
|
107
|
+
description: {
|
|
108
|
+
story: "Checklist with no items (component returns null).",
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// All variants showcase
|
|
115
|
+
export const AllVariants: Story = {
|
|
116
|
+
render: () => (
|
|
117
|
+
<div className="space-y-8">
|
|
118
|
+
<div>
|
|
119
|
+
<h3 className="mb-3 text-lg font-semibold">Default Checklist</h3>
|
|
120
|
+
<Checklist items={["Item 1", "Item 2", "Item 3"]} />
|
|
121
|
+
</div>
|
|
122
|
+
<div>
|
|
123
|
+
<h3 className="mb-3 text-lg font-semibold">Custom Styled</h3>
|
|
124
|
+
<Checklist
|
|
125
|
+
items={["Styled item 1", "Styled item 2"]}
|
|
126
|
+
listItemClassName="body1 font-semibold"
|
|
127
|
+
/>
|
|
128
|
+
</div>
|
|
129
|
+
<div>
|
|
130
|
+
<h3 className="mb-3 text-lg font-semibold">Long List</h3>
|
|
131
|
+
<Checklist
|
|
132
|
+
items={[
|
|
133
|
+
"Feature one",
|
|
134
|
+
"Feature two",
|
|
135
|
+
"Feature three",
|
|
136
|
+
"Feature four",
|
|
137
|
+
"Feature five",
|
|
138
|
+
]}
|
|
139
|
+
/>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
),
|
|
143
|
+
parameters: {
|
|
144
|
+
docs: {
|
|
145
|
+
description: {
|
|
146
|
+
story: "Showcase of all checklist variants and styling options.",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
};
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/// <reference types="@testing-library/jest-dom" />
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Checklist } from "./index";
|
|
4
|
+
|
|
5
|
+
import { render, screen } from "@testing-library/react";
|
|
6
|
+
|
|
7
|
+
jest.mock("@shared/components/list", () => ({
|
|
8
|
+
List: ({
|
|
9
|
+
children,
|
|
10
|
+
className,
|
|
11
|
+
}: {
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
className?: string;
|
|
14
|
+
}) => (
|
|
15
|
+
<ul data-testid="list" className={className}>
|
|
16
|
+
{children}
|
|
17
|
+
</ul>
|
|
18
|
+
),
|
|
19
|
+
ListItem: ({
|
|
20
|
+
children,
|
|
21
|
+
className,
|
|
22
|
+
}: {
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
className?: string;
|
|
25
|
+
}) => (
|
|
26
|
+
<li data-testid="list-item" className={className}>
|
|
27
|
+
{children}
|
|
28
|
+
</li>
|
|
29
|
+
),
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
jest.mock("@shared/components/material-icon", () => ({
|
|
33
|
+
MaterialIcon: ({
|
|
34
|
+
name,
|
|
35
|
+
size,
|
|
36
|
+
color,
|
|
37
|
+
className,
|
|
38
|
+
}: {
|
|
39
|
+
name: string;
|
|
40
|
+
size?: number;
|
|
41
|
+
color?: string;
|
|
42
|
+
className?: string;
|
|
43
|
+
}) => (
|
|
44
|
+
<span
|
|
45
|
+
data-testid={`icon-${name}`}
|
|
46
|
+
data-size={size}
|
|
47
|
+
data-color={color}
|
|
48
|
+
className={className}
|
|
49
|
+
>
|
|
50
|
+
{name}
|
|
51
|
+
</span>
|
|
52
|
+
),
|
|
53
|
+
}));
|
|
54
|
+
|
|
55
|
+
jest.mock("@shared/components/text", () => ({
|
|
56
|
+
Text: ({
|
|
57
|
+
children,
|
|
58
|
+
}: {
|
|
59
|
+
children: React.ReactNode;
|
|
60
|
+
as?: React.ElementType;
|
|
61
|
+
}) => <div data-testid="text-component">{children}</div>,
|
|
62
|
+
}));
|
|
63
|
+
|
|
64
|
+
jest.mock("@shared/utils/cx", () => ({
|
|
65
|
+
cx: (...args: unknown[]) => args.filter(Boolean).join(" "),
|
|
66
|
+
}));
|
|
67
|
+
|
|
68
|
+
describe("Checklist", () => {
|
|
69
|
+
describe("rendering", () => {
|
|
70
|
+
it("renders null when items is empty", () => {
|
|
71
|
+
const { container } = render(<Checklist items={[]} />);
|
|
72
|
+
expect(container.firstChild).toBeNull();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("renders null when items is undefined", () => {
|
|
76
|
+
const { container } = render(
|
|
77
|
+
<Checklist items={undefined as unknown as React.ReactNode[]} />
|
|
78
|
+
);
|
|
79
|
+
expect(container.firstChild).toBeNull();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("renders a list with items", () => {
|
|
83
|
+
render(<Checklist items={["Item 1", "Item 2", "Item 3"]} />);
|
|
84
|
+
const listItems = screen.getAllByTestId("list-item");
|
|
85
|
+
expect(listItems).toHaveLength(3);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("renders item text content", () => {
|
|
89
|
+
render(<Checklist items={["First item", "Second item"]} />);
|
|
90
|
+
expect(screen.getByText("First item")).toBeInTheDocument();
|
|
91
|
+
expect(screen.getByText("Second item")).toBeInTheDocument();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("renders ReactNode items", () => {
|
|
95
|
+
render(
|
|
96
|
+
<Checklist
|
|
97
|
+
items={[
|
|
98
|
+
<strong key="1">Bold item</strong>,
|
|
99
|
+
<em key="2">Italic item</em>,
|
|
100
|
+
]}
|
|
101
|
+
/>
|
|
102
|
+
);
|
|
103
|
+
expect(screen.getByText("Bold item")).toBeInTheDocument();
|
|
104
|
+
expect(screen.getByText("Italic item")).toBeInTheDocument();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("applies displayName correctly", () => {
|
|
108
|
+
expect(Checklist.displayName).toBe("Checklist");
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
describe("icons", () => {
|
|
113
|
+
it("renders check icons by default", () => {
|
|
114
|
+
render(<Checklist items={["Item 1"]} />);
|
|
115
|
+
expect(screen.getByTestId("icon-check")).toBeInTheDocument();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("renders custom icon name", () => {
|
|
119
|
+
render(<Checklist items={["Item 1"]} listIconName="check" />);
|
|
120
|
+
expect(screen.getByTestId("icon-check")).toBeInTheDocument();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("does not render icons when listIconName is disc", () => {
|
|
124
|
+
render(<Checklist items={["Item 1"]} listIconName="disc" />);
|
|
125
|
+
expect(screen.queryByTestId("icon-check")).not.toBeInTheDocument();
|
|
126
|
+
expect(screen.queryByTestId("icon-disc")).not.toBeInTheDocument();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("passes correct iconSize to MaterialIcon", () => {
|
|
130
|
+
render(<Checklist items={["Item"]} iconSize={32} />);
|
|
131
|
+
const icon = screen.getByTestId("icon-check");
|
|
132
|
+
expect(icon).toHaveAttribute("data-size", "32");
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it("uses default iconSize of 20", () => {
|
|
136
|
+
render(<Checklist items={["Item"]} />);
|
|
137
|
+
const icon = screen.getByTestId("icon-check");
|
|
138
|
+
expect(icon).toHaveAttribute("data-size", "20");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
describe("icon colors", () => {
|
|
143
|
+
it("applies green color by default", () => {
|
|
144
|
+
render(<Checklist items={["Item"]} />);
|
|
145
|
+
const icon = screen.getByTestId("icon-check");
|
|
146
|
+
expect(icon).toHaveAttribute("data-color", "#209A61");
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("applies yellow color", () => {
|
|
150
|
+
render(<Checklist items={["Item"]} iconColor="yellow" />);
|
|
151
|
+
const icon = screen.getByTestId("icon-check");
|
|
152
|
+
expect(icon).toHaveAttribute("data-color", "#F5FF36");
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it("applies blue color", () => {
|
|
156
|
+
render(<Checklist items={["Item"]} iconColor="blue" />);
|
|
157
|
+
const icon = screen.getByTestId("icon-check");
|
|
158
|
+
expect(icon).toHaveAttribute("data-color", "#0393BA");
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
describe("icon position", () => {
|
|
163
|
+
it("applies items-center by default (center position)", () => {
|
|
164
|
+
render(<Checklist items={["Item"]} />);
|
|
165
|
+
const listItem = screen.getByTestId("list-item");
|
|
166
|
+
expect(listItem.className).toContain("items-center");
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it("applies items-start for top position", () => {
|
|
170
|
+
render(<Checklist items={["Item"]} iconPosition="top" />);
|
|
171
|
+
const listItem = screen.getByTestId("list-item");
|
|
172
|
+
expect(listItem.className).toContain("items-start");
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it("applies mt-1 to icon when position is top", () => {
|
|
176
|
+
render(<Checklist items={["Item"]} iconPosition="top" />);
|
|
177
|
+
const icon = screen.getByTestId("icon-check");
|
|
178
|
+
expect(icon.className).toContain("mt-1");
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("does not apply mt-1 to icon when position is center", () => {
|
|
182
|
+
render(<Checklist items={["Item"]} iconPosition="center" />);
|
|
183
|
+
const icon = screen.getByTestId("icon-check");
|
|
184
|
+
expect(icon.className).not.toContain("mt-1");
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe("classNames", () => {
|
|
189
|
+
it("applies listContainerClassName to the List", () => {
|
|
190
|
+
render(
|
|
191
|
+
<Checklist items={["Item"]} listContainerClassName="custom-list" />
|
|
192
|
+
);
|
|
193
|
+
const list = screen.getByTestId("list");
|
|
194
|
+
expect(list.className).toContain("custom-list");
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it("applies listItemClassName to ListItems", () => {
|
|
198
|
+
render(
|
|
199
|
+
<Checklist
|
|
200
|
+
items={["Item 1", "Item 2"]}
|
|
201
|
+
listItemClassName="custom-item"
|
|
202
|
+
/>
|
|
203
|
+
);
|
|
204
|
+
const items = screen.getAllByTestId("list-item");
|
|
205
|
+
items.forEach(item => {
|
|
206
|
+
expect(item.className).toContain("custom-item");
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("applies iconClassName to the icon", () => {
|
|
211
|
+
render(<Checklist items={["Item"]} iconClassName="custom-icon" />);
|
|
212
|
+
const icon = screen.getByTestId("icon-check");
|
|
213
|
+
expect(icon.className).toContain("custom-icon");
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
describe("list variant", () => {
|
|
218
|
+
it("uses unstyled variant when icons are shown", () => {
|
|
219
|
+
render(<Checklist items={["Item"]} />);
|
|
220
|
+
// With icons (default check), the list items should have flex class
|
|
221
|
+
const listItem = screen.getByTestId("list-item");
|
|
222
|
+
expect(listItem.className).toContain("flex");
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it("does not apply flex class when using disc variant", () => {
|
|
226
|
+
render(<Checklist items={["Item"]} listIconName="disc" />);
|
|
227
|
+
const listItem = screen.getByTestId("list-item");
|
|
228
|
+
expect(listItem.className).not.toContain("flex");
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
});
|