@sproutsocial/seeds-react-narrative-kit 0.2.0 → 0.3.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.
- package/.turbo/turbo-build.log +11 -11
- package/CHANGELOG.md +19 -0
- package/dist/esm/index.js +119 -91
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +110 -11
- package/dist/index.d.ts +110 -11
- package/dist/index.js +123 -93
- package/dist/index.js.map +1 -1
- package/dist/metric-highlight.css +17 -27
- package/dist/narrative-divider.css +27 -0
- package/dist/narrative-headline.css +7 -0
- package/dist/narrative-summary.css +126 -0
- package/package.json +7 -3
- package/src/EyebrowToken/EyebrowToken.tsx +1 -5
- package/src/MetricHighlight/MetricHighlight.stories.tsx +37 -14
- package/src/MetricHighlight/MetricHighlight.tsx +19 -99
- package/src/MetricHighlight/MetricHighlightTypes.ts +6 -9
- package/src/MetricHighlight/__tests__/MetricHighlight.test.tsx +13 -48
- package/src/NarrativeDivider/NarrativeDivider.stories.tsx +33 -0
- package/src/NarrativeDivider/NarrativeDivider.tsx +30 -0
- package/src/NarrativeDivider/NarrativeDividerTypes.ts +4 -0
- package/src/NarrativeDivider/__tests__/NarrativeDivider.test.tsx +35 -0
- package/src/NarrativeDivider/index.ts +2 -0
- package/src/NarrativeHeadline/NarrativeHeadline.tsx +21 -12
- package/src/NarrativeHeadline/NarrativeHeadlineRoll.tsx +4 -1
- package/src/NarrativeHeadline/NarrativeHeadlineTypes.ts +9 -0
- package/src/NarrativeHeadline/__tests__/NarrativeHeadline.test.tsx +2 -7
- package/src/NarrativeHeadline/index.ts +1 -0
- package/src/NarrativeSummary/NarrativeSummary.stories.tsx +79 -0
- package/src/NarrativeSummary/NarrativeSummary.tsx +98 -0
- package/src/NarrativeSummary/NarrativeSummaryTypes.ts +59 -0
- package/src/NarrativeSummary/__tests__/NarrativeSummary.test.tsx +99 -0
- package/src/NarrativeSummary/index.ts +5 -0
- package/src/Playground/Playground.stories.tsx +86 -36
- package/src/PullQuote/PullQuote.stories.tsx +3 -1
- package/src/PullQuote/PullQuoteTypes.ts +1 -2
- package/src/index.ts +11 -0
- package/src/metric-highlight.css +17 -27
- package/src/narrative-divider.css +27 -0
- package/src/narrative-headline.css +7 -0
- package/src/narrative-summary.css +126 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
yarn run v1.22.22
|
|
2
|
-
$ tsup --dts && cp src/narrative-container.css dist/narrative-container.css && cp src/narrative-headline.css dist/narrative-headline.css && cp src/pull-quote.css dist/pull-quote.css && cp src/metric-highlight.css dist/metric-highlight.css && cp src/eyebrow-token.css dist/eyebrow-token.css
|
|
2
|
+
$ tsup --dts && cp src/narrative-container.css dist/narrative-container.css && cp src/narrative-headline.css dist/narrative-headline.css && cp src/pull-quote.css dist/pull-quote.css && cp src/metric-highlight.css dist/metric-highlight.css && cp src/eyebrow-token.css dist/eyebrow-token.css && cp src/narrative-summary.css dist/narrative-summary.css && cp src/narrative-divider.css dist/narrative-divider.css
|
|
3
3
|
[34mCLI[39m Building entry: src/index.ts
|
|
4
4
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
5
5
|
[34mCLI[39m tsup v8.5.0
|
|
@@ -8,14 +8,14 @@ $ tsup --dts && cp src/narrative-container.css dist/narrative-container.css && c
|
|
|
8
8
|
[34mCLI[39m Cleaning output folder
|
|
9
9
|
[34mCJS[39m Build start
|
|
10
10
|
[34mESM[39m Build start
|
|
11
|
-
[32mCJS[39m [1mdist/index.js [22m[
|
|
12
|
-
[32mCJS[39m [1mdist/index.js.map [22m[
|
|
13
|
-
[32mCJS[39m ⚡️ Build success in
|
|
14
|
-
[32mESM[39m [1mdist/esm/index.js [22m[
|
|
15
|
-
[32mESM[39m [1mdist/esm/index.js.map [22m[
|
|
16
|
-
[32mESM[39m ⚡️ Build success in
|
|
11
|
+
[32mCJS[39m [1mdist/index.js [22m[32m14.66 KB[39m
|
|
12
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m25.00 KB[39m
|
|
13
|
+
[32mCJS[39m ⚡️ Build success in 17ms
|
|
14
|
+
[32mESM[39m [1mdist/esm/index.js [22m[32m11.87 KB[39m
|
|
15
|
+
[32mESM[39m [1mdist/esm/index.js.map [22m[32m24.02 KB[39m
|
|
16
|
+
[32mESM[39m ⚡️ Build success in 17ms
|
|
17
17
|
[34mDTS[39m Build start
|
|
18
|
-
[32mDTS[39m ⚡️ Build success in
|
|
19
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[
|
|
20
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[
|
|
21
|
-
Done in
|
|
18
|
+
[32mDTS[39m ⚡️ Build success in 1483ms
|
|
19
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m14.44 KB[39m
|
|
20
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m14.44 KB[39m
|
|
21
|
+
Done in 2.19s.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @sproutsocial/seeds-react-narrative-kit
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 1aca1d1: `MetricHighlight` now takes a `sparkline` render slot instead of owning the
|
|
8
|
+
chart itself. Pass any node (e.g. a `<SparklineChart />` from
|
|
9
|
+
`@sproutsocial/seeds-react-data-viz/sparkline`) to render it beside/below the
|
|
10
|
+
metric; omit it to render the metric on its own. This replaces the previous
|
|
11
|
+
`data` and `chart` props.
|
|
12
|
+
- 0b37765: Add the `NarrativeDivider` primitive to `seeds-react-narrative-kit` — a full-width,
|
|
13
|
+
1px horizontal rule for separating sections within a narrative brief, using the
|
|
14
|
+
`container.border` token (dark-mode aware). Exported through `@sproutsocial/racine`.
|
|
15
|
+
- 0b37765: Add the `NarrativeSummary` primitive to `seeds-react-narrative-kit` — a composed
|
|
16
|
+
block pairing a lead column (eyebrow + headline + optional action) with a Summary
|
|
17
|
+
section and a Key themes list, laid out as a container-query-driven grid with
|
|
18
|
+
`three-column` and `two-column` (1/3 | 2/3) arrangements. Also adds a `size` prop
|
|
19
|
+
(`"default" | "small"`) to `NarrativeHeadline`. Exported through
|
|
20
|
+
`@sproutsocial/racine`.
|
|
21
|
+
|
|
3
22
|
## 0.2.0
|
|
4
23
|
|
|
5
24
|
### Minor Changes
|
package/dist/esm/index.js
CHANGED
|
@@ -42,18 +42,24 @@ var NarrativeContainer_default = NarrativeContainer;
|
|
|
42
42
|
// src/NarrativeHeadline/NarrativeHeadline.tsx
|
|
43
43
|
import * as React2 from "react";
|
|
44
44
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
45
|
-
var NarrativeHeadline = React2.forwardRef(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
var NarrativeHeadline = React2.forwardRef(
|
|
46
|
+
({ children, headingLevel = 2, size = "default", className, ...props }, ref) => {
|
|
47
|
+
const Heading = `h${headingLevel}`;
|
|
48
|
+
return /* @__PURE__ */ jsx2(
|
|
49
|
+
Heading,
|
|
50
|
+
{
|
|
51
|
+
ref,
|
|
52
|
+
className: cn(
|
|
53
|
+
"seeds-narrative-headline",
|
|
54
|
+
{ "seeds-narrative-headline-small": size === "small" },
|
|
55
|
+
className
|
|
56
|
+
),
|
|
57
|
+
...props,
|
|
58
|
+
children
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
);
|
|
57
63
|
NarrativeHeadline.displayName = "NarrativeHeadline";
|
|
58
64
|
var NarrativeHeadline_default = NarrativeHeadline;
|
|
59
65
|
|
|
@@ -118,7 +124,14 @@ var NarrativeHeadlineRoll = React4.forwardRef(
|
|
|
118
124
|
style: merged,
|
|
119
125
|
...rest,
|
|
120
126
|
children: [
|
|
121
|
-
/* @__PURE__ */ jsx4(
|
|
127
|
+
/* @__PURE__ */ jsx4(
|
|
128
|
+
"span",
|
|
129
|
+
{
|
|
130
|
+
className: "seeds-narrative-headline-roll-sizer",
|
|
131
|
+
"aria-hidden": "true",
|
|
132
|
+
children: words[i]
|
|
133
|
+
}
|
|
134
|
+
),
|
|
122
135
|
words.map((w, idx) => /* @__PURE__ */ jsx4(
|
|
123
136
|
"span",
|
|
124
137
|
{
|
|
@@ -169,82 +182,36 @@ var PullQuote_default = PullQuote;
|
|
|
169
182
|
import * as React6 from "react";
|
|
170
183
|
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
171
184
|
var EyebrowToken = React6.forwardRef(
|
|
172
|
-
({ children, className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
173
|
-
"span",
|
|
174
|
-
{
|
|
175
|
-
ref,
|
|
176
|
-
className: cn("seeds-eyebrow-token", className),
|
|
177
|
-
...props,
|
|
178
|
-
children
|
|
179
|
-
}
|
|
180
|
-
)
|
|
185
|
+
({ children, className, ...props }, ref) => /* @__PURE__ */ jsx6("span", { ref, className: cn("seeds-eyebrow-token", className), ...props, children })
|
|
181
186
|
);
|
|
182
187
|
EyebrowToken.displayName = "EyebrowToken";
|
|
183
188
|
var EyebrowToken_default = EyebrowToken;
|
|
184
189
|
|
|
185
|
-
// src/
|
|
190
|
+
// src/NarrativeDivider/NarrativeDivider.tsx
|
|
186
191
|
import * as React7 from "react";
|
|
187
|
-
import { jsx as jsx7
|
|
188
|
-
var
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
const p = points[0];
|
|
195
|
-
return p ? `M ${p.x},${p.y}` : "";
|
|
196
|
-
}
|
|
197
|
-
let d = `M ${points[0].x.toFixed(2)},${points[0].y.toFixed(2)}`;
|
|
198
|
-
for (let i = 0; i < points.length - 1; i++) {
|
|
199
|
-
const p1 = points[i];
|
|
200
|
-
const p2 = points[i + 1];
|
|
201
|
-
const p0 = points[i - 1] ?? p1;
|
|
202
|
-
const p3 = points[i + 2] ?? p2;
|
|
203
|
-
const cp1x = p1.x + (p2.x - p0.x) / 6;
|
|
204
|
-
const cp1y = p1.y + (p2.y - p0.y) / 6;
|
|
205
|
-
const cp2x = p2.x - (p3.x - p1.x) / 6;
|
|
206
|
-
const cp2y = p2.y - (p3.y - p1.y) / 6;
|
|
207
|
-
d += ` C ${cp1x.toFixed(2)},${cp1y.toFixed(2)} ${cp2x.toFixed(
|
|
208
|
-
2
|
|
209
|
-
)},${cp2y.toFixed(2)} ${p2.x.toFixed(2)},${p2.y.toFixed(2)}`;
|
|
192
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
193
|
+
var NarrativeDivider = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
194
|
+
"hr",
|
|
195
|
+
{
|
|
196
|
+
ref,
|
|
197
|
+
className: cn("seeds-narrative-divider", className),
|
|
198
|
+
...props
|
|
210
199
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
var
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const range = max - min || 1;
|
|
220
|
-
const usableHeight = SPARK_VIEWBOX_HEIGHT - SPARK_PADDING * 2;
|
|
221
|
-
const points = data.map((value, i) => ({
|
|
222
|
-
x: data.length === 1 ? SPARK_VIEWBOX_WIDTH / 2 : i / (data.length - 1) * SPARK_VIEWBOX_WIDTH,
|
|
223
|
-
// Invert y so larger values sit higher in the chart.
|
|
224
|
-
y: SPARK_PADDING + (1 - (value - min) / range) * usableHeight
|
|
225
|
-
}));
|
|
226
|
-
return /* @__PURE__ */ jsx7(
|
|
227
|
-
"svg",
|
|
228
|
-
{
|
|
229
|
-
className: cn("seeds-metric-highlight-spark", {
|
|
230
|
-
"seeds-metric-highlight-spark-negative": Boolean(negative)
|
|
231
|
-
}),
|
|
232
|
-
viewBox: `0 0 ${SPARK_VIEWBOX_WIDTH} ${SPARK_VIEWBOX_HEIGHT}`,
|
|
233
|
-
preserveAspectRatio: "none",
|
|
234
|
-
"aria-hidden": true,
|
|
235
|
-
focusable: false,
|
|
236
|
-
children: /* @__PURE__ */ jsx7("path", { d: smoothPath(points), fill: "none", strokeLinecap: "round" })
|
|
237
|
-
}
|
|
238
|
-
);
|
|
239
|
-
};
|
|
240
|
-
var TrendArrow = ({ direction }) => /* @__PURE__ */ jsx7(
|
|
200
|
+
));
|
|
201
|
+
NarrativeDivider.displayName = "NarrativeDivider";
|
|
202
|
+
var NarrativeDivider_default = NarrativeDivider;
|
|
203
|
+
|
|
204
|
+
// src/MetricHighlight/MetricHighlight.tsx
|
|
205
|
+
import * as React8 from "react";
|
|
206
|
+
import { jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
207
|
+
var TrendArrow = ({ direction }) => /* @__PURE__ */ jsx8(
|
|
241
208
|
"svg",
|
|
242
209
|
{
|
|
243
210
|
className: "seeds-metric-highlight-trend-arrow",
|
|
244
211
|
viewBox: "0 0 16 16",
|
|
245
212
|
"aria-hidden": true,
|
|
246
213
|
focusable: false,
|
|
247
|
-
children: direction === "up" ? /* @__PURE__ */
|
|
214
|
+
children: direction === "up" ? /* @__PURE__ */ jsx8(
|
|
248
215
|
"path",
|
|
249
216
|
{
|
|
250
217
|
d: "M4.5 11.5 11.5 4.5M11.5 4.5H5.5M11.5 4.5V10.5",
|
|
@@ -252,7 +219,7 @@ var TrendArrow = ({ direction }) => /* @__PURE__ */ jsx7(
|
|
|
252
219
|
strokeLinecap: "round",
|
|
253
220
|
strokeLinejoin: "round"
|
|
254
221
|
}
|
|
255
|
-
) : /* @__PURE__ */
|
|
222
|
+
) : /* @__PURE__ */ jsx8(
|
|
256
223
|
"path",
|
|
257
224
|
{
|
|
258
225
|
d: "M4.5 4.5 11.5 11.5M11.5 11.5H5.5M11.5 11.5V5.5",
|
|
@@ -263,7 +230,11 @@ var TrendArrow = ({ direction }) => /* @__PURE__ */ jsx7(
|
|
|
263
230
|
)
|
|
264
231
|
}
|
|
265
232
|
);
|
|
266
|
-
var TrendBadge = ({
|
|
233
|
+
var TrendBadge = ({
|
|
234
|
+
direction = "up",
|
|
235
|
+
value,
|
|
236
|
+
...rest
|
|
237
|
+
}) => /* @__PURE__ */ jsxs3(
|
|
267
238
|
"span",
|
|
268
239
|
{
|
|
269
240
|
className: cn("seeds-metric-highlight-trend", {
|
|
@@ -271,27 +242,23 @@ var TrendBadge = ({ direction = "up", value, ...rest }) => /* @__PURE__ */ jsxs3
|
|
|
271
242
|
}),
|
|
272
243
|
...rest,
|
|
273
244
|
children: [
|
|
274
|
-
/* @__PURE__ */
|
|
275
|
-
value != null && /* @__PURE__ */
|
|
245
|
+
/* @__PURE__ */ jsx8(TrendArrow, { direction }),
|
|
246
|
+
value != null && /* @__PURE__ */ jsx8("span", { className: "seeds-metric-highlight-trend-value", children: value })
|
|
276
247
|
]
|
|
277
248
|
}
|
|
278
249
|
);
|
|
279
|
-
var MetricHighlight =
|
|
250
|
+
var MetricHighlight = React8.forwardRef(
|
|
280
251
|
({
|
|
281
252
|
label,
|
|
282
253
|
value,
|
|
283
254
|
trend,
|
|
284
|
-
|
|
285
|
-
chart = true,
|
|
255
|
+
sparkline,
|
|
286
256
|
appearance = "horizontal",
|
|
287
257
|
size = "default",
|
|
288
258
|
container = true,
|
|
289
259
|
className,
|
|
290
260
|
...props
|
|
291
261
|
}, ref) => {
|
|
292
|
-
const isDown = trend?.direction === "down";
|
|
293
|
-
const resolvedData = data ?? (isDown ? [...DEFAULT_SPARK].reverse() : DEFAULT_SPARK);
|
|
294
|
-
const showChart = chart && resolvedData.length > 0;
|
|
295
262
|
return /* @__PURE__ */ jsxs3(
|
|
296
263
|
"div",
|
|
297
264
|
{
|
|
@@ -308,13 +275,16 @@ var MetricHighlight = React7.forwardRef(
|
|
|
308
275
|
...props,
|
|
309
276
|
children: [
|
|
310
277
|
/* @__PURE__ */ jsxs3("div", { className: "seeds-metric-highlight-metric", children: [
|
|
311
|
-
/* @__PURE__ */
|
|
278
|
+
/* @__PURE__ */ jsx8("p", { className: "seeds-metric-highlight-label", children: label }),
|
|
312
279
|
/* @__PURE__ */ jsxs3("div", { className: "seeds-metric-highlight-value-row", children: [
|
|
313
|
-
/* @__PURE__ */
|
|
314
|
-
trend != null && /* @__PURE__ */
|
|
280
|
+
/* @__PURE__ */ jsx8("p", { className: "seeds-metric-highlight-value", children: value }),
|
|
281
|
+
trend != null && /* @__PURE__ */ jsx8(TrendBadge, { ...trend })
|
|
315
282
|
] })
|
|
316
283
|
] }),
|
|
317
|
-
|
|
284
|
+
sparkline != null && // Layout-only slot (bounded dimensions per horizontal/vertical/small)
|
|
285
|
+
// for a consumer-supplied chart. It controls its own look; the slot
|
|
286
|
+
// only sizes and centers it.
|
|
287
|
+
/* @__PURE__ */ jsx8("div", { className: "seeds-metric-highlight-chart", children: sparkline })
|
|
318
288
|
]
|
|
319
289
|
}
|
|
320
290
|
);
|
|
@@ -322,13 +292,71 @@ var MetricHighlight = React7.forwardRef(
|
|
|
322
292
|
);
|
|
323
293
|
MetricHighlight.displayName = "MetricHighlight";
|
|
324
294
|
var MetricHighlight_default = MetricHighlight;
|
|
295
|
+
|
|
296
|
+
// src/NarrativeSummary/NarrativeSummary.tsx
|
|
297
|
+
import * as React9 from "react";
|
|
298
|
+
import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
299
|
+
var NarrativeSummary = React9.forwardRef(
|
|
300
|
+
({
|
|
301
|
+
eyebrow,
|
|
302
|
+
headline,
|
|
303
|
+
headingLevel = 2,
|
|
304
|
+
action,
|
|
305
|
+
summary,
|
|
306
|
+
summaryLabel = "Summary",
|
|
307
|
+
keyThemes,
|
|
308
|
+
keyThemesLabel = "Key themes",
|
|
309
|
+
layout = "three-column",
|
|
310
|
+
className,
|
|
311
|
+
...props
|
|
312
|
+
}, ref) => {
|
|
313
|
+
const hasKeyThemes = keyThemes != null && keyThemes.length > 0;
|
|
314
|
+
return /* @__PURE__ */ jsx9(
|
|
315
|
+
"div",
|
|
316
|
+
{
|
|
317
|
+
ref,
|
|
318
|
+
className: cn("seeds-narrative-summary", className),
|
|
319
|
+
...props,
|
|
320
|
+
children: /* @__PURE__ */ jsxs4(
|
|
321
|
+
"div",
|
|
322
|
+
{
|
|
323
|
+
className: cn("seeds-narrative-summary-grid", {
|
|
324
|
+
"seeds-narrative-summary-two-column": layout === "two-column"
|
|
325
|
+
}),
|
|
326
|
+
children: [
|
|
327
|
+
/* @__PURE__ */ jsxs4("div", { className: "seeds-narrative-summary-lead", children: [
|
|
328
|
+
eyebrow != null && /* @__PURE__ */ jsx9(EyebrowToken_default, { children: eyebrow }),
|
|
329
|
+
/* @__PURE__ */ jsx9("div", { className: "seeds-narrative-summary-headline", children: /* @__PURE__ */ jsx9(NarrativeHeadline_default, { size: "small", headingLevel, children: headline }) }),
|
|
330
|
+
action != null && /* @__PURE__ */ jsx9("div", { className: "seeds-narrative-summary-action", children: action })
|
|
331
|
+
] }),
|
|
332
|
+
/* @__PURE__ */ jsxs4("div", { className: "seeds-narrative-summary-content", children: [
|
|
333
|
+
summary != null && /* @__PURE__ */ jsxs4("section", { className: "seeds-narrative-summary-section", children: [
|
|
334
|
+
/* @__PURE__ */ jsx9("p", { className: "seeds-narrative-summary-label", children: summaryLabel }),
|
|
335
|
+
/* @__PURE__ */ jsx9("p", { className: "seeds-narrative-summary-text", children: summary })
|
|
336
|
+
] }),
|
|
337
|
+
hasKeyThemes && /* @__PURE__ */ jsxs4("section", { className: "seeds-narrative-summary-section", children: [
|
|
338
|
+
/* @__PURE__ */ jsx9("p", { className: "seeds-narrative-summary-label", children: keyThemesLabel }),
|
|
339
|
+
/* @__PURE__ */ jsx9("ul", { className: "seeds-narrative-summary-list", children: keyThemes.map((theme, i) => /* @__PURE__ */ jsx9("li", { children: theme }, i)) })
|
|
340
|
+
] })
|
|
341
|
+
] })
|
|
342
|
+
]
|
|
343
|
+
}
|
|
344
|
+
)
|
|
345
|
+
}
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
);
|
|
349
|
+
NarrativeSummary.displayName = "NarrativeSummary";
|
|
350
|
+
var NarrativeSummary_default = NarrativeSummary;
|
|
325
351
|
export {
|
|
326
352
|
EyebrowToken_default as EyebrowToken,
|
|
327
353
|
MetricHighlight_default as MetricHighlight,
|
|
328
354
|
NarrativeContainer_default as NarrativeContainer,
|
|
355
|
+
NarrativeDivider_default as NarrativeDivider,
|
|
329
356
|
NarrativeHeadline_default as NarrativeHeadline,
|
|
330
357
|
NarrativeHeadlineHighlight_default as NarrativeHeadlineHighlight,
|
|
331
358
|
NarrativeHeadlineRoll_default as NarrativeHeadlineRoll,
|
|
359
|
+
NarrativeSummary_default as NarrativeSummary,
|
|
332
360
|
PullQuote_default as PullQuote
|
|
333
361
|
};
|
|
334
362
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/NarrativeContainer/NarrativeContainer.tsx","../../src/_internal/cn.ts","../../src/NarrativeHeadline/NarrativeHeadline.tsx","../../src/NarrativeHeadline/NarrativeHeadlineHighlight.tsx","../../src/NarrativeHeadline/NarrativeHeadlineRoll.tsx","../../src/PullQuote/PullQuote.tsx","../../src/EyebrowToken/EyebrowToken.tsx","../../src/MetricHighlight/MetricHighlight.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeContainerProps } from \"./NarrativeContainerTypes\";\n\n/**\n * NarrativeContainer — the foundational surface that narrative primitives are\n * composed inside. A padded, rounded, elevated card with a content slot and an\n * optional decorative gradient accent that wraps the top-left corner.\n *\n * Styled via `narrative-container.css` (Seeds CSS custom properties). Consumers\n * import the classes through `@sproutsocial/racine/css/components`. Surface\n * overrides are done with standard `className` / `style`.\n */\nconst NarrativeContainer = React.forwardRef<\n HTMLDivElement,\n TypeNarrativeContainerProps\n>(({ children, accent = true, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"seeds-narrative-container\",\n { \"seeds-narrative-container-accent\": accent },\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\n\nNarrativeContainer.displayName = \"NarrativeContainer\";\n\nexport default NarrativeContainer;\n","/** Merge class names, supporting `{ \"class\": boolean }` toggles. */\nexport function cn(\n ...inputs: (string | undefined | null | false | Record<string, boolean>)[]\n): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === \"string\") {\n classes.push(input);\n } else if (typeof input === \"object\") {\n for (const [key, value] of Object.entries(input)) {\n if (value) {\n classes.push(key);\n }\n }\n }\n }\n\n return classes.join(\" \");\n}\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeHeadlineProps } from \"./NarrativeHeadlineTypes\";\n\n/**\n * NarrativeHeadline — the titling primitive for a narrative block. A single\n * heading element, nothing more: supporting copy and tags/tokens belong to\n * sibling primitives that compose alongside it, not baked into the title.\n *\n * Wrap part of the headline in `<NarrativeHeadlineHighlight>` for a static\n * gradient accent, or `<NarrativeHeadlineRoll>` for the rolling \"roll\" variant.\n *\n * Styled via `narrative-headline.css` (Seeds CSS custom properties). Consumers\n * import the classes through `@sproutsocial/racine/css/components`. Overrides\n * are done with standard `className` / `style`.\n */\nconst NarrativeHeadline = React.forwardRef<\n HTMLHeadingElement,\n TypeNarrativeHeadlineProps\n>(({ children, headingLevel = 2, className, ...props }, ref) => {\n const Heading = `h${headingLevel}` as const;\n\n return (\n <Heading\n ref={ref}\n className={cn(\"seeds-narrative-headline\", className)}\n {...props}\n >\n {children}\n </Heading>\n );\n});\n\nNarrativeHeadline.displayName = \"NarrativeHeadline\";\n\nexport default NarrativeHeadline;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeHeadlineHighlightProps } from \"./NarrativeHeadlineTypes\";\n\n/**\n * NarrativeHeadlineHighlight — paints a span of headline text with the AI\n * brand gradient (the \"highlighted word\" treatment). Drop it inline inside a\n * `<NarrativeHeadline>`:\n *\n * <NarrativeHeadline>\n * Headline with a <NarrativeHeadlineHighlight>highlighted</NarrativeHeadlineHighlight> word\n * </NarrativeHeadline>\n */\nconst NarrativeHeadlineHighlight = React.forwardRef<\n HTMLSpanElement,\n TypeNarrativeHeadlineHighlightProps\n>(({ children, className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\"seeds-narrative-headline-highlight\", className)}\n {...props}\n >\n {children}\n </span>\n );\n});\n\nNarrativeHeadlineHighlight.displayName = \"NarrativeHeadlineHighlight\";\n\nexport default NarrativeHeadlineHighlight;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeHeadlineRollProps } from \"./NarrativeHeadlineTypes\";\n\n/**\n * NarrativeHeadlineRoll — the \"roll\" variant: a vertical word roll for the\n * highlighted slot of a headline. The active word slides into view while the\n * previous one rolls out (no typing). Inspired by the performative-ui WordRoll.\n *\n * <NarrativeHeadline>\n * Built for{\" \"}\n * <NarrativeHeadlineRoll words={[\"marketers\", \"agencies\", \"teams\"]} />\n * </NarrativeHeadline>\n *\n * The container width follows the active word so it sits naturally inline.\n * Gradient-painted by default; honors `prefers-reduced-motion` by holding the\n * first word static.\n */\nconst NarrativeHeadlineRoll = React.forwardRef<\n HTMLSpanElement,\n TypeNarrativeHeadlineRollProps\n>(\n (\n {\n words,\n intervalMs = 2200,\n transitionMs = 500,\n direction = \"up\",\n gradient = true,\n className,\n style,\n ...rest\n },\n ref\n ) => {\n const [i, setI] = React.useState(0);\n\n React.useEffect(() => {\n if (words.length <= 1) return;\n\n // Respect reduced-motion: hold the first word, skip the cycle entirely.\n const reduced =\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n if (reduced) return;\n\n const t = setInterval(\n () => setI((j) => (j + 1) % words.length),\n intervalMs\n );\n return () => clearInterval(t);\n }, [intervalMs, words.length]);\n\n const merged: React.CSSProperties = {\n ...style,\n // Consumed by the transition timing in narrative-headline.css.\n [\"--seeds-narrative-headline-roll-ms\" as string]: `${transitionMs}ms`,\n };\n\n const prev = words.length ? (i - 1 + words.length) % words.length : 0;\n\n return (\n <span\n ref={ref}\n className={cn(\n \"seeds-narrative-headline-roll\",\n { \"seeds-narrative-headline-roll-down\": direction === \"down\" },\n { \"seeds-narrative-headline-roll-gradient\": gradient },\n className\n )}\n style={merged}\n {...rest}\n >\n {/* Sizer keeps the container width matched to the active word — without\n it the absolutely-positioned words would collapse the box. */}\n <span className=\"seeds-narrative-headline-roll-sizer\" aria-hidden=\"true\">\n {words[i]}\n </span>\n {words.map((w, idx) => (\n <span\n key={idx}\n className={cn(\"seeds-narrative-headline-roll-word\", {\n \"seeds-narrative-headline-roll-word-active\": idx === i,\n \"seeds-narrative-headline-roll-word-past\":\n idx === prev && i !== prev,\n })}\n aria-hidden={idx === i ? undefined : \"true\"}\n >\n {w}\n </span>\n ))}\n </span>\n );\n }\n);\n\nNarrativeHeadlineRoll.displayName = \"NarrativeHeadlineRoll\";\n\nexport default NarrativeHeadlineRoll;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypePullQuoteProps } from \"./PullQuoteTypes\";\n\n/**\n * PullQuote — a narrative primitive that spotlights a quotation on an AI\n * gradient surface. The quote sits behind an accented vertical bar with an\n * optional attribution row (author name, avatar, network).\n *\n * Rendered as semantic `<figure>` / `<blockquote>` / `<figcaption>` markup.\n * Styled via `pull-quote.css` (Seeds CSS custom properties); consumers import\n * the classes through `@sproutsocial/racine/css/components`. Surface overrides\n * are done with standard `className` / `style`.\n */\nconst PullQuote = React.forwardRef<HTMLElement, TypePullQuoteProps>(\n ({ quote, attribution, appearance = \"subtle\", className, ...props }, ref) => {\n return (\n <figure\n ref={ref}\n className={cn(\n \"seeds-pull-quote\",\n { \"seeds-pull-quote-vivid\": appearance === \"vivid\" },\n className\n )}\n {...props}\n >\n <div className=\"seeds-pull-quote-bar\">\n <blockquote className=\"seeds-pull-quote-text\">{quote}</blockquote>\n {attribution != null && (\n <figcaption className=\"seeds-pull-quote-attribution\">\n {attribution}\n </figcaption>\n )}\n </div>\n </figure>\n );\n }\n);\n\nPullQuote.displayName = \"PullQuote\";\n\nexport default PullQuote;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeEyebrowTokenProps } from \"./EyebrowTokenTypes\";\n\n/**\n * EyebrowToken — a small gray pill that sits above a headline to carry a short\n * bit of context: a date (e.g. \"May 31, 2026\"), category, or kicker.\n *\n * A faithful match of the Figma \"Token / Non Clickable / Default\" design — a\n * solid `#dee1e1` fill with a matching border, 6px radius, and small body text.\n * Styled via `eyebrow-token.css` (Seeds CSS custom properties); consumers import\n * the classes through `@sproutsocial/racine/css/components`. Overrides come via\n * standard `className` / `style`.\n */\nconst EyebrowToken = React.forwardRef<HTMLSpanElement, TypeEyebrowTokenProps>(\n ({ children, className, ...props }, ref) => (\n <span\n ref={ref}\n className={cn(\"seeds-eyebrow-token\", className)}\n {...props}\n >\n {children}\n </span>\n )\n);\n\nEyebrowToken.displayName = \"EyebrowToken\";\n\nexport default EyebrowToken;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type {\n TypeMetricHighlightProps,\n TypeMetricHighlightTrend,\n} from \"./MetricHighlightTypes\";\n\n/** Fixed viewBox the sparkline normalizes into; CSS stretches it to fit. */\nconst SPARK_VIEWBOX_WIDTH = 100;\nconst SPARK_VIEWBOX_HEIGHT = 32;\n/** Inset so the stroke at the min/max points isn't clipped by the viewBox edge. */\nconst SPARK_PADDING = 2;\n\n/**\n * Default sparkline series used when the consumer doesn't pass `data` — a gently\n * rising wave. It's reversed for a downward trend so the line slopes to match.\n */\nconst DEFAULT_SPARK = [6, 10, 8, 13, 11, 16];\n\n/**\n * Build a smooth SVG path through `points` using a Catmull-Rom spline converted\n * to cubic béziers. Each segment's control points are derived from its\n * neighbors, so the curve passes through every data point with soft, rounded\n * transitions (matching the design) rather than sharp polyline corners.\n */\nconst smoothPath = (points: { x: number; y: number }[]) => {\n if (points.length < 2) {\n const p = points[0];\n return p ? `M ${p.x},${p.y}` : \"\";\n }\n\n let d = `M ${points[0]!.x.toFixed(2)},${points[0]!.y.toFixed(2)}`;\n for (let i = 0; i < points.length - 1; i++) {\n // The loop bound guarantees p1 and p2; p0/p3 clamp to the endpoints.\n const p1 = points[i]!;\n const p2 = points[i + 1]!;\n const p0 = points[i - 1] ?? p1;\n const p3 = points[i + 2] ?? p2;\n // Catmull-Rom → bézier control points (tension 1/6).\n const cp1x = p1.x + (p2.x - p0.x) / 6;\n const cp1y = p1.y + (p2.y - p0.y) / 6;\n const cp2x = p2.x - (p3.x - p1.x) / 6;\n const cp2y = p2.y - (p3.y - p1.y) / 6;\n d += ` C ${cp1x.toFixed(2)},${cp1y.toFixed(2)} ${cp2x.toFixed(\n 2\n )},${cp2y.toFixed(2)} ${p2.x.toFixed(2)},${p2.y.toFixed(2)}`;\n }\n return d;\n};\n\n/**\n * Sparkline — an inline SVG path normalized from `data` into a fixed viewBox and\n * smoothed into a soft curve. `preserveAspectRatio=\"none\"` plus a non-scaling\n * stroke (set in CSS) lets a single path stretch to any width/height while\n * keeping a crisp line.\n */\nconst Sparkline = ({\n data,\n negative,\n}: {\n data: number[];\n negative?: boolean;\n}) => {\n const min = Math.min(...data);\n const max = Math.max(...data);\n const range = max - min || 1;\n const usableHeight = SPARK_VIEWBOX_HEIGHT - SPARK_PADDING * 2;\n\n const points = data.map((value, i) => ({\n x:\n data.length === 1\n ? SPARK_VIEWBOX_WIDTH / 2\n : (i / (data.length - 1)) * SPARK_VIEWBOX_WIDTH,\n // Invert y so larger values sit higher in the chart.\n y: SPARK_PADDING + (1 - (value - min) / range) * usableHeight,\n }));\n\n return (\n <svg\n className={cn(\"seeds-metric-highlight-spark\", {\n \"seeds-metric-highlight-spark-negative\": Boolean(negative),\n })}\n viewBox={`0 0 ${SPARK_VIEWBOX_WIDTH} ${SPARK_VIEWBOX_HEIGHT}`}\n preserveAspectRatio=\"none\"\n aria-hidden\n focusable={false}\n >\n <path d={smoothPath(points)} fill=\"none\" strokeLinecap=\"round\" />\n </svg>\n );\n};\n\n/** Directional arrow glyph for the trend badge (decorative; `aria-hidden`). */\nconst TrendArrow = ({ direction }: { direction: \"up\" | \"down\" }) => (\n <svg\n className=\"seeds-metric-highlight-trend-arrow\"\n viewBox=\"0 0 16 16\"\n aria-hidden\n focusable={false}\n >\n {direction === \"up\" ? (\n <path\n d=\"M4.5 11.5 11.5 4.5M11.5 4.5H5.5M11.5 4.5V10.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n ) : (\n <path\n d=\"M4.5 4.5 11.5 11.5M11.5 11.5H5.5M11.5 11.5V5.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n </svg>\n);\n\nconst TrendBadge = ({ direction = \"up\", value, ...rest }: TypeMetricHighlightTrend) => (\n <span\n className={cn(\"seeds-metric-highlight-trend\", {\n \"seeds-metric-highlight-trend-down\": direction === \"down\",\n })}\n {...rest}\n >\n <TrendArrow direction={direction} />\n {value != null && (\n <span className=\"seeds-metric-highlight-trend-value\">{value}</span>\n )}\n </span>\n);\n\n/**\n * MetricHighlight — a narrative primitive that spotlights a single metric: a\n * label, a large monospace value, an optional trend badge (a directional arrow\n * plus an optional number such as \"240%\"), and an optional sparkline.\n *\n * Styled via `metric-highlight.css` (Seeds CSS custom properties); consumers\n * import the classes through `@sproutsocial/racine/css/components`. Layout flexes\n * across `appearance` (horizontal/vertical) and `size` (default/small); surface\n * overrides are done with standard `className` / `style`.\n */\nconst MetricHighlight = React.forwardRef<HTMLDivElement, TypeMetricHighlightProps>(\n (\n {\n label,\n value,\n trend,\n data,\n chart = true,\n appearance = \"horizontal\",\n size = \"default\",\n container = true,\n className,\n ...props\n },\n ref\n ) => {\n const isDown = trend?.direction === \"down\";\n // Fall back to a sensible default series, sloped to match the trend, so the\n // chart renders without the consumer wiring up data. An explicit `data`\n // (including an empty array to opt out) always wins.\n const resolvedData =\n data ?? (isDown ? [...DEFAULT_SPARK].reverse() : DEFAULT_SPARK);\n const showChart = chart && resolvedData.length > 0;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"seeds-metric-highlight\",\n {\n \"seeds-metric-highlight-vertical\": appearance === \"vertical\",\n \"seeds-metric-highlight-small\": size === \"small\",\n \"seeds-metric-highlight-bare\": !container,\n },\n className\n )}\n {...props}\n >\n <div className=\"seeds-metric-highlight-metric\">\n <p className=\"seeds-metric-highlight-label\">{label}</p>\n <div className=\"seeds-metric-highlight-value-row\">\n <p className=\"seeds-metric-highlight-value\">{value}</p>\n {trend != null && <TrendBadge {...trend} />}\n </div>\n </div>\n {showChart && <Sparkline data={resolvedData} negative={isDown} />}\n </div>\n );\n }\n);\n\nMetricHighlight.displayName = \"MetricHighlight\";\n\nexport default MetricHighlight;\n"],"mappings":"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","names":["React","jsx","React","jsx","React","jsx","React","jsx","jsxs","React","jsx","React","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../../src/NarrativeContainer/NarrativeContainer.tsx","../../src/_internal/cn.ts","../../src/NarrativeHeadline/NarrativeHeadline.tsx","../../src/NarrativeHeadline/NarrativeHeadlineHighlight.tsx","../../src/NarrativeHeadline/NarrativeHeadlineRoll.tsx","../../src/PullQuote/PullQuote.tsx","../../src/EyebrowToken/EyebrowToken.tsx","../../src/NarrativeDivider/NarrativeDivider.tsx","../../src/MetricHighlight/MetricHighlight.tsx","../../src/NarrativeSummary/NarrativeSummary.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeContainerProps } from \"./NarrativeContainerTypes\";\n\n/**\n * NarrativeContainer — the foundational surface that narrative primitives are\n * composed inside. A padded, rounded, elevated card with a content slot and an\n * optional decorative gradient accent that wraps the top-left corner.\n *\n * Styled via `narrative-container.css` (Seeds CSS custom properties). Consumers\n * import the classes through `@sproutsocial/racine/css/components`. Surface\n * overrides are done with standard `className` / `style`.\n */\nconst NarrativeContainer = React.forwardRef<\n HTMLDivElement,\n TypeNarrativeContainerProps\n>(({ children, accent = true, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"seeds-narrative-container\",\n { \"seeds-narrative-container-accent\": accent },\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\n\nNarrativeContainer.displayName = \"NarrativeContainer\";\n\nexport default NarrativeContainer;\n","/** Merge class names, supporting `{ \"class\": boolean }` toggles. */\nexport function cn(\n ...inputs: (string | undefined | null | false | Record<string, boolean>)[]\n): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === \"string\") {\n classes.push(input);\n } else if (typeof input === \"object\") {\n for (const [key, value] of Object.entries(input)) {\n if (value) {\n classes.push(key);\n }\n }\n }\n }\n\n return classes.join(\" \");\n}\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeHeadlineProps } from \"./NarrativeHeadlineTypes\";\n\n/**\n * NarrativeHeadline — the titling primitive for a narrative block. A single\n * heading element, nothing more: supporting copy and tags/tokens belong to\n * sibling primitives that compose alongside it, not baked into the title.\n *\n * Wrap part of the headline in `<NarrativeHeadlineHighlight>` for a static\n * gradient accent, or `<NarrativeHeadlineRoll>` for the rolling \"roll\" variant.\n *\n * Styled via `narrative-headline.css` (Seeds CSS custom properties). Consumers\n * import the classes through `@sproutsocial/racine/css/components`. Overrides\n * are done with standard `className` / `style`.\n */\nconst NarrativeHeadline = React.forwardRef<\n HTMLHeadingElement,\n TypeNarrativeHeadlineProps\n>(\n (\n { children, headingLevel = 2, size = \"default\", className, ...props },\n ref\n ) => {\n const Heading = `h${headingLevel}` as const;\n\n return (\n <Heading\n ref={ref}\n className={cn(\n \"seeds-narrative-headline\",\n { \"seeds-narrative-headline-small\": size === \"small\" },\n className\n )}\n {...props}\n >\n {children}\n </Heading>\n );\n }\n);\n\nNarrativeHeadline.displayName = \"NarrativeHeadline\";\n\nexport default NarrativeHeadline;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeHeadlineHighlightProps } from \"./NarrativeHeadlineTypes\";\n\n/**\n * NarrativeHeadlineHighlight — paints a span of headline text with the AI\n * brand gradient (the \"highlighted word\" treatment). Drop it inline inside a\n * `<NarrativeHeadline>`:\n *\n * <NarrativeHeadline>\n * Headline with a <NarrativeHeadlineHighlight>highlighted</NarrativeHeadlineHighlight> word\n * </NarrativeHeadline>\n */\nconst NarrativeHeadlineHighlight = React.forwardRef<\n HTMLSpanElement,\n TypeNarrativeHeadlineHighlightProps\n>(({ children, className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\"seeds-narrative-headline-highlight\", className)}\n {...props}\n >\n {children}\n </span>\n );\n});\n\nNarrativeHeadlineHighlight.displayName = \"NarrativeHeadlineHighlight\";\n\nexport default NarrativeHeadlineHighlight;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeHeadlineRollProps } from \"./NarrativeHeadlineTypes\";\n\n/**\n * NarrativeHeadlineRoll — the \"roll\" variant: a vertical word roll for the\n * highlighted slot of a headline. The active word slides into view while the\n * previous one rolls out (no typing). Inspired by the performative-ui WordRoll.\n *\n * <NarrativeHeadline>\n * Built for{\" \"}\n * <NarrativeHeadlineRoll words={[\"marketers\", \"agencies\", \"teams\"]} />\n * </NarrativeHeadline>\n *\n * The container width follows the active word so it sits naturally inline.\n * Gradient-painted by default; honors `prefers-reduced-motion` by holding the\n * first word static.\n */\nconst NarrativeHeadlineRoll = React.forwardRef<\n HTMLSpanElement,\n TypeNarrativeHeadlineRollProps\n>(\n (\n {\n words,\n intervalMs = 2200,\n transitionMs = 500,\n direction = \"up\",\n gradient = true,\n className,\n style,\n ...rest\n },\n ref\n ) => {\n const [i, setI] = React.useState(0);\n\n React.useEffect(() => {\n if (words.length <= 1) return;\n\n // Respect reduced-motion: hold the first word, skip the cycle entirely.\n const reduced =\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n if (reduced) return;\n\n const t = setInterval(\n () => setI((j) => (j + 1) % words.length),\n intervalMs\n );\n return () => clearInterval(t);\n }, [intervalMs, words.length]);\n\n const merged: React.CSSProperties = {\n ...style,\n // Consumed by the transition timing in narrative-headline.css.\n [\"--seeds-narrative-headline-roll-ms\" as string]: `${transitionMs}ms`,\n };\n\n const prev = words.length ? (i - 1 + words.length) % words.length : 0;\n\n return (\n <span\n ref={ref}\n className={cn(\n \"seeds-narrative-headline-roll\",\n { \"seeds-narrative-headline-roll-down\": direction === \"down\" },\n { \"seeds-narrative-headline-roll-gradient\": gradient },\n className\n )}\n style={merged}\n {...rest}\n >\n {/* Sizer keeps the container width matched to the active word — without\n it the absolutely-positioned words would collapse the box. */}\n <span\n className=\"seeds-narrative-headline-roll-sizer\"\n aria-hidden=\"true\"\n >\n {words[i]}\n </span>\n {words.map((w, idx) => (\n <span\n key={idx}\n className={cn(\"seeds-narrative-headline-roll-word\", {\n \"seeds-narrative-headline-roll-word-active\": idx === i,\n \"seeds-narrative-headline-roll-word-past\":\n idx === prev && i !== prev,\n })}\n aria-hidden={idx === i ? undefined : \"true\"}\n >\n {w}\n </span>\n ))}\n </span>\n );\n }\n);\n\nNarrativeHeadlineRoll.displayName = \"NarrativeHeadlineRoll\";\n\nexport default NarrativeHeadlineRoll;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypePullQuoteProps } from \"./PullQuoteTypes\";\n\n/**\n * PullQuote — a narrative primitive that spotlights a quotation on an AI\n * gradient surface. The quote sits behind an accented vertical bar with an\n * optional attribution row (author name, avatar, network).\n *\n * Rendered as semantic `<figure>` / `<blockquote>` / `<figcaption>` markup.\n * Styled via `pull-quote.css` (Seeds CSS custom properties); consumers import\n * the classes through `@sproutsocial/racine/css/components`. Surface overrides\n * are done with standard `className` / `style`.\n */\nconst PullQuote = React.forwardRef<HTMLElement, TypePullQuoteProps>(\n ({ quote, attribution, appearance = \"subtle\", className, ...props }, ref) => {\n return (\n <figure\n ref={ref}\n className={cn(\n \"seeds-pull-quote\",\n { \"seeds-pull-quote-vivid\": appearance === \"vivid\" },\n className\n )}\n {...props}\n >\n <div className=\"seeds-pull-quote-bar\">\n <blockquote className=\"seeds-pull-quote-text\">{quote}</blockquote>\n {attribution != null && (\n <figcaption className=\"seeds-pull-quote-attribution\">\n {attribution}\n </figcaption>\n )}\n </div>\n </figure>\n );\n }\n);\n\nPullQuote.displayName = \"PullQuote\";\n\nexport default PullQuote;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeEyebrowTokenProps } from \"./EyebrowTokenTypes\";\n\n/**\n * EyebrowToken — a small gray pill that sits above a headline to carry a short\n * bit of context: a date (e.g. \"May 31, 2026\"), category, or kicker.\n *\n * A faithful match of the Figma \"Token / Non Clickable / Default\" design — a\n * solid `#dee1e1` fill with a matching border, 6px radius, and small body text.\n * Styled via `eyebrow-token.css` (Seeds CSS custom properties); consumers import\n * the classes through `@sproutsocial/racine/css/components`. Overrides come via\n * standard `className` / `style`.\n */\nconst EyebrowToken = React.forwardRef<HTMLSpanElement, TypeEyebrowTokenProps>(\n ({ children, className, ...props }, ref) => (\n <span ref={ref} className={cn(\"seeds-eyebrow-token\", className)} {...props}>\n {children}\n </span>\n )\n);\n\nEyebrowToken.displayName = \"EyebrowToken\";\n\nexport default EyebrowToken;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeDividerProps } from \"./NarrativeDividerTypes\";\n\n/**\n * NarrativeDivider — a full-width, 1px horizontal rule that separates sections\n * within a narrative brief (e.g. a row of metrics from the headline/summary\n * block below it).\n *\n * Renders a semantic <hr> stripped of its user-agent margins and borders, then\n * draws a single 1px line with the container-border-base token (#dee1e1, which\n * also tracks dark mode). Styled via narrative-divider.css (Seeds CSS custom\n * properties); consumers import the classes through\n * @sproutsocial/racine/css/components. Overrides come via standard className /\n * style.\n */\nconst NarrativeDivider = React.forwardRef<\n HTMLHRElement,\n TypeNarrativeDividerProps\n>(({ className, ...props }, ref) => (\n <hr\n ref={ref}\n className={cn(\"seeds-narrative-divider\", className)}\n {...props}\n />\n));\n\nNarrativeDivider.displayName = \"NarrativeDivider\";\n\nexport default NarrativeDivider;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type {\n TypeMetricHighlightProps,\n TypeMetricHighlightTrend,\n} from \"./MetricHighlightTypes\";\n\n/** Directional arrow glyph for the trend badge (decorative; `aria-hidden`). */\nconst TrendArrow = ({ direction }: { direction: \"up\" | \"down\" }) => (\n <svg\n className=\"seeds-metric-highlight-trend-arrow\"\n viewBox=\"0 0 16 16\"\n aria-hidden\n focusable={false}\n >\n {direction === \"up\" ? (\n <path\n d=\"M4.5 11.5 11.5 4.5M11.5 4.5H5.5M11.5 4.5V10.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n ) : (\n <path\n d=\"M4.5 4.5 11.5 11.5M11.5 11.5H5.5M11.5 11.5V5.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n </svg>\n);\n\nconst TrendBadge = ({\n direction = \"up\",\n value,\n ...rest\n}: TypeMetricHighlightTrend) => (\n <span\n className={cn(\"seeds-metric-highlight-trend\", {\n \"seeds-metric-highlight-trend-down\": direction === \"down\",\n })}\n {...rest}\n >\n <TrendArrow direction={direction} />\n {value != null && (\n <span className=\"seeds-metric-highlight-trend-value\">{value}</span>\n )}\n </span>\n);\n\n/**\n * MetricHighlight — a narrative primitive that spotlights a single metric: a\n * label, a large monospace value, an optional trend badge (a directional arrow\n * plus an optional number such as \"240%\"), and an optional chart supplied via\n * the `sparkline` slot (e.g. a `<SparklineChart />` from\n * `@sproutsocial/seeds-react-data-viz/sparkline`).\n *\n * Styled via `metric-highlight.css` (Seeds CSS custom properties); consumers\n * import the classes through `@sproutsocial/racine/css/components`. Layout flexes\n * across `appearance` (horizontal/vertical) and `size` (default/small); surface\n * overrides are done with standard `className` / `style`.\n */\nconst MetricHighlight = React.forwardRef<\n HTMLDivElement,\n TypeMetricHighlightProps\n>(\n (\n {\n label,\n value,\n trend,\n sparkline,\n appearance = \"horizontal\",\n size = \"default\",\n container = true,\n className,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"seeds-metric-highlight\",\n {\n \"seeds-metric-highlight-vertical\": appearance === \"vertical\",\n \"seeds-metric-highlight-small\": size === \"small\",\n \"seeds-metric-highlight-bare\": !container,\n },\n className\n )}\n {...props}\n >\n <div className=\"seeds-metric-highlight-metric\">\n <p className=\"seeds-metric-highlight-label\">{label}</p>\n <div className=\"seeds-metric-highlight-value-row\">\n <p className=\"seeds-metric-highlight-value\">{value}</p>\n {trend != null && <TrendBadge {...trend} />}\n </div>\n </div>\n {sparkline != null && (\n // Layout-only slot (bounded dimensions per horizontal/vertical/small)\n // for a consumer-supplied chart. It controls its own look; the slot\n // only sizes and centers it.\n <div className=\"seeds-metric-highlight-chart\">{sparkline}</div>\n )}\n </div>\n );\n }\n);\n\nMetricHighlight.displayName = \"MetricHighlight\";\n\nexport default MetricHighlight;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport EyebrowToken from \"../EyebrowToken/EyebrowToken\";\nimport NarrativeHeadline from \"../NarrativeHeadline/NarrativeHeadline\";\nimport type { TypeNarrativeSummaryProps } from \"./NarrativeSummaryTypes\";\n\n/**\n * NarrativeSummary — a composed narrative block that pairs a lead column\n * (eyebrow + headline + optional action) with a Summary section and a Key\n * themes list.\n *\n * Renders inner content only — it carries no surface, shadow, or accent of its\n * own. Drop it into a `NarrativeContainer` (see the stories / playground).\n *\n * Layout is CSS Grid driven by container queries, so the columns collapse based\n * on the width the component is actually given, not the viewport:\n * - `\"three-column\"` → lead | Summary | Key themes.\n * - `\"two-column\"` → a 1/3 | 2/3 split with Summary and Key themes stacked in\n * the wider column.\n *\n * Styled via `narrative-summary.css` (Seeds CSS custom properties); consumers\n * import the classes through `@sproutsocial/racine/css/components`. Overrides\n * come via standard `className` / `style`.\n */\nconst NarrativeSummary = React.forwardRef<\n HTMLDivElement,\n TypeNarrativeSummaryProps\n>(\n (\n {\n eyebrow,\n headline,\n headingLevel = 2,\n action,\n summary,\n summaryLabel = \"Summary\",\n keyThemes,\n keyThemesLabel = \"Key themes\",\n layout = \"three-column\",\n className,\n ...props\n },\n ref\n ) => {\n const hasKeyThemes = keyThemes != null && keyThemes.length > 0;\n\n return (\n <div\n ref={ref}\n className={cn(\"seeds-narrative-summary\", className)}\n {...props}\n >\n <div\n className={cn(\"seeds-narrative-summary-grid\", {\n \"seeds-narrative-summary-two-column\": layout === \"two-column\",\n })}\n >\n <div className=\"seeds-narrative-summary-lead\">\n {eyebrow != null && <EyebrowToken>{eyebrow}</EyebrowToken>}\n <div className=\"seeds-narrative-summary-headline\">\n <NarrativeHeadline size=\"small\" headingLevel={headingLevel}>\n {headline}\n </NarrativeHeadline>\n </div>\n {action != null && (\n <div className=\"seeds-narrative-summary-action\">{action}</div>\n )}\n </div>\n\n <div className=\"seeds-narrative-summary-content\">\n {summary != null && (\n <section className=\"seeds-narrative-summary-section\">\n <p className=\"seeds-narrative-summary-label\">{summaryLabel}</p>\n <p className=\"seeds-narrative-summary-text\">{summary}</p>\n </section>\n )}\n {hasKeyThemes && (\n <section className=\"seeds-narrative-summary-section\">\n <p className=\"seeds-narrative-summary-label\">\n {keyThemesLabel}\n </p>\n <ul className=\"seeds-narrative-summary-list\">\n {keyThemes.map((theme, i) => (\n <li key={i}>{theme}</li>\n ))}\n </ul>\n </section>\n )}\n </div>\n </div>\n </div>\n );\n }\n);\n\nNarrativeSummary.displayName = \"NarrativeSummary\";\n\nexport default NarrativeSummary;\n"],"mappings":"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","names":["React","jsx","React","jsx","React","jsx","React","jsx","jsxs","React","jsx","React","jsx","React","jsx","jsxs","React","jsx","jsxs"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -23,6 +23,8 @@ declare const NarrativeContainer: React.ForwardRefExoticComponent<TypeNarrativeC
|
|
|
23
23
|
|
|
24
24
|
/** Heading level the headline text renders as. */
|
|
25
25
|
type TypeNarrativeHeadlineLevel = 1 | 2 | 3 | 4 | 5 | 6;
|
|
26
|
+
/** Visual size of the headline. Independent of the semantic heading level. */
|
|
27
|
+
type TypeNarrativeHeadlineSize = "default" | "small";
|
|
26
28
|
interface TypeNarrativeHeadlineProps extends React.HTMLAttributes<HTMLHeadingElement> {
|
|
27
29
|
/**
|
|
28
30
|
* The headline text. Wrap part of it in `<NarrativeHeadlineHighlight>` for a
|
|
@@ -36,6 +38,12 @@ interface TypeNarrativeHeadlineProps extends React.HTMLAttributes<HTMLHeadingEle
|
|
|
36
38
|
* @default 2
|
|
37
39
|
*/
|
|
38
40
|
headingLevel?: TypeNarrativeHeadlineLevel;
|
|
41
|
+
/**
|
|
42
|
+
* Visual size. `"default"` is the display size (32px / 40px); `"small"` is the
|
|
43
|
+
* compact size (24px / 32px) used inside denser layouts like NarrativeSummary.
|
|
44
|
+
* @default "default"
|
|
45
|
+
*/
|
|
46
|
+
size?: TypeNarrativeHeadlineSize;
|
|
39
47
|
}
|
|
40
48
|
interface TypeNarrativeHeadlineHighlightProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
41
49
|
/** Text painted with the AI gradient. */
|
|
@@ -155,6 +163,23 @@ interface TypeEyebrowTokenProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
|
155
163
|
*/
|
|
156
164
|
declare const EyebrowToken: React.ForwardRefExoticComponent<TypeEyebrowTokenProps & React.RefAttributes<HTMLSpanElement>>;
|
|
157
165
|
|
|
166
|
+
/** NarrativeDivider takes no extra props — just standard <hr> attributes. */
|
|
167
|
+
type TypeNarrativeDividerProps = React.HTMLAttributes<HTMLHRElement>;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* NarrativeDivider — a full-width, 1px horizontal rule that separates sections
|
|
171
|
+
* within a narrative brief (e.g. a row of metrics from the headline/summary
|
|
172
|
+
* block below it).
|
|
173
|
+
*
|
|
174
|
+
* Renders a semantic <hr> stripped of its user-agent margins and borders, then
|
|
175
|
+
* draws a single 1px line with the container-border-base token (#dee1e1, which
|
|
176
|
+
* also tracks dark mode). Styled via narrative-divider.css (Seeds CSS custom
|
|
177
|
+
* properties); consumers import the classes through
|
|
178
|
+
* @sproutsocial/racine/css/components. Overrides come via standard className /
|
|
179
|
+
* style.
|
|
180
|
+
*/
|
|
181
|
+
declare const NarrativeDivider: React.ForwardRefExoticComponent<TypeNarrativeDividerProps & React.RefAttributes<HTMLHRElement>>;
|
|
182
|
+
|
|
158
183
|
interface TypeMetricHighlightTrend {
|
|
159
184
|
/**
|
|
160
185
|
* Direction of movement. Selects the arrow glyph and the sentiment color of
|
|
@@ -181,16 +206,13 @@ interface TypeMetricHighlightProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
181
206
|
/** Optional trend badge — a directional arrow plus an optional value. */
|
|
182
207
|
trend?: TypeMetricHighlightTrend;
|
|
183
208
|
/**
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
209
|
+
* Chart slot. When provided, this node renders in the chart area beside/below
|
|
210
|
+
* the metric — e.g. a `<SparklineChart />` from
|
|
211
|
+
* `@sproutsocial/seeds-react-data-viz/sparkline`. Omit it to render the metric
|
|
212
|
+
* on its own. The injected node controls its own look; the slot only sizes and
|
|
213
|
+
* centers it (pass `className="h-full w-full"` to fill).
|
|
187
214
|
*/
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Render the sparkline.
|
|
191
|
-
* @default true
|
|
192
|
-
*/
|
|
193
|
-
chart?: boolean;
|
|
215
|
+
sparkline?: React.ReactNode;
|
|
194
216
|
/**
|
|
195
217
|
* Layout direction.
|
|
196
218
|
* - `horizontal` — metric block beside the sparkline.
|
|
@@ -216,7 +238,9 @@ interface TypeMetricHighlightProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
216
238
|
/**
|
|
217
239
|
* MetricHighlight — a narrative primitive that spotlights a single metric: a
|
|
218
240
|
* label, a large monospace value, an optional trend badge (a directional arrow
|
|
219
|
-
* plus an optional number such as "240%"), and an optional
|
|
241
|
+
* plus an optional number such as "240%"), and an optional chart supplied via
|
|
242
|
+
* the `sparkline` slot (e.g. a `<SparklineChart />` from
|
|
243
|
+
* `@sproutsocial/seeds-react-data-viz/sparkline`).
|
|
220
244
|
*
|
|
221
245
|
* Styled via `metric-highlight.css` (Seeds CSS custom properties); consumers
|
|
222
246
|
* import the classes through `@sproutsocial/racine/css/components`. Layout flexes
|
|
@@ -225,6 +249,81 @@ interface TypeMetricHighlightProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
225
249
|
*/
|
|
226
250
|
declare const MetricHighlight: React.ForwardRefExoticComponent<TypeMetricHighlightProps & React.RefAttributes<HTMLDivElement>>;
|
|
227
251
|
|
|
252
|
+
/**
|
|
253
|
+
* Column arrangement.
|
|
254
|
+
* - `"three-column"`: lead | Summary | Key themes, three side-by-side columns.
|
|
255
|
+
* - `"two-column"`: a 1/3 | 2/3 split — lead on the left, with Summary and Key
|
|
256
|
+
* themes stacked together in the wider right column.
|
|
257
|
+
*/
|
|
258
|
+
type TypeNarrativeSummaryLayout = "three-column" | "two-column";
|
|
259
|
+
interface TypeNarrativeSummaryProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
260
|
+
/**
|
|
261
|
+
* Kicker shown in an `EyebrowToken` above the headline (e.g. a date). Omit to
|
|
262
|
+
* hide the eyebrow entirely.
|
|
263
|
+
*/
|
|
264
|
+
eyebrow?: React.ReactNode;
|
|
265
|
+
/** Headline text — rendered via `NarrativeHeadline` at `size="small"`. */
|
|
266
|
+
headline: React.ReactNode;
|
|
267
|
+
/**
|
|
268
|
+
* Heading element the headline renders as, for document outline /
|
|
269
|
+
* accessibility.
|
|
270
|
+
* @default 2
|
|
271
|
+
*/
|
|
272
|
+
headingLevel?: TypeNarrativeHeadlineLevel;
|
|
273
|
+
/**
|
|
274
|
+
* Optional action, typically a `<Button>`. Rendered below the headline only
|
|
275
|
+
* when provided. Pass a Button without system props so it renders the Tailwind
|
|
276
|
+
* path (e.g. `<Button appearance="primary">Action</Button>`).
|
|
277
|
+
*
|
|
278
|
+
* Note: in the MVP this will most often be left unset (null) — the AC is
|
|
279
|
+
* poorly defined at this time and needs more definition before the data model
|
|
280
|
+
* will properly support it.
|
|
281
|
+
*/
|
|
282
|
+
action?: React.ReactNode;
|
|
283
|
+
/** Summary body content. The section is omitted when this is empty. */
|
|
284
|
+
summary?: React.ReactNode;
|
|
285
|
+
/**
|
|
286
|
+
* Label above the summary.
|
|
287
|
+
* @default "Summary"
|
|
288
|
+
*/
|
|
289
|
+
summaryLabel?: React.ReactNode;
|
|
290
|
+
/**
|
|
291
|
+
* Key themes, rendered as a bulleted list. The section is omitted when this
|
|
292
|
+
* is empty.
|
|
293
|
+
*/
|
|
294
|
+
keyThemes?: string[];
|
|
295
|
+
/**
|
|
296
|
+
* Label above the key themes.
|
|
297
|
+
* @default "Key themes"
|
|
298
|
+
*/
|
|
299
|
+
keyThemesLabel?: React.ReactNode;
|
|
300
|
+
/**
|
|
301
|
+
* Column arrangement. `"two-column"` is a 1/3 | 2/3 split.
|
|
302
|
+
* @default "three-column"
|
|
303
|
+
*/
|
|
304
|
+
layout?: TypeNarrativeSummaryLayout;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* NarrativeSummary — a composed narrative block that pairs a lead column
|
|
309
|
+
* (eyebrow + headline + optional action) with a Summary section and a Key
|
|
310
|
+
* themes list.
|
|
311
|
+
*
|
|
312
|
+
* Renders inner content only — it carries no surface, shadow, or accent of its
|
|
313
|
+
* own. Drop it into a `NarrativeContainer` (see the stories / playground).
|
|
314
|
+
*
|
|
315
|
+
* Layout is CSS Grid driven by container queries, so the columns collapse based
|
|
316
|
+
* on the width the component is actually given, not the viewport:
|
|
317
|
+
* - `"three-column"` → lead | Summary | Key themes.
|
|
318
|
+
* - `"two-column"` → a 1/3 | 2/3 split with Summary and Key themes stacked in
|
|
319
|
+
* the wider column.
|
|
320
|
+
*
|
|
321
|
+
* Styled via `narrative-summary.css` (Seeds CSS custom properties); consumers
|
|
322
|
+
* import the classes through `@sproutsocial/racine/css/components`. Overrides
|
|
323
|
+
* come via standard `className` / `style`.
|
|
324
|
+
*/
|
|
325
|
+
declare const NarrativeSummary: React.ForwardRefExoticComponent<TypeNarrativeSummaryProps & React.RefAttributes<HTMLDivElement>>;
|
|
326
|
+
|
|
228
327
|
/**
|
|
229
328
|
* Shared types for narrative primitives.
|
|
230
329
|
*
|
|
@@ -237,4 +336,4 @@ declare const MetricHighlight: React.ForwardRefExoticComponent<TypeMetricHighlig
|
|
|
237
336
|
*/
|
|
238
337
|
type TypeNarrativeTone = "neutral" | "positive" | "negative" | "opportunity";
|
|
239
338
|
|
|
240
|
-
export { EyebrowToken, MetricHighlight, NarrativeContainer, NarrativeHeadline, NarrativeHeadlineHighlight, NarrativeHeadlineRoll, PullQuote, type TypeEyebrowTokenProps, type TypeMetricHighlightProps, type TypeMetricHighlightTrend, type TypeNarrativeContainerProps, type TypeNarrativeHeadlineHighlightProps, type TypeNarrativeHeadlineLevel, type TypeNarrativeHeadlineProps, type TypeNarrativeHeadlineRollProps, type TypeNarrativeTone, type TypePullQuoteProps };
|
|
339
|
+
export { EyebrowToken, MetricHighlight, NarrativeContainer, NarrativeDivider, NarrativeHeadline, NarrativeHeadlineHighlight, NarrativeHeadlineRoll, NarrativeSummary, PullQuote, type TypeEyebrowTokenProps, type TypeMetricHighlightProps, type TypeMetricHighlightTrend, type TypeNarrativeContainerProps, type TypeNarrativeDividerProps, type TypeNarrativeHeadlineHighlightProps, type TypeNarrativeHeadlineLevel, type TypeNarrativeHeadlineProps, type TypeNarrativeHeadlineRollProps, type TypeNarrativeSummaryLayout, type TypeNarrativeSummaryProps, type TypeNarrativeTone, type TypePullQuoteProps };
|