@sproutsocial/seeds-react-content-block 0.5.2 → 0.5.14

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.
package/CHANGELOG.md DELETED
@@ -1,317 +0,0 @@
1
- # @sproutsocial/seeds-react-content-block
2
-
3
- ## 0.5.2
4
-
5
- ### Patch Changes
6
-
7
- - @sproutsocial/seeds-react-button@2.0.4
8
- - @sproutsocial/seeds-react-content-header@0.2.10
9
-
10
- ## 0.5.1
11
-
12
- ### Patch Changes
13
-
14
- - @sproutsocial/seeds-react-button@2.0.3
15
- - @sproutsocial/seeds-react-content-header@0.2.9
16
-
17
- ## 0.5.0
18
-
19
- ### Minor Changes
20
-
21
- - eb6937d: Add optional `footerContent` and `footerActions` props for a styled footer area below the content, and `flushLayout` boolean prop to set content area padding to 0
22
-
23
- ### Patch Changes
24
-
25
- - Updated dependencies [eb6937d]
26
- - @sproutsocial/seeds-react-content-header@0.2.8
27
-
28
- ## 0.4.1
29
-
30
- ### Patch Changes
31
-
32
- - @sproutsocial/seeds-react-button@2.0.2
33
- - @sproutsocial/seeds-react-content-header@0.2.7
34
-
35
- ## 0.4.0
36
-
37
- ### Minor Changes
38
-
39
- - 43380e5: Subtitle is now an optional prop
40
-
41
- ## 0.3.7
42
-
43
- ### Patch Changes
44
-
45
- - @sproutsocial/seeds-react-button@2.0.1
46
- - @sproutsocial/seeds-react-content-header@0.2.6
47
-
48
- ## 0.3.6
49
-
50
- ### Patch Changes
51
-
52
- - Updated dependencies [4ba8720]
53
- - Updated dependencies [df9d751]
54
- - @sproutsocial/seeds-react-theme@3.6.2
55
- - @sproutsocial/seeds-react-button@2.0.0
56
- - @sproutsocial/seeds-react-box@1.1.16
57
- - @sproutsocial/seeds-react-container@0.3.10
58
- - @sproutsocial/seeds-react-loader@1.0.16
59
- - @sproutsocial/seeds-react-content-header@0.2.5
60
-
61
- ## 0.3.5
62
-
63
- ### Patch Changes
64
-
65
- - Updated dependencies [1f9a473]
66
- - @sproutsocial/seeds-react-theme@3.6.1
67
- - @sproutsocial/seeds-react-box@1.1.15
68
- - @sproutsocial/seeds-react-container@0.3.9
69
- - @sproutsocial/seeds-react-loader@1.0.15
70
- - @sproutsocial/seeds-react-content-header@0.2.4
71
- - @sproutsocial/seeds-react-button@1.4.3
72
-
73
- ## 0.3.4
74
-
75
- ### Patch Changes
76
-
77
- - @sproutsocial/seeds-react-button@1.4.2
78
- - @sproutsocial/seeds-react-content-header@0.2.3
79
-
80
- ## 0.3.3
81
-
82
- ### Patch Changes
83
-
84
- - @sproutsocial/seeds-react-button@1.4.1
85
- - @sproutsocial/seeds-react-content-header@0.2.2
86
-
87
- ## 0.3.2
88
-
89
- ### Patch Changes
90
-
91
- - Updated dependencies [7d54d67]
92
- - @sproutsocial/seeds-react-button@1.4.0
93
-
94
- ## 0.3.1
95
-
96
- ### Patch Changes
97
-
98
- - Updated dependencies [17d4f12]
99
- - @sproutsocial/seeds-react-theme@3.6.0
100
- - @sproutsocial/seeds-react-box@1.1.14
101
- - @sproutsocial/seeds-react-container@0.3.8
102
- - @sproutsocial/seeds-react-loader@1.0.14
103
- - @sproutsocial/seeds-react-content-header@0.2.1
104
- - @sproutsocial/seeds-react-button@1.3.20
105
-
106
- ## 0.3.0
107
-
108
- ### Minor Changes
109
-
110
- - 5bb63e1: ContentBlock now uses ContentHeader/CollapsibleContentHeader internally and supports optional collapsible behavior via isCollapsible prop.
111
-
112
- ### Patch Changes
113
-
114
- - Updated dependencies [5bb63e1]
115
- - Updated dependencies [5bb63e1]
116
- - @sproutsocial/seeds-react-content-header@0.2.0
117
- - @sproutsocial/seeds-react-container@0.3.7
118
- - @sproutsocial/seeds-react-button@1.3.19
119
- - @sproutsocial/seeds-react-loader@1.0.13
120
-
121
- ## 0.2.13
122
-
123
- ### Patch Changes
124
-
125
- - Updated dependencies [118e300]
126
- - @sproutsocial/seeds-react-theme@3.5.1
127
- - @sproutsocial/seeds-react-box@1.1.13
128
- - @sproutsocial/seeds-react-container@0.3.6
129
- - @sproutsocial/seeds-react-icon@2.2.4
130
- - @sproutsocial/seeds-react-loader@1.0.12
131
- - @sproutsocial/seeds-react-button@1.3.18
132
-
133
- ## 0.2.12
134
-
135
- ### Patch Changes
136
-
137
- - @sproutsocial/seeds-react-icon@2.2.3
138
- - @sproutsocial/seeds-react-button@1.3.17
139
-
140
- ## 0.2.11
141
-
142
- ### Patch Changes
143
-
144
- - Updated dependencies [131db40]
145
- - @sproutsocial/seeds-react-icon@2.2.2
146
- - @sproutsocial/seeds-react-button@1.3.16
147
-
148
- ## 0.2.10
149
-
150
- ### Patch Changes
151
-
152
- - @sproutsocial/seeds-react-icon@2.2.1
153
- - @sproutsocial/seeds-react-button@1.3.15
154
-
155
- ## 0.2.9
156
-
157
- ### Patch Changes
158
-
159
- - Updated dependencies [db6ce39]
160
- - Updated dependencies [20bb01b]
161
- - Updated dependencies [c7f2c70]
162
- - @sproutsocial/seeds-react-theme@3.5.0
163
- - @sproutsocial/seeds-react-icon@2.2.0
164
- - @sproutsocial/seeds-react-box@1.1.12
165
- - @sproutsocial/seeds-react-container@0.3.5
166
- - @sproutsocial/seeds-react-loader@1.0.11
167
- - @sproutsocial/seeds-react-button@1.3.14
168
-
169
- ## 0.2.8
170
-
171
- ### Patch Changes
172
-
173
- - Updated dependencies [29ced53]
174
- - @sproutsocial/seeds-react-text@1.4.0
175
-
176
- ## 0.2.7
177
-
178
- ### Patch Changes
179
-
180
- - Updated dependencies [7716e16]
181
- - @sproutsocial/seeds-react-theme@3.4.0
182
- - @sproutsocial/seeds-react-box@1.1.11
183
- - @sproutsocial/seeds-react-container@0.3.4
184
- - @sproutsocial/seeds-react-icon@2.1.2
185
- - @sproutsocial/seeds-react-loader@1.0.10
186
- - @sproutsocial/seeds-react-button@1.3.13
187
-
188
- ## 0.2.6
189
-
190
- ### Patch Changes
191
-
192
- - @sproutsocial/seeds-react-theme@3.3.2
193
- - @sproutsocial/seeds-react-box@1.1.10
194
- - @sproutsocial/seeds-react-container@0.3.3
195
- - @sproutsocial/seeds-react-icon@2.1.1
196
- - @sproutsocial/seeds-react-loader@1.0.9
197
- - @sproutsocial/seeds-react-button@1.3.12
198
-
199
- ## 0.2.5
200
-
201
- ### Patch Changes
202
-
203
- - Updated dependencies [b147e07]
204
- - @sproutsocial/seeds-react-icon@2.1.0
205
- - @sproutsocial/seeds-react-button@1.3.11
206
-
207
- ## 0.2.4
208
-
209
- ### Patch Changes
210
-
211
- - @sproutsocial/seeds-react-theme@3.3.1
212
- - @sproutsocial/seeds-react-box@1.1.9
213
- - @sproutsocial/seeds-react-container@0.3.2
214
- - @sproutsocial/seeds-react-icon@2.0.5
215
- - @sproutsocial/seeds-react-loader@1.0.8
216
- - @sproutsocial/seeds-react-button@1.3.10
217
-
218
- ## 0.2.3
219
-
220
- ### Patch Changes
221
-
222
- - Updated dependencies [750d1ea]
223
- - @sproutsocial/seeds-react-theme@3.3.0
224
- - @sproutsocial/seeds-react-button@1.3.9
225
- - @sproutsocial/seeds-react-loader@1.0.7
226
- - @sproutsocial/seeds-react-box@1.1.8
227
- - @sproutsocial/seeds-react-container@0.3.1
228
- - @sproutsocial/seeds-react-icon@2.0.4
229
-
230
- ## 0.2.2
231
-
232
- ### Patch Changes
233
-
234
- - e056fd7: Update ContentBlock to use children prop instead of content
235
-
236
- ## 0.2.1
237
-
238
- ### Patch Changes
239
-
240
- - @sproutsocial/seeds-react-icon@2.0.3
241
- - @sproutsocial/seeds-react-button@1.3.8
242
-
243
- ## 0.2.0
244
-
245
- ### Minor Changes
246
-
247
- - e2f6976: Refactor ContentBlock to use the shared Container component from seeds-react-container instead of custom styles. This improves consistency across components and simplifies the codebase. Also removes unused type exports from seeds-react-container.
248
-
249
- ### Patch Changes
250
-
251
- - Updated dependencies [e2f6976]
252
- - @sproutsocial/seeds-react-container@0.3.0
253
-
254
- ## 0.1.0
255
-
256
- ### Minor Changes
257
-
258
- - 1de0863: **Breaking Changes**
259
-
260
- `@sproutsocial/seeds-react-container` has been simplified to a basic styled container component. It now only provides border, background, and border-radius styling as a wrapper around Box, accepting all Box props.
261
-
262
- The previous Container component functionality (with title, subtitle, loading states, and header actions) has been moved to a new package: `@sproutsocial/seeds-react-content-block`.
263
-
264
- **Migration**
265
-
266
- If you were using the old Container component with `title`, `subtitle`, `isLoading`, or `headerActions` props, switch to `@sproutsocial/seeds-react-content-block`:
267
-
268
- ```tsx
269
- // Before
270
- import { Container } from "@sproutsocial/seeds-react-container";
271
-
272
- // After
273
- import { ContentBlock } from "@sproutsocial/seeds-react-content-block";
274
- ```
275
-
276
- ## 0.1.4
277
-
278
- ### Patch Changes
279
-
280
- - @sproutsocial/seeds-react-icon@2.0.2
281
- - @sproutsocial/seeds-react-button@1.3.7
282
-
283
- ## 0.1.3
284
-
285
- ### Patch Changes
286
-
287
- - Updated dependencies [fa7579a]
288
- - @sproutsocial/seeds-react-theme@3.2.1
289
- - @sproutsocial/seeds-react-box@1.1.7
290
- - @sproutsocial/seeds-react-icon@2.0.1
291
- - @sproutsocial/seeds-react-loader@1.0.6
292
- - @sproutsocial/seeds-react-button@1.3.6
293
-
294
- ## 0.1.2
295
-
296
- ### Patch Changes
297
-
298
- - Updated dependencies [40248a0]
299
- - @sproutsocial/seeds-react-icon@2.0.0
300
- - @sproutsocial/seeds-react-button@1.3.5
301
-
302
- ## 0.1.1
303
-
304
- ### Patch Changes
305
-
306
- - Updated dependencies [8f6ba8d]
307
- - @sproutsocial/seeds-react-theme@3.2.0
308
- - @sproutsocial/seeds-react-box@1.1.6
309
- - @sproutsocial/seeds-react-icon@1.1.8
310
- - @sproutsocial/seeds-react-loader@1.0.5
311
- - @sproutsocial/seeds-react-button@1.3.4
312
-
313
- ## 0.1.0
314
-
315
- ### Minor Changes
316
-
317
- - 5f6fee3: Created new component called Container that accepts a title, subtitle, header action, and can display a loading state"
package/jest.config.js DELETED
@@ -1,9 +0,0 @@
1
- const baseConfig = require("@sproutsocial/seeds-testing");
2
-
3
- /** * @type {import('jest').Config} */
4
- const config = {
5
- ...baseConfig,
6
- displayName: "seeds-react-content-block",
7
- };
8
-
9
- module.exports = config;
@@ -1,189 +0,0 @@
1
- import React, { useState } from "react";
2
- import ContentBlock from "./ContentBlock";
3
- import type { Meta, StoryObj } from "@storybook/react";
4
- import { Text } from "@sproutsocial/seeds-react-text";
5
- import { Box } from "@sproutsocial/seeds-react-box";
6
- import { Button } from "@sproutsocial/seeds-react-button";
7
- import { Icon } from "@sproutsocial/seeds-react-icon";
8
-
9
- const meta: Meta<typeof ContentBlock> = {
10
- title: "Components/ContentBlock",
11
- component: ContentBlock,
12
- args: {
13
- title: "Volume Breakdown - Outbound",
14
- subtitle: "View a breakdown of your outbound volume.",
15
- children: (
16
- <Text.SmallBodyCopy>
17
- Here is some content inside the content block.
18
- </Text.SmallBodyCopy>
19
- ),
20
- isLoading: false,
21
- headerActions: null,
22
- },
23
- };
24
-
25
- export default meta;
26
-
27
- type Story = StoryObj<typeof ContentBlock>;
28
-
29
- export const Default: Story = {
30
- render: (args) => <ContentBlock {...args} />,
31
- };
32
-
33
- export const WithoutSubtitle: Story = {
34
- render: (args) => <ContentBlock {...args} subtitle={undefined} />,
35
- };
36
-
37
- export const WithHeaderActions: Story = {
38
- render: (args) => (
39
- <ContentBlock
40
- {...args}
41
- headerActions={
42
- <Button size="small">
43
- <Icon name="face-frown-open-solid" />
44
- </Button>
45
- }
46
- />
47
- ),
48
- };
49
-
50
- export const LoadingState: Story = {
51
- render: (args) => <ContentBlock {...args} isLoading={true} />,
52
- };
53
-
54
- export const WithContentStyles: Story = {
55
- render: (args) => (
56
- <ContentBlock {...args} contentProps={{ p: 0, py: 400, bg: "blue.300" }} />
57
- ),
58
- };
59
-
60
- export const WithFooter: Story = {
61
- render: (args) => (
62
- <ContentBlock
63
- {...args}
64
- footerContent={
65
- <Text.SmallBodyCopy>Footer description text</Text.SmallBodyCopy>
66
- }
67
- footerActions={
68
- <Button
69
- href="https://app.sproutsocial.com/dashboard/"
70
- appearance="secondary"
71
- >
72
- See profile performance
73
- </Button>
74
- }
75
- />
76
- ),
77
- };
78
-
79
- export const WithFlushContent: Story = {
80
- render: (args) => (
81
- <ContentBlock
82
- {...args}
83
- flushLayout
84
- footerContent={
85
- <Text.SmallBodyCopy>Footer description text</Text.SmallBodyCopy>
86
- }
87
- >
88
- <Box p={400}>Impressions</Box>
89
- <Box p={400} borderTop={500} borderColor="container.border.base">
90
- Engagements
91
- </Box>
92
- <Box p={400} borderTop={500} borderColor="container.border.base">
93
- Followers Gained
94
- </Box>
95
- </ContentBlock>
96
- ),
97
- };
98
-
99
- export const Collapsible: Story = {
100
- render: (args) => (
101
- <ContentBlock {...args} isCollapsible>
102
- <Text.SmallBodyCopy>
103
- This content can be collapsed and expanded by clicking the header.
104
- </Text.SmallBodyCopy>
105
- </ContentBlock>
106
- ),
107
- };
108
-
109
- export const CollapsibleDefaultClosed: Story = {
110
- name: "Collapsible (Default Closed)",
111
- render: (args) => (
112
- <ContentBlock {...args} isCollapsible defaultOpen={false}>
113
- <Text.SmallBodyCopy>
114
- This content starts collapsed and can be expanded by clicking the
115
- header.
116
- </Text.SmallBodyCopy>
117
- </ContentBlock>
118
- ),
119
- };
120
-
121
- export const CollapsibleWithHeaderActions: Story = {
122
- name: "Collapsible with Header Actions",
123
- render: (args) => (
124
- <ContentBlock
125
- {...args}
126
- isCollapsible
127
- headerActions={
128
- <Button size="small">
129
- <Icon name="face-frown-open-solid" />
130
- </Button>
131
- }
132
- >
133
- <Text.SmallBodyCopy>
134
- The header actions are independent from the collapse trigger. Clicking
135
- the action button does not toggle the content.
136
- </Text.SmallBodyCopy>
137
- </ContentBlock>
138
- ),
139
- };
140
-
141
- export const CollapsibleWithFooter: Story = {
142
- name: "Collapsible with Footer",
143
- render: (args) => (
144
- <ContentBlock
145
- {...args}
146
- isCollapsible
147
- footerContent={
148
- <Text.SmallBodyCopy>Footer description text</Text.SmallBodyCopy>
149
- }
150
- footerActions={
151
- <Button
152
- href="https://app.sproutsocial.com/dashboard/"
153
- appearance="secondary"
154
- >
155
- See profile performance
156
- </Button>
157
- }
158
- >
159
- <Text.SmallBodyCopy>
160
- The footer collapses along with the content.
161
- </Text.SmallBodyCopy>
162
- </ContentBlock>
163
- ),
164
- };
165
-
166
- export const CollapsibleControlled: Story = {
167
- name: "Collapsible (Controlled)",
168
- render: (args) => {
169
- const [isOpen, setIsOpen] = useState(true);
170
- return (
171
- <>
172
- <Button onClick={() => setIsOpen(!isOpen)} mb={400}>
173
- {isOpen ? "Close" : "Open"} externally
174
- </Button>
175
- <ContentBlock
176
- {...args}
177
- isCollapsible
178
- isOpen={isOpen}
179
- onOpenChange={setIsOpen}
180
- >
181
- <Text.SmallBodyCopy>
182
- This content block is controlled externally. Use the button above or
183
- click the header to toggle.
184
- </Text.SmallBodyCopy>
185
- </ContentBlock>
186
- </>
187
- );
188
- },
189
- };
@@ -1,198 +0,0 @@
1
- import React, { useState } from "react";
2
- import { Box } from "@sproutsocial/seeds-react-box";
3
- import { Loader } from "@sproutsocial/seeds-react-loader";
4
- import { Collapsible } from "@sproutsocial/seeds-react-collapsible";
5
- import {
6
- ContentHeader,
7
- CollapsibleContentHeader,
8
- } from "@sproutsocial/seeds-react-content-header";
9
- import { Container } from "@sproutsocial/seeds-react-container";
10
- import { FooterContainer } from "./styles";
11
-
12
- interface ContentBlockBaseProps {
13
- title: string;
14
- subtitle?: string;
15
- titleAs?: "h1" | "h2" | "h3" | "h4";
16
- subtitleAs?: "h2" | "h3" | "h4" | "h5" | "p";
17
- isLoading?: boolean;
18
- children: React.ReactNode;
19
- headerActions?: React.ReactNode;
20
- contentProps?: React.ComponentProps<typeof Box>;
21
- /** Sets content area padding to 0 */
22
- flushLayout?: boolean;
23
- /** Left slot of the footer area */
24
- footerContent?: React.ReactNode;
25
- /** Right slot of the footer area */
26
- footerActions?: React.ReactNode;
27
- }
28
-
29
- type StaticContentBlockProps = ContentBlockBaseProps & {
30
- isCollapsible?: false;
31
- isOpen?: never;
32
- defaultOpen?: never;
33
- onOpenChange?: never;
34
- };
35
-
36
- type CollapsibleContentBlockProps = ContentBlockBaseProps & {
37
- /** Enables collapse/expand behavior on the content area */
38
- isCollapsible: true;
39
- /** Controlled open state. When provided, the component is in controlled mode. */
40
- isOpen?: boolean;
41
- /** Initial open state for uncontrolled mode. Defaults to true. */
42
- defaultOpen?: boolean;
43
- /** Called when the open state changes */
44
- onOpenChange?: (open: boolean) => void;
45
- };
46
-
47
- export type ContentBlockProps =
48
- | StaticContentBlockProps
49
- | CollapsibleContentBlockProps;
50
-
51
- const ContentArea = ({
52
- isLoading,
53
- children,
54
- contentProps,
55
- flushLayout,
56
- hasFooter,
57
- }: Pick<
58
- ContentBlockBaseProps,
59
- "isLoading" | "children" | "contentProps" | "flushLayout"
60
- > & { hasFooter?: boolean }) => (
61
- <Box
62
- p={flushLayout ? 0 : 400}
63
- {...contentProps}
64
- borderBottomLeftRadius={hasFooter ? undefined : "outer"}
65
- borderBottomRightRadius={hasFooter ? undefined : "outer"}
66
- >
67
- {isLoading ? (
68
- <Box my={400}>
69
- <Loader delay={false} />
70
- </Box>
71
- ) : (
72
- children
73
- )}
74
- </Box>
75
- );
76
-
77
- const ContentFooter = ({
78
- footerContent,
79
- footerActions,
80
- }: {
81
- footerContent?: React.ReactNode;
82
- footerActions?: React.ReactNode;
83
- }) => (
84
- <FooterContainer>
85
- {footerContent && <span>{footerContent}</span>}
86
- {footerActions && <span>{footerActions}</span>}
87
- </FooterContainer>
88
- );
89
-
90
- const CollapsibleContentBlock = ({
91
- title,
92
- subtitle,
93
- titleAs = "h2",
94
- subtitleAs = "h3",
95
- children,
96
- isLoading,
97
- headerActions,
98
- contentProps,
99
- flushLayout,
100
- footerContent,
101
- footerActions,
102
- isOpen: controlledIsOpen,
103
- defaultOpen = true,
104
- onOpenChange,
105
- }: Omit<CollapsibleContentBlockProps, "isCollapsible">) => {
106
- const [internalOpen, setInternalOpen] = useState(defaultOpen);
107
- const open = controlledIsOpen !== undefined ? controlledIsOpen : internalOpen;
108
- const hasFooter = !!(footerContent || footerActions);
109
-
110
- const handleOpenChange = (newOpen: boolean) => {
111
- if (controlledIsOpen === undefined) {
112
- setInternalOpen(newOpen);
113
- }
114
- onOpenChange?.(newOpen);
115
- };
116
-
117
- return (
118
- <Collapsible isOpen={open} onOpenChange={handleOpenChange}>
119
- <Container as="section">
120
- <CollapsibleContentHeader
121
- title={title}
122
- subtitle={subtitle}
123
- headingLevel={titleAs}
124
- subtitleAs={subtitleAs}
125
- headerActions={headerActions}
126
- trigger={Collapsible.Trigger}
127
- triggerPosition="left"
128
- />
129
- <Collapsible.Panel>
130
- <ContentArea
131
- isLoading={isLoading}
132
- contentProps={contentProps}
133
- flushLayout={flushLayout}
134
- hasFooter={hasFooter}
135
- >
136
- {children}
137
- </ContentArea>
138
- {hasFooter && (
139
- <ContentFooter
140
- footerContent={footerContent}
141
- footerActions={footerActions}
142
- />
143
- )}
144
- </Collapsible.Panel>
145
- </Container>
146
- </Collapsible>
147
- );
148
- };
149
-
150
- const ContentBlock = ({ isCollapsible, ...props }: ContentBlockProps) => {
151
- if (isCollapsible) {
152
- return <CollapsibleContentBlock {...props} />;
153
- }
154
-
155
- const {
156
- title,
157
- subtitle,
158
- titleAs = "h2",
159
- subtitleAs = "h3",
160
- children,
161
- isLoading,
162
- headerActions,
163
- contentProps,
164
- flushLayout,
165
- footerContent,
166
- footerActions,
167
- } = props;
168
-
169
- const hasFooter = !!(footerContent || footerActions);
170
-
171
- return (
172
- <Container as="section">
173
- <ContentHeader
174
- title={title}
175
- subtitle={subtitle}
176
- headingLevel={titleAs}
177
- subtitleAs={subtitleAs}
178
- headerActions={headerActions}
179
- />
180
- <ContentArea
181
- isLoading={isLoading}
182
- contentProps={contentProps}
183
- flushLayout={flushLayout}
184
- hasFooter={hasFooter}
185
- >
186
- {children}
187
- </ContentArea>
188
- {hasFooter && (
189
- <ContentFooter
190
- footerContent={footerContent}
191
- footerActions={footerActions}
192
- />
193
- )}
194
- </Container>
195
- );
196
- };
197
-
198
- export default ContentBlock;