@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.
Files changed (65) hide show
  1. package/.turbo/turbo-build.log +11 -11
  2. package/CHANGELOG.md +46 -0
  3. package/dist/ai-container.css +39 -0
  4. package/dist/esm/index.js +217 -91
  5. package/dist/esm/index.js.map +1 -1
  6. package/dist/index.d.mts +232 -14
  7. package/dist/index.d.ts +232 -14
  8. package/dist/index.js +224 -93
  9. package/dist/index.js.map +1 -1
  10. package/dist/metric-highlight.css +17 -27
  11. package/dist/narrative-data-callout.css +103 -0
  12. package/dist/narrative-divider.css +27 -0
  13. package/dist/narrative-headline.css +7 -0
  14. package/dist/narrative-ordered-list.css +112 -0
  15. package/dist/narrative-summary.css +126 -0
  16. package/dist/pull-quote.css +4 -25
  17. package/package.json +12 -5
  18. package/src/AIContainer/AIContainer.stories.tsx +54 -0
  19. package/src/AIContainer/AIContainer.tsx +35 -0
  20. package/src/AIContainer/AIContainerTypes.ts +14 -0
  21. package/src/AIContainer/__tests__/AIContainer.test.tsx +61 -0
  22. package/src/AIContainer/index.ts +2 -0
  23. package/src/EyebrowToken/EyebrowToken.tsx +1 -5
  24. package/src/MetricHighlight/MetricHighlight.stories.tsx +37 -14
  25. package/src/MetricHighlight/MetricHighlight.tsx +19 -99
  26. package/src/MetricHighlight/MetricHighlightTypes.ts +6 -9
  27. package/src/MetricHighlight/__tests__/MetricHighlight.test.tsx +13 -48
  28. package/src/NarrativeDataCallout/NarrativeDataCallout.stories.tsx +71 -0
  29. package/src/NarrativeDataCallout/NarrativeDataCallout.tsx +50 -0
  30. package/src/NarrativeDataCallout/NarrativeDataCalloutTypes.ts +18 -0
  31. package/src/NarrativeDataCallout/__tests__/NarrativeDataCallout.test.tsx +69 -0
  32. package/src/NarrativeDataCallout/index.ts +2 -0
  33. package/src/NarrativeDivider/NarrativeDivider.stories.tsx +33 -0
  34. package/src/NarrativeDivider/NarrativeDivider.tsx +30 -0
  35. package/src/NarrativeDivider/NarrativeDividerTypes.ts +4 -0
  36. package/src/NarrativeDivider/__tests__/NarrativeDivider.test.tsx +35 -0
  37. package/src/NarrativeDivider/index.ts +2 -0
  38. package/src/NarrativeHeadline/NarrativeHeadline.tsx +21 -12
  39. package/src/NarrativeHeadline/NarrativeHeadlineRoll.tsx +4 -1
  40. package/src/NarrativeHeadline/NarrativeHeadlineTypes.ts +9 -0
  41. package/src/NarrativeHeadline/__tests__/NarrativeHeadline.test.tsx +2 -7
  42. package/src/NarrativeHeadline/index.ts +1 -0
  43. package/src/NarrativeOrderedList/NarrativeOrderedList.stories.tsx +69 -0
  44. package/src/NarrativeOrderedList/NarrativeOrderedList.tsx +74 -0
  45. package/src/NarrativeOrderedList/NarrativeOrderedListTypes.ts +39 -0
  46. package/src/NarrativeOrderedList/__tests__/NarrativeOrderedList.test.tsx +89 -0
  47. package/src/NarrativeOrderedList/index.ts +6 -0
  48. package/src/NarrativeSummary/NarrativeSummary.stories.tsx +79 -0
  49. package/src/NarrativeSummary/NarrativeSummary.tsx +98 -0
  50. package/src/NarrativeSummary/NarrativeSummaryTypes.ts +59 -0
  51. package/src/NarrativeSummary/__tests__/NarrativeSummary.test.tsx +99 -0
  52. package/src/NarrativeSummary/index.ts +5 -0
  53. package/src/Playground/Playground.stories.tsx +174 -36
  54. package/src/PullQuote/PullQuote.stories.tsx +4 -1
  55. package/src/PullQuote/PullQuote.tsx +6 -3
  56. package/src/PullQuote/PullQuoteTypes.ts +1 -2
  57. package/src/ai-container.css +39 -0
  58. package/src/index.ts +25 -0
  59. package/src/metric-highlight.css +17 -27
  60. package/src/narrative-data-callout.css +103 -0
  61. package/src/narrative-divider.css +27 -0
  62. package/src/narrative-headline.css +7 -0
  63. package/src/narrative-ordered-list.css +112 -0
  64. package/src/narrative-summary.css +126 -0
  65. package/src/pull-quote.css +4 -25
@@ -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
  CLI Building entry: src/index.ts
4
4
  CLI Using tsconfig: tsconfig.json
5
5
  CLI tsup v8.5.0
@@ -8,14 +8,14 @@ $ tsup --dts && cp src/narrative-container.css dist/narrative-container.css && c
8
8
  CLI Cleaning output folder
9
9
  CJS Build start
10
10
  ESM Build start
11
- CJS dist/index.js 12.80 KB
12
- CJS dist/index.js.map 23.24 KB
13
- CJS ⚡️ Build success in 22ms
14
- ESM dist/esm/index.js 10.40 KB
15
- ESM dist/esm/index.js.map 22.42 KB
16
- ESM ⚡️ Build success in 23ms
11
+ CJS dist/index.js 18.81 KB
12
+ CJS dist/index.js.map 33.28 KB
13
+ CJS ⚡️ Build success in 19ms
14
+ ESM dist/esm/index.js 15.63 KB
15
+ ESM dist/esm/index.js.map 32.00 KB
16
+ ESM ⚡️ Build success in 20ms
17
17
  DTS Build start
18
- DTS ⚡️ Build success in 3112ms
19
- DTS dist/index.d.ts 10.04 KB
20
- DTS dist/index.d.mts 10.04 KB
21
- Done in 4.67s.
18
+ DTS ⚡️ Build success in 1732ms
19
+ DTS dist/index.d.ts 19.92 KB
20
+ DTS dist/index.d.mts 19.92 KB
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(({ children, headingLevel = 2, className, ...props }, ref) => {
46
- const Heading = `h${headingLevel}`;
47
- return /* @__PURE__ */ jsx2(
48
- Heading,
49
- {
50
- ref,
51
- className: cn("seeds-narrative-headline", className),
52
- ...props,
53
- children
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("span", { className: "seeds-narrative-headline-roll-sizer", "aria-hidden": "true", children: words[i] }),
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/MetricHighlight/MetricHighlight.tsx
192
+ // src/NarrativeDivider/NarrativeDivider.tsx
186
193
  import * as React7 from "react";
187
- import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
188
- var SPARK_VIEWBOX_WIDTH = 100;
189
- var SPARK_VIEWBOX_HEIGHT = 32;
190
- var SPARK_PADDING = 2;
191
- var DEFAULT_SPARK = [6, 10, 8, 13, 11, 16];
192
- var smoothPath = (points) => {
193
- if (points.length < 2) {
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
- return d;
212
- };
213
- var Sparkline = ({
214
- data,
215
- negative
216
- }) => {
217
- const min = Math.min(...data);
218
- const max = Math.max(...data);
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__ */ jsx7(
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__ */ jsx7(
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 = ({ direction = "up", value, ...rest }) => /* @__PURE__ */ jsxs3(
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__ */ jsx7(TrendArrow, { direction }),
275
- value != null && /* @__PURE__ */ jsx7("span", { className: "seeds-metric-highlight-trend-value", children: value })
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 = React7.forwardRef(
252
+ var MetricHighlight = React8.forwardRef(
280
253
  ({
281
254
  label,
282
255
  value,
283
256
  trend,
284
- data,
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__ */ jsx7("p", { className: "seeds-metric-highlight-label", children: label }),
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__ */ jsx7("p", { className: "seeds-metric-highlight-value", children: value }),
314
- trend != null && /* @__PURE__ */ jsx7(TrendBadge, { ...trend })
282
+ /* @__PURE__ */ jsx8("p", { className: "seeds-metric-highlight-value", children: value }),
283
+ trend != null && /* @__PURE__ */ jsx8(TrendBadge, { ...trend })
315
284
  ] })
316
285
  ] }),
317
- showChart && /* @__PURE__ */ jsx7(Sparkline, { data: resolvedData, negative: isDown })
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