@windstream/react-shared-components 0.1.41 → 0.1.43

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.d.ts +2 -2
  3. package/dist/contentful/index.esm.js +2 -4
  4. package/dist/contentful/index.esm.js.map +1 -1
  5. package/dist/contentful/index.js +2 -4
  6. package/dist/contentful/index.js.map +1 -1
  7. package/dist/core.d.ts +5 -4
  8. package/dist/index.d.ts +5 -4
  9. package/dist/index.esm.js +5 -7
  10. package/dist/index.esm.js.map +1 -1
  11. package/dist/index.js +5 -7
  12. package/dist/index.js.map +1 -1
  13. package/dist/next/index.esm.js +1 -3
  14. package/dist/next/index.esm.js.map +1 -1
  15. package/dist/next/index.js +1 -3
  16. package/dist/next/index.js.map +1 -1
  17. package/dist/styles.css +1 -1
  18. package/dist/utils/index.d.ts +4 -5
  19. package/dist/utils/index.esm.js +1 -1
  20. package/dist/utils/index.esm.js.map +1 -1
  21. package/dist/utils/index.js +1 -1
  22. package/dist/utils/index.js.map +1 -1
  23. package/package.json +185 -185
  24. package/src/components/accordion/Accordion.stories.tsx +230 -230
  25. package/src/components/accordion/index.tsx +70 -70
  26. package/src/components/accordion/types.ts +12 -12
  27. package/src/components/alert-card/AlertCard.stories.tsx +171 -171
  28. package/src/components/alert-card/index.tsx +41 -41
  29. package/src/components/alert-card/types.ts +13 -13
  30. package/src/components/brand-button/BrandButton.stories.tsx +223 -223
  31. package/src/components/brand-button/helpers.ts +35 -35
  32. package/src/components/brand-button/index.tsx +120 -114
  33. package/src/components/brand-button/types.ts +38 -37
  34. package/src/components/button/Button.stories.tsx +108 -108
  35. package/src/components/button/index.tsx +27 -27
  36. package/src/components/button/types.ts +14 -14
  37. package/src/components/call-button/CallButton.stories.tsx +324 -324
  38. package/src/components/call-button/index.tsx +86 -86
  39. package/src/components/call-button/types.ts +11 -11
  40. package/src/components/checkbox/Checkbox.stories.tsx +247 -247
  41. package/src/components/checkbox/index.tsx +197 -197
  42. package/src/components/checkbox/types.ts +27 -27
  43. package/src/components/checklist/Checklist.stories.tsx +150 -150
  44. package/src/components/checklist/index.tsx +61 -61
  45. package/src/components/checklist/types.ts +17 -17
  46. package/src/components/collapse/Collapse.stories.tsx +255 -255
  47. package/src/components/collapse/index.tsx +46 -46
  48. package/src/components/collapse/types.ts +6 -6
  49. package/src/components/divider/Divider.stories.tsx +205 -205
  50. package/src/components/divider/index.tsx +22 -22
  51. package/src/components/divider/type.ts +3 -3
  52. package/src/components/image/Image.stories.tsx +113 -113
  53. package/src/components/image/index.tsx +25 -25
  54. package/src/components/image/types.ts +40 -40
  55. package/src/components/input/Input.stories.tsx +325 -325
  56. package/src/components/input/index.tsx +177 -177
  57. package/src/components/input/types.ts +37 -37
  58. package/src/components/link/Link.stories.tsx +163 -163
  59. package/src/components/link/index.tsx +109 -109
  60. package/src/components/link/types.ts +25 -25
  61. package/src/components/list/List.stories.tsx +272 -272
  62. package/src/components/list/index.tsx +88 -88
  63. package/src/components/list/list-item/index.tsx +38 -38
  64. package/src/components/list/list-item/types.ts +13 -13
  65. package/src/components/list/types.ts +29 -29
  66. package/src/components/material-icon/MaterialIcon.stories.tsx +322 -322
  67. package/src/components/material-icon/constants.ts +98 -98
  68. package/src/components/material-icon/index.tsx +47 -47
  69. package/src/components/material-icon/types.ts +31 -31
  70. package/src/components/modal/Modal.stories.tsx +171 -171
  71. package/src/components/modal/index.tsx +164 -164
  72. package/src/components/modal/types.ts +24 -24
  73. package/src/components/next-image/index.tsx +54 -54
  74. package/src/components/next-image/types.ts +1 -1
  75. package/src/components/pagination/index.tsx +100 -100
  76. package/src/components/pagination/types.ts +6 -6
  77. package/src/components/radio-button/RadioButton.stories.tsx +307 -307
  78. package/src/components/radio-button/index.tsx +75 -75
  79. package/src/components/radio-button/types.ts +21 -21
  80. package/src/components/see-more/SeeMore.stories.tsx +181 -181
  81. package/src/components/see-more/index.tsx +44 -44
  82. package/src/components/see-more/types.ts +4 -4
  83. package/src/components/select/Select.stories.tsx +411 -411
  84. package/src/components/select/index.tsx +155 -155
  85. package/src/components/select/types.ts +36 -36
  86. package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
  87. package/src/components/select-plan-button/index.tsx +63 -63
  88. package/src/components/select-plan-button/types.ts +17 -17
  89. package/src/components/skeleton/Skeleton.stories.tsx +179 -179
  90. package/src/components/skeleton/index.tsx +61 -61
  91. package/src/components/skeleton/types.ts +4 -4
  92. package/src/components/spinner/Spinner.stories.tsx +335 -335
  93. package/src/components/spinner/index.tsx +44 -44
  94. package/src/components/spinner/types.ts +5 -5
  95. package/src/components/text/Text.stories.tsx +321 -321
  96. package/src/components/text/index.tsx +25 -25
  97. package/src/components/text/types.ts +45 -45
  98. package/src/components/tooltip/Tooltip.stories.tsx +219 -219
  99. package/src/components/tooltip/index.tsx +74 -74
  100. package/src/components/tooltip/types.ts +7 -7
  101. package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
  102. package/src/components/view-cart-button/index.tsx +42 -42
  103. package/src/components/view-cart-button/types.ts +5 -5
  104. package/src/contentful/blocks/accordion/Accordion.stories.tsx +29 -29
  105. package/src/contentful/blocks/accordion/index.tsx +62 -62
  106. package/src/contentful/blocks/accordion/types.ts +17 -17
  107. package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
  108. package/src/contentful/blocks/address-input-banner/types.ts +14 -14
  109. package/src/contentful/blocks/anchored-bottom-banner/index.tsx +70 -70
  110. package/src/contentful/blocks/anchored-bottom-banner/types.ts +10 -10
  111. package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
  112. package/src/contentful/blocks/blogs-grid/types.ts +26 -26
  113. package/src/contentful/blocks/breadcrumbs/index.tsx +51 -51
  114. package/src/contentful/blocks/breadcrumbs/types.ts +5 -5
  115. package/src/contentful/blocks/button/Button.stories.tsx +40 -40
  116. package/src/contentful/blocks/button/index.tsx +130 -129
  117. package/src/contentful/blocks/button/types.ts +39 -39
  118. package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
  119. package/src/contentful/blocks/callout/index.tsx +88 -88
  120. package/src/contentful/blocks/callout/types.ts +15 -15
  121. package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
  122. package/src/contentful/blocks/cards/blog-card/index.tsx +110 -110
  123. package/src/contentful/blocks/cards/blog-card/types.ts +18 -18
  124. package/src/contentful/blocks/cards/index.tsx +13 -13
  125. package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
  126. package/src/contentful/blocks/cards/product-card/types.ts +28 -28
  127. package/src/contentful/blocks/cards/simple-card/index.tsx +89 -89
  128. package/src/contentful/blocks/cards/simple-card/types.ts +28 -28
  129. package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
  130. package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
  131. package/src/contentful/blocks/cards/types.ts +1 -1
  132. package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
  133. package/src/contentful/blocks/carousel/helper.tsx +440 -440
  134. package/src/contentful/blocks/carousel/index.tsx +85 -85
  135. package/src/contentful/blocks/carousel/types.ts +144 -144
  136. package/src/contentful/blocks/comparison-table/index.tsx +27 -27
  137. package/src/contentful/blocks/comparison-table/types.ts +6 -6
  138. package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
  139. package/src/contentful/blocks/cookiebanner/type.ts +7 -7
  140. package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
  141. package/src/contentful/blocks/cta-callout/index.tsx +69 -69
  142. package/src/contentful/blocks/cta-callout/types.ts +26 -26
  143. package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
  144. package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
  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 +90 -90
  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 -241
  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 +96 -96
  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,114 +1,120 @@
