@sproutsocial/seeds-react-narrative-kit 0.2.0 → 0.4.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 +46 -0
- package/dist/ai-container.css +39 -0
- package/dist/esm/index.js +217 -91
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +232 -14
- package/dist/index.d.ts +232 -14
- package/dist/index.js +224 -93
- package/dist/index.js.map +1 -1
- package/dist/metric-highlight.css +17 -27
- package/dist/narrative-data-callout.css +103 -0
- package/dist/narrative-divider.css +27 -0
- package/dist/narrative-headline.css +7 -0
- package/dist/narrative-ordered-list.css +112 -0
- package/dist/narrative-summary.css +126 -0
- package/dist/pull-quote.css +4 -25
- package/package.json +12 -5
- package/src/AIContainer/AIContainer.stories.tsx +54 -0
- package/src/AIContainer/AIContainer.tsx +35 -0
- package/src/AIContainer/AIContainerTypes.ts +14 -0
- package/src/AIContainer/__tests__/AIContainer.test.tsx +61 -0
- package/src/AIContainer/index.ts +2 -0
- 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/NarrativeDataCallout/NarrativeDataCallout.stories.tsx +71 -0
- package/src/NarrativeDataCallout/NarrativeDataCallout.tsx +50 -0
- package/src/NarrativeDataCallout/NarrativeDataCalloutTypes.ts +18 -0
- package/src/NarrativeDataCallout/__tests__/NarrativeDataCallout.test.tsx +69 -0
- package/src/NarrativeDataCallout/index.ts +2 -0
- 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/NarrativeOrderedList/NarrativeOrderedList.stories.tsx +69 -0
- package/src/NarrativeOrderedList/NarrativeOrderedList.tsx +74 -0
- package/src/NarrativeOrderedList/NarrativeOrderedListTypes.ts +39 -0
- package/src/NarrativeOrderedList/__tests__/NarrativeOrderedList.test.tsx +89 -0
- package/src/NarrativeOrderedList/index.ts +6 -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 +174 -36
- package/src/PullQuote/PullQuote.stories.tsx +4 -1
- package/src/PullQuote/PullQuote.tsx +6 -3
- package/src/PullQuote/PullQuoteTypes.ts +1 -2
- package/src/ai-container.css +39 -0
- package/src/index.ts +25 -0
- package/src/metric-highlight.css +17 -27
- package/src/narrative-data-callout.css +103 -0
- package/src/narrative-divider.css +27 -0
- package/src/narrative-headline.css +7 -0
- package/src/narrative-ordered-list.css +112 -0
- package/src/narrative-summary.css +126 -0
- package/src/pull-quote.css +4 -25
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 && cp src/narrative-ordered-list.css dist/narrative-ordered-list.css && cp src/narrative-data-callout.css dist/narrative-data-callout.css && cp src/ai-container.css dist/ai-container.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[32m18.81 KB[39m
|
|
12
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m33.28 KB[39m
|
|
13
|
+
[32mCJS[39m ⚡️ Build success in 19ms
|
|
14
|
+
[32mESM[39m [1mdist/esm/index.js [22m[32m15.63 KB[39m
|
|
15
|
+
[32mESM[39m [1mdist/esm/index.js.map [22m[32m32.00 KB[39m
|
|
16
|
+
[32mESM[39m ⚡️ Build success in 20ms
|
|
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 1732ms
|
|
19
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m19.92 KB[39m
|
|
20
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m19.92 KB[39m
|
|
21
|
+
Done in 2.47s.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,51 @@
|
|
|
1
1
|
# @sproutsocial/seeds-react-narrative-kit
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- e5a385e: Add the `NarrativeDataCallout` primitive to `seeds-react-narrative-kit` — a
|
|
8
|
+
horizontally oriented callout that pairs an injected data-viz `visual` (left,
|
|
9
|
+
~1/3 width) with a block of body copy (right, ~2/3). The kit ships no chart of
|
|
10
|
+
its own; the `visual` slot accepts any node (the stories drop in a v2
|
|
11
|
+
`DonutChart`), so narrative-kit takes no runtime dependency on data-viz —
|
|
12
|
+
mirroring `MetricHighlight`'s `sparkline` slot. An optional `visualLabel`
|
|
13
|
+
applies an `img` role with an accessible name to the visual. Layout is driven by
|
|
14
|
+
a container query, so it collapses to a stacked column (visual on top, text
|
|
15
|
+
below) based on the width the component is given rather than the viewport.
|
|
16
|
+
Exported through `@sproutsocial/racine`.
|
|
17
|
+
- 979bf12: Add the `NarrativeOrderedList` primitive to `seeds-react-narrative-kit` — a
|
|
18
|
+
numbered list of action items pairing a large ordinal (01, 02, …) with a title,
|
|
19
|
+
an optional description, and an optional call-to-action slot. Supports
|
|
20
|
+
`vertical` (default, stacked) and `horizontal` (row of equal columns)
|
|
21
|
+
orientations via a container query, so the horizontal layout collapses back to a
|
|
22
|
+
stack when its container is narrow. Exported through `@sproutsocial/racine`.
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- be93d78: add AiContainer
|
|
27
|
+
- Updated dependencies [a13a571]
|
|
28
|
+
- @sproutsocial/seeds-react-theme@4.1.1
|
|
29
|
+
|
|
30
|
+
## 0.3.0
|
|
31
|
+
|
|
32
|
+
### Minor Changes
|
|
33
|
+
|
|
34
|
+
- 1aca1d1: `MetricHighlight` now takes a `sparkline` render slot instead of owning the
|
|
35
|
+
chart itself. Pass any node (e.g. a `<SparklineChart />` from
|
|
36
|
+
`@sproutsocial/seeds-react-data-viz/sparkline`) to render it beside/below the
|
|
37
|
+
metric; omit it to render the metric on its own. This replaces the previous
|
|
38
|
+
`data` and `chart` props.
|
|
39
|
+
- 0b37765: Add the `NarrativeDivider` primitive to `seeds-react-narrative-kit` — a full-width,
|
|
40
|
+
1px horizontal rule for separating sections within a narrative brief, using the
|
|
41
|
+
`container.border` token (dark-mode aware). Exported through `@sproutsocial/racine`.
|
|
42
|
+
- 0b37765: Add the `NarrativeSummary` primitive to `seeds-react-narrative-kit` — a composed
|
|
43
|
+
block pairing a lead column (eyebrow + headline + optional action) with a Summary
|
|
44
|
+
section and a Key themes list, laid out as a container-query-driven grid with
|
|
45
|
+
`three-column` and `two-column` (1/3 | 2/3) arrangements. Also adds a `size` prop
|
|
46
|
+
(`"default" | "small"`) to `NarrativeHeadline`. Exported through
|
|
47
|
+
`@sproutsocial/racine`.
|
|
48
|
+
|
|
3
49
|
## 0.2.0
|
|
4
50
|
|
|
5
51
|
### Minor Changes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeds AIContainer component classes.
|
|
3
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
4
|
+
*
|
|
5
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
6
|
+
* CSS variable definitions and dark mode support.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* <div class="seeds-ai-container">…</div> // subtle (default)
|
|
10
|
+
* <div class="seeds-ai-container seeds-ai-container-vivid">…</div>
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
@layer components {
|
|
14
|
+
|
|
15
|
+
.seeds-ai-container {
|
|
16
|
+
position: relative;
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
box-sizing: border-box;
|
|
19
|
+
border-radius: var(--radius-800);
|
|
20
|
+
box-shadow: var(--shadow-low);
|
|
21
|
+
font-family: var(--font-family);
|
|
22
|
+
/* Subtle (default): the 20% AI gradient tint composited over the base
|
|
23
|
+
surface. --color-gradient-ai-subtle is already translucent, so layering it
|
|
24
|
+
over the opaque base color produces the soft wash. */
|
|
25
|
+
background-color: var(--color-container-bg-base);
|
|
26
|
+
background-image: var(--color-gradient-ai-subtle);
|
|
27
|
+
color: var(--color-text-headline);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Vivid: the full-saturation AI gradient with white content. White has no
|
|
31
|
+
semantic Seeds token; it is part of the AI gradient treatment (mirrors the
|
|
32
|
+
raw brand hex used in --color-gradient-ai). */
|
|
33
|
+
.seeds-ai-container-vivid {
|
|
34
|
+
background-color: transparent;
|
|
35
|
+
background-image: var(--color-gradient-ai);
|
|
36
|
+
color: #fff;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
}
|
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
|
{
|
|
@@ -150,6 +163,8 @@ var PullQuote = React5.forwardRef(
|
|
|
150
163
|
ref,
|
|
151
164
|
className: cn(
|
|
152
165
|
"seeds-pull-quote",
|
|
166
|
+
"seeds-ai-container",
|
|
167
|
+
{ "seeds-ai-container-vivid": appearance === "vivid" },
|
|
153
168
|
{ "seeds-pull-quote-vivid": appearance === "vivid" },
|
|
154
169
|
className
|
|
155
170
|
),
|
|
@@ -169,82 +184,36 @@ var PullQuote_default = PullQuote;
|
|
|
169
184
|
import * as React6 from "react";
|
|
170
185
|
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
171
186
|
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
|
-
)
|
|
187
|
+
({ children, className, ...props }, ref) => /* @__PURE__ */ jsx6("span", { ref, className: cn("seeds-eyebrow-token", className), ...props, children })
|
|
181
188
|
);
|
|
182
189
|
EyebrowToken.displayName = "EyebrowToken";
|
|
183
190
|
var EyebrowToken_default = EyebrowToken;
|
|
184
191
|
|
|
185
|
-
// src/
|
|
192
|
+
// src/NarrativeDivider/NarrativeDivider.tsx
|
|
186
193
|
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)}`;
|
|
194
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
195
|
+
var NarrativeDivider = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
196
|
+
"hr",
|
|
197
|
+
{
|
|
198
|
+
ref,
|
|
199
|
+
className: cn("seeds-narrative-divider", className),
|
|
200
|
+
...props
|
|
210
201
|
}
|
|
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(
|
|
202
|
+
));
|
|
203
|
+
NarrativeDivider.displayName = "NarrativeDivider";
|
|
204
|
+
var NarrativeDivider_default = NarrativeDivider;
|
|
205
|
+
|
|
206
|
+
// src/MetricHighlight/MetricHighlight.tsx
|
|
207
|
+
import * as React8 from "react";
|
|
208
|
+
import { jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
209
|
+
var TrendArrow = ({ direction }) => /* @__PURE__ */ jsx8(
|
|
241
210
|
"svg",
|
|
242
211
|
{
|
|
243
212
|
className: "seeds-metric-highlight-trend-arrow",
|
|
244
213
|
viewBox: "0 0 16 16",
|
|
245
214
|
"aria-hidden": true,
|
|
246
215
|
focusable: false,
|
|
247
|
-
children: direction === "up" ? /* @__PURE__ */
|
|
216
|
+
children: direction === "up" ? /* @__PURE__ */ jsx8(
|
|
248
217
|
"path",
|
|
249
218
|
{
|
|
250
219
|
d: "M4.5 11.5 11.5 4.5M11.5 4.5H5.5M11.5 4.5V10.5",
|
|
@@ -252,7 +221,7 @@ var TrendArrow = ({ direction }) => /* @__PURE__ */ jsx7(
|
|
|
252
221
|
strokeLinecap: "round",
|
|
253
222
|
strokeLinejoin: "round"
|
|
254
223
|
}
|
|
255
|
-
) : /* @__PURE__ */
|
|
224
|
+
) : /* @__PURE__ */ jsx8(
|
|
256
225
|
"path",
|
|
257
226
|
{
|
|
258
227
|
d: "M4.5 4.5 11.5 11.5M11.5 11.5H5.5M11.5 11.5V5.5",
|
|
@@ -263,7 +232,11 @@ var TrendArrow = ({ direction }) => /* @__PURE__ */ jsx7(
|
|
|
263
232
|
)
|
|
264
233
|
}
|
|
265
234
|
);
|
|
266
|
-
var TrendBadge = ({
|
|
235
|
+
var TrendBadge = ({
|
|
236
|
+
direction = "up",
|
|
237
|
+
value,
|
|
238
|
+
...rest
|
|
239
|
+
}) => /* @__PURE__ */ jsxs3(
|
|
267
240
|
"span",
|
|
268
241
|
{
|
|
269
242
|
className: cn("seeds-metric-highlight-trend", {
|
|
@@ -271,27 +244,23 @@ var TrendBadge = ({ direction = "up", value, ...rest }) => /* @__PURE__ */ jsxs3
|
|
|
271
244
|
}),
|
|
272
245
|
...rest,
|
|
273
246
|
children: [
|
|
274
|
-
/* @__PURE__ */
|
|
275
|
-
value != null && /* @__PURE__ */
|
|
247
|
+
/* @__PURE__ */ jsx8(TrendArrow, { direction }),
|
|
248
|
+
value != null && /* @__PURE__ */ jsx8("span", { className: "seeds-metric-highlight-trend-value", children: value })
|
|
276
249
|
]
|
|
277
250
|
}
|
|
278
251
|
);
|
|
279
|
-
var MetricHighlight =
|
|
252
|
+
var MetricHighlight = React8.forwardRef(
|
|
280
253
|
({
|
|
281
254
|
label,
|
|
282
255
|
value,
|
|
283
256
|
trend,
|
|
284
|
-
|
|
285
|
-
chart = true,
|
|
257
|
+
sparkline,
|
|
286
258
|
appearance = "horizontal",
|
|
287
259
|
size = "default",
|
|
288
260
|
container = true,
|
|
289
261
|
className,
|
|
290
262
|
...props
|
|
291
263
|
}, 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
264
|
return /* @__PURE__ */ jsxs3(
|
|
296
265
|
"div",
|
|
297
266
|
{
|
|
@@ -308,13 +277,16 @@ var MetricHighlight = React7.forwardRef(
|
|
|
308
277
|
...props,
|
|
309
278
|
children: [
|
|
310
279
|
/* @__PURE__ */ jsxs3("div", { className: "seeds-metric-highlight-metric", children: [
|
|
311
|
-
/* @__PURE__ */
|
|
280
|
+
/* @__PURE__ */ jsx8("p", { className: "seeds-metric-highlight-label", children: label }),
|
|
312
281
|
/* @__PURE__ */ jsxs3("div", { className: "seeds-metric-highlight-value-row", children: [
|
|
313
|
-
/* @__PURE__ */
|
|
314
|
-
trend != null && /* @__PURE__ */
|
|
282
|
+
/* @__PURE__ */ jsx8("p", { className: "seeds-metric-highlight-value", children: value }),
|
|
283
|
+
trend != null && /* @__PURE__ */ jsx8(TrendBadge, { ...trend })
|
|
315
284
|
] })
|
|
316
285
|
] }),
|
|
317
|
-
|
|
286
|
+
sparkline != null && // Layout-only slot (bounded dimensions per horizontal/vertical/small)
|
|
287
|
+
// for a consumer-supplied chart. It controls its own look; the slot
|
|
288
|
+
// only sizes and centers it.
|
|
289
|
+
/* @__PURE__ */ jsx8("div", { className: "seeds-metric-highlight-chart", children: sparkline })
|
|
318
290
|
]
|
|
319
291
|
}
|
|
320
292
|
);
|
|
@@ -322,13 +294,167 @@ var MetricHighlight = React7.forwardRef(
|
|
|
322
294
|
);
|
|
323
295
|
MetricHighlight.displayName = "MetricHighlight";
|
|
324
296
|
var MetricHighlight_default = MetricHighlight;
|
|
297
|
+
|
|
298
|
+
// src/NarrativeSummary/NarrativeSummary.tsx
|
|
299
|
+
import * as React9 from "react";
|
|
300
|
+
import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
301
|
+
var NarrativeSummary = React9.forwardRef(
|
|
302
|
+
({
|
|
303
|
+
eyebrow,
|
|
304
|
+
headline,
|
|
305
|
+
headingLevel = 2,
|
|
306
|
+
action,
|
|
307
|
+
summary,
|
|
308
|
+
summaryLabel = "Summary",
|
|
309
|
+
keyThemes,
|
|
310
|
+
keyThemesLabel = "Key themes",
|
|
311
|
+
layout = "three-column",
|
|
312
|
+
className,
|
|
313
|
+
...props
|
|
314
|
+
}, ref) => {
|
|
315
|
+
const hasKeyThemes = keyThemes != null && keyThemes.length > 0;
|
|
316
|
+
return /* @__PURE__ */ jsx9(
|
|
317
|
+
"div",
|
|
318
|
+
{
|
|
319
|
+
ref,
|
|
320
|
+
className: cn("seeds-narrative-summary", className),
|
|
321
|
+
...props,
|
|
322
|
+
children: /* @__PURE__ */ jsxs4(
|
|
323
|
+
"div",
|
|
324
|
+
{
|
|
325
|
+
className: cn("seeds-narrative-summary-grid", {
|
|
326
|
+
"seeds-narrative-summary-two-column": layout === "two-column"
|
|
327
|
+
}),
|
|
328
|
+
children: [
|
|
329
|
+
/* @__PURE__ */ jsxs4("div", { className: "seeds-narrative-summary-lead", children: [
|
|
330
|
+
eyebrow != null && /* @__PURE__ */ jsx9(EyebrowToken_default, { children: eyebrow }),
|
|
331
|
+
/* @__PURE__ */ jsx9("div", { className: "seeds-narrative-summary-headline", children: /* @__PURE__ */ jsx9(NarrativeHeadline_default, { size: "small", headingLevel, children: headline }) }),
|
|
332
|
+
action != null && /* @__PURE__ */ jsx9("div", { className: "seeds-narrative-summary-action", children: action })
|
|
333
|
+
] }),
|
|
334
|
+
/* @__PURE__ */ jsxs4("div", { className: "seeds-narrative-summary-content", children: [
|
|
335
|
+
summary != null && /* @__PURE__ */ jsxs4("section", { className: "seeds-narrative-summary-section", children: [
|
|
336
|
+
/* @__PURE__ */ jsx9("p", { className: "seeds-narrative-summary-label", children: summaryLabel }),
|
|
337
|
+
/* @__PURE__ */ jsx9("p", { className: "seeds-narrative-summary-text", children: summary })
|
|
338
|
+
] }),
|
|
339
|
+
hasKeyThemes && /* @__PURE__ */ jsxs4("section", { className: "seeds-narrative-summary-section", children: [
|
|
340
|
+
/* @__PURE__ */ jsx9("p", { className: "seeds-narrative-summary-label", children: keyThemesLabel }),
|
|
341
|
+
/* @__PURE__ */ jsx9("ul", { className: "seeds-narrative-summary-list", children: keyThemes.map((theme, i) => /* @__PURE__ */ jsx9("li", { children: theme }, i)) })
|
|
342
|
+
] })
|
|
343
|
+
] })
|
|
344
|
+
]
|
|
345
|
+
}
|
|
346
|
+
)
|
|
347
|
+
}
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
);
|
|
351
|
+
NarrativeSummary.displayName = "NarrativeSummary";
|
|
352
|
+
var NarrativeSummary_default = NarrativeSummary;
|
|
353
|
+
|
|
354
|
+
// src/NarrativeOrderedList/NarrativeOrderedList.tsx
|
|
355
|
+
import * as React10 from "react";
|
|
356
|
+
import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
357
|
+
var NarrativeOrderedList = React10.forwardRef(({ items, orientation = "vertical", className, ...props }, ref) => {
|
|
358
|
+
return (
|
|
359
|
+
// The outer element establishes the query container. The ol inside switches
|
|
360
|
+
// direction based on this element's width — a container query can only style
|
|
361
|
+
// descendants of the container, never the container element itself.
|
|
362
|
+
/* @__PURE__ */ jsx10(
|
|
363
|
+
"div",
|
|
364
|
+
{
|
|
365
|
+
ref,
|
|
366
|
+
className: cn("seeds-narrative-ordered-list", className),
|
|
367
|
+
...props,
|
|
368
|
+
children: /* @__PURE__ */ jsx10(
|
|
369
|
+
"ol",
|
|
370
|
+
{
|
|
371
|
+
className: cn("seeds-narrative-ordered-list-track", {
|
|
372
|
+
"seeds-narrative-ordered-list-horizontal": orientation === "horizontal"
|
|
373
|
+
}),
|
|
374
|
+
children: items.map((item, i) => /* @__PURE__ */ jsxs5("li", { className: "seeds-narrative-ordered-list-item", children: [
|
|
375
|
+
/* @__PURE__ */ jsx10(
|
|
376
|
+
"span",
|
|
377
|
+
{
|
|
378
|
+
className: "seeds-narrative-ordered-list-number",
|
|
379
|
+
"aria-hidden": "true",
|
|
380
|
+
children: String(i + 1).padStart(2, "0")
|
|
381
|
+
}
|
|
382
|
+
),
|
|
383
|
+
/* @__PURE__ */ jsxs5("div", { className: "seeds-narrative-ordered-list-body", children: [
|
|
384
|
+
/* @__PURE__ */ jsx10("p", { className: "seeds-narrative-ordered-list-title", children: item.title }),
|
|
385
|
+
item.description != null && /* @__PURE__ */ jsx10("p", { className: "seeds-narrative-ordered-list-description", children: item.description }),
|
|
386
|
+
item.action != null && /* @__PURE__ */ jsx10("div", { className: "seeds-narrative-ordered-list-action", children: item.action })
|
|
387
|
+
] })
|
|
388
|
+
] }, i))
|
|
389
|
+
}
|
|
390
|
+
)
|
|
391
|
+
}
|
|
392
|
+
)
|
|
393
|
+
);
|
|
394
|
+
});
|
|
395
|
+
NarrativeOrderedList.displayName = "NarrativeOrderedList";
|
|
396
|
+
var NarrativeOrderedList_default = NarrativeOrderedList;
|
|
397
|
+
|
|
398
|
+
// src/NarrativeDataCallout/NarrativeDataCallout.tsx
|
|
399
|
+
import * as React11 from "react";
|
|
400
|
+
import { jsx as jsx11, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
401
|
+
var NarrativeDataCallout = React11.forwardRef(({ visual, children, visualLabel, className, ...props }, ref) => /* @__PURE__ */ jsx11(
|
|
402
|
+
"div",
|
|
403
|
+
{
|
|
404
|
+
ref,
|
|
405
|
+
className: cn("seeds-narrative-data-callout", className),
|
|
406
|
+
...props,
|
|
407
|
+
children: /* @__PURE__ */ jsxs6("div", { className: "seeds-narrative-data-callout-row", children: [
|
|
408
|
+
/* @__PURE__ */ jsx11(
|
|
409
|
+
"div",
|
|
410
|
+
{
|
|
411
|
+
className: "seeds-narrative-data-callout-visual",
|
|
412
|
+
role: visualLabel != null ? "img" : void 0,
|
|
413
|
+
"aria-label": visualLabel,
|
|
414
|
+
children: visual
|
|
415
|
+
}
|
|
416
|
+
),
|
|
417
|
+
/* @__PURE__ */ jsx11("div", { className: "seeds-narrative-data-callout-body", children })
|
|
418
|
+
] })
|
|
419
|
+
}
|
|
420
|
+
));
|
|
421
|
+
NarrativeDataCallout.displayName = "NarrativeDataCallout";
|
|
422
|
+
var NarrativeDataCallout_default = NarrativeDataCallout;
|
|
423
|
+
|
|
424
|
+
// src/AIContainer/AIContainer.tsx
|
|
425
|
+
import * as React12 from "react";
|
|
426
|
+
import { jsx as jsx12 } from "react/jsx-runtime";
|
|
427
|
+
var AIContainer = React12.forwardRef(
|
|
428
|
+
({ children, appearance = "subtle", className, ...props }, ref) => {
|
|
429
|
+
return /* @__PURE__ */ jsx12(
|
|
430
|
+
"div",
|
|
431
|
+
{
|
|
432
|
+
ref,
|
|
433
|
+
className: cn(
|
|
434
|
+
"seeds-ai-container",
|
|
435
|
+
{ "seeds-ai-container-vivid": appearance === "vivid" },
|
|
436
|
+
className
|
|
437
|
+
),
|
|
438
|
+
...props,
|
|
439
|
+
children
|
|
440
|
+
}
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
);
|
|
444
|
+
AIContainer.displayName = "AIContainer";
|
|
445
|
+
var AIContainer_default = AIContainer;
|
|
325
446
|
export {
|
|
447
|
+
AIContainer_default as AIContainer,
|
|
326
448
|
EyebrowToken_default as EyebrowToken,
|
|
327
449
|
MetricHighlight_default as MetricHighlight,
|
|
328
450
|
NarrativeContainer_default as NarrativeContainer,
|
|
451
|
+
NarrativeDataCallout_default as NarrativeDataCallout,
|
|
452
|
+
NarrativeDivider_default as NarrativeDivider,
|
|
329
453
|
NarrativeHeadline_default as NarrativeHeadline,
|
|
330
454
|
NarrativeHeadlineHighlight_default as NarrativeHeadlineHighlight,
|
|
331
455
|
NarrativeHeadlineRoll_default as NarrativeHeadlineRoll,
|
|
456
|
+
NarrativeOrderedList_default as NarrativeOrderedList,
|
|
457
|
+
NarrativeSummary_default as NarrativeSummary,
|
|
332
458
|
PullQuote_default as PullQuote
|
|
333
459
|
};
|
|
334
460
|
//# sourceMappingURL=index.js.map
|