@windstream/react-shared-components 0.0.9 → 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.
Files changed (103) hide show
  1. package/README.md +623 -623
  2. package/dist/contentful/index.d.ts +10 -6
  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 +3 -3
  8. package/dist/index.d.ts +4 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/styles.css +1 -1
  11. package/package.json +159 -159
  12. package/src/components/accordion/Accordion.stories.tsx +225 -225
  13. package/src/components/accordion/index.tsx +36 -36
  14. package/src/components/accordion/types.ts +9 -9
  15. package/src/components/alert-card/types.ts +9 -9
  16. package/src/components/brand-button/BrandButton.stories.tsx +221 -221
  17. package/src/components/brand-button/helpers.ts +35 -35
  18. package/src/components/brand-button/index.tsx +90 -90
  19. package/src/components/brand-button/types.ts +26 -26
  20. package/src/components/button/Button.stories.tsx +108 -108
  21. package/src/components/button/index.tsx +23 -23
  22. package/src/components/button/types.ts +14 -14
  23. package/src/components/call-button/CallButton.stories.tsx +324 -324
  24. package/src/components/call-button/index.tsx +80 -80
  25. package/src/components/call-button/types.ts +9 -9
  26. package/src/components/checkbox/Checkbox.stories.tsx +248 -248
  27. package/src/components/checkbox/types.ts +23 -23
  28. package/src/components/checklist/Checklist.stories.tsx +151 -151
  29. package/src/components/checklist/index.tsx +33 -33
  30. package/src/components/checklist/types.ts +5 -5
  31. package/src/components/collapse/Collapse.stories.tsx +256 -256
  32. package/src/components/collapse/index.tsx +44 -44
  33. package/src/components/collapse/types.ts +5 -5
  34. package/src/components/divider/Divider.stories.tsx +206 -206
  35. package/src/components/divider/index.tsx +23 -23
  36. package/src/components/divider/type.ts +2 -2
  37. package/src/components/input/Input.stories.tsx +358 -358
  38. package/src/components/input/index.tsx +174 -174
  39. package/src/components/input/types.ts +36 -36
  40. package/src/components/link/Link.stories.tsx +163 -163
  41. package/src/components/link/index.tsx +96 -96
  42. package/src/components/link/types.ts +25 -25
  43. package/src/components/list/List.stories.tsx +272 -272
  44. package/src/components/list/index.tsx +86 -86
  45. package/src/components/list/list-item/index.tsx +36 -36
  46. package/src/components/list/list-item/types.ts +13 -13
  47. package/src/components/list/types.ts +29 -29
  48. package/src/components/material-icon/MaterialIcon.stories.tsx +330 -330
  49. package/src/components/material-icon/constants.ts +95 -95
  50. package/src/components/material-icon/index.tsx +44 -44
  51. package/src/components/material-icon/types.ts +31 -31
  52. package/src/components/modal/Modal.stories.tsx +171 -171
  53. package/src/components/modal/index.tsx +168 -168
  54. package/src/components/modal/types.ts +23 -23
  55. package/src/components/radio-button/index.tsx +73 -73
  56. package/src/components/radio-button/types.ts +21 -21
  57. package/src/components/see-more/SeeMore.stories.tsx +182 -182
  58. package/src/components/see-more/index.tsx +38 -38
  59. package/src/components/see-more/types.ts +3 -3
  60. package/src/components/select/Select.stories.tsx +410 -410
  61. package/src/components/select/index.tsx +150 -150
  62. package/src/components/select/types.ts +34 -34
  63. package/src/components/select-plan-button/SelectPlanButton.stories.tsx +160 -160
  64. package/src/components/select-plan-button/index.tsx +20 -20
  65. package/src/components/select-plan-button/types.ts +3 -3
  66. package/src/components/skeleton/Skeleton.stories.tsx +180 -180
  67. package/src/components/skeleton/index.tsx +61 -61
  68. package/src/components/skeleton/types.ts +3 -3
  69. package/src/components/spinner/Spinner.stories.tsx +335 -335
  70. package/src/components/spinner/index.tsx +44 -44
  71. package/src/components/spinner/types.ts +4 -4
  72. package/src/components/text/Text.stories.tsx +302 -302
  73. package/src/components/text/index.tsx +26 -26
  74. package/src/components/text/types.ts +45 -45
  75. package/src/components/tooltip/Tooltip.stories.tsx +220 -220
  76. package/src/components/tooltip/index.tsx +78 -78
  77. package/src/components/tooltip/types.ts +6 -6
  78. package/src/components/view-cart-button/ViewCartButton.stories.tsx +241 -241
  79. package/src/components/view-cart-button/index.tsx +38 -38
  80. package/src/components/view-cart-button/types.ts +4 -4
  81. package/src/contentful/blocks/accordion/index.tsx +7 -7
  82. package/src/contentful/blocks/button/index.tsx +5 -5
  83. package/src/contentful/blocks/callout/index.tsx +7 -7
  84. package/src/contentful/blocks/cards/index.tsx +7 -7
  85. package/src/contentful/blocks/carousel/index.tsx +7 -7
  86. package/src/contentful/blocks/cta-callout/index.tsx +6 -0
  87. package/src/contentful/blocks/cta-callout/types.ts +1 -0
  88. package/src/contentful/blocks/floating-banner/index.tsx +7 -7
  89. package/src/contentful/blocks/footer/index.tsx +7 -7
  90. package/src/contentful/blocks/image-promo-bar/index.tsx +7 -7
  91. package/src/contentful/blocks/modal/index.tsx +5 -5
  92. package/src/contentful/blocks/navigation/index.tsx +7 -7
  93. package/src/contentful/blocks/primary-hero/index.tsx +7 -7
  94. package/src/contentful/blocks/shape-background-wrapper/index.tsx +123 -101
  95. package/src/contentful/blocks/shape-background-wrapper/types.ts +35 -29
  96. package/src/contentful/blocks/text/index.tsx +6 -6
  97. package/src/contentful/index.ts +4 -1
  98. package/src/hooks/use-body-scroll-lock.ts +31 -31
  99. package/src/index.ts +81 -81
  100. package/src/setupTests.ts +46 -46
  101. package/src/styles/globals.css +275 -269
  102. package/src/types/global.d.ts +9 -9
  103. package/src/utils/index.ts +49 -49
