@khanacademy/wonder-blocks-cell 1.0.0

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.
@@ -0,0 +1,178 @@
1
+ // @flow
2
+ import * as React from "react";
3
+ import {View} from "@khanacademy/wonder-blocks-core";
4
+ import Icon, {icons} from "@khanacademy/wonder-blocks-icon";
5
+ import {LabelSmall, LabelXSmall} from "@khanacademy/wonder-blocks-typography";
6
+
7
+ /**
8
+ * Some pre-defined accessory examples to use in our stories.
9
+ */
10
+ export const AccessoryMappings = {
11
+ withContentArticle: ((
12
+ <Icon icon={icons.contentArticle} size="medium" />
13
+ ): React.Element<typeof Icon>),
14
+ withContentVideo: ((
15
+ <Icon icon={icons.contentVideo} size="medium" />
16
+ ): React.Element<typeof Icon>),
17
+ withCaret: (<Icon icon={icons.caretRight} size="medium" />: React.Element<
18
+ typeof Icon,
19
+ >),
20
+ withText: (<LabelSmall>26.3 GB</LabelSmall>: React.Element<
21
+ typeof LabelSmall,
22
+ >),
23
+ withIconText: ((
24
+ <View style={{alignItems: "center"}}>
25
+ <Icon icon={icons.info} size="small" />
26
+ <LabelXSmall>Info</LabelXSmall>
27
+ </View>
28
+ ): React.Element<typeof View>),
29
+ withImage: ((
30
+ <img src="/avatar.png" alt="ItemAvatar" width={48} height={48} />
31
+ ): React$Element<"img">),
32
+ };
33
+
34
+ export default {
35
+ title: {
36
+ description:
37
+ "The title / main content of the cell. You can either provide a string or a Typography component. If a string is provided, typography defaults to `LabelLarge`.",
38
+ type: {required: true},
39
+ table: {
40
+ type: {
41
+ summary: "TypographyText",
42
+ detail: "string | React.Element<Typography>",
43
+ },
44
+ },
45
+ },
46
+ leftAccessory: {
47
+ description: `If provided, this adds a left accessory to the cell. Left Accessories can be defined using WB components such as Icon, IconButton, or it can even be used for a custom node/component if needed. What ever is passed in will occupy the "LeftAccessory” area of the Cell.`,
48
+ control: {type: "select"},
49
+ options: (Object.keys(AccessoryMappings): Array<React.Node>),
50
+ mapping: AccessoryMappings,
51
+ table: {
52
+ category: "Layout",
53
+ type: {
54
+ summary: "React.Node",
55
+ detail: "By default it uses a free width and its default alignment is center (for both vertical and horizontal).",
56
+ },
57
+ },
58
+ },
59
+ leftAccessoryStyle: {
60
+ description: `Optional custom styles applied to the leftAccessory wrapper. For example, it can be used to set a custom minWidth or a custom alignment.`,
61
+ table: {
62
+ category: "Styling",
63
+ type: {
64
+ summary: "AccessoryStyle",
65
+ detail: "NOTE: leftAccessoryStyle can only be used if leftAccessory is set.",
66
+ },
67
+ },
68
+ },
69
+ rightAccessory: {
70
+ description: `If provided, this adds a right accessory to the cell. Right Accessories can be defined using WB components such as Icon, IconButton, or it can even be used for a custom node/component if needed. What ever is passed in will occupy the “RightAccessory” area of the Cell.`,
71
+ control: {type: "select"},
72
+ options: (Object.keys(AccessoryMappings): Array<React.Node>),
73
+ mapping: AccessoryMappings,
74
+ table: {
75
+ category: "Layout",
76
+ type: {
77
+ summary: "React.Node",
78
+ detail: "By default it uses a free width and its default alignment is center (for both vertical and horizontal).",
79
+ },
80
+ },
81
+ },
82
+ rightAccessoryStyle: {
83
+ description: `Optional custom styles applied to the rightAccessory wrapper. For example, it can be used to set a custom minWidth or a custom alignment.`,
84
+ table: {
85
+ category: "Styling",
86
+ type: {
87
+ summary: "AccessoryStyle",
88
+ detail: "NOTE: rightAccessoryStyle can only be used if rightAccessory is set.",
89
+ },
90
+ },
91
+ },
92
+ horizontalRule: {
93
+ description:
94
+ "Adds a horizontal rule at the bottom of the cell that can be used to separate cells within groups such as lists. Defaults to `inset`.",
95
+ defaultValue: "inset",
96
+ options: ["inset", "full-width", "none"],
97
+ control: {type: "select"},
98
+ table: {
99
+ category: "Layout",
100
+ type: {
101
+ summary: "inset | full-width | none",
102
+ },
103
+ },
104
+ },
105
+ style: {
106
+ description: "Optional custom styles.",
107
+ control: {type: "object"},
108
+ table: {
109
+ category: "Styling",
110
+ type: {
111
+ summary: "StyleType",
112
+ },
113
+ },
114
+ },
115
+ testId: {
116
+ description: "Test ID used for e2e testing.",
117
+ control: {type: "text"},
118
+ table: {
119
+ type: {
120
+ summary: "string",
121
+ },
122
+ },
123
+ },
124
+ onClick: {
125
+ action: "clicked",
126
+ description: `Called when the cell is clicked.
127
+ If not provided, the Cell can’t be hovered and/or pressed (highlighted on
128
+ hover).
129
+ `,
130
+ table: {
131
+ category: "Events",
132
+ type: {
133
+ summary: "(e: SyntheticEvent<>) => mixed",
134
+ },
135
+ },
136
+ },
137
+ disabled: {
138
+ description: "Whether the cell is disabled.",
139
+ control: {
140
+ type: "boolean",
141
+ },
142
+ defaultValue: false,
143
+ table: {
144
+ type: {
145
+ summary: "boolean",
146
+ },
147
+ },
148
+ },
149
+ active: {
150
+ description: "Whether the cell is active (or currently selected).",
151
+ control: {
152
+ type: "boolean",
153
+ },
154
+ defaultValue: false,
155
+ table: {
156
+ type: {
157
+ summary: "boolean",
158
+ },
159
+ },
160
+ },
161
+ /**
162
+ * Accessibility
163
+ */
164
+ ariaLabel: {
165
+ name: "aria-label",
166
+ control: {
167
+ type: "string",
168
+ },
169
+ description: "Used to announce the cell's content to screen readers.",
170
+ table: {
171
+ category: "Accessibility",
172
+ type: {
173
+ summary: "string",
174
+ detail: `aria-label should be specially used when the cell is pressable so screen readers can announce the link when the user is focused on it.`,
175
+ },
176
+ },
177
+ },
178
+ };
@@ -0,0 +1,302 @@
1
+ // @flow
2
+ import * as React from "react";
3
+ import {StyleSheet} from "aphrodite";
4
+
5
+ import {View} from "@khanacademy/wonder-blocks-core";
6
+ import Color from "@khanacademy/wonder-blocks-color";
7
+ import {Strut} from "@khanacademy/wonder-blocks-layout";
8
+ import Spacing from "@khanacademy/wonder-blocks-spacing";
9
+ import Icon, {icons} from "@khanacademy/wonder-blocks-icon";
10
+
11
+ import type {StoryComponentType} from "@storybook/react";
12
+
13
+ import type {IconAsset} from "@khanacademy/wonder-blocks-icon";
14
+
15
+ import ComponentInfo from "../../../../../.storybook/components/component-info.js";
16
+ import {name, version} from "../../../package.json";
17
+ import BasicCellArgTypes, {AccessoryMappings} from "./basic-cell.argtypes.js";
18
+
19
+ import BasicCell from "../basic-cell.js";
20
+
21
+ export default {
22
+ title: "Cell / BasicCell",
23
+ component: BasicCell,
24
+ argTypes: BasicCellArgTypes,
25
+ parameters: {
26
+ componentSubtitle: ((
27
+ <ComponentInfo name={name} version={version} />
28
+ ): any),
29
+ docs: {
30
+ description: {
31
+ component: null,
32
+ },
33
+ source: {
34
+ // See https://github.com/storybookjs/storybook/issues/12596
35
+ excludeDecorators: true,
36
+ },
37
+ },
38
+ },
39
+ decorators: [
40
+ (Story: any): React.Node => (
41
+ <View style={styles.example}>{Story()}</View>
42
+ ),
43
+ ],
44
+ };
45
+
46
+ /**
47
+ * Default BasicCell example. It will be rendered as the first/default story and
48
+ * it can be interacted with the controls panel in the Browser.
49
+ */
50
+ const Template = (args) => <BasicCell {...args} />;
51
+
52
+ export const DefaultBasicCell: StoryComponentType = Template.bind({});
53
+
54
+ DefaultBasicCell.args = {
55
+ title: "Basic Cell",
56
+ rightAccessory: <Icon icon={icons.caretRight} />,
57
+ };
58
+
59
+ DefaultBasicCell.parameters = {
60
+ chromatic: {
61
+ // We have screenshots of other stories that cover other variants.
62
+ disableSnapshot: true,
63
+ },
64
+ };
65
+
66
+ /**
67
+ * Only including an accessory on the left.
68
+ */
69
+ export const BasicCellLeft: StoryComponentType = () => (
70
+ <BasicCell
71
+ title="Intro to rational & irrational numbers"
72
+ leftAccessory={<Icon icon={icons.contentArticle} size="medium" />}
73
+ />
74
+ );
75
+
76
+ BasicCellLeft.parameters = {
77
+ docs: {
78
+ storyDescription:
79
+ "You can create a minimal cell that only uses a title and an Icon that can be placed on the left or right (or both). In this case, we will place the icon on the left to show you how cell is flexible. Note that you can pass any of the existing WB components such as `Icon`, `IconButton`, `Tooltip`, etc.",
80
+ },
81
+ };
82
+
83
+ /**
84
+ * Only including an accessory on the right.
85
+ */
86
+ export const BasicCellRight: StoryComponentType = (args) => (
87
+ <BasicCell
88
+ title="Intro to rational & irrational numbers"
89
+ rightAccessory={<Icon icon={icons.caretRight} size="medium" />}
90
+ />
91
+ );
92
+
93
+ BasicCellRight.parameters = {
94
+ docs: {
95
+ storyDescription:
96
+ "You can also create a cell with an accessory placed on the right. Note that you can pass any of the existing WB components such as `Icon`.",
97
+ },
98
+ };
99
+
100
+ /**
101
+ * Adding multiline title to verify that the cell's height is correct.
102
+ */
103
+ export const BasicCellWithDifferentHeights: StoryComponentType = (args) => (
104
+ <>
105
+ <BasicCell
106
+ title="Single line with short accessory."
107
+ rightAccessory={AccessoryMappings.withCaret}
108
+ />
109
+ <Strut size={Spacing.xSmall_8} />
110
+ <BasicCell
111
+ title="Single line with tall accessory."
112
+ rightAccessory={AccessoryMappings.withIconText}
113
+ />
114
+ <Strut size={Spacing.xSmall_8} />
115
+ <BasicCell
116
+ title="Multi line title with tall accessory. Content should fit within the container and the cell height should be consistent no matter the content length."
117
+ rightAccessory={AccessoryMappings.withIconText}
118
+ />
119
+ </>
120
+ );
121
+
122
+ BasicCellWithDifferentHeights.parameters = {
123
+ docs: {
124
+ storyDescription:
125
+ "Cells should keep a consistent height no matter the content passed in the title prop. It should also respect a `minHeight` of 48px",
126
+ },
127
+ };
128
+
129
+ /**
130
+ * A BasicCell example adding both accessories (left and right)
131
+ */
132
+ const calendarIcon: IconAsset = {
133
+ small: `M14.22 1.6H13.33V0H11.56V1.6H4.44V0H2.67V1.6H1.78C0.79 1.6 0.01 2.32 0.01 3.2L0 14.4C0 15.28 0.79 16 1.78 16H14.22C15.2 16 16 15.28 16 14.4V3.2C16 2.32 15.2 1.6 14.22 1.6ZM14.22 14.4H1.78V5.6H14.22V14.4ZM3.56 7.2H8V11.2H3.56V7.2Z`,
134
+ };
135
+
136
+ export const BasicCellBoth: StoryComponentType = () => (
137
+ <BasicCell
138
+ title="Intro to rational & irrational numbers"
139
+ leftAccessory={<Icon icon={icons.contentArticle} size="medium" />}
140
+ rightAccessory={
141
+ <Icon icon={calendarIcon} size="medium" color={Color.blue} />
142
+ }
143
+ />
144
+ );
145
+
146
+ BasicCellBoth.storyName = "BasicCell with both accessories";
147
+
148
+ BasicCellBoth.parameters = {
149
+ docs: {
150
+ storyDescription:
151
+ "You can also create a more complex cell with accessories placed on both sides. Note that you can extend the Icon component with custom paths such as the following example.",
152
+ },
153
+ };
154
+
155
+ export const BasicCellAccessoryStyles: StoryComponentType = () => (
156
+ <BasicCell
157
+ title="BasicCell with custom accessory styles"
158
+ leftAccessory={<Icon icon={icons.contentArticle} size="medium" />}
159
+ leftAccessoryStyle={{
160
+ minWidth: Spacing.xxLarge_48,
161
+ alignSelf: "flex-start",
162
+ alignItems: "flex-start",
163
+ }}
164
+ rightAccessory={<Icon icon={icons.caretRight} size="small" />}
165
+ rightAccessoryStyle={{
166
+ minWidth: Spacing.large_24,
167
+ alignSelf: "flex-end",
168
+ alignItems: "flex-end",
169
+ }}
170
+ />
171
+ );
172
+
173
+ BasicCellAccessoryStyles.storyName = "BasicCell accessories with custom styles";
174
+
175
+ BasicCellAccessoryStyles.parameters = {
176
+ docs: {
177
+ storyDescription:
178
+ "Accessories can also be customized to adapt to different sizes and alignments. In this example, we can see how a cell can be customized for both accessories.",
179
+ },
180
+ };
181
+
182
+ /**
183
+ * Defining horizontal rule variants
184
+ */
185
+ export const BasicCellHorizontalRules: StoryComponentType = () => (
186
+ <>
187
+ <BasicCell
188
+ title="This is a basic cell with an 'inset' horizontal rule"
189
+ leftAccessory={<Icon icon={icons.contentArticle} size="medium" />}
190
+ horizontalRule="inset"
191
+ />
192
+ <BasicCell
193
+ title="This is a basic cell with a 'full-width' horizontal rule"
194
+ leftAccessory={<Icon icon={icons.contentArticle} size="medium" />}
195
+ horizontalRule="full-width"
196
+ />
197
+ <BasicCell
198
+ title="This is a basic cell without a horizontal rule"
199
+ leftAccessory={<Icon icon={icons.contentArticle} size="medium" />}
200
+ horizontalRule="none"
201
+ />
202
+ </>
203
+ );
204
+
205
+ BasicCellHorizontalRules.storyName = "Defining horizontal rule variants";
206
+
207
+ BasicCellHorizontalRules.parameters = {
208
+ docs: {
209
+ storyDescription:
210
+ "Cell components can use the `horizontalRule` prop to use a set of predefined variants that we can use to match our needs.",
211
+ },
212
+ };
213
+
214
+ export const BasicCellWithCustomStyles: StoryComponentType = () => (
215
+ <BasicCell
216
+ title="BasicCell with a darkBlue background"
217
+ leftAccessory={<Icon icon={icons.contentArticle} size="medium" />}
218
+ rightAccessory={<Icon icon={calendarIcon} color={Color.white} />}
219
+ style={{
220
+ background: Color.darkBlue,
221
+ color: Color.white,
222
+ }}
223
+ onClick={() => {}}
224
+ />
225
+ );
226
+
227
+ BasicCellWithCustomStyles.parameters = {
228
+ docs: {
229
+ storyDescription:
230
+ "Cell components can also adapt to different visual needs. One example of this can be done by passing a custom style object to the `style` prop.",
231
+ },
232
+ };
233
+
234
+ /*
235
+ * BasicCell with onClick set
236
+
237
+ */
238
+
239
+ export const ClickableBasicCell: StoryComponentType = () => (
240
+ <BasicCell
241
+ title="Intro to rational & irrational numbers"
242
+ rightAccessory={<Icon icon={icons.caretRight} />}
243
+ onClick={() => {}}
244
+ aria-label="Press to navigate to the article"
245
+ />
246
+ );
247
+
248
+ ClickableBasicCell.parameters = {
249
+ chromatic: {
250
+ // This only includes interactions with the clickable cell, so no need
251
+ // to capture screenshots.
252
+ disableSnapshot: true,
253
+ },
254
+ docs: {
255
+ storyDescription:
256
+ "Cell components can also also be clickable. This is done by passing a `onClick` prop to the component.",
257
+ },
258
+ };
259
+
260
+ export const BasicCellActive: StoryComponentType = () => (
261
+ <BasicCell
262
+ title="Title for article item"
263
+ leftAccessory={
264
+ <Icon icon={icons.contentVideo} size="medium" color="black" />
265
+ }
266
+ rightAccessory={<Icon icon={calendarIcon} size="small" />}
267
+ active={true}
268
+ onClick={() => {}}
269
+ />
270
+ );
271
+
272
+ BasicCellActive.parameters = {
273
+ docs: {
274
+ storyDescription:
275
+ "The cell also supports different states within itself. The different styles are defined internally (e.g hover, focused, pressed, active, disabled) and we allow passing some props to use the `active` or `disabled` state.",
276
+ },
277
+ };
278
+
279
+ export const BasicCellDisabled: StoryComponentType = () => (
280
+ <BasicCell
281
+ title="Title for article item"
282
+ leftAccessory={AccessoryMappings.withImage}
283
+ rightAccessory={<Icon icon={calendarIcon} size="small" />}
284
+ disabled={true}
285
+ onClick={() => {}}
286
+ />
287
+ );
288
+
289
+ BasicCellDisabled.parameters = {
290
+ docs: {
291
+ storyDescription:
292
+ "In the following example we can see how the `disabled` state works. Note that we apply an opacity to all the elements to make it more apparent that the cell is disabled. This includes text, SVG icons, images, etc.",
293
+ },
294
+ };
295
+
296
+ const styles = StyleSheet.create({
297
+ example: {
298
+ backgroundColor: Color.offWhite,
299
+ padding: Spacing.large_24,
300
+ width: 320 + Spacing.xxLarge_48,
301
+ },
302
+ });
@@ -0,0 +1,28 @@
1
+ // @flow
2
+ import BasicCellArgTypes from "./basic-cell.argtypes.js";
3
+
4
+ export default {
5
+ ...BasicCellArgTypes,
6
+ subtitle1: {
7
+ control: {
8
+ type: "text",
9
+ },
10
+ table: {
11
+ category: "Layout",
12
+ type: {
13
+ detail: "string | React.Element<Typography>",
14
+ },
15
+ },
16
+ },
17
+ subtitle2: {
18
+ control: {
19
+ type: "text",
20
+ },
21
+ table: {
22
+ category: "Layout",
23
+ type: {
24
+ detail: "string | React.Element<Typography>",
25
+ },
26
+ },
27
+ },
28
+ };
@@ -0,0 +1,154 @@
1
+ // @flow
2
+ import * as React from "react";
3
+ import {StyleSheet} from "aphrodite";
4
+
5
+ import {View} from "@khanacademy/wonder-blocks-core";
6
+ import Color from "@khanacademy/wonder-blocks-color";
7
+ import Spacing from "@khanacademy/wonder-blocks-spacing";
8
+ import Icon, {icons} from "@khanacademy/wonder-blocks-icon";
9
+
10
+ import type {StoryComponentType} from "@storybook/react";
11
+
12
+ import ComponentInfo from "../../../../../.storybook/components/component-info.js";
13
+ import {name, version} from "../../../package.json";
14
+ import DetailCellArgTypes from "./detail-cell.argtypes.js";
15
+
16
+ import DetailCell from "../detail-cell.js";
17
+
18
+ export default {
19
+ title: "Cell / DetailCell",
20
+ component: DetailCell,
21
+ argTypes: DetailCellArgTypes,
22
+ parameters: {
23
+ componentSubtitle: ((
24
+ <ComponentInfo name={name} version={version} />
25
+ ): any),
26
+ docs: {
27
+ description: {
28
+ component: null,
29
+ },
30
+ source: {
31
+ // See https://github.com/storybookjs/storybook/issues/12596
32
+ excludeDecorators: true,
33
+ },
34
+ },
35
+ },
36
+ decorators: [
37
+ (Story: any): React.Node => (
38
+ <View style={styles.example}>{Story()}</View>
39
+ ),
40
+ ],
41
+ };
42
+
43
+ /**
44
+ * Default DetailCell example. It will be rendered as the first/default story and
45
+ * it can be interacted with the controls panel in the Browser.
46
+ */
47
+ const Template = (args) => <DetailCell {...args} />;
48
+
49
+ export const DefaultDetailCell: StoryComponentType = Template.bind({});
50
+
51
+ DefaultDetailCell.args = {
52
+ title: "Title for article item",
53
+ subtitle1: "Subtitle 1 for article item",
54
+ subtitle2: "Subtitle 2 for article item",
55
+ leftAccessory: <Icon icon={icons.contentVideo} size="medium" />,
56
+ rightAccessory: <Icon icon={icons.caretRight} />,
57
+ };
58
+
59
+ /**
60
+ * Active detail cell example.
61
+ */
62
+ export const DetailCellActive: StoryComponentType = () => (
63
+ <DetailCell
64
+ title="Title for article item"
65
+ subtitle1="Subtitle for article item"
66
+ subtitle2="Subtitle for article item"
67
+ leftAccessory={<Icon icon={icons.contentVideo} size="medium" />}
68
+ rightAccessory={<Icon icon={icons.caretRight} size="small" />}
69
+ active={true}
70
+ />
71
+ );
72
+
73
+ DetailCellActive.parameters = {
74
+ docs: {
75
+ storyDescription:
76
+ "For more complex scenarios where we need to use more content such as subtitles, we provide a DetailCell component that can be used to cover these cases. The following example shows how to include a subtitle and use the active state.",
77
+ },
78
+ };
79
+
80
+ /**
81
+ * Disabled detail cell example.
82
+ */
83
+ export const DetailCellDisabled: StoryComponentType = () => (
84
+ <DetailCell
85
+ title="Title for article item"
86
+ subtitle1="Subtitle for article item"
87
+ subtitle2="Subtitle for article item"
88
+ leftAccessory={<Icon icon={icons.contentVideo} size="medium" />}
89
+ rightAccessory={<Icon icon={icons.caretRight} size="small" />}
90
+ disabled={true}
91
+ />
92
+ );
93
+
94
+ DetailCellDisabled.parameters = {
95
+ docs: {
96
+ storyDescription:
97
+ "For more complex scenarios where we need to use more content such as subtitles, we provide a DetailCell component that can be used to cover these cases. The following example shows how to include a subtitle and use the active state.",
98
+ },
99
+ };
100
+
101
+ /**
102
+ * Using custom styles.
103
+ */
104
+ export const DetailCellWithCustomStyles: StoryComponentType = () => (
105
+ <DetailCell
106
+ title="Title for article item"
107
+ subtitle1="Subtitle for article item"
108
+ subtitle2="Subtitle for article item"
109
+ leftAccessory={<Icon icon={icons.contentVideo} size="medium" />}
110
+ leftAccessoryStyle={{
111
+ minWidth: Spacing.xxLarge_48,
112
+ }}
113
+ rightAccessory={<Icon icon={icons.caretRight} size="small" />}
114
+ rightAccessoryStyle={{
115
+ minWidth: Spacing.medium_16,
116
+ alignSelf: "flex-end",
117
+ }}
118
+ />
119
+ );
120
+
121
+ DetailCellWithCustomStyles.parameters = {
122
+ docs: {
123
+ storyDescription:
124
+ "Accessories can also be customized to adapt to different sizes and alignments. In this example, we can see how a cell can be customized for both accessories. ",
125
+ },
126
+ };
127
+
128
+ export const ClickableDetailCell: StoryComponentType = () => (
129
+ <DetailCell
130
+ title="Title for article item"
131
+ subtitle1="Subtitle for article item"
132
+ subtitle2="Subtitle for article item"
133
+ leftAccessory={<Icon icon={icons.contentVideo} size="medium" />}
134
+ rightAccessory={<Icon icon={icons.caretRight} />}
135
+ onClick={() => {}}
136
+ aria-label="Press to navigate to the article"
137
+ />
138
+ );
139
+
140
+ ClickableDetailCell.parameters = {
141
+ chromatic: {
142
+ // This only includes interactions with the clickable cell, so no need
143
+ // to capture screenshots.
144
+ disableSnapshot: true,
145
+ },
146
+ };
147
+
148
+ const styles = StyleSheet.create({
149
+ example: {
150
+ backgroundColor: Color.offWhite,
151
+ padding: Spacing.large_24,
152
+ width: 376,
153
+ },
154
+ });