@windstream/react-shared-components 0.1.45 → 0.1.46

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 (196) hide show
  1. package/README.md +635 -635
  2. package/dist/contentful/index.esm.js +3 -3
  3. package/dist/contentful/index.esm.js.map +1 -1
  4. package/dist/contentful/index.js +3 -3
  5. package/dist/contentful/index.js.map +1 -1
  6. package/dist/core.d.ts +1 -1
  7. package/dist/index.d.ts +3 -3
  8. package/dist/index.esm.js +5 -13
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +5 -13
  11. package/dist/index.js.map +1 -1
  12. package/dist/next/index.esm.js +2 -2
  13. package/dist/next/index.esm.js.map +1 -1
  14. package/dist/next/index.js +2 -2
  15. package/dist/next/index.js.map +1 -1
  16. package/dist/styles.css +1 -1
  17. package/dist/utils/index.esm.js +1 -1
  18. package/dist/utils/index.esm.js.map +1 -1
  19. package/dist/utils/index.js +1 -1
  20. package/dist/utils/index.js.map +1 -1
  21. package/package.json +185 -185
  22. package/src/components/accordion/Accordion.stories.tsx +230 -230
  23. package/src/components/accordion/index.tsx +70 -70
  24. package/src/components/accordion/types.ts +12 -12
  25. package/src/components/alert-card/AlertCard.stories.tsx +171 -171
  26. package/src/components/alert-card/index.tsx +41 -41
  27. package/src/components/alert-card/types.ts +13 -13
  28. package/src/components/brand-button/BrandButton.stories.tsx +223 -223
  29. package/src/components/brand-button/helpers.ts +35 -35
  30. package/src/components/brand-button/index.tsx +120 -120
  31. package/src/components/brand-button/types.ts +38 -38
  32. package/src/components/button/Button.stories.tsx +108 -108
  33. package/src/components/button/index.tsx +27 -27
  34. package/src/components/button/types.ts +14 -14
  35. package/src/components/call-button/CallButton.stories.tsx +324 -324
  36. package/src/components/call-button/index.tsx +86 -86
  37. package/src/components/call-button/types.ts +11 -11
  38. package/src/components/checkbox/Checkbox.stories.tsx +247 -247
  39. package/src/components/checkbox/index.tsx +197 -197
  40. package/src/components/checkbox/types.ts +27 -27
  41. package/src/components/checklist/Checklist.stories.tsx +150 -150
  42. package/src/components/checklist/index.tsx +61 -61
  43. package/src/components/checklist/types.ts +17 -17
  44. package/src/components/collapse/Collapse.stories.tsx +255 -255
  45. package/src/components/collapse/index.tsx +46 -46
  46. package/src/components/collapse/types.ts +6 -6
  47. package/src/components/divider/Divider.stories.tsx +205 -205
  48. package/src/components/divider/index.tsx +22 -22
  49. package/src/components/divider/type.ts +3 -3
  50. package/src/components/image/Image.stories.tsx +113 -113
  51. package/src/components/image/index.tsx +25 -25
  52. package/src/components/image/types.ts +40 -40
  53. package/src/components/input/Input.stories.tsx +325 -325
  54. package/src/components/input/index.tsx +177 -177
  55. package/src/components/input/types.ts +37 -37
  56. package/src/components/link/Link.stories.tsx +163 -163
  57. package/src/components/link/index.tsx +109 -109
  58. package/src/components/link/types.ts +25 -25
  59. package/src/components/list/List.stories.tsx +272 -272
  60. package/src/components/list/index.tsx +88 -88
  61. package/src/components/list/list-item/index.tsx +38 -38
  62. package/src/components/list/list-item/types.ts +13 -13
  63. package/src/components/list/types.ts +29 -29
  64. package/src/components/material-icon/MaterialIcon.stories.tsx +322 -322
  65. package/src/components/material-icon/constants.ts +98 -98
  66. package/src/components/material-icon/index.tsx +47 -47
  67. package/src/components/material-icon/types.ts +31 -31
  68. package/src/components/modal/Modal.stories.tsx +171 -171
  69. package/src/components/modal/index.tsx +164 -164
  70. package/src/components/modal/types.ts +24 -24
  71. package/src/components/next-image/index.tsx +54 -54
  72. package/src/components/next-image/types.ts +1 -1
  73. package/src/components/pagination/index.tsx +100 -100
  74. package/src/components/pagination/types.ts +6 -6
  75. package/src/components/radio-button/RadioButton.stories.tsx +307 -307
  76. package/src/components/radio-button/index.tsx +75 -75
  77. package/src/components/radio-button/types.ts +21 -21
  78. package/src/components/see-more/SeeMore.stories.tsx +181 -181
  79. package/src/components/see-more/index.tsx +44 -44
  80. package/src/components/see-more/types.ts +4 -4
  81. package/src/components/select/Select.stories.tsx +411 -411
  82. package/src/components/select/index.tsx +155 -155
  83. package/src/components/select/types.ts +36 -36
  84. package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
  85. package/src/components/select-plan-button/index.tsx +63 -63
  86. package/src/components/select-plan-button/types.ts +17 -17
  87. package/src/components/skeleton/Skeleton.stories.tsx +179 -179
  88. package/src/components/skeleton/index.tsx +61 -61
  89. package/src/components/skeleton/types.ts +4 -4
  90. package/src/components/spinner/Spinner.stories.tsx +335 -335
  91. package/src/components/spinner/index.tsx +44 -44
  92. package/src/components/spinner/types.ts +5 -5
  93. package/src/components/text/Text.stories.tsx +321 -321
  94. package/src/components/text/index.tsx +25 -25
  95. package/src/components/text/types.ts +45 -45
  96. package/src/components/tooltip/Tooltip.stories.tsx +219 -219
  97. package/src/components/tooltip/index.tsx +74 -74
  98. package/src/components/tooltip/types.ts +7 -7
  99. package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
  100. package/src/components/view-cart-button/index.tsx +42 -42
  101. package/src/components/view-cart-button/types.ts +5 -5
  102. package/src/contentful/blocks/accordion/Accordion.stories.tsx +34 -34
  103. package/src/contentful/blocks/accordion/index.tsx +112 -112
  104. package/src/contentful/blocks/accordion/types.ts +34 -34
  105. package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
  106. package/src/contentful/blocks/address-input-banner/types.ts +14 -14
  107. package/src/contentful/blocks/anchored-bottom-banner/index.tsx +70 -70
  108. package/src/contentful/blocks/anchored-bottom-banner/types.ts +10 -10
  109. package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
  110. package/src/contentful/blocks/blogs-grid/types.ts +26 -26
  111. package/src/contentful/blocks/breadcrumbs/index.tsx +51 -51
  112. package/src/contentful/blocks/breadcrumbs/types.ts +5 -5
  113. package/src/contentful/blocks/button/Button.stories.tsx +40 -40
  114. package/src/contentful/blocks/button/index.tsx +130 -130
  115. package/src/contentful/blocks/button/types.ts +39 -39
  116. package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
  117. package/src/contentful/blocks/callout/index.tsx +88 -88
  118. package/src/contentful/blocks/callout/types.ts +15 -15
  119. package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
  120. package/src/contentful/blocks/cards/blog-card/index.tsx +110 -110
  121. package/src/contentful/blocks/cards/blog-card/types.ts +18 -18
  122. package/src/contentful/blocks/cards/index.tsx +13 -13
  123. package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
  124. package/src/contentful/blocks/cards/product-card/types.ts +28 -28
  125. package/src/contentful/blocks/cards/simple-card/index.tsx +89 -89
  126. package/src/contentful/blocks/cards/simple-card/types.ts +28 -28
  127. package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
  128. package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
  129. package/src/contentful/blocks/cards/types.ts +1 -1
  130. package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
  131. package/src/contentful/blocks/carousel/helper.tsx +440 -440
  132. package/src/contentful/blocks/carousel/index.tsx +85 -85
  133. package/src/contentful/blocks/carousel/types.ts +144 -144
  134. package/src/contentful/blocks/comparison-table/index.tsx +27 -27
  135. package/src/contentful/blocks/comparison-table/types.ts +6 -6
  136. package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
  137. package/src/contentful/blocks/cookiebanner/type.ts +7 -7
  138. package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
  139. package/src/contentful/blocks/cta-callout/index.tsx +71 -71
  140. package/src/contentful/blocks/cta-callout/types.ts +26 -26
  141. package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
  142. package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
  143. package/src/contentful/blocks/email-input-block/index.tsx +117 -117
  144. package/src/contentful/blocks/email-input-block/types.ts +16 -16
  145. package/src/contentful/blocks/find-kinetic/FindKinetic.stories.tsx +23 -23
  146. package/src/contentful/blocks/find-kinetic/index.tsx +130 -130
  147. package/src/contentful/blocks/find-kinetic/types.ts +19 -19
  148. package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
  149. package/src/contentful/blocks/floating-banner/index.tsx +97 -97
  150. package/src/contentful/blocks/floating-banner/types.ts +22 -22
  151. package/src/contentful/blocks/footer/Footer.stories.tsx +30 -30
  152. package/src/contentful/blocks/footer/index.tsx +91 -91
  153. package/src/contentful/blocks/footer/types.ts +13 -13
  154. package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
  155. package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
  156. package/src/contentful/blocks/image-promo-bar/index.tsx +246 -246
  157. package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
  158. package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
  159. package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -46
  160. package/src/contentful/blocks/modal/constants.ts +53 -53
  161. package/src/contentful/blocks/modal/index.tsx +107 -107
  162. package/src/contentful/blocks/modal/types.ts +12 -12
  163. package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +113 -113
  164. package/src/contentful/blocks/navigation/index.tsx +394 -394
  165. package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
  166. package/src/contentful/blocks/navigation/types.ts +41 -41
  167. package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
  168. package/src/contentful/blocks/primary-hero/index.tsx +236 -236
  169. package/src/contentful/blocks/primary-hero/types.ts +37 -37
  170. package/src/contentful/blocks/search-block/index.tsx +90 -90
  171. package/src/contentful/blocks/search-block/types.ts +15 -15
  172. package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
  173. package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
  174. package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
  175. package/src/contentful/blocks/text/Text.stories.tsx +23 -23
  176. package/src/contentful/blocks/text/index.tsx +12 -12
  177. package/src/contentful/blocks/text/types.ts +1 -1
  178. package/src/contentful/index.ts +99 -99
  179. package/src/hooks/contentful/use-contentful-rich-text.tsx +310 -310
  180. package/src/hooks/contentful/use-processed-check-list.ts +63 -63
  181. package/src/hooks/use-body-scroll-lock.ts +34 -34
  182. package/src/hooks/use-carousel-swipe.ts +264 -264
  183. package/src/hooks/use-outside-click.ts +17 -17
  184. package/src/index.ts +101 -101
  185. package/src/next/index.ts +5 -5
  186. package/src/setupTests.ts +46 -46
  187. package/src/stories/DocsTemplate.tsx +24 -24
  188. package/src/styles/globals.css +343 -343
  189. package/src/types/global.d.ts +9 -9
  190. package/src/types/micro-components.ts +99 -99
  191. package/src/types/utm.ts +49 -49
  192. package/src/utils/contentful/to-document.ts +24 -24
  193. package/src/utils/cookie.ts +84 -84
  194. package/src/utils/cx.ts +49 -49
  195. package/src/utils/index.ts +38 -38
  196. package/src/utils/utm.ts +221 -221