@@ -1,174 +1,174 @@
1
- import {
2
- FocusEventHandler,
3
- forwardRef,
4
- ForwardRefRenderFunction,
5
- MouseEventHandler,
6
- useCallback,
7
- useState,
8
- } from "react";
9
- import { cx } from "@shared/utils";
10
- import { MaterialIcon } from "@shared/components/material-icon";
11
- import { Text } from "@shared/components/text";
12
- import { InputFieldProps, InputProps } from "./types";
13
-
14
- export const InputField: ForwardRefRenderFunction<
15
- HTMLInputElement,
16
- InputFieldProps
17
- > = (props, ref) => {
18
- const {
19
- className,
20
- size,
21
- required,
22
- placeholder,
23
- label,
24
- state,
25
- errorText,
26
- prefixIconName,
27
- prefixIconFill = true,
28
- suffixIconFill = false,
29
- prefixIconSize = 24,
30
- suffixIconName,
31
- suffixIconSize = 24,
32
- containerClassName,
33
- prefixIconClassName,
34
- loading,
35
- hasError,
36
- type,
37
- // Filter out all non-DOM props
38
- ...rest
39
- } = props;
40
-
41
- // Use hasError to override state if provided
42
- const effectiveState = hasError ? "error" : state;
43
-
44
- const sizeClasses = {
45
- sm: "h-[48px] rounded-lg px-3 py-2",
46
- slim: "h-12",
47
- medium: "h-14",
48
- large: "h-[60px]",
49
- };
50
-
51
- const [isHovered, setIsHovered] = useState(false);
52
- const [isFocused, setIsFocused] = useState(false);
53
- const [inputType, setInputType] = useState(type || "text");
54
-
55
- const handleMouseOver = () => setIsHovered(true);
56
- const handleMouseOut = () => setIsHovered(false);
57
- const handleFocus: FocusEventHandler<HTMLInputElement> = e => {
58
- rest.onFocus?.(e);
59
- setIsFocused(true);
60
- };
61
- const handleBlur: FocusEventHandler<HTMLInputElement> = e => {
62
- rest.onBlur?.(e);
63
- setIsFocused(false);
64
- };
65
-
66
- const togglePasswordVisibility = useCallback<
67
- MouseEventHandler<HTMLDivElement>
68
- >(e => {
69
- e.stopPropagation();
70
- setInputType(prevType =>
71
- prevType === "password" ? "text" : "password"
72
- );
73
- }, []);
74
-
75
- return (
76
- <div className="relative">
77
- {label ? (
78
- <label htmlFor={label} className={cx("inline-block pb-1")}>
79
- <Text as="span" className="footnote text-text">
80
- {label}
81
- {required ? (
82
- <span className="pl-1 text-text-critical">*</span>
83
- ) : null}
84
- </Text>
85
- </label>
86
- ) : null}
87
-
88
- <div
89
- className={cx(
90
- "relative flex w-80 flex-row items-center rounded-xl border border-input-border bg-input-bg-surface overflow-hidden",
91
- sizeClasses[size || "medium"],
92
- containerClassName,
93
- (isHovered || effectiveState === "hover") && !isFocused && effectiveState !== "error" && "border-input-border-hover",
94
- (isFocused ||
95
- effectiveState === "focus" ||
96
- effectiveState === "active") &&
97
- "border-input-border-selected outline outline-1 outline-input-border-selected",
98
- effectiveState === "error" && "border-input-border-critical outline outline-1 outline-input-border-critical"
99
- )}
100
- >
101
- {prefixIconName ? (
102
- <div
103
- className="mr-1"
104
- style={{
105
- width: prefixIconSize,
106
- height: prefixIconSize,
107
- overflow: "hidden",
108
- }}
109
- >
110
- <MaterialIcon
111
- name={prefixIconName}
112
- fill={prefixIconFill ? 1 : 0}
113
- size={prefixIconSize}
114
- className={cx(prefixIconClassName)}
115
- />
116
- </div>
117
- ) : null}
118
- <input
119
- ref={ref}
120
- id={label}
121
- disabled={loading || rest.disabled}
122
- className={cx(
123
- "h-full grow rounded-xl p-4 caret-bg-inverse placeholder:text-input-text-placeholder focus:border-none focus:outline-none",
124
- "text-body2",
125
- size === "slim" && "text-body3",
126
- className
127
- )}
128
- placeholder={placeholder}
129
- type={inputType}
130
- {...rest}
131
- onMouseOver={handleMouseOver}
132
- onMouseOut={handleMouseOut}
133
- onFocus={handleFocus}
134
- onBlur={handleBlur}
135
- />
136
- {suffixIconName ? (
137
- <div
138
- className="ml-2"
139
- style={{
140
- width: suffixIconSize,
141
- height: suffixIconSize,
142
- overflow: "hidden",
143
- }}
144
- onClick={togglePasswordVisibility}
145
- >
146
- <MaterialIcon
147
- name={inputType === "text" ? "visibility" : "visibility_off"}
148
- size={suffixIconSize}
149
- fill={suffixIconFill ? 1 : 0}
150
- />
151
- </div>
152
- ) : null}
153
- </div>
154
- {effectiveState === "error" && errorText && errorText != "" ? (
155
- <Text
156
- className={cx(
157
- "footnote left-0 top-full inline-flex items-center pt-1 text-text-critical"
158
- )}
159
- >
160
- <MaterialIcon name="info" size={20} className="mr-1" />
161
- {errorText || "Error"}
162
- </Text>
163
- ) : null}
164
- </div>
165
- );
166
- };
167
-
168
- export const Input = forwardRef<HTMLInputElement, InputFieldProps>(
169
- InputField
170
- );
171
-
172
- Input.displayName = "Input";
173
-
174
- export type { InputFieldProps, InputProps };
1
+ import {
2
+ FocusEventHandler,
3
+ forwardRef,
4
+ ForwardRefRenderFunction,
5
+ MouseEventHandler,
6
+ useCallback,
7
+ useState,
8
+ } from "react";
9
+ import { cx } from "@shared/utils";
10
+ import { MaterialIcon } from "@shared/components/material-icon";
11
+ import { Text } from "@shared/components/text";
12
+ import { InputFieldProps, InputProps } from "./types";
13
+
14
+ export const InputField: ForwardRefRenderFunction<
15
+ HTMLInputElement,
16
+ InputFieldProps
17
+ > = (props, ref) => {
18
+ const {
19
+ className,
20
+ size,
21
+ required,
22
+ placeholder,
23
+ label,
24
+ state,
25
+ errorText,
26
+ prefixIconName,
27
+ prefixIconFill = true,
28
+ suffixIconFill = false,
29
+ prefixIconSize = 24,
30
+ suffixIconName,
31
+ suffixIconSize = 24,
32
+ containerClassName,
33
+ prefixIconClassName,
34
+ loading,
35
+ hasError,
36
+ type,
37
+ // Filter out all non-DOM props
38
+ ...rest
39
+ } = props;
40
+
41
+ // Use hasError to override state if provided
42
+ const effectiveState = hasError ? "error" : state;
43
+
44
+ const sizeClasses = {
45
+ sm: "h-[48px] rounded-lg px-3 py-2",
46
+ slim: "h-12",
47
+ medium: "h-14",
48
+ large: "h-[60px]",
49
+ };
50
+
51
+ const [isHovered, setIsHovered] = useState(false);
52
+ const [isFocused, setIsFocused] = useState(false);
53
+ const [inputType, setInputType] = useState(type || "text");
54
+
55
+ const handleMouseOver = () => setIsHovered(true);
56
+ const handleMouseOut = () => setIsHovered(false);
57
+ const handleFocus: FocusEventHandler<HTMLInputElement> = e => {
58
+ rest.onFocus?.(e);
59
+ setIsFocused(true);
60
+ };
61
+ const handleBlur: FocusEventHandler<HTMLInputElement> = e => {
62
+ rest.onBlur?.(e);
63
+ setIsFocused(false);
64
+ };
65
+
66
+ const togglePasswordVisibility = useCallback<
67
+ MouseEventHandler<HTMLDivElement>
68
+ >(e => {
69
+ e.stopPropagation();
70
+ setInputType(prevType =>
71
+ prevType === "password" ? "text" : "password"
72
+ );
73
+ }, []);
74
+
75
+ return (
76
+ <div className="relative">
77
+ {label ? (
78
+ <label htmlFor={label} className={cx("inline-block pb-1")}>
79
+ <Text as="span" className="footnote text-text">
80
+ {label}
81
+ {required ? (
82
+ <span className="pl-1 text-text-critical">*</span>
83
+ ) : null}
84
+ </Text>
85
+ </label>
86
+ ) : null}
87
+
88
+ <div
89
+ className={cx(
90
+ "relative flex w-80 flex-row items-center rounded-xl border border-input-border bg-input-bg-surface overflow-hidden",
91
+ sizeClasses[size || "medium"],
92
+ containerClassName,
93
+ (isHovered || effectiveState === "hover") && !isFocused && effectiveState !== "error" && "border-input-border-hover",
94
+ (isFocused ||
95
+ effectiveState === "focus" ||
96
+ effectiveState === "active") &&
97
+ "border-input-border-selected outline outline-1 outline-input-border-selected",
98
+ effectiveState === "error" && "border-input-border-critical outline outline-1 outline-input-border-critical"
99
+ )}
100
+ >
101
+ {prefixIconName ? (
102
+ <div
103
+ className="mr-1"
104
+ style={{
105
+ width: prefixIconSize,
106
+ height: prefixIconSize,
107
+ overflow: "hidden",
108
+ }}
109
+ >
110
+ <MaterialIcon
111
+ name={prefixIconName}
112
+ fill={prefixIconFill ? 1 : 0}
113
+ size={prefixIconSize}
114
+ className={cx(prefixIconClassName)}
115
+ />
116
+ </div>
117
+ ) : null}
118
+ <input
119
+ ref={ref}
120
+ id={label}
121
+ disabled={loading || rest.disabled}
122
+ className={cx(
123
+ "h-full grow rounded-xl p-4 caret-bg-inverse placeholder:text-input-text-placeholder focus:border-none focus:outline-none",
124
+ "text-body2",
125
+ size === "slim" && "text-body3",
126
+ className
127
+ )}
128
+ placeholder={placeholder}
129
+ type={inputType}
130
+ {...rest}
131
+ onMouseOver={handleMouseOver}
132
+ onMouseOut={handleMouseOut}
133
+ onFocus={handleFocus}
134
+ onBlur={handleBlur}
135
+ />
136
+ {suffixIconName ? (
137
+ <div
138
+ className="ml-2"
139
+ style={{
140
+ width: suffixIconSize,
141
+ height: suffixIconSize,
142
+ overflow: "hidden",
143
+ }}
144
+ onClick={togglePasswordVisibility}
145
+ >
146
+ <MaterialIcon
147
+ name={inputType === "text" ? "visibility" : "visibility_off"}
148
+ size={suffixIconSize}
149
+ fill={suffixIconFill ? 1 : 0}
150
+ />
151
+ </div>
152
+ ) : null}
153
+ </div>
154
+ {effectiveState === "error" && errorText && errorText != "" ? (
155
+ <Text
156
+ className={cx(
157
+ "footnote left-0 top-full inline-flex items-center pt-1 text-text-critical"
158
+ )}
159
+ >
160
+ <MaterialIcon name="info" size={20} className="mr-1" />
161
+ {errorText || "Error"}
162
+ </Text>
163
+ ) : null}
164
+ </div>
165
+ );
166
+ };
167
+
168
+ export const Input = forwardRef<HTMLInputElement, InputFieldProps>(
169
+ InputField
170
+ );
171
+
172
+ Input.displayName = "Input";
173
+
174
+ export type { InputFieldProps, InputProps };
@@ -1,37 +1,37 @@
1
- import { InputHTMLAttributes, ReactNode } from "react";
2
-
3
- export type InputProps = Omit<InputHTMLAttributes<HTMLInputElement>, "size"> & {
4
- loading?: boolean;
5
- iconLeft?: ReactNode;
6
- size?: "sm" | "md";
7
- hasError?: boolean;
8
- label?: string;
9
- labelClassName?: string;
10
- containerClassName?: string;
11
- mapPinIcon?: boolean;
12
- isLightMapPinIcon?: boolean;
13
- passwordToggle?: boolean;
14
- helperText?: string;
15
- error?: string;
16
- variant?: "default" | "unstyled";
17
- };
18
-
19
- export type InputFieldProps = Omit<
20
- InputHTMLAttributes<HTMLInputElement>,
21
- "size"
22
- > & {
23
- state?: "default" | "focus" | "active" | "hover" | "filled" | "error";
24
- size?: "slim" | "medium" | "large";
25
- label?: string;
26
- errorText?: string;
27
- prefixIconName?: "location_on" | "search";
28
- prefixIconSize?: 20 | 24 | 40 | 48;
29
- prefixIconFill?: boolean;
30
- suffixIconFill?: boolean;
31
- suffixIconName?: "visibility" | "visibility_off" | "lock";
32
- suffixIconSize?: 20 | 24 | 40 | 48;
33
- containerClassName?: string;
34
- prefixIconClassName?: string;
35
- loading?: boolean;
36
- hasError?: boolean;
1
+ import { InputHTMLAttributes, ReactNode } from "react";
2
+
3
+ export type InputProps = Omit<InputHTMLAttributes<HTMLInputElement>, "size"> & {
4
+ loading?: boolean;
5
+ iconLeft?: ReactNode;
6
+ size?: "sm" | "md";
7
+ hasError?: boolean;
8
+ label?: string;
9
+ labelClassName?: string;
10
+ containerClassName?: string;
11
+ mapPinIcon?: boolean;
12
+ isLightMapPinIcon?: boolean;
13
+ passwordToggle?: boolean;
14
+ helperText?: string;
15
+ error?: string;
16
+ variant?: "default" | "unstyled";
17
+ };
18
+
19
+ export type InputFieldProps = Omit<
20
+ InputHTMLAttributes<HTMLInputElement>,
21
+ "size"
22
+ > & {
23
+ state?: "default" | "focus" | "active" | "hover" | "filled" | "error";
24
+ size?: "slim" | "medium" | "large";
25
+ label?: string;
26
+ errorText?: string;
27
+ prefixIconName?: "location_on" | "search";
28
+ prefixIconSize?: 20 | 24 | 40 | 48;
29
+ prefixIconFill?: boolean;
30
+ suffixIconFill?: boolean;
31
+ suffixIconName?: "visibility" | "visibility_off" | "lock";
32
+ suffixIconSize?: 20 | 24 | 40 | 48;
33
+ containerClassName?: string;
34
+ prefixIconClassName?: string;
35
+ loading?: boolean;
36
+ hasError?: boolean;
37
37
  };