@windstream/react-shared-components 0.0.89 → 0.0.91

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.
Files changed (147) hide show
  1. package/README.md +635 -635
  2. package/dist/contentful/index.d.ts +11 -5
  3. package/dist/contentful/index.esm.js +1 -1
  4. package/dist/contentful/index.esm.js.map +1 -1
  5. package/dist/contentful/index.js +1 -1
  6. package/dist/contentful/index.js.map +1 -1
  7. package/dist/core.d.ts +1 -1
  8. package/dist/index.esm.js +1 -1
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +4 -4
  11. package/dist/index.js.map +1 -1
  12. package/dist/styles.css +1 -1
  13. package/package.json +177 -177
  14. package/src/components/accordion/Accordion.stories.tsx +230 -230
  15. package/src/components/accordion/types.ts +10 -10
  16. package/src/components/alert-card/AlertCard.stories.tsx +171 -171
  17. package/src/components/alert-card/index.tsx +32 -32
  18. package/src/components/alert-card/types.ts +9 -9
  19. package/src/components/brand-button/BrandButton.stories.tsx +223 -223
  20. package/src/components/brand-button/helpers.ts +35 -35
  21. package/src/components/brand-button/index.tsx +115 -115
  22. package/src/components/brand-button/types.ts +37 -37
  23. package/src/components/button/Button.stories.tsx +108 -108
  24. package/src/components/button/index.tsx +27 -27
  25. package/src/components/button/types.ts +14 -14
  26. package/src/components/call-button/CallButton.stories.tsx +324 -324
  27. package/src/components/call-button/index.tsx +86 -86
  28. package/src/components/call-button/types.ts +11 -11
  29. package/src/components/checkbox/Checkbox.stories.tsx +247 -247
  30. package/src/components/checkbox/index.tsx +197 -197
  31. package/src/components/checkbox/types.ts +27 -27
  32. package/src/components/checklist/Checklist.stories.tsx +150 -150
  33. package/src/components/checklist/index.tsx +55 -54
  34. package/src/components/checklist/types.ts +14 -9
  35. package/src/components/collapse/Collapse.stories.tsx +255 -255
  36. package/src/components/collapse/index.tsx +46 -46
  37. package/src/components/collapse/types.ts +6 -6
  38. package/src/components/divider/Divider.stories.tsx +205 -205
  39. package/src/components/divider/index.tsx +22 -22
  40. package/src/components/divider/type.ts +3 -3
  41. package/src/components/image/Image.stories.tsx +113 -113
  42. package/src/components/image/index.tsx +25 -25
  43. package/src/components/image/types.ts +40 -40
  44. package/src/components/input/Input.stories.tsx +325 -325
  45. package/src/components/input/index.tsx +177 -177
  46. package/src/components/input/types.ts +37 -37
  47. package/src/components/link/Link.stories.tsx +163 -163
  48. package/src/components/link/types.ts +25 -25
  49. package/src/components/list/List.stories.tsx +272 -272
  50. package/src/components/list/index.tsx +88 -88
  51. package/src/components/list/list-item/index.tsx +38 -38
  52. package/src/components/list/list-item/types.ts +13 -13
  53. package/src/components/list/types.ts +29 -29
  54. package/src/components/material-icon/MaterialIcon.stories.tsx +330 -330
  55. package/src/components/material-icon/constants.ts +98 -98
  56. package/src/components/material-icon/index.tsx +44 -44
  57. package/src/components/material-icon/types.ts +31 -31
  58. package/src/components/modal/Modal.stories.tsx +171 -171
  59. package/src/components/modal/index.tsx +164 -164
  60. package/src/components/modal/types.ts +24 -24
  61. package/src/components/next-image/index.tsx +32 -32
  62. package/src/components/next-image/types.ts +1 -1
  63. package/src/components/radio-button/RadioButton.stories.tsx +307 -307
  64. package/src/components/radio-button/index.tsx +75 -75
  65. package/src/components/radio-button/types.ts +21 -21
  66. package/src/components/see-more/SeeMore.stories.tsx +181 -181
  67. package/src/components/see-more/index.tsx +44 -44
  68. package/src/components/see-more/types.ts +4 -4
  69. package/src/components/select/Select.stories.tsx +411 -411
  70. package/src/components/select/index.tsx +150 -150
  71. package/src/components/select/types.ts +35 -35
  72. package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
  73. package/src/components/select-plan-button/index.tsx +31 -31
  74. package/src/components/select-plan-button/types.ts +5 -5
  75. package/src/components/skeleton/Skeleton.stories.tsx +179 -179
  76. package/src/components/skeleton/index.tsx +61 -61
  77. package/src/components/skeleton/types.ts +4 -4
  78. package/src/components/spinner/Spinner.stories.tsx +335 -335
  79. package/src/components/spinner/index.tsx +44 -44
  80. package/src/components/spinner/types.ts +5 -5
  81. package/src/components/text/Text.stories.tsx +321 -321
  82. package/src/components/text/index.tsx +25 -25
  83. package/src/components/text/types.ts +45 -45
  84. package/src/components/tooltip/Tooltip.stories.tsx +219 -219
  85. package/src/components/tooltip/index.tsx +74 -74
  86. package/src/components/tooltip/types.ts +7 -7
  87. package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
  88. package/src/components/view-cart-button/index.tsx +42 -42
  89. package/src/components/view-cart-button/types.ts +5 -5
  90. package/src/contentful/blocks/button/Button.stories.tsx +40 -40
  91. package/src/contentful/blocks/button/index.tsx +99 -99
  92. package/src/contentful/blocks/button/types.ts +31 -31
  93. package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
  94. package/src/contentful/blocks/callout/index.tsx +66 -66
  95. package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
  96. package/src/contentful/blocks/cards/index.tsx +13 -13
  97. package/src/contentful/blocks/cards/product-card/index.tsx +199 -199
  98. package/src/contentful/blocks/cards/product-card/types.ts +21 -20
  99. package/src/contentful/blocks/cards/simple-card/index.tsx +77 -77
  100. package/src/contentful/blocks/cards/simple-card/types.ts +31 -31
  101. package/src/contentful/blocks/cards/testimonial-card/index.tsx +88 -88
  102. package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
  103. package/src/contentful/blocks/cards/types.ts +1 -1
  104. package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
  105. package/src/contentful/blocks/carousel/helper.tsx +349 -314
  106. package/src/contentful/blocks/carousel/index.tsx +68 -52
  107. package/src/contentful/blocks/carousel/types.ts +139 -126
  108. package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
  109. package/src/contentful/blocks/cta-callout/index.tsx +54 -54
  110. package/src/contentful/blocks/cta-callout/types.ts +22 -22
  111. package/src/contentful/blocks/find-kinetic/index.tsx +124 -124
  112. package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
  113. package/src/contentful/blocks/floating-banner/types.ts +22 -22
  114. package/src/contentful/blocks/footer/Footer.stories.tsx +30 -30
  115. package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
  116. package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -0
  117. package/src/contentful/blocks/image-promo-bar/index.tsx +231 -154
  118. package/src/contentful/blocks/image-promo-bar/types.ts +44 -31
  119. package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -0
  120. package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -0
  121. package/src/contentful/blocks/modal/constants.ts +53 -53
  122. package/src/contentful/blocks/modal/index.tsx +91 -91
  123. package/src/contentful/blocks/modal/types.ts +12 -12
  124. package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +111 -111
  125. package/src/contentful/blocks/navigation/index.tsx +385 -385
  126. package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +80 -80
  127. package/src/contentful/blocks/navigation/types.ts +41 -41
  128. package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
  129. package/src/contentful/blocks/primary-hero/index.tsx +228 -228
  130. package/src/contentful/blocks/primary-hero/types.ts +35 -35
  131. package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
  132. package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
  133. package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
  134. package/src/contentful/blocks/text/Text.stories.tsx +23 -23
  135. package/src/contentful/blocks/text/index.tsx +12 -12
  136. package/src/contentful/blocks/text/types.ts +1 -1
  137. package/src/contentful/index.ts +57 -57
  138. package/src/hooks/use-body-scroll-lock.ts +34 -34
  139. package/src/hooks/use-outside-click.ts +17 -17
  140. package/src/index.ts +96 -96
  141. package/src/next/index.ts +5 -5
  142. package/src/setupTests.ts +46 -46
  143. package/src/stories/DocsTemplate.tsx +24 -24
  144. package/src/styles/globals.css +307 -307
  145. package/src/types/global.d.ts +9 -9
  146. package/src/types/micro-components.ts +89 -89
  147. package/src/utils/index.ts +49 -49
