@windstream/react-shared-components 0.0.10 → 0.0.11
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 +623 -623
- package/dist/contentful/index.d.ts +6 -2
- package/dist/contentful/index.esm.js +1 -1
- package/dist/contentful/index.esm.js.map +1 -1
- package/dist/contentful/index.js +1 -1
- package/dist/contentful/index.js.map +1 -1
- package/dist/core.d.ts +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +159 -159
- package/src/components/accordion/Accordion.stories.tsx +225 -225
- package/src/components/accordion/index.tsx +36 -36
- package/src/components/accordion/types.ts +9 -9
- package/src/components/alert-card/types.ts +9 -9
- package/src/components/brand-button/BrandButton.stories.tsx +221 -221
- package/src/components/brand-button/helpers.ts +35 -35
- package/src/components/brand-button/index.tsx +90 -90
- package/src/components/brand-button/types.ts +26 -26
- package/src/components/button/Button.stories.tsx +108 -108
- package/src/components/button/index.tsx +23 -23
- package/src/components/button/types.ts +14 -14
- package/src/components/call-button/CallButton.stories.tsx +324 -324
- package/src/components/call-button/index.tsx +80 -80
- package/src/components/call-button/types.ts +9 -9
- package/src/components/checkbox/Checkbox.stories.tsx +248 -248
- package/src/components/checkbox/types.ts +23 -23
- package/src/components/checklist/Checklist.stories.tsx +151 -151
- package/src/components/checklist/index.tsx +33 -33
- package/src/components/checklist/types.ts +5 -5
- package/src/components/collapse/Collapse.stories.tsx +256 -256
- package/src/components/collapse/index.tsx +44 -44
- package/src/components/collapse/types.ts +5 -5
- package/src/components/divider/Divider.stories.tsx +206 -206
- package/src/components/divider/index.tsx +23 -23
- package/src/components/divider/type.ts +2 -2
- package/src/components/input/Input.stories.tsx +358 -358
- package/src/components/input/index.tsx +174 -174
- package/src/components/input/types.ts +36 -36
- package/src/components/link/Link.stories.tsx +163 -163
- package/src/components/link/index.tsx +96 -96
- package/src/components/link/types.ts +25 -25
- package/src/components/list/List.stories.tsx +272 -272
- package/src/components/list/index.tsx +86 -86
- package/src/components/list/list-item/index.tsx +36 -36
- 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 +330 -330
- package/src/components/material-icon/constants.ts +95 -95
- package/src/components/material-icon/index.tsx +44 -44
- package/src/components/material-icon/types.ts +31 -31
- package/src/components/modal/Modal.stories.tsx +171 -171
- package/src/components/modal/index.tsx +168 -168
- package/src/components/modal/types.ts +23 -23
- package/src/components/radio-button/index.tsx +73 -73
- package/src/components/radio-button/types.ts +21 -21
- package/src/components/see-more/SeeMore.stories.tsx +182 -182
- package/src/components/see-more/index.tsx +38 -38
- package/src/components/see-more/types.ts +3 -3
- package/src/components/select/Select.stories.tsx +410 -410
- package/src/components/select/index.tsx +150 -150
- package/src/components/select/types.ts +34 -34
- package/src/components/select-plan-button/SelectPlanButton.stories.tsx +160 -160
- package/src/components/select-plan-button/index.tsx +20 -20
- package/src/components/select-plan-button/types.ts +3 -3
- package/src/components/skeleton/Skeleton.stories.tsx +180 -180
- package/src/components/skeleton/index.tsx +61 -61
- package/src/components/skeleton/types.ts +3 -3
- package/src/components/spinner/Spinner.stories.tsx +335 -335
- package/src/components/spinner/index.tsx +44 -44
- package/src/components/spinner/types.ts +4 -4
- package/src/components/text/Text.stories.tsx +302 -302
- package/src/components/text/index.tsx +26 -26
- package/src/components/text/types.ts +45 -45
- package/src/components/tooltip/Tooltip.stories.tsx +220 -220
- package/src/components/tooltip/index.tsx +78 -78
- package/src/components/tooltip/types.ts +6 -6
- package/src/components/view-cart-button/ViewCartButton.stories.tsx +241 -241
- package/src/components/view-cart-button/index.tsx +38 -38
- package/src/components/view-cart-button/types.ts +4 -4
- package/src/contentful/blocks/accordion/index.tsx +7 -7
- package/src/contentful/blocks/button/index.tsx +5 -5
- package/src/contentful/blocks/callout/index.tsx +7 -7
- package/src/contentful/blocks/cards/index.tsx +7 -7
- package/src/contentful/blocks/carousel/index.tsx +7 -7
- package/src/contentful/blocks/cta-callout/index.tsx +6 -0
- package/src/contentful/blocks/cta-callout/types.ts +1 -0
- package/src/contentful/blocks/floating-banner/index.tsx +7 -7
- package/src/contentful/blocks/footer/index.tsx +7 -7
- package/src/contentful/blocks/image-promo-bar/index.tsx +7 -7
- package/src/contentful/blocks/modal/index.tsx +5 -5
- package/src/contentful/blocks/navigation/index.tsx +7 -7
- package/src/contentful/blocks/primary-hero/index.tsx +7 -7
- package/src/contentful/blocks/shape-background-wrapper/index.tsx +123 -123
- package/src/contentful/blocks/shape-background-wrapper/types.ts +35 -35
- package/src/contentful/blocks/text/index.tsx +6 -6
- package/src/contentful/index.ts +4 -1
- package/src/hooks/use-body-scroll-lock.ts +31 -31
- package/src/index.ts +81 -81
- package/src/setupTests.ts +46 -46
- package/src/styles/globals.css +275 -319
- package/src/types/global.d.ts +9 -9
- package/src/utils/index.ts +49 -49
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
import { Link } from "@shared/components/link";
|
|
2
|
-
import { MaterialIcon } from "@shared/components/material-icon";
|
|
3
|
-
import type { IconProps } from "@shared/components/material-icon/types";
|
|
4
|
-
import type { CallButtonProps } from "@shared/components/call-button/types";
|
|
5
|
-
|
|
6
|
-
export const CallButton = (props: CallButtonProps) => {
|
|
7
|
-
const {
|
|
8
|
-
showBlinkDot = false,
|
|
9
|
-
buttonStyle = "primary",
|
|
10
|
-
size = "md",
|
|
11
|
-
children,
|
|
12
|
-
...rest
|
|
13
|
-
} = props;
|
|
14
|
-
|
|
15
|
-
const baseClasses =
|
|
16
|
-
"relative flex items-center gap-2 font-medium tracking-wide outline-offset-4 rounded-full";
|
|
17
|
-
|
|
18
|
-
const sizeClasses = {
|
|
19
|
-
sm: "h-6 text-xs pl-1 pr-2",
|
|
20
|
-
md: "h-8 text-sm pl-1 pr-2",
|
|
21
|
-
lg: "h-10 text-base pl-2 pr-3",
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const styleClasses = {
|
|
25
|
-
primary:
|
|
26
|
-
"border-[0.727px] border-border text-text"
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const iconSize: Record<string, IconProps["size"]> = {
|
|
30
|
-
sm: 20,
|
|
31
|
-
md: 20,
|
|
32
|
-
lg: 32,
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const iconContainerSize = {
|
|
36
|
-
sm: "h-5 w-5",
|
|
37
|
-
md: "h-6 w-6",
|
|
38
|
-
lg: "h-8 w-8",
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const dotSize = {
|
|
42
|
-
sm: "h-2 w-2",
|
|
43
|
-
md: "h-3 w-3",
|
|
44
|
-
lg: "h-4 w-4",
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const dotPosition = {
|
|
48
|
-
sm: "-left-4",
|
|
49
|
-
md: "-left-6",
|
|
50
|
-
lg: "-left-8",
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
return (
|
|
54
|
-
<Link
|
|
55
|
-
{...rest}
|
|
56
|
-
className={`${baseClasses} ${sizeClasses[size]} ${styleClasses[buttonStyle]}`}
|
|
57
|
-
>
|
|
58
|
-
{showBlinkDot ? (
|
|
59
|
-
<span
|
|
60
|
-
className={`animate-blink pointer-events-none absolute ${dotPosition[size]} top-1/2 ${dotSize[size]} -translate-y-1/2 rounded-full bg-icon-brand`}
|
|
61
|
-
/>
|
|
62
|
-
) : null}
|
|
63
|
-
<span
|
|
64
|
-
className={`relative inline-flex ${iconContainerSize[size]} items-center justify-center rounded-full bg-icon-brand`}
|
|
65
|
-
>
|
|
66
|
-
<MaterialIcon
|
|
67
|
-
name="call"
|
|
68
|
-
fill={1}
|
|
69
|
-
size={iconSize[size]}
|
|
70
|
-
className="text-white"
|
|
71
|
-
/>
|
|
72
|
-
</span>
|
|
73
|
-
<span className="font-normal tracking-wide">{children}</span>
|
|
74
|
-
</Link>
|
|
75
|
-
);
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
CallButton.displayName = "CallButton";
|
|
79
|
-
|
|
80
|
-
export type { CallButtonProps };
|
|
1
|
+
import { Link } from "@shared/components/link";
|
|
2
|
+
import { MaterialIcon } from "@shared/components/material-icon";
|
|
3
|
+
import type { IconProps } from "@shared/components/material-icon/types";
|
|
4
|
+
import type { CallButtonProps } from "@shared/components/call-button/types";
|
|
5
|
+
|
|
6
|
+
export const CallButton = (props: CallButtonProps) => {
|
|
7
|
+
const {
|
|
8
|
+
showBlinkDot = false,
|
|
9
|
+
buttonStyle = "primary",
|
|
10
|
+
size = "md",
|
|
11
|
+
children,
|
|
12
|
+
...rest
|
|
13
|
+
} = props;
|
|
14
|
+
|
|
15
|
+
const baseClasses =
|
|
16
|
+
"relative flex items-center gap-2 font-medium tracking-wide outline-offset-4 rounded-full";
|
|
17
|
+
|
|
18
|
+
const sizeClasses = {
|
|
19
|
+
sm: "h-6 text-xs pl-1 pr-2",
|
|
20
|
+
md: "h-8 text-sm pl-1 pr-2",
|
|
21
|
+
lg: "h-10 text-base pl-2 pr-3",
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const styleClasses = {
|
|
25
|
+
primary:
|
|
26
|
+
"border-[0.727px] border-border text-text"
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const iconSize: Record<string, IconProps["size"]> = {
|
|
30
|
+
sm: 20,
|
|
31
|
+
md: 20,
|
|
32
|
+
lg: 32,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const iconContainerSize = {
|
|
36
|
+
sm: "h-5 w-5",
|
|
37
|
+
md: "h-6 w-6",
|
|
38
|
+
lg: "h-8 w-8",
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const dotSize = {
|
|
42
|
+
sm: "h-2 w-2",
|
|
43
|
+
md: "h-3 w-3",
|
|
44
|
+
lg: "h-4 w-4",
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const dotPosition = {
|
|
48
|
+
sm: "-left-4",
|
|
49
|
+
md: "-left-6",
|
|
50
|
+
lg: "-left-8",
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<Link
|
|
55
|
+
{...rest}
|
|
56
|
+
className={`${baseClasses} ${sizeClasses[size]} ${styleClasses[buttonStyle]}`}
|
|
57
|
+
>
|
|
58
|
+
{showBlinkDot ? (
|
|
59
|
+
<span
|
|
60
|
+
className={`animate-blink pointer-events-none absolute ${dotPosition[size]} top-1/2 ${dotSize[size]} -translate-y-1/2 rounded-full bg-icon-brand`}
|
|
61
|
+
/>
|
|
62
|
+
) : null}
|
|
63
|
+
<span
|
|
64
|
+
className={`relative inline-flex ${iconContainerSize[size]} items-center justify-center rounded-full bg-icon-brand`}
|
|
65
|
+
>
|
|
66
|
+
<MaterialIcon
|
|
67
|
+
name="call"
|
|
68
|
+
fill={1}
|
|
69
|
+
size={iconSize[size]}
|
|
70
|
+
className="text-white"
|
|
71
|
+
/>
|
|
72
|
+
</span>
|
|
73
|
+
<span className="font-normal tracking-wide">{children}</span>
|
|
74
|
+
</Link>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
CallButton.displayName = "CallButton";
|
|
79
|
+
|
|
80
|
+
export type { CallButtonProps };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
import { LinkProps } from "@shared/components/link/types";
|
|
3
|
-
|
|
4
|
-
export interface CallButtonProps extends Omit<LinkProps, "children"> {
|
|
5
|
-
showBlinkDot?: boolean;
|
|
6
|
-
buttonStyle?: "primary";
|
|
7
|
-
size?: "sm" | "md" | "lg";
|
|
8
|
-
children: ReactNode;
|
|
9
|
-
}
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { LinkProps } from "@shared/components/link/types";
|
|
3
|
+
|
|
4
|
+
export interface CallButtonProps extends Omit<LinkProps, "children"> {
|
|
5
|
+
showBlinkDot?: boolean;
|
|
6
|
+
buttonStyle?: "primary";
|
|
7
|
+
size?: "sm" | "md" | "lg";
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}
|
|
@@ -1,248 +1,248 @@
|
|
|
1
|
-
import { Checkbox } from "./index";
|
|
2
|
-
import { DocsPage } from "@shared/stories/DocsTemplate";
|
|
3
|
-
|
|
4
|
-
import type { Meta, StoryObj } from "@storybook/react";
|
|
5
|
-
import { useState } from "react";
|
|
6
|
-
|
|
7
|
-
const meta: Meta<typeof Checkbox> = {
|
|
8
|
-
title: "Components/Checkbox",
|
|
9
|
-
component: Checkbox,
|
|
10
|
-
tags: ["autodocs"],
|
|
11
|
-
parameters: {
|
|
12
|
-
layout: "centered",
|
|
13
|
-
docs: {
|
|
14
|
-
page: DocsPage,
|
|
15
|
-
description: {
|
|
16
|
-
component:
|
|
17
|
-
"A checkbox component with support for checked/unchecked states, labels, error states, and info icons.",
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
argTypes: {
|
|
22
|
-
checked: {
|
|
23
|
-
control: { type: "boolean" },
|
|
24
|
-
description: "Whether the checkbox is checked",
|
|
25
|
-
},
|
|
26
|
-
disabled: {
|
|
27
|
-
control: { type: "boolean" },
|
|
28
|
-
description: "Disable the checkbox",
|
|
29
|
-
},
|
|
30
|
-
label: {
|
|
31
|
-
control: { type: "text" },
|
|
32
|
-
description: "Label text for the checkbox",
|
|
33
|
-
},
|
|
34
|
-
error: {
|
|
35
|
-
control: { type: "boolean" },
|
|
36
|
-
description: "Show error state",
|
|
37
|
-
},
|
|
38
|
-
required: {
|
|
39
|
-
control: { type: "boolean" },
|
|
40
|
-
description: "Mark checkbox as required",
|
|
41
|
-
},
|
|
42
|
-
state: {
|
|
43
|
-
control: { type: "select" },
|
|
44
|
-
options: ["default", "focus", "disabled"],
|
|
45
|
-
description: "Visual state of the checkbox",
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
args: {
|
|
49
|
-
checked: false,
|
|
50
|
-
disabled: false,
|
|
51
|
-
label: "Checkbox Label",
|
|
52
|
-
error: false,
|
|
53
|
-
required: false,
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
export default meta;
|
|
58
|
-
type Story = StoryObj<typeof meta>;
|
|
59
|
-
|
|
60
|
-
// Default checkbox
|
|
61
|
-
export const Default: Story = {
|
|
62
|
-
args: {},
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
// Checked checkbox
|
|
66
|
-
export const Checked: Story = {
|
|
67
|
-
args: {
|
|
68
|
-
checked: true,
|
|
69
|
-
label: "Checked Checkbox",
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
// Unchecked checkbox
|
|
74
|
-
export const Unchecked: Story = {
|
|
75
|
-
args: {
|
|
76
|
-
checked: false,
|
|
77
|
-
label: "Unchecked Checkbox",
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
// With label
|
|
82
|
-
export const WithLabel: Story = {
|
|
83
|
-
args: {
|
|
84
|
-
checked: false,
|
|
85
|
-
label: "I agree to the terms and conditions",
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
// Disabled checkbox
|
|
90
|
-
export const Disabled: Story = {
|
|
91
|
-
args: {
|
|
92
|
-
checked: false,
|
|
93
|
-
label: "Disabled Checkbox",
|
|
94
|
-
disabled: true,
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// Disabled checked
|
|
99
|
-
export const DisabledChecked: Story = {
|
|
100
|
-
args: {
|
|
101
|
-
checked: true,
|
|
102
|
-
label: "Disabled Checked Checkbox",
|
|
103
|
-
disabled: true,
|
|
104
|
-
},
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
// Error state
|
|
108
|
-
export const Error: Story = {
|
|
109
|
-
args: {
|
|
110
|
-
checked: false,
|
|
111
|
-
label: "Checkbox with Error",
|
|
112
|
-
error: true,
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
// Required checkbox
|
|
117
|
-
export const Required: Story = {
|
|
118
|
-
args: {
|
|
119
|
-
checked: false,
|
|
120
|
-
label: "Required Field",
|
|
121
|
-
required: true,
|
|
122
|
-
},
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
// Focus state
|
|
126
|
-
export const Focus: Story = {
|
|
127
|
-
args: {
|
|
128
|
-
checked: false,
|
|
129
|
-
label: "Focused Checkbox",
|
|
130
|
-
state: "focus",
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
// With info icon
|
|
135
|
-
export const WithInfoIcon: Story = {
|
|
136
|
-
args: {
|
|
137
|
-
checked: false,
|
|
138
|
-
label: "Checkbox with Info",
|
|
139
|
-
renderInfoIcon: {
|
|
140
|
-
onClick: () => alert("Info clicked"),
|
|
141
|
-
dataTestId: "info-icon",
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
// Interactive checkbox
|
|
147
|
-
export const Interactive: Story = {
|
|
148
|
-
render: () => {
|
|
149
|
-
const [checked, setChecked] = useState(false);
|
|
150
|
-
return (
|
|
151
|
-
<Checkbox
|
|
152
|
-
checked={checked}
|
|
153
|
-
onChange={(isChecked) => setChecked(isChecked)}
|
|
154
|
-
label="Click to toggle"
|
|
155
|
-
/>
|
|
156
|
-
);
|
|
157
|
-
},
|
|
158
|
-
parameters: {
|
|
159
|
-
docs: {
|
|
160
|
-
description: {
|
|
161
|
-
story: "Interactive checkbox that can be toggled by clicking.",
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
},
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
// Multiple checkboxes
|
|
168
|
-
export const Multiple: Story = {
|
|
169
|
-
render: () => {
|
|
170
|
-
const [items, setItems] = useState([
|
|
171
|
-
{ id: 1, label: "Option 1", checked: false },
|
|
172
|
-
{ id: 2, label: "Option 2", checked: true },
|
|
173
|
-
{ id: 3, label: "Option 3", checked: false },
|
|
174
|
-
]);
|
|
175
|
-
|
|
176
|
-
const handleChange = (id: number, isChecked: boolean) => {
|
|
177
|
-
setItems(
|
|
178
|
-
items.map((item) =>
|
|
179
|
-
item.id === id ? { ...item, checked: isChecked } : item
|
|
180
|
-
)
|
|
181
|
-
);
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
return (
|
|
185
|
-
<div className="space-y-3">
|
|
186
|
-
{items.map((item) => (
|
|
187
|
-
<Checkbox
|
|
188
|
-
key={item.id}
|
|
189
|
-
checked={item.checked}
|
|
190
|
-
onChange={(isChecked) => handleChange(item.id, isChecked)}
|
|
191
|
-
label={item.label}
|
|
192
|
-
/>
|
|
193
|
-
))}
|
|
194
|
-
</div>
|
|
195
|
-
);
|
|
196
|
-
},
|
|
197
|
-
parameters: {
|
|
198
|
-
docs: {
|
|
199
|
-
description: {
|
|
200
|
-
story: "Multiple checkboxes in a group.",
|
|
201
|
-
},
|
|
202
|
-
},
|
|
203
|
-
},
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
// All variants showcase
|
|
207
|
-
export const AllVariants: Story = {
|
|
208
|
-
render: () => (
|
|
209
|
-
<div className="space-y-6">
|
|
210
|
-
<div>
|
|
211
|
-
<h3 className="mb-3 text-lg font-semibold">States</h3>
|
|
212
|
-
<div className="space-y-3">
|
|
213
|
-
<Checkbox checked={false} label="Unchecked" />
|
|
214
|
-
<Checkbox checked={true} label="Checked" />
|
|
215
|
-
<Checkbox checked={false} label="Disabled" disabled />
|
|
216
|
-
<Checkbox checked={true} label="Disabled Checked" disabled />
|
|
217
|
-
</div>
|
|
218
|
-
</div>
|
|
219
|
-
<div>
|
|
220
|
-
<h3 className="mb-3 text-lg font-semibold">With Error</h3>
|
|
221
|
-
<Checkbox checked={false} label="Error State" error />
|
|
222
|
-
</div>
|
|
223
|
-
<div>
|
|
224
|
-
<h3 className="mb-3 text-lg font-semibold">Required</h3>
|
|
225
|
-
<Checkbox checked={false} label="Required Field" required />
|
|
226
|
-
</div>
|
|
227
|
-
<div>
|
|
228
|
-
<h3 className="mb-3 text-lg font-semibold">With Info Icon</h3>
|
|
229
|
-
<Checkbox
|
|
230
|
-
checked={false}
|
|
231
|
-
label="With Info Icon"
|
|
232
|
-
renderInfoIcon={{
|
|
233
|
-
onClick: () => {},
|
|
234
|
-
dataTestId: "info",
|
|
235
|
-
}}
|
|
236
|
-
/>
|
|
237
|
-
</div>
|
|
238
|
-
</div>
|
|
239
|
-
),
|
|
240
|
-
parameters: {
|
|
241
|
-
docs: {
|
|
242
|
-
description: {
|
|
243
|
-
story: "Showcase of all checkbox variants and states.",
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
},
|
|
247
|
-
};
|
|
248
|
-
|
|
1
|
+
import { Checkbox } from "./index";
|
|
2
|
+
import { DocsPage } from "@shared/stories/DocsTemplate";
|
|
3
|
+
|
|
4
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
|
|
7
|
+
const meta: Meta<typeof Checkbox> = {
|
|
8
|
+
title: "Components/Checkbox",
|
|
9
|
+
component: Checkbox,
|
|
10
|
+
tags: ["autodocs"],
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: "centered",
|
|
13
|
+
docs: {
|
|
14
|
+
page: DocsPage,
|
|
15
|
+
description: {
|
|
16
|
+
component:
|
|
17
|
+
"A checkbox component with support for checked/unchecked states, labels, error states, and info icons.",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
argTypes: {
|
|
22
|
+
checked: {
|
|
23
|
+
control: { type: "boolean" },
|
|
24
|
+
description: "Whether the checkbox is checked",
|
|
25
|
+
},
|
|
26
|
+
disabled: {
|
|
27
|
+
control: { type: "boolean" },
|
|
28
|
+
description: "Disable the checkbox",
|
|
29
|
+
},
|
|
30
|
+
label: {
|
|
31
|
+
control: { type: "text" },
|
|
32
|
+
description: "Label text for the checkbox",
|
|
33
|
+
},
|
|
34
|
+
error: {
|
|
35
|
+
control: { type: "boolean" },
|
|
36
|
+
description: "Show error state",
|
|
37
|
+
},
|
|
38
|
+
required: {
|
|
39
|
+
control: { type: "boolean" },
|
|
40
|
+
description: "Mark checkbox as required",
|
|
41
|
+
},
|
|
42
|
+
state: {
|
|
43
|
+
control: { type: "select" },
|
|
44
|
+
options: ["default", "focus", "disabled"],
|
|
45
|
+
description: "Visual state of the checkbox",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
args: {
|
|
49
|
+
checked: false,
|
|
50
|
+
disabled: false,
|
|
51
|
+
label: "Checkbox Label",
|
|
52
|
+
error: false,
|
|
53
|
+
required: false,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export default meta;
|
|
58
|
+
type Story = StoryObj<typeof meta>;
|
|
59
|
+
|
|
60
|
+
// Default checkbox
|
|
61
|
+
export const Default: Story = {
|
|
62
|
+
args: {},
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// Checked checkbox
|
|
66
|
+
export const Checked: Story = {
|
|
67
|
+
args: {
|
|
68
|
+
checked: true,
|
|
69
|
+
label: "Checked Checkbox",
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Unchecked checkbox
|
|
74
|
+
export const Unchecked: Story = {
|
|
75
|
+
args: {
|
|
76
|
+
checked: false,
|
|
77
|
+
label: "Unchecked Checkbox",
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// With label
|
|
82
|
+
export const WithLabel: Story = {
|
|
83
|
+
args: {
|
|
84
|
+
checked: false,
|
|
85
|
+
label: "I agree to the terms and conditions",
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// Disabled checkbox
|
|
90
|
+
export const Disabled: Story = {
|
|
91
|
+
args: {
|
|
92
|
+
checked: false,
|
|
93
|
+
label: "Disabled Checkbox",
|
|
94
|
+
disabled: true,
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// Disabled checked
|
|
99
|
+
export const DisabledChecked: Story = {
|
|
100
|
+
args: {
|
|
101
|
+
checked: true,
|
|
102
|
+
label: "Disabled Checked Checkbox",
|
|
103
|
+
disabled: true,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Error state
|
|
108
|
+
export const Error: Story = {
|
|
109
|
+
args: {
|
|
110
|
+
checked: false,
|
|
111
|
+
label: "Checkbox with Error",
|
|
112
|
+
error: true,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// Required checkbox
|
|
117
|
+
export const Required: Story = {
|
|
118
|
+
args: {
|
|
119
|
+
checked: false,
|
|
120
|
+
label: "Required Field",
|
|
121
|
+
required: true,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
// Focus state
|
|
126
|
+
export const Focus: Story = {
|
|
127
|
+
args: {
|
|
128
|
+
checked: false,
|
|
129
|
+
label: "Focused Checkbox",
|
|
130
|
+
state: "focus",
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// With info icon
|
|
135
|
+
export const WithInfoIcon: Story = {
|
|
136
|
+
args: {
|
|
137
|
+
checked: false,
|
|
138
|
+
label: "Checkbox with Info",
|
|
139
|
+
renderInfoIcon: {
|
|
140
|
+
onClick: () => alert("Info clicked"),
|
|
141
|
+
dataTestId: "info-icon",
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// Interactive checkbox
|
|
147
|
+
export const Interactive: Story = {
|
|
148
|
+
render: () => {
|
|
149
|
+
const [checked, setChecked] = useState(false);
|
|
150
|
+
return (
|
|
151
|
+
<Checkbox
|
|
152
|
+
checked={checked}
|
|
153
|
+
onChange={(isChecked) => setChecked(isChecked)}
|
|
154
|
+
label="Click to toggle"
|
|
155
|
+
/>
|
|
156
|
+
);
|
|
157
|
+
},
|
|
158
|
+
parameters: {
|
|
159
|
+
docs: {
|
|
160
|
+
description: {
|
|
161
|
+
story: "Interactive checkbox that can be toggled by clicking.",
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// Multiple checkboxes
|
|
168
|
+
export const Multiple: Story = {
|
|
169
|
+
render: () => {
|
|
170
|
+
const [items, setItems] = useState([
|
|
171
|
+
{ id: 1, label: "Option 1", checked: false },
|
|
172
|
+
{ id: 2, label: "Option 2", checked: true },
|
|
173
|
+
{ id: 3, label: "Option 3", checked: false },
|
|
174
|
+
]);
|
|
175
|
+
|
|
176
|
+
const handleChange = (id: number, isChecked: boolean) => {
|
|
177
|
+
setItems(
|
|
178
|
+
items.map((item) =>
|
|
179
|
+
item.id === id ? { ...item, checked: isChecked } : item
|
|
180
|
+
)
|
|
181
|
+
);
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
return (
|
|
185
|
+
<div className="space-y-3">
|
|
186
|
+
{items.map((item) => (
|
|
187
|
+
<Checkbox
|
|
188
|
+
key={item.id}
|
|
189
|
+
checked={item.checked}
|
|
190
|
+
onChange={(isChecked) => handleChange(item.id, isChecked)}
|
|
191
|
+
label={item.label}
|
|
192
|
+
/>
|
|
193
|
+
))}
|
|
194
|
+
</div>
|
|
195
|
+
);
|
|
196
|
+
},
|
|
197
|
+
parameters: {
|
|
198
|
+
docs: {
|
|
199
|
+
description: {
|
|
200
|
+
story: "Multiple checkboxes in a group.",
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// All variants showcase
|
|
207
|
+
export const AllVariants: Story = {
|
|
208
|
+
render: () => (
|
|
209
|
+
<div className="space-y-6">
|
|
210
|
+
<div>
|
|
211
|
+
<h3 className="mb-3 text-lg font-semibold">States</h3>
|
|
212
|
+
<div className="space-y-3">
|
|
213
|
+
<Checkbox checked={false} label="Unchecked" />
|
|
214
|
+
<Checkbox checked={true} label="Checked" />
|
|
215
|
+
<Checkbox checked={false} label="Disabled" disabled />
|
|
216
|
+
<Checkbox checked={true} label="Disabled Checked" disabled />
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
<div>
|
|
220
|
+
<h3 className="mb-3 text-lg font-semibold">With Error</h3>
|
|
221
|
+
<Checkbox checked={false} label="Error State" error />
|
|
222
|
+
</div>
|
|
223
|
+
<div>
|
|
224
|
+
<h3 className="mb-3 text-lg font-semibold">Required</h3>
|
|
225
|
+
<Checkbox checked={false} label="Required Field" required />
|
|
226
|
+
</div>
|
|
227
|
+
<div>
|
|
228
|
+
<h3 className="mb-3 text-lg font-semibold">With Info Icon</h3>
|
|
229
|
+
<Checkbox
|
|
230
|
+
checked={false}
|
|
231
|
+
label="With Info Icon"
|
|
232
|
+
renderInfoIcon={{
|
|
233
|
+
onClick: () => {},
|
|
234
|
+
dataTestId: "info",
|
|
235
|
+
}}
|
|
236
|
+
/>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
),
|
|
240
|
+
parameters: {
|
|
241
|
+
docs: {
|
|
242
|
+
description: {
|
|
243
|
+
story: "Showcase of all checkbox variants and states.",
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
|