1
- "use client";
2
-
3
- import React, { forwardRef } from "react";
4
- import { getLabelSizeBasedOnButtonSize, sizeToClassNames } from "./helpers";
5
-
6
- import {
7
- ButtonProps,
8
- ButtonVariantsT,
9
- } from "@shared/components/brand-button/types";
10
- import { MaterialIcon } from "@shared/components/material-icon";
11
- import { cx } from "@shared/utils";
12
-
13
- // BrandButton is intentionally limited to prevent over-configuration, restricting className and children props.
14
- export const BrandButton = forwardRef<
15
- HTMLButtonElement | HTMLAnchorElement,
16
- ButtonProps
17
- >(
18
- (
19
- {
20
- variant = "primary_brand",
21
- isLoading = false,
22
- text,
23
- label,
24
- disabled,
25
- fullWidth,
26
- size = { base: "medium" },
27
- as = "button",
28
- ...props
29
- },
30
- ref
31
- ) => {
32
- const getVariantClasses = () => {
33
- const baseClasses = cx(
34
- sizeToClassNames(size),
35
- "rounded-button pl-15 pr-15 inline-flex gap-2 items-center justify-center outline-none focus:ring-2 focus:ring-offset-2 cursor-pointer transition-colors duration-200 align-top whitespace-nowrap",
36
- fullWidth && "w-full"
37
- );
38
-
39
- const variantClasses: Record<ButtonVariantsT, string> = {
40
- primary_brand:
41
- "bg-bg-fill-brand text-text-brand-on-bg-fill [&:not(:disabled)]:hover:bg-bg-fill-brand-hover focus:ring-bg-fill-brand disabled:bg-bg-fill-brand-disabled",
42
- primary_inverse:
43
- "bg-bg-fill-inverse text-text-inverse [&:not(:disabled)]:hover:bg-bg-fill-inverse-hover focus:ring-bg-surface-inverse disabled:bg-bg-fill-inverse-disabled",
44
- secondary:
45
- "border border-border-secondary-on-bg-fill bg-bg-fill-secondary text-text [&:not(:disabled)]:hover:bg-bg-fill-secondary-hover focus:bg-bg-fill-secondary focus:ring-input-border-hover disabled:bg-bg-fill-secondary",
46
- };
47
- const stateClasses = cx(
48
- (disabled || isLoading) && "cursor-not-allowed",
49
- isLoading && "pl-7"
50
- );
51
-
52
- return cx(baseClasses, variantClasses[variant] || "", stateClasses);
53
- };
54
-
55
- const variantClasses = getVariantClasses();
56
-
57
- let infoClassNames = `button--${variant}`;
58
- if (isLoading) infoClassNames += " button--loading";
59
- if (disabled) infoClassNames += " button--disabled";
60
-
61
- const combinedClassName = `${infoClassNames} ${variantClasses}`;
62
-
63
- const contentEl = (
64
- <>
65
- {isLoading ? (
66
- <MaterialIcon name="progress_activity" className="animate-spin" />
67
- ) : null}
68
-
69
- {label ? (
70
- <span className="flex flex-col">
71
- <span className={cx(getLabelSizeBasedOnButtonSize(size))}>
72
- {label}
73
- </span>
74
- {text}
75
- </span>
76
- ) : (
77
- text
78
- )}
79
- </>
80
- );
81
-
82
- if (as === "a") {
83
- return (
84
- <a
85
- ref={ref as React.Ref<HTMLAnchorElement>}
86
- className={cx(combinedClassName)}
87
- {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}
88
- >
89
- {contentEl}
90
- </a>
91
- );
92
- }
93
-
94
- return (
95
- <button
96
- ref={ref as React.Ref<HTMLButtonElement>}
97
- className={cx(combinedClassName)}
98
- disabled={disabled || isLoading}
99
- {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}
100
- >
101
- {contentEl}
102
- </button>
103
- );
104
- }
105
- );
106
-
107
- BrandButton.displayName = "BrandButton";
108
-
109
- export type {
110
- ButtonProps,
111
- ButtonVariantsT,
112
- ButtonSizeT,
113
- ResponsiveSize,
114
- } from "./types";
1
+ "use client";
2
+
3
+ import React, { forwardRef } from "react";
4
+ import { getLabelSizeBasedOnButtonSize, sizeToClassNames } from "./helpers";
5
+
6
+ import {
7
+ ButtonProps,
8
+ ButtonVariantsT,
9
+ } from "@shared/components/brand-button/types";
10
+ import { MaterialIcon } from "@shared/components/material-icon";
11
+ import { cx } from "@shared/utils";
12
+
13
+ // BrandButton is intentionally limited to prevent over-configuration, restricting className and children props.
14
+ export const BrandButton = forwardRef<
15
+ HTMLButtonElement | HTMLAnchorElement,
16
+ ButtonProps
17
+ >(
18
+ (
19
+ {
20
+ variant = "primary_brand",
21
+ isLoading = false,
22
+ text,
23
+ label,
24
+ disabled,
25
+ fullWidth,
26
+ buttonClassName,
27
+ size = { base: "medium" },
28
+ as = "button",
29
+ ...props
30
+ },
31
+ ref
32
+ ) => {
33
+ const getVariantClasses = () => {
34
+ const baseClasses = cx(
35
+ sizeToClassNames(size),
36
+ "rounded-button pl-15 pr-15 inline-flex gap-2 items-center justify-center outline-none focus:ring-2 focus:ring-offset-2 cursor-pointer transition-colors duration-200 align-top whitespace-nowrap",
37
+ fullWidth ? "w-full" : "w-auto"
38
+ );
39
+
40
+ const variantClasses: Record<ButtonVariantsT, string> = {
41
+ primary_brand:
42
+ "bg-bg-fill-brand text-text-brand-on-bg-fill [&:not(:disabled)]:hover:bg-bg-fill-brand-hover focus:ring-bg-fill-brand disabled:bg-bg-fill-brand-disabled",
43
+ primary_inverse:
44
+ "bg-bg-fill-inverse text-text-inverse [&:not(:disabled)]:hover:bg-bg-fill-inverse-hover focus:ring-bg-surface-inverse disabled:bg-bg-fill-inverse-disabled",
45
+ secondary:
46
+ "border border-border-secondary-on-bg-fill bg-bg-fill-secondary text-text [&:not(:disabled)]:hover:bg-bg-fill-secondary-hover focus:bg-bg-fill-secondary focus:ring-input-border-hover disabled:bg-bg-fill-secondary",
47
+ };
48
+ const stateClasses = cx(
49
+ (disabled || isLoading) && "cursor-not-allowed",
50
+ isLoading && "pl-7"
51
+ );
52
+
53
+ return cx(
54
+ baseClasses,
55
+ variantClasses[variant] || "",
56
+ stateClasses,
57
+ buttonClassName
58
+ );
59
+ };
60
+
61
+ const variantClasses = getVariantClasses();
62
+
63
+ let infoClassNames = `button--${variant}`;
64
+ if (isLoading) infoClassNames += " button--loading";
65
+ if (disabled) infoClassNames += " button--disabled";
66
+
67
+ const combinedClassName = `${infoClassNames} ${variantClasses}`;
68
+
69
+ const contentEl = (
70
+ <>
71
+ {isLoading ? (
72
+ <MaterialIcon name="progress_activity" className="animate-spin" />
73
+ ) : null}
74
+
75
+ {label ? (
76
+ <span className="flex flex-col">
77
+ <span className={cx(getLabelSizeBasedOnButtonSize(size))}>
78
+ {label}
79
+ </span>
80
+ {text}
81
+ </span>
82
+ ) : (
83
+ text
84
+ )}
85
+ </>
86
+ );
87
+
88
+ if (as === "a") {
89
+ return (
90
+ <a
91
+ ref={ref as React.Ref<HTMLAnchorElement>}
92
+ className={cx(combinedClassName)}
93
+ {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}
94
+ >
95
+ {contentEl}
96
+ </a>
97
+ );
98
+ }
99
+
100
+ return (
101
+ <button
102
+ ref={ref as React.Ref<HTMLButtonElement>}
103
+ className={cx(combinedClassName)}
104
+ disabled={disabled || isLoading}
105
+ {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}
106
+ >
107
+ {contentEl}
108
+ </button>
109
+ );
110
+ }
111
+ );
112
+
113
+ BrandButton.displayName = "BrandButton";
114
+
115
+ export type {
116
+ ButtonProps,
117
+ ButtonVariantsT,
118
+ ButtonSizeT,
119
+ ResponsiveSize,
120
+ } from "./types";
@@ -1,37 +1,38 @@
1
- import { type AnchorHTMLAttributes, type ButtonHTMLAttributes } from "react";
2
-
3
- export type ButtonVariantsT = "primary_brand" | "primary_inverse" | "secondary";
4
-
5
- export type ButtonSizeT = "small" | "medium" | "large" | "x-large";
6
-
7
- export type ResponsiveSize = {
8
- base?: ButtonSizeT;
9
- md?: ButtonSizeT;
10
- lg?: ButtonSizeT;
11
- };
12
-
13
- export type ButtonCustomProps = {
14
- /** Button styling variant */
15
- variant?: ButtonVariantsT;
16
- /** Loading state - shows spinner and disables button */
17
- isLoading?: boolean;
18
- label?: string;
19
- text?: string;
20
- disabled?: boolean;
21
- fullWidth?: boolean;
22
- size?: ResponsiveSize;
23
- };
24
-
25
- // Discriminated union types for polymorphic component
26
- export type ButtonAsButton = ButtonCustomProps &
27
- Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "className"> & {
28
- as?: "button";
29
- };
30
-
31
- export type ButtonAsAnchor = ButtonCustomProps &
32
- Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "children" | "className"> & {
33
- as: "a";
34
- href: string; // href is required when as="a"
35
- };
36
-
37
- export type ButtonProps = ButtonAsButton | ButtonAsAnchor;
1
+ import { type AnchorHTMLAttributes, type ButtonHTMLAttributes } from "react";
2
+
3
+ export type ButtonVariantsT = "primary_brand" | "primary_inverse" | "secondary";
4
+
5
+ export type ButtonSizeT = "small" | "medium" | "large" | "x-large";
6
+
7
+ export type ResponsiveSize = {
8
+ base?: ButtonSizeT;
9
+ md?: ButtonSizeT;
10
+ lg?: ButtonSizeT;
11
+ };
12
+
13
+ export type ButtonCustomProps = {
14
+ /** Button styling variant */
15
+ variant?: ButtonVariantsT;
16
+ /** Loading state - shows spinner and disables button */
17
+ isLoading?: boolean;
18
+ label?: string;
19
+ text?: string;
20
+ disabled?: boolean;
21
+ fullWidth?: boolean;
22
+ buttonClassName?: string;
23
+ size?: ResponsiveSize;
24
+ };
25
+
26
+ // Discriminated union types for polymorphic component
27
+ export type ButtonAsButton = ButtonCustomProps &
28
+ Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "className"> & {
29
+ as?: "button";
30
+ };
31
+
32
+ export type ButtonAsAnchor = ButtonCustomProps &
33
+ Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "children" | "className"> & {
34
+ as: "a";
35
+ href: string; // href is required when as="a"
36
+ };
37
+
38
+ export type ButtonProps = ButtonAsButton | ButtonAsAnchor;
@@ -1,108 +1,108 @@
1
- import { Button } from "./index";
2
-
3
- import { DocsPage } from "@shared/stories/DocsTemplate";
4
- import type { Meta, StoryObj } from "@storybook/react";
5
-
6
- const meta: Meta<typeof Button> = {
7
- title: "Components/Button",
8
- component: Button,
9
- tags: ["autodocs"],
10
- parameters: {
11
- layout: "centered",
12
- docs: {
13
- page: DocsPage,
14
- description: {
15
- component:
16
- "A base button component for functional actions. Its appearance and behavior can be customized based on the parent component's context using className. This component provides loading and disabled states, but styling is left to the consumer.",
17
- },
18
- },
19
- },
20
- argTypes: {
21
- disabled: {
22
- control: { type: "boolean" },
23
- description: "Disable the button",
24
- },
25
- children: {
26
- control: { type: "text" },
27
- description: "Button content",
28
- },
29
- className: {
30
- control: { type: "text" },
31
- description: "Additional CSS classes for custom styling",
32
- },
33
- },
34
- args: {
35
- children: "Button",
36
- disabled: false,
37
- },
38
- };
39
-
40
- export default meta;
41
- type Story = StoryObj<typeof meta>;
42
-
43
- // Default button
44
- export const Default: Story = {
45
- args: {},
46
- };
47
-
48
- // Disabled button
49
- export const Disabled: Story = {
50
- args: {
51
- disabled: true,
52
- children: "Disabled Button",
53
- },
54
- };
55
-
56
- // With custom styling
57
- export const WithCustomStyling: Story = {
58
- args: {
59
- className: "btn-medium bg-fill-brand text-inverse rounded px-4 py-2",
60
- children: "Custom Styled Button",
61
- },
62
- parameters: {
63
- docs: {
64
- description: {
65
- story:
66
- "The Button component accepts className for custom styling. Use Tailwind classes or your own CSS to style the button as needed.",
67
- },
68
- },
69
- },
70
- };
71
-
72
- // Styling examples
73
- export const StylingExamples: Story = {
74
- render: () => (
75
- <div className="space-y-4">
76
- <div>
77
- <p className="mb-2 text-sm text-gray-600">
78
- Examples of how you can style the Button component using className:
79
- </p>
80
- <div className="flex flex-wrap gap-2">
81
- <Button className="bg-fill-brand text-inverse btn-medium">
82
- Brand Button
83
- </Button>
84
- <Button className="bg-surface-secondary text-default btn-medium">
85
- Secondary Button
86
- </Button>
87
- <Button className="border-border-default text-default btn-medium border">
88
- Outline Button
89
- </Button>
90
- <Button className="bg-fill-brand text-inverse btn-small">
91
- Small Button
92
- </Button>
93
- <Button className="bg-fill-brand text-inverse btn-large">
94
- Large Button
95
- </Button>
96
- </div>
97
- </div>
98
- </div>
99
- ),
100
- parameters: {
101
- docs: {
102
- description: {
103
- story:
104
- "Styling examples showing how to use className to customize the button appearance. These are examples only - the component itself doesn't provide built-in variants.",
105
- },
106
- },
107
- },
108
- };
1
+ import { Button } from "./index";
2
+
3
+ import { DocsPage } from "@shared/stories/DocsTemplate";
4
+ import type { Meta, StoryObj } from "@storybook/react";
5
+
6
+ const meta: Meta<typeof Button> = {
7
+ title: "Components/Button",
8
+ component: Button,
9
+ tags: ["autodocs"],
10
+ parameters: {
11
+ layout: "centered",
12
+ docs: {
13
+ page: DocsPage,
14
+ description: {
15
+ component:
16
+ "A base button component for functional actions. Its appearance and behavior can be customized based on the parent component's context using className. This component provides loading and disabled states, but styling is left to the consumer.",
17
+ },
18
+ },
19
+ },
20
+ argTypes: {
21
+ disabled: {
22
+ control: { type: "boolean" },
23
+ description: "Disable the button",
24
+ },
25
+ children: {
26
+ control: { type: "text" },
27
+ description: "Button content",
28
+ },
29
+ className: {
30
+ control: { type: "text" },
31
+ description: "Additional CSS classes for custom styling",
32
+ },
33
+ },
34
+ args: {
35
+ children: "Button",
36
+ disabled: false,
37
+ },
38
+ };
39
+
40
+ export default meta;
41
+ type Story = StoryObj<typeof meta>;
42
+
43
+ // Default button
44
+ export const Default: Story = {
45
+ args: {},
46
+ };
47
+
48
+ // Disabled button
49
+ export const Disabled: Story = {
50
+ args: {
51
+ disabled: true,
52
+ children: "Disabled Button",
53
+ },
54
+ };
55
+
56
+ // With custom styling
57
+ export const WithCustomStyling: Story = {
58
+ args: {
59
+ className: "btn-medium bg-fill-brand text-inverse rounded px-4 py-2",
60
+ children: "Custom Styled Button",
61
+ },
62
+ parameters: {
63
+ docs: {
64
+ description: {
65
+ story:
66
+ "The Button component accepts className for custom styling. Use Tailwind classes or your own CSS to style the button as needed.",
67
+ },
68
+ },
69
+ },
70
+ };
71
+
72
+ // Styling examples
73
+ export const StylingExamples: Story = {
74
+ render: () => (
75
+ <div className="space-y-4">
76
+ <div>
77
+ <p className="mb-2 text-sm text-gray-600">
78
+ Examples of how you can style the Button component using className:
79
+ </p>
80
+ <div className="flex flex-wrap gap-2">
81
+ <Button className="bg-fill-brand text-inverse btn-medium">
82
+ Brand Button
83
+ </Button>
84
+ <Button className="bg-surface-secondary text-default btn-medium">
85
+ Secondary Button
86
+ </Button>
87
+ <Button className="border-border-default text-default btn-medium border">
88
+ Outline Button
89
+ </Button>
90
+ <Button className="bg-fill-brand text-inverse btn-small">
91
+ Small Button
92
+ </Button>
93
+ <Button className="bg-fill-brand text-inverse btn-large">
94
+ Large Button
95
+ </Button>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ ),
100
+ parameters: {
101
+ docs: {
102
+ description: {
103
+ story:
104
+ "Styling examples showing how to use className to customize the button appearance. These are examples only - the component itself doesn't provide built-in variants.",
105
+ },
106
+ },
107
+ },
108
+ };
@@ -1,27 +1,27 @@
1
- "use client";
2
-
3
- import { forwardRef } from "react";
4
-
5
- import { ButtonProps } from "@shared/components/button/types";
6
- import { cx } from "@shared/utils";
7
-
8
- // Minimal button: styling is entirely up to the consumer via className
9
- export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
10
- ({ children, className = "", style, disabled, ...props }, ref) => {
11
- return (
12
- <button
13
- ref={ref}
14
- className={cx(className)}
15
- style={style}
16
- disabled={disabled}
17
- {...props}
18
- >
19
- {children}
20
- </button>
21
- );
22
- }
23
- );
24
-
25
- Button.displayName = "Button";
26
-
27
- export type { ButtonProps };
1
+ "use client";
2
+
3
+ import { forwardRef } from "react";
4
+
5
+ import { ButtonProps } from "@shared/components/button/types";
6
+ import { cx } from "@shared/utils";
7
+
8
+ // Minimal button: styling is entirely up to the consumer via className
9
+ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
10
+ ({ children, className = "", style, disabled, ...props }, ref) => {
11
+ return (
12
+ <button
13
+ ref={ref}
14
+ className={cx(className)}
15
+ style={style}
16
+ disabled={disabled}
17
+ {...props}
18
+ >
19
+ {children}
20
+ </button>
21
+ );
22
+ }
23
+ );
24
+
25
+ Button.displayName = "Button";
26
+
27
+ export type { ButtonProps };
@@ -1,14 +1,14 @@
1
- import {
2
- type ButtonHTMLAttributes,
3
- type CSSProperties,
4
- type ReactNode,
5
- } from "react";
6
-
7
- export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
8
- /** Content to render inside the button */
9
- children?: ReactNode;
10
- /** Custom className for the button */
11
- className?: string;
12
- /** Custom styles */
13
- style?: CSSProperties;
14
- }
1
+ import {
2
+ type ButtonHTMLAttributes,
3
+ type CSSProperties,
4
+ type ReactNode,
5
+ } from "react";
6
+
7
+ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
8
+ /** Content to render inside the button */
9
+ children?: ReactNode;
10
+ /** Custom className for the button */
11
+ className?: string;
12
+ /** Custom styles */
13
+ style?: CSSProperties;
14
+ }