@@ -1,86 +1,86 @@
1
- import type { CallButtonProps } from "@shared/components/call-button/types";
2
- import { Link } from "@shared/components/link";
3
- import { MaterialIcon } from "@shared/components/material-icon";
4
- import type { IconProps } from "@shared/components/material-icon/types";
5
- import { cx } from "@shared/utils";
6
-
7
- export const CallButton = (props: CallButtonProps) => {
8
- const {
9
- showBlinkDot = false,
10
- buttonStyle = "primary",
11
- size = "md",
12
- children,
13
- className,
14
- ...rest
15
- } = props;
16
-
17
- const baseClasses =
18
- "relative flex items-center gap-2 font-medium tracking-wide outline-offset-4 rounded-full";
19
-
20
- const sizeClasses = {
21
- sm: "h-6 text-xs pl-1 pr-2",
22
- md: "h-8 text-sm pl-1 pr-2",
23
- lg: "h-10 text-base pl-2 pr-3",
24
- };
25
-
26
- const styleClasses = {
27
- primary: "border-[0.727px] border-border text-text",
28
- };
29
-
30
- const iconSize: Record<string, IconProps["size"]> = {
31
- sm: 20,
32
- md: 20,
33
- lg: 32,
34
- };
35
-
36
- const iconContainerSize = {
37
- sm: "h-5 w-5",
38
- md: "h-6 w-6",
39
- lg: "h-8 w-8",
40
- };
41
-
42
- const dotSize = {
43
- sm: "h-2 w-2",
44
- md: "h-3 w-3",
45
- lg: "h-4 w-4",
46
- };
47
-
48
- const dotPosition = {
49
- sm: "-left-4",
50
- md: "-left-6",
51
- lg: "-left-8",
52
- };
53
-
54
- return (
55
- <Link
56
- {...rest}
57
- className={cx(
58
- baseClasses,
59
- sizeClasses[size],
60
- styleClasses[buttonStyle],
61
- className
62
- )}
63
- >
64
- {showBlinkDot ? (
65
- <span
66
- className={`pointer-events-none absolute animate-blink ${dotPosition[size]} top-1/2 ${dotSize[size]} -translate-y-1/2 rounded-full bg-icon-brand`}
67
- />
68
- ) : null}
69
- <span
70
- className={`relative inline-flex ${iconContainerSize[size]} items-center justify-center rounded-full bg-icon-brand`}
71
- >
72
- <MaterialIcon
73
- name="call"
74
- fill={1}
75
- size={iconSize[size]}
76
- className="text-white"
77
- />
78
- </span>
79
- <span className="font-normal tracking-wide">{children}</span>
80
- </Link>
81
- );
82
- };
83
-
84
- CallButton.displayName = "CallButton";
85
-
86
- export type { CallButtonProps };
1
+ import type { CallButtonProps } from "@shared/components/call-button/types";
2
+ import { Link } from "@shared/components/link";
3
+ import { MaterialIcon } from "@shared/components/material-icon";
4
+ import type { IconProps } from "@shared/components/material-icon/types";
5
+ import { cx } from "@shared/utils";
6
+
7
+ export const CallButton = (props: CallButtonProps) => {
8
+ const {
9
+ showBlinkDot = false,
10
+ buttonStyle = "primary",
11
+ size = "md",
12
+ children,
13
+ className,
14
+ ...rest
15
+ } = props;
16
+
17
+ const baseClasses =
18
+ "relative flex items-center gap-2 font-medium tracking-wide outline-offset-4 rounded-full";
19
+
20
+ const sizeClasses = {
21
+ sm: "h-6 text-xs pl-1 pr-2",
22
+ md: "h-8 text-sm pl-1 pr-2",
23
+ lg: "h-10 text-base pl-2 pr-3",
24
+ };
25
+
26
+ const styleClasses = {
27
+ primary: "border-[0.727px] border-border text-text",
28
+ };
29
+
30
+ const iconSize: Record<string, IconProps["size"]> = {
31
+ sm: 20,
32
+ md: 20,
33
+ lg: 32,
34
+ };
35
+
36
+ const iconContainerSize = {
37
+ sm: "h-5 w-5",
38
+ md: "h-6 w-6",
39
+ lg: "h-8 w-8",
40
+ };
41
+
42
+ const dotSize = {
43
+ sm: "h-2 w-2",
44
+ md: "h-3 w-3",
45
+ lg: "h-4 w-4",
46
+ };
47
+
48
+ const dotPosition = {
49
+ sm: "-left-4",
50
+ md: "-left-6",
51
+ lg: "-left-8",
52
+ };
53
+
54
+ return (
55
+ <Link
56
+ {...rest}
57
+ className={cx(
58
+ baseClasses,
59
+ sizeClasses[size],
60
+ styleClasses[buttonStyle],
61
+ className
62
+ )}
63
+ >
64
+ {showBlinkDot ? (
65
+ <span
66
+ className={`pointer-events-none absolute animate-blink ${dotPosition[size]} top-1/2 ${dotSize[size]} -translate-y-1/2 rounded-full bg-icon-brand`}
67
+ />
68
+ ) : null}
69
+ <span
70
+ className={`relative inline-flex ${iconContainerSize[size]} items-center justify-center rounded-full bg-icon-brand`}
71
+ >
72
+ <MaterialIcon
73
+ name="call"
74
+ fill={1}
75
+ size={iconSize[size]}
76
+ className="text-white"
77
+ />
78
+ </span>
79
+ <span className="font-normal tracking-wide">{children}</span>
80
+ </Link>
81
+ );
82
+ };
83
+
84
+ CallButton.displayName = "CallButton";
85
+
86
+ export type { CallButtonProps };
@@ -1,11 +1,11 @@
1
- import { ReactNode } from "react";
2
-
3
- import { LinkProps } from "@shared/components/link/types";
4
-
5
- export interface CallButtonProps extends Omit<LinkProps, "children"> {
6
- showBlinkDot?: boolean;
7
- buttonStyle?: "primary";
8
- className?: string;
9
- size?: "sm" | "md" | "lg";
10
- children: ReactNode;
11
- }
1
+ import { ReactNode } from "react";
2
+
3
+ import { LinkProps } from "@shared/components/link/types";
4
+
5
+ export interface CallButtonProps extends Omit<LinkProps, "children"> {
6
+ showBlinkDot?: boolean;
7
+ buttonStyle?: "primary";
8
+ className?: string;
9
+ size?: "sm" | "md" | "lg";
10
+ children: ReactNode;
11
+ }
@@ -1,247 +1,247 @@
1
- import { useState } from "react";
2
- import { Checkbox } from "./index";
3
-
4
- import { DocsPage } from "@shared/stories/DocsTemplate";
5
- import type { Meta, StoryObj } from "@storybook/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
- };
1
+ import { useState } from "react";
2
+ import { Checkbox } from "./index";
3
+
4
+ import { DocsPage } from "@shared/stories/DocsTemplate";
5
+ import type { Meta, StoryObj } from "@storybook/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
+ };