@@ -1,74 +1,74 @@
1
- import { ToolTipProps } from "./types";
2
-
3
- export function Tooltip({ tooltipMsg, className, children }: ToolTipProps) {
4
- return (
5
- <>
6
- <style>{`
7
- .tooltip-custom {
8
- position: relative;
9
- cursor: pointer;
10
- margin-top: 7px;
11
- }
12
- .tooltip-custom::after {
13
- display: none;
14
- position: absolute;
15
- text-align: center;
16
- z-index: 999;
17
- content: attr(data-text);
18
- top: 0;
19
- left: -200%;
20
- transform: translate(-50%, calc(-100% - 10px));
21
- line-height: 1.1rem;
22
- padding-left: 1rem;
23
- padding-right: 1rem;
24
- border-radius: 8px;
25
- color: white;
26
- background-color: black;
27
- padding-bottom: 0.75rem;
28
- padding-top: 0.75rem;
29
- width: 270px;
30
- font-size: 14px;
31
- }
32
- .tooltip-custom:hover::after {
33
- display: block;
34
- }
35
- .tooltip-custom::before {
36
- background-color: black;
37
- content: " ";
38
- display: none;
39
- position: absolute;
40
- width: 15px;
41
- height: 15px;
42
- z-index: 999;
43
- top: 0;
44
- left: 50%;
45
- transform: translate(-50%, calc(-100% - 5px)) rotate(45deg);
46
- }
47
- .tooltip-custom:hover::before {
48
- display: block;
49
- }
50
- @media (max-width: 640px) {
51
- .tooltip-custom::after {
52
- left: -124px;
53
- }
54
- }
55
- @media (max-width: 343px) {
56
- .tooltip-custom::after {
57
- left: 80px;
58
- width: 160px;
59
- }
60
- }
61
- `}</style>
62
- <span
63
- className={`tooltip-custom ${className || ""}`}
64
- data-text={tooltipMsg}
65
- >
66
- {children}
67
- </span>
68
- </>
69
- );
70
- }
71
-
72
- Tooltip.displayName = "Tooltip";
73
-
74
- export type { ToolTipProps };
1
+ import { ToolTipProps } from "./types";
2
+
3
+ export function Tooltip({ tooltipMsg, className, children }: ToolTipProps) {
4
+ return (
5
+ <>
6
+ <style>{`
7
+ .tooltip-custom {
8
+ position: relative;
9
+ cursor: pointer;
10
+ margin-top: 7px;
11
+ }
12
+ .tooltip-custom::after {
13
+ display: none;
14
+ position: absolute;
15
+ text-align: center;
16
+ z-index: 999;
17
+ content: attr(data-text);
18
+ top: 0;
19
+ left: -200%;
20
+ transform: translate(-50%, calc(-100% - 10px));
21
+ line-height: 1.1rem;
22
+ padding-left: 1rem;
23
+ padding-right: 1rem;
24
+ border-radius: 8px;
25
+ color: white;
26
+ background-color: black;
27
+ padding-bottom: 0.75rem;
28
+ padding-top: 0.75rem;
29
+ width: 270px;
30
+ font-size: 14px;
31
+ }
32
+ .tooltip-custom:hover::after {
33
+ display: block;
34
+ }
35
+ .tooltip-custom::before {
36
+ background-color: black;
37
+ content: " ";
38
+ display: none;
39
+ position: absolute;
40
+ width: 15px;
41
+ height: 15px;
42
+ z-index: 999;
43
+ top: 0;
44
+ left: 50%;
45
+ transform: translate(-50%, calc(-100% - 5px)) rotate(45deg);
46
+ }
47
+ .tooltip-custom:hover::before {
48
+ display: block;
49
+ }
50
+ @media (max-width: 640px) {
51
+ .tooltip-custom::after {
52
+ left: -124px;
53
+ }
54
+ }
55
+ @media (max-width: 343px) {
56
+ .tooltip-custom::after {
57
+ left: 80px;
58
+ width: 160px;
59
+ }
60
+ }
61
+ `}</style>
62
+ <span
63
+ className={`tooltip-custom ${className || ""}`}
64
+ data-text={tooltipMsg}
65
+ >
66
+ {children}
67
+ </span>
68
+ </>
69
+ );
70
+ }
71
+
72
+ Tooltip.displayName = "Tooltip";
73
+
74
+ export type { ToolTipProps };
@@ -1,7 +1,7 @@
1
- import { ReactNode } from "react";
2
-
3
- export type ToolTipProps = {
4
- tooltipMsg: string;
5
- children: ReactNode;
6
- className?: string;
7
- };
1
+ import { ReactNode } from "react";
2
+
3
+ export type ToolTipProps = {
4
+ tooltipMsg: string;
5
+ children: ReactNode;
6
+ className?: string;
7
+ };
@@ -1,252 +1,252 @@
1
- import { useState } from "react";
2
- import { ViewCartButton } from "./index";
3
-
4
- import { DocsPage } from "@shared/stories/DocsTemplate";
5
- import type { Meta, StoryObj } from "@storybook/react";
6
-
7
- const meta: Meta<typeof ViewCartButton> = {
8
- title: "Components/ViewCartButton",
9
- component: ViewCartButton,
10
- tags: ["autodocs"],
11
- parameters: {
12
- layout: "centered",
13
- docs: {
14
- page: DocsPage,
15
- description: {
16
- component:
17
- "A button component for viewing cart contents with total price display and open/closed states.",
18
- },
19
- },
20
- },
21
- argTypes: {
22
- cartTotalText: {
23
- control: { type: "text" },
24
- description: "Text displaying the cart total",
25
- },
26
- isOpen: {
27
- control: { type: "boolean" },
28
- description: "Whether the cart is open",
29
- },
30
- onClick: {
31
- action: "clicked",
32
- description: "Callback function when button is clicked",
33
- },
34
- },
35
- args: {
36
- cartTotalText: "$99.99",
37
- isOpen: false,
38
- onClick: () => {},
39
- },
40
- };
41
-
42
- export default meta;
43
- type Story = StoryObj<typeof meta>;
44
-
45
- // Default button
46
- export const Default: Story = {
47
- args: {},
48
- };
49
-
50
- // With cart total
51
- export const WithCartTotal: Story = {
52
- args: {
53
- cartTotalText: "$149.99",
54
- },
55
- };
56
-
57
- // Open state
58
- export const Open: Story = {
59
- args: {
60
- cartTotalText: "$99.99",
61
- isOpen: true,
62
- },
63
- };
64
-
65
- // Closed state
66
- export const Closed: Story = {
67
- args: {
68
- cartTotalText: "$99.99",
69
- isOpen: false,
70
- },
71
- };
72
-
73
- // Interactive state
74
- export const Interactive: Story = {
75
- render: () => {
76
- const [isOpen, setIsOpen] = useState(false);
77
- return (
78
- <div className="max-w-md w-full">
79
- <ViewCartButton
80
- cartTotalText="$149.99"
81
- isOpen={isOpen}
82
- onClick={() => setIsOpen(!isOpen)}
83
- />
84
- {isOpen && (
85
- <div className="bg-surface-secondary mt-4 rounded p-4">
86
- <p className="body2 text-text">Cart is open</p>
87
- </div>
88
- )}
89
- </div>
90
- );
91
- },
92
- parameters: {
93
- docs: {
94
- description: {
95
- story:
96
- "Interactive ViewCartButton that toggles open/closed state on click.",
97
- },
98
- },
99
- },
100
- };
101
-
102
- // Different totals
103
- export const DifferentTotals: Story = {
104
- render: () => (
105
- <div className="max-w-md w-full space-y-3">
106
- <ViewCartButton cartTotalText="$0.00" isOpen={false} onClick={() => {}} />
107
- <ViewCartButton
108
- cartTotalText="$29.99"
109
- isOpen={false}
110
- onClick={() => {}}
111
- />
112
- <ViewCartButton
113
- cartTotalText="$99.99"
114
- isOpen={false}
115
- onClick={() => {}}
116
- />
117
- <ViewCartButton
118
- cartTotalText="$249.99"
119
- isOpen={false}
120
- onClick={() => {}}
121
- />
122
- </div>
123
- ),
124
- parameters: {
125
- docs: {
126
- description: {
127
- story: "ViewCartButton with different cart total values.",
128
- },
129
- },
130
- },
131
- };
132
-
133
- // Responsive behavior
134
- export const Responsive: Story = {
135
- render: () => (
136
- <div className="space-y-8">
137
- <div>
138
- <h3 className="mb-2 text-sm font-medium text-gray-600">
139
- Mobile View (btn-small)
140
- </h3>
141
- <div className="w-64 border border-gray-200 p-2">
142
- <ViewCartButton
143
- cartTotalText="$99.99"
144
- isOpen={false}
145
- onClick={() => {}}
146
- />
147
- </div>
148
- </div>
149
- <div>
150
- <h3 className="mb-2 text-sm font-medium text-gray-600">
151
- Desktop View (btn-medium)
152
- </h3>
153
- <div className="max-w-md w-full border border-gray-200 p-2">
154
- <ViewCartButton
155
- cartTotalText="$99.99"
156
- isOpen={false}
157
- onClick={() => {}}
158
- />
159
- </div>
160
- </div>
161
- </div>
162
- ),
163
- parameters: {
164
- docs: {
165
- description: {
166
- story:
167
- "ViewCartButton adapts its size responsively - smaller on mobile, larger on desktop.",
168
- },
169
- },
170
- },
171
- };
172
-
173
- // Open and closed states
174
- export const OpenAndClosed: Story = {
175
- render: () => (
176
- <div className="max-w-md w-full space-y-4">
177
- <div>
178
- <h4 className="mb-2 text-sm font-medium">Closed State</h4>
179
- <ViewCartButton
180
- cartTotalText="$99.99"
181
- isOpen={false}
182
- onClick={() => {}}
183
- />
184
- </div>
185
- <div>
186
- <h4 className="mb-2 text-sm font-medium">Open State</h4>
187
- <ViewCartButton
188
- cartTotalText="$99.99"
189
- isOpen={true}
190
- onClick={() => {}}
191
- />
192
- </div>
193
- </div>
194
- ),
195
- parameters: {
196
- docs: {
197
- description: {
198
- story: "ViewCartButton in both open and closed states.",
199
- },
200
- },
201
- },
202
- };
203
-
204
- // All variants showcase
205
- export const AllVariants: Story = {
206
- render: () => (
207
- <div className="max-w-2xl w-full space-y-6">
208
- <div>
209
- <h3 className="mb-3 text-lg font-semibold">States</h3>
210
- <div className="space-y-3">
211
- <ViewCartButton
212
- cartTotalText="$99.99"
213
- isOpen={false}
214
- onClick={() => {}}
215
- />
216
- <ViewCartButton
217
- cartTotalText="$99.99"
218
- isOpen={true}
219
- onClick={() => {}}
220
- />
221
- </div>
222
- </div>
223
- <div>
224
- <h3 className="mb-3 text-lg font-semibold">Different Totals</h3>
225
- <div className="space-y-3">
226
- <ViewCartButton
227
- cartTotalText="$0.00"
228
- isOpen={false}
229
- onClick={() => {}}
230
- />
231
- <ViewCartButton
232
- cartTotalText="$29.99"
233
- isOpen={false}
234
- onClick={() => {}}
235
- />
236
- <ViewCartButton
237
- cartTotalText="$149.99"
238
- isOpen={false}
239
- onClick={() => {}}
240
- />
241
- </div>
242
- </div>
243
- </div>
244
- ),
245
- parameters: {
246
- docs: {
247
- description: {
248
- story: "Showcase of all ViewCartButton variants and states.",
249
- },
250
- },
251
- },
252
- };
1
+ import { useState } from "react";
2
+ import { ViewCartButton } from "./index";
3
+
4
+ import { DocsPage } from "@shared/stories/DocsTemplate";
5
+ import type { Meta, StoryObj } from "@storybook/react";
6
+
7
+ const meta: Meta<typeof ViewCartButton> = {
8
+ title: "Components/ViewCartButton",
9
+ component: ViewCartButton,
10
+ tags: ["autodocs"],
11
+ parameters: {
12
+ layout: "centered",
13
+ docs: {
14
+ page: DocsPage,
15
+ description: {
16
+ component:
17
+ "A button component for viewing cart contents with total price display and open/closed states.",
18
+ },
19
+ },
20
+ },
21
+ argTypes: {
22
+ cartTotalText: {
23
+ control: { type: "text" },
24
+ description: "Text displaying the cart total",
25
+ },
26
+ isOpen: {
27
+ control: { type: "boolean" },
28
+ description: "Whether the cart is open",
29
+ },
30
+ onClick: {
31
+ action: "clicked",
32
+ description: "Callback function when button is clicked",
33
+ },
34
+ },
35
+ args: {
36
+ cartTotalText: "$99.99",
37
+ isOpen: false,
38
+ onClick: () => {},
39
+ },
40
+ };
41
+
42
+ export default meta;
43
+ type Story = StoryObj<typeof meta>;
44
+
45
+ // Default button
46
+ export const Default: Story = {
47
+ args: {},
48
+ };
49
+
50
+ // With cart total
51
+ export const WithCartTotal: Story = {
52
+ args: {
53
+ cartTotalText: "$149.99",
54
+ },
55
+ };
56
+
57
+ // Open state
58
+ export const Open: Story = {
59
+ args: {
60
+ cartTotalText: "$99.99",
61
+ isOpen: true,
62
+ },
63
+ };
64
+
65
+ // Closed state
66
+ export const Closed: Story = {
67
+ args: {
68
+ cartTotalText: "$99.99",
69
+ isOpen: false,
70
+ },
71
+ };
72
+
73
+ // Interactive state
74
+ export const Interactive: Story = {
75
+ render: () => {
76
+ const [isOpen, setIsOpen] = useState(false);
77
+ return (
78
+ <div className="max-w-md w-full">
79
+ <ViewCartButton
80
+ cartTotalText="$149.99"
81
+ isOpen={isOpen}
82
+ onClick={() => setIsOpen(!isOpen)}
83
+ />
84
+ {isOpen && (
85
+ <div className="bg-surface-secondary mt-4 rounded p-4">
86
+ <p className="body2 text-text">Cart is open</p>
87
+ </div>
88
+ )}
89
+ </div>
90
+ );
91
+ },
92
+ parameters: {
93
+ docs: {
94
+ description: {
95
+ story:
96
+ "Interactive ViewCartButton that toggles open/closed state on click.",
97
+ },
98
+ },
99
+ },
100
+ };
101
+
102
+ // Different totals
103
+ export const DifferentTotals: Story = {
104
+ render: () => (
105
+ <div className="max-w-md w-full space-y-3">
106
+ <ViewCartButton cartTotalText="$0.00" isOpen={false} onClick={() => {}} />
107
+ <ViewCartButton
108
+ cartTotalText="$29.99"
109
+ isOpen={false}
110
+ onClick={() => {}}
111
+ />
112
+ <ViewCartButton
113
+ cartTotalText="$99.99"
114
+ isOpen={false}
115
+ onClick={() => {}}
116
+ />
117
+ <ViewCartButton
118
+ cartTotalText="$249.99"
119
+ isOpen={false}
120
+ onClick={() => {}}
121
+ />
122
+ </div>
123
+ ),
124
+ parameters: {
125
+ docs: {
126
+ description: {
127
+ story: "ViewCartButton with different cart total values.",
128
+ },
129
+ },
130
+ },
131
+ };
132
+
133
+ // Responsive behavior
134
+ export const Responsive: Story = {
135
+ render: () => (
136
+ <div className="space-y-8">
137
+ <div>
138
+ <h3 className="mb-2 text-sm font-medium text-gray-600">
139
+ Mobile View (btn-small)
140
+ </h3>
141
+ <div className="w-64 border border-gray-200 p-2">
142
+ <ViewCartButton
143
+ cartTotalText="$99.99"
144
+ isOpen={false}
145
+ onClick={() => {}}
146
+ />
147
+ </div>
148
+ </div>
149
+ <div>
150
+ <h3 className="mb-2 text-sm font-medium text-gray-600">
151
+ Desktop View (btn-medium)
152
+ </h3>
153
+ <div className="max-w-md w-full border border-gray-200 p-2">
154
+ <ViewCartButton
155
+ cartTotalText="$99.99"
156
+ isOpen={false}
157
+ onClick={() => {}}
158
+ />
159
+ </div>
160
+ </div>
161
+ </div>
162
+ ),
163
+ parameters: {
164
+ docs: {
165
+ description: {
166
+ story:
167
+ "ViewCartButton adapts its size responsively - smaller on mobile, larger on desktop.",
168
+ },
169
+ },
170
+ },
171
+ };
172
+
173
+ // Open and closed states
174
+ export const OpenAndClosed: Story = {
175
+ render: () => (
176
+ <div className="max-w-md w-full space-y-4">
177
+ <div>
178
+ <h4 className="mb-2 text-sm font-medium">Closed State</h4>
179
+ <ViewCartButton
180
+ cartTotalText="$99.99"
181
+ isOpen={false}
182
+ onClick={() => {}}
183
+ />
184
+ </div>
185
+ <div>
186
+ <h4 className="mb-2 text-sm font-medium">Open State</h4>
187
+ <ViewCartButton
188
+ cartTotalText="$99.99"
189
+ isOpen={true}
190
+ onClick={() => {}}
191
+ />
192
+ </div>
193
+ </div>
194
+ ),
195
+ parameters: {
196
+ docs: {
197
+ description: {
198
+ story: "ViewCartButton in both open and closed states.",
199
+ },
200
+ },
201
+ },
202
+ };
203
+
204
+ // All variants showcase
205
+ export const AllVariants: Story = {
206
+ render: () => (
207
+ <div className="max-w-2xl w-full space-y-6">
208
+ <div>
209
+ <h3 className="mb-3 text-lg font-semibold">States</h3>
210
+ <div className="space-y-3">
211
+ <ViewCartButton
212
+ cartTotalText="$99.99"
213
+ isOpen={false}
214
+ onClick={() => {}}
215
+ />
216
+ <ViewCartButton
217
+ cartTotalText="$99.99"
218
+ isOpen={true}
219
+ onClick={() => {}}
220
+ />
221
+ </div>
222
+ </div>
223
+ <div>
224
+ <h3 className="mb-3 text-lg font-semibold">Different Totals</h3>
225
+ <div className="space-y-3">
226
+ <ViewCartButton
227
+ cartTotalText="$0.00"
228
+ isOpen={false}
229
+ onClick={() => {}}
230
+ />
231
+ <ViewCartButton
232
+ cartTotalText="$29.99"
233
+ isOpen={false}
234
+ onClick={() => {}}
235
+ />
236
+ <ViewCartButton
237
+ cartTotalText="$149.99"
238
+ isOpen={false}
239
+ onClick={() => {}}
240
+ />
241
+ </div>
242
+ </div>
243
+ </div>
244
+ ),
245
+ parameters: {
246
+ docs: {
247
+ description: {
248
+ story: "Showcase of all ViewCartButton variants and states.",
249
+ },
250
+ },
251
+ },
252
+ };