@sproutsocial/seeds-react-narrative-kit 0.3.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 (36) hide show
  1. package/.turbo/turbo-build.log +11 -11
  2. package/CHANGELOG.md +27 -0
  3. package/dist/ai-container.css +39 -0
  4. package/dist/esm/index.js +98 -0
  5. package/dist/esm/index.js.map +1 -1
  6. package/dist/index.d.mts +123 -4
  7. package/dist/index.d.ts +123 -4
  8. package/dist/index.js +101 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/narrative-data-callout.css +103 -0
  11. package/dist/narrative-ordered-list.css +112 -0
  12. package/dist/pull-quote.css +4 -25
  13. package/package.json +8 -5
  14. package/src/AIContainer/AIContainer.stories.tsx +54 -0
  15. package/src/AIContainer/AIContainer.tsx +35 -0
  16. package/src/AIContainer/AIContainerTypes.ts +14 -0
  17. package/src/AIContainer/__tests__/AIContainer.test.tsx +61 -0
  18. package/src/AIContainer/index.ts +2 -0
  19. package/src/NarrativeDataCallout/NarrativeDataCallout.stories.tsx +71 -0
  20. package/src/NarrativeDataCallout/NarrativeDataCallout.tsx +50 -0
  21. package/src/NarrativeDataCallout/NarrativeDataCalloutTypes.ts +18 -0
  22. package/src/NarrativeDataCallout/__tests__/NarrativeDataCallout.test.tsx +69 -0
  23. package/src/NarrativeDataCallout/index.ts +2 -0
  24. package/src/NarrativeOrderedList/NarrativeOrderedList.stories.tsx +69 -0
  25. package/src/NarrativeOrderedList/NarrativeOrderedList.tsx +74 -0
  26. package/src/NarrativeOrderedList/NarrativeOrderedListTypes.ts +39 -0
  27. package/src/NarrativeOrderedList/__tests__/NarrativeOrderedList.test.tsx +89 -0
  28. package/src/NarrativeOrderedList/index.ts +6 -0
  29. package/src/Playground/Playground.stories.tsx +93 -5
  30. package/src/PullQuote/PullQuote.stories.tsx +1 -0
  31. package/src/PullQuote/PullQuote.tsx +6 -3
  32. package/src/ai-container.css +39 -0
  33. package/src/index.ts +14 -0
  34. package/src/narrative-data-callout.css +103 -0
  35. package/src/narrative-ordered-list.css +112 -0
  36. package/src/pull-quote.css +4 -25
package/dist/index.d.ts CHANGED
@@ -140,9 +140,10 @@ interface TypePullQuoteProps extends React.HTMLAttributes<HTMLElement> {
140
140
  * optional attribution row (author name, avatar, network).
141
141
  *
142
142
  * Rendered as semantic `<figure>` / `<blockquote>` / `<figcaption>` markup.
143
- * Styled via `pull-quote.css` (Seeds CSS custom properties); consumers import
144
- * the classes through `@sproutsocial/racine/css/components`. Surface overrides
145
- * are done with standard `className` / `style`.
143
+ * Styled via `pull-quote.css` and `ai-container.css` (Seeds CSS custom
144
+ * properties); consumers import the classes through
145
+ * `@sproutsocial/racine/css/components`. Surface overrides are done with
146
+ * standard `className` / `style`.
146
147
  */
147
148
  declare const PullQuote: React.ForwardRefExoticComponent<TypePullQuoteProps & React.RefAttributes<HTMLElement>>;
148
149
 
@@ -324,6 +325,124 @@ interface TypeNarrativeSummaryProps extends React.HTMLAttributes<HTMLDivElement>
324
325
  */
325
326
  declare const NarrativeSummary: React.ForwardRefExoticComponent<TypeNarrativeSummaryProps & React.RefAttributes<HTMLDivElement>>;
326
327
 
328
+ /**
329
+ * Item arrangement.
330
+ * - `"vertical"`: items stacked full-width, one per row (the default).
331
+ * - `"horizontal"`: items laid out as a row of equal columns that collapses
332
+ * back to a stack when the container is narrow (container query).
333
+ */
334
+ type TypeNarrativeOrderedListOrientation = "vertical" | "horizontal";
335
+ interface TypeNarrativeOrderedListItem {
336
+ /** Bold action title for the item. A plain string or any React node. */
337
+ title: React.ReactNode;
338
+ /**
339
+ * Descriptive text below the title. A plain string or any React node. The
340
+ * paragraph is omitted when this is empty.
341
+ */
342
+ description?: React.ReactNode;
343
+ /**
344
+ * Optional call-to-action rendered below the description, only when provided.
345
+ * Typically a Seeds `<Button>` in an AI appearance (e.g.
346
+ * `appearance="ai-secondary"`). Pass it without system props so it renders the
347
+ * Tailwind path — same as NarrativeSummary's `action` slot.
348
+ */
349
+ action?: React.ReactNode;
350
+ }
351
+ interface TypeNarrativeOrderedListProps extends React.HTMLAttributes<HTMLDivElement> {
352
+ /** The ordered items. Numbered automatically (01, 02, …) in order. */
353
+ items: TypeNarrativeOrderedListItem[];
354
+ /**
355
+ * Item arrangement. `"horizontal"` lays items in a row of equal columns that
356
+ * collapses to a stack when the container is narrow; `"vertical"` is always
357
+ * stacked.
358
+ * @default "vertical"
359
+ */
360
+ orientation?: TypeNarrativeOrderedListOrientation;
361
+ }
362
+
363
+ /**
364
+ * NarrativeOrderedList — a numbered list of action items. Each item pairs a
365
+ * large ordinal (01, 02, …) with a title, an optional description, and an
366
+ * optional call-to-action slot.
367
+ *
368
+ * Renders inner content only — it carries no surface, shadow, or accent of its
369
+ * own. Drop it into a `NarrativeContainer` (see the stories / playground).
370
+ *
371
+ * Layout is driven by container queries, so it responds to the width the
372
+ * component is actually given, not the viewport:
373
+ * - `"vertical"` (default) → items stacked full-width, one per row.
374
+ * - `"horizontal"` → items laid out as a row of equal columns once there is
375
+ * room, collapsing back to a stack when the container is narrow.
376
+ *
377
+ * Styled via `narrative-ordered-list.css` (Seeds CSS custom properties);
378
+ * consumers import the classes through `@sproutsocial/racine/css/components`.
379
+ * Overrides come via standard `className` / `style`.
380
+ */
381
+ declare const NarrativeOrderedList: React.ForwardRefExoticComponent<TypeNarrativeOrderedListProps & React.RefAttributes<HTMLDivElement>>;
382
+
383
+ interface TypeNarrativeDataCalloutProps extends React.HTMLAttributes<HTMLDivElement> {
384
+ /**
385
+ * Data-viz component rendered in the left slot (occupies ~1/3 of the width).
386
+ * The kit ships no chart of its own — drop in any data-viz node, e.g. a v2
387
+ * `DonutChart` from `@sproutsocial/seeds-react-data-viz`.
388
+ */
389
+ visual: React.ReactNode;
390
+ /** Body copy / description occupying the right two-thirds. */
391
+ children: React.ReactNode;
392
+ /**
393
+ * Accessible label for the visual slot region. Omit when the injected visual
394
+ * already carries its own description/label.
395
+ */
396
+ visualLabel?: string;
397
+ }
398
+
399
+ /**
400
+ * NarrativeDataCallout — a horizontally oriented callout that pairs an injected
401
+ * data-viz visual (left, ~1/3 width) with a block of body copy (right, ~2/3).
402
+ *
403
+ * The kit ships no chart of its own; the `visual` slot accepts any node — the
404
+ * stories drop in a v2 `DonutChart` from `@sproutsocial/seeds-react-data-viz`.
405
+ * narrative-kit takes no runtime dependency on data-viz (mirrors MetricHighlight's
406
+ * `sparkline` slot).
407
+ *
408
+ * Renders inner content only — it carries no surface, shadow, or accent of its
409
+ * own. Drop it into a `NarrativeContainer` (see the stories) to reproduce the
410
+ * card look.
411
+ *
412
+ * Layout is a flex row driven by a container query, so it collapses to a stacked
413
+ * column (visual on top, text below) based on the width the component is actually
414
+ * given, not the viewport.
415
+ *
416
+ * Styled via `narrative-data-callout.css` (Seeds CSS custom properties); consumers
417
+ * import the classes through `@sproutsocial/racine/css/components`. Overrides come
418
+ * via standard `className` / `style`.
419
+ */
420
+ declare const NarrativeDataCallout: React.ForwardRefExoticComponent<TypeNarrativeDataCalloutProps & React.RefAttributes<HTMLDivElement>>;
421
+
422
+ interface TypeAIContainerProps extends React.HTMLAttributes<HTMLDivElement> {
423
+ /** Content rendered inside the container. */
424
+ children?: React.ReactNode;
425
+ /**
426
+ * Visual treatment of the AI gradient surface.
427
+ * - `subtle` — a light 20% gradient tint over the base surface with dark text.
428
+ * - `vivid` — the full-saturation AI gradient with white text (always white).
429
+ * @default "subtle"
430
+ */
431
+ appearance?: "subtle" | "vivid";
432
+ }
433
+
434
+ /**
435
+ * AIContainer — a rounded surface primitive with the AI gradient background.
436
+ * Provides the outer shell (border-radius, shadow, overflow, gradient) without
437
+ * any padding. Used by PullQuote and available as a standalone container.
438
+ *
439
+ * - `subtle` — a light 20% gradient tint over the base surface with adaptive text color.
440
+ * - `vivid` — the full-saturation AI gradient with white text (always white).
441
+ *
442
+ * Styled via `ai-container.css` (Seeds CSS custom properties).
443
+ */
444
+ declare const AIContainer: React.ForwardRefExoticComponent<TypeAIContainerProps & React.RefAttributes<HTMLDivElement>>;
445
+
327
446
  /**
328
447
  * Shared types for narrative primitives.
329
448
  *
@@ -336,4 +455,4 @@ declare const NarrativeSummary: React.ForwardRefExoticComponent<TypeNarrativeSum
336
455
  */
337
456
  type TypeNarrativeTone = "neutral" | "positive" | "negative" | "opportunity";
338
457
 
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 };
458
+ export { AIContainer, EyebrowToken, MetricHighlight, NarrativeContainer, NarrativeDataCallout, NarrativeDivider, NarrativeHeadline, NarrativeHeadlineHighlight, NarrativeHeadlineRoll, NarrativeOrderedList, NarrativeSummary, PullQuote, type TypeAIContainerProps, type TypeEyebrowTokenProps, type TypeMetricHighlightProps, type TypeMetricHighlightTrend, type TypeNarrativeContainerProps, type TypeNarrativeDataCalloutProps, type TypeNarrativeDividerProps, type TypeNarrativeHeadlineHighlightProps, type TypeNarrativeHeadlineLevel, type TypeNarrativeHeadlineProps, type TypeNarrativeHeadlineRollProps, type TypeNarrativeOrderedListItem, type TypeNarrativeOrderedListOrientation, type TypeNarrativeOrderedListProps, type TypeNarrativeSummaryLayout, type TypeNarrativeSummaryProps, type TypeNarrativeTone, type TypePullQuoteProps };
package/dist/index.js CHANGED
@@ -30,13 +30,16 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ AIContainer: () => AIContainer_default,
33
34
  EyebrowToken: () => EyebrowToken_default,
34
35
  MetricHighlight: () => MetricHighlight_default,
35
36
  NarrativeContainer: () => NarrativeContainer_default,
37
+ NarrativeDataCallout: () => NarrativeDataCallout_default,
36
38
  NarrativeDivider: () => NarrativeDivider_default,
37
39
  NarrativeHeadline: () => NarrativeHeadline_default,
38
40
  NarrativeHeadlineHighlight: () => NarrativeHeadlineHighlight_default,
39
41
  NarrativeHeadlineRoll: () => NarrativeHeadlineRoll_default,
42
+ NarrativeOrderedList: () => NarrativeOrderedList_default,
40
43
  NarrativeSummary: () => NarrativeSummary_default,
41
44
  PullQuote: () => PullQuote_default
42
45
  });
@@ -207,6 +210,8 @@ var PullQuote = React5.forwardRef(
207
210
  ref,
208
211
  className: cn(
209
212
  "seeds-pull-quote",
213
+ "seeds-ai-container",
214
+ { "seeds-ai-container-vivid": appearance === "vivid" },
210
215
  { "seeds-pull-quote-vivid": appearance === "vivid" },
211
216
  className
212
217
  ),
@@ -392,15 +397,111 @@ var NarrativeSummary = React9.forwardRef(
392
397
  );
393
398
  NarrativeSummary.displayName = "NarrativeSummary";
394
399
  var NarrativeSummary_default = NarrativeSummary;
400
+
401
+ // src/NarrativeOrderedList/NarrativeOrderedList.tsx
402
+ var React10 = __toESM(require("react"));
403
+ var import_jsx_runtime10 = require("react/jsx-runtime");
404
+ var NarrativeOrderedList = React10.forwardRef(({ items, orientation = "vertical", className, ...props }, ref) => {
405
+ return (
406
+ // The outer element establishes the query container. The ol inside switches
407
+ // direction based on this element's width — a container query can only style
408
+ // descendants of the container, never the container element itself.
409
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
410
+ "div",
411
+ {
412
+ ref,
413
+ className: cn("seeds-narrative-ordered-list", className),
414
+ ...props,
415
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
416
+ "ol",
417
+ {
418
+ className: cn("seeds-narrative-ordered-list-track", {
419
+ "seeds-narrative-ordered-list-horizontal": orientation === "horizontal"
420
+ }),
421
+ children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { className: "seeds-narrative-ordered-list-item", children: [
422
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
423
+ "span",
424
+ {
425
+ className: "seeds-narrative-ordered-list-number",
426
+ "aria-hidden": "true",
427
+ children: String(i + 1).padStart(2, "0")
428
+ }
429
+ ),
430
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "seeds-narrative-ordered-list-body", children: [
431
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "seeds-narrative-ordered-list-title", children: item.title }),
432
+ item.description != null && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "seeds-narrative-ordered-list-description", children: item.description }),
433
+ item.action != null && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "seeds-narrative-ordered-list-action", children: item.action })
434
+ ] })
435
+ ] }, i))
436
+ }
437
+ )
438
+ }
439
+ )
440
+ );
441
+ });
442
+ NarrativeOrderedList.displayName = "NarrativeOrderedList";
443
+ var NarrativeOrderedList_default = NarrativeOrderedList;
444
+
445
+ // src/NarrativeDataCallout/NarrativeDataCallout.tsx
446
+ var React11 = __toESM(require("react"));
447
+ var import_jsx_runtime11 = require("react/jsx-runtime");
448
+ var NarrativeDataCallout = React11.forwardRef(({ visual, children, visualLabel, className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
449
+ "div",
450
+ {
451
+ ref,
452
+ className: cn("seeds-narrative-data-callout", className),
453
+ ...props,
454
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "seeds-narrative-data-callout-row", children: [
455
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
456
+ "div",
457
+ {
458
+ className: "seeds-narrative-data-callout-visual",
459
+ role: visualLabel != null ? "img" : void 0,
460
+ "aria-label": visualLabel,
461
+ children: visual
462
+ }
463
+ ),
464
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "seeds-narrative-data-callout-body", children })
465
+ ] })
466
+ }
467
+ ));
468
+ NarrativeDataCallout.displayName = "NarrativeDataCallout";
469
+ var NarrativeDataCallout_default = NarrativeDataCallout;
470
+
471
+ // src/AIContainer/AIContainer.tsx
472
+ var React12 = __toESM(require("react"));
473
+ var import_jsx_runtime12 = require("react/jsx-runtime");
474
+ var AIContainer = React12.forwardRef(
475
+ ({ children, appearance = "subtle", className, ...props }, ref) => {
476
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
477
+ "div",
478
+ {
479
+ ref,
480
+ className: cn(
481
+ "seeds-ai-container",
482
+ { "seeds-ai-container-vivid": appearance === "vivid" },
483
+ className
484
+ ),
485
+ ...props,
486
+ children
487
+ }
488
+ );
489
+ }
490
+ );
491
+ AIContainer.displayName = "AIContainer";
492
+ var AIContainer_default = AIContainer;
395
493
  // Annotate the CommonJS export names for ESM import in node:
396
494
  0 && (module.exports = {
495
+ AIContainer,
397
496
  EyebrowToken,
398
497
  MetricHighlight,
399
498
  NarrativeContainer,
499
+ NarrativeDataCallout,
400
500
  NarrativeDivider,
401
501
  NarrativeHeadline,
402
502
  NarrativeHeadlineHighlight,
403
503
  NarrativeHeadlineRoll,
504
+ NarrativeOrderedList,
404
505
  NarrativeSummary,
405
506
  PullQuote
406
507
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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":["/* Narrative Kit — composable narrative primitives.\n * Each primitive adds a single line below. No default export — this is a kit. */\nexport {\n NarrativeContainer,\n type TypeNarrativeContainerProps,\n} from \"./NarrativeContainer\";\n\nexport {\n NarrativeHeadline,\n NarrativeHeadlineHighlight,\n NarrativeHeadlineRoll,\n type TypeNarrativeHeadlineProps,\n type TypeNarrativeHeadlineLevel,\n type TypeNarrativeHeadlineHighlightProps,\n type TypeNarrativeHeadlineRollProps,\n} from \"./NarrativeHeadline\";\n\nexport { PullQuote, type TypePullQuoteProps } from \"./PullQuote\";\n\nexport { EyebrowToken, type TypeEyebrowTokenProps } from \"./EyebrowToken\";\n\nexport {\n NarrativeDivider,\n type TypeNarrativeDividerProps,\n} from \"./NarrativeDivider\";\n\nexport {\n MetricHighlight,\n type TypeMetricHighlightProps,\n type TypeMetricHighlightTrend,\n} from \"./MetricHighlight\";\n\nexport {\n NarrativeSummary,\n type TypeNarrativeSummaryProps,\n type TypeNarrativeSummaryLayout,\n} from \"./NarrativeSummary\";\n\nexport type { TypeNarrativeTone } from \"./_internal/types\";\n","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","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../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","../src/NarrativeOrderedList/NarrativeOrderedList.tsx","../src/NarrativeDataCallout/NarrativeDataCallout.tsx","../src/AIContainer/AIContainer.tsx"],"sourcesContent":["/* Narrative Kit — composable narrative primitives.\n * Each primitive adds a single line below. No default export — this is a kit. */\nexport {\n NarrativeContainer,\n type TypeNarrativeContainerProps,\n} from \"./NarrativeContainer\";\n\nexport {\n NarrativeHeadline,\n NarrativeHeadlineHighlight,\n NarrativeHeadlineRoll,\n type TypeNarrativeHeadlineProps,\n type TypeNarrativeHeadlineLevel,\n type TypeNarrativeHeadlineHighlightProps,\n type TypeNarrativeHeadlineRollProps,\n} from \"./NarrativeHeadline\";\n\nexport { PullQuote, type TypePullQuoteProps } from \"./PullQuote\";\n\nexport { EyebrowToken, type TypeEyebrowTokenProps } from \"./EyebrowToken\";\n\nexport {\n NarrativeDivider,\n type TypeNarrativeDividerProps,\n} from \"./NarrativeDivider\";\n\nexport {\n MetricHighlight,\n type TypeMetricHighlightProps,\n type TypeMetricHighlightTrend,\n} from \"./MetricHighlight\";\n\nexport {\n NarrativeSummary,\n type TypeNarrativeSummaryProps,\n type TypeNarrativeSummaryLayout,\n} from \"./NarrativeSummary\";\n\nexport {\n NarrativeOrderedList,\n type TypeNarrativeOrderedListProps,\n type TypeNarrativeOrderedListItem,\n type TypeNarrativeOrderedListOrientation,\n} from \"./NarrativeOrderedList\";\n\nexport {\n NarrativeDataCallout,\n type TypeNarrativeDataCalloutProps,\n} from \"./NarrativeDataCallout\";\n\nexport { AIContainer, type TypeAIContainerProps } from \"./AIContainer\";\n\nexport type { TypeNarrativeTone } from \"./_internal/types\";\n","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` and `ai-container.css` (Seeds CSS custom\n * properties); consumers import the classes through\n * `@sproutsocial/racine/css/components`. Surface overrides are done with\n * 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-ai-container\",\n { \"seeds-ai-container-vivid\": appearance === \"vivid\" },\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","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeOrderedListProps } from \"./NarrativeOrderedListTypes\";\n\n/**\n * NarrativeOrderedList — a numbered list of action items. Each item pairs a\n * large ordinal (01, 02, …) with a title, an optional description, and an\n * optional call-to-action slot.\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 driven by container queries, so it responds to the width the\n * component is actually given, not the viewport:\n * - `\"vertical\"` (default) → items stacked full-width, one per row.\n * - `\"horizontal\"` → items laid out as a row of equal columns once there is\n * room, collapsing back to a stack when the container is narrow.\n *\n * Styled via `narrative-ordered-list.css` (Seeds CSS custom properties);\n * consumers import the classes through `@sproutsocial/racine/css/components`.\n * Overrides come via standard `className` / `style`.\n */\nconst NarrativeOrderedList = React.forwardRef<\n HTMLDivElement,\n TypeNarrativeOrderedListProps\n>(({ items, orientation = \"vertical\", className, ...props }, ref) => {\n return (\n // The outer element establishes the query container. The ol inside switches\n // direction based on this element's width — a container query can only style\n // descendants of the container, never the container element itself.\n <div\n ref={ref}\n className={cn(\"seeds-narrative-ordered-list\", className)}\n {...props}\n >\n <ol\n className={cn(\"seeds-narrative-ordered-list-track\", {\n \"seeds-narrative-ordered-list-horizontal\":\n orientation === \"horizontal\",\n })}\n >\n {items.map((item, i) => (\n <li key={i} className=\"seeds-narrative-ordered-list-item\">\n {/* Decorative — the ol/li already convey order to assistive tech, so\n hide the visible ordinal from it to avoid double-announcing. */}\n <span\n className=\"seeds-narrative-ordered-list-number\"\n aria-hidden=\"true\"\n >\n {String(i + 1).padStart(2, \"0\")}\n </span>\n <div className=\"seeds-narrative-ordered-list-body\">\n <p className=\"seeds-narrative-ordered-list-title\">{item.title}</p>\n {item.description != null && (\n <p className=\"seeds-narrative-ordered-list-description\">\n {item.description}\n </p>\n )}\n {item.action != null && (\n <div className=\"seeds-narrative-ordered-list-action\">\n {item.action}\n </div>\n )}\n </div>\n </li>\n ))}\n </ol>\n </div>\n );\n});\n\nNarrativeOrderedList.displayName = \"NarrativeOrderedList\";\n\nexport default NarrativeOrderedList;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeNarrativeDataCalloutProps } from \"./NarrativeDataCalloutTypes\";\n\n/**\n * NarrativeDataCallout — a horizontally oriented callout that pairs an injected\n * data-viz visual (left, ~1/3 width) with a block of body copy (right, ~2/3).\n *\n * The kit ships no chart of its own; the `visual` slot accepts any node — the\n * stories drop in a v2 `DonutChart` from `@sproutsocial/seeds-react-data-viz`.\n * narrative-kit takes no runtime dependency on data-viz (mirrors MetricHighlight's\n * `sparkline` slot).\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) to reproduce the\n * card look.\n *\n * Layout is a flex row driven by a container query, so it collapses to a stacked\n * column (visual on top, text below) based on the width the component is actually\n * given, not the viewport.\n *\n * Styled via `narrative-data-callout.css` (Seeds CSS custom properties); consumers\n * import the classes through `@sproutsocial/racine/css/components`. Overrides come\n * via standard `className` / `style`.\n */\nconst NarrativeDataCallout = React.forwardRef<\n HTMLDivElement,\n TypeNarrativeDataCalloutProps\n>(({ visual, children, visualLabel, className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"seeds-narrative-data-callout\", className)}\n {...props}\n >\n <div className=\"seeds-narrative-data-callout-row\">\n <div\n className=\"seeds-narrative-data-callout-visual\"\n role={visualLabel != null ? \"img\" : undefined}\n aria-label={visualLabel}\n >\n {visual}\n </div>\n <div className=\"seeds-narrative-data-callout-body\">{children}</div>\n </div>\n </div>\n));\n\nNarrativeDataCallout.displayName = \"NarrativeDataCallout\";\n\nexport default NarrativeDataCallout;\n","import * as React from \"react\";\nimport { cn } from \"../_internal/cn\";\nimport type { TypeAIContainerProps } from \"./AIContainerTypes\";\n\n/**\n * AIContainer — a rounded surface primitive with the AI gradient background.\n * Provides the outer shell (border-radius, shadow, overflow, gradient) without\n * any padding. Used by PullQuote and available as a standalone container.\n *\n * - `subtle` — a light 20% gradient tint over the base surface with adaptive text color.\n * - `vivid` — the full-saturation AI gradient with white text (always white).\n *\n * Styled via `ai-container.css` (Seeds CSS custom properties).\n */\nconst AIContainer = React.forwardRef<HTMLDivElement, TypeAIContainerProps>(\n ({ children, appearance = \"subtle\", className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"seeds-ai-container\",\n { \"seeds-ai-container-vivid\": appearance === \"vivid\" },\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nAIContainer.displayName = \"AIContainer\";\n\nexport default AIContainer;\n"],"mappings":"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","names":["React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime"]}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Seeds NarrativeDataCallout 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
+ * The layout is a flex row driven by a container query on the root, so the
9
+ * visual/text columns stack based on the width the component is given, not the
10
+ * viewport.
11
+ *
12
+ * Usage:
13
+ * <div class="seeds-narrative-data-callout">
14
+ * <div class="seeds-narrative-data-callout-row">
15
+ * <div class="seeds-narrative-data-callout-visual">…chart…</div>
16
+ * <div class="seeds-narrative-data-callout-body">…copy…</div>
17
+ * </div>
18
+ * </div>
19
+ */
20
+
21
+ @layer components {
22
+
23
+ /* Establishes the query container. The row inside reacts to this element's
24
+ inline size. A container query only styles DESCENDANTS of the query container,
25
+ so the flex row lives on the inner element, not this one. */
26
+ .seeds-narrative-data-callout {
27
+ container-type: inline-size;
28
+ box-sizing: border-box;
29
+ font-family: var(--font-family);
30
+ }
31
+
32
+ /* Stacked single column by default (narrow). The container query below turns it
33
+ into the horizontal 1/3 + 2/3 row once there is room. */
34
+ .seeds-narrative-data-callout-row {
35
+ box-sizing: border-box;
36
+ display: flex;
37
+ flex-direction: column;
38
+ align-items: center;
39
+ gap: var(--space-450); /* 24px */
40
+ }
41
+
42
+ /* Visual slot — layout only, no stroke/background so the injected chart controls
43
+ its own look and its own size. No fixed height: charts like the data-viz
44
+ DonutChart carry their own intrinsic height (and a legend), so the slot sizes
45
+ to the chart rather than clipping it. Stacked full-width until the container
46
+ query expands the row. */
47
+ .seeds-narrative-data-callout-visual {
48
+ box-sizing: border-box;
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ width: 100%;
53
+ min-width: 0;
54
+ }
55
+
56
+ /* Stretch the injected visual to the slot's full width. A fluid-width chart like
57
+ the v2 DonutChart otherwise shrinks to content inside this centered flex slot,
58
+ so Highcharts fills that shrunk width and the ring gets width-capped below its
59
+ fixed 270px height — leaving an empty vertical band. Filling the width lets the
60
+ ring become height-capped and fill its box top-to-bottom, like the standalone
61
+ chart story. */
62
+ .seeds-narrative-data-callout-visual > * {
63
+ width: 100%;
64
+ }
65
+
66
+ /* Body copy — fills the remaining space. */
67
+ .seeds-narrative-data-callout-body {
68
+ box-sizing: border-box;
69
+ min-width: 0;
70
+ font-size: var(--font-size-300); /* 16px */
71
+ line-height: var(--line-height-400); /* ~28px */
72
+ font-weight: var(--font-weight-normal);
73
+ color: var(--color-text-body);
74
+ overflow-wrap: break-word;
75
+ }
76
+
77
+ /* Expand to the horizontal 1/3 + 2/3 split once the component is wide enough.
78
+ The threshold is on the component's own width (container query), so a narrow
79
+ callout on a wide screen still stacks. 480px keeps the donut + copy readable
80
+ side by side. */
81
+ @container (min-width: 480px) {
82
+ .seeds-narrative-data-callout-row {
83
+ flex-direction: row;
84
+ }
85
+
86
+ .seeds-narrative-data-callout-visual {
87
+ /* Nominally one-third, but never narrower than the injected chart's fixed
88
+ height (the v2 DonutChart is 270px tall). Below that width a fluid-width,
89
+ fixed-height chart like the donut gets width-capped and leaves an empty
90
+ vertical band above/below the ring; the min-width keeps the visual square
91
+ enough that the ring fills its box top-to-bottom, matching the standalone
92
+ chart story. */
93
+ flex: 0 0 33.333%;
94
+ min-width: 270px;
95
+ width: auto;
96
+ }
97
+
98
+ .seeds-narrative-data-callout-body {
99
+ flex: 1 1 0;
100
+ }
101
+ }
102
+
103
+ }
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Seeds NarrativeOrderedList 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-narrative-ordered-list">
10
+ * <ol class="seeds-narrative-ordered-list-track">
11
+ * <li class="seeds-narrative-ordered-list-item">…</li>
12
+ * </ol>
13
+ * </div>
14
+ */
15
+
16
+ @layer components {
17
+
18
+ /* Establishes the query container. The track inside reacts to this element's
19
+ inline size — a container query can only style descendants of the container,
20
+ never the container element itself. */
21
+ .seeds-narrative-ordered-list {
22
+ container-type: inline-size;
23
+ box-sizing: border-box;
24
+ font-family: var(--font-family);
25
+ }
26
+
27
+ /* The list itself, and the default (stacked) layout. The horizontal modifier
28
+ only expands to a row once the container query below has room, so horizontal
29
+ collapses back to this stack when narrow. */
30
+ .seeds-narrative-ordered-list-track {
31
+ display: flex;
32
+ flex-direction: column;
33
+ gap: var(--space-400); /* 16px */
34
+ margin: 0;
35
+ padding: 0;
36
+ list-style: none;
37
+ }
38
+
39
+ /* An item row: the ordinal beside the body, on its own rounded surface. */
40
+ .seeds-narrative-ordered-list-item {
41
+ display: flex;
42
+ gap: var(--space-450); /* 24px */
43
+ align-items: flex-start;
44
+ box-sizing: border-box;
45
+ min-width: 0;
46
+ padding: var(--space-400) var(--space-450); /* 16px 24px */
47
+ border-radius: var(--radius-800); /* 12px */
48
+ background-color: var(--color-app-bg-base);
49
+ }
50
+
51
+ /* The ordinal (01, 02, …). No mono token exists yet, so fall back to a system
52
+ monospace stack — mirrors the value treatment in metric-highlight.css. */
53
+ .seeds-narrative-ordered-list-number {
54
+ margin: 0;
55
+ flex-shrink: 0;
56
+ font-family: var(--font-family-mono, ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace);
57
+ font-size: var(--font-size-700); /* 32px */
58
+ line-height: var(--line-height-700); /* 40px */
59
+ font-weight: var(--font-weight-bold);
60
+ color: var(--color-text-headline);
61
+ }
62
+
63
+ /* Title + description + optional action, stacked. */
64
+ .seeds-narrative-ordered-list-body {
65
+ flex: 1 1 auto;
66
+ display: flex;
67
+ flex-direction: column;
68
+ gap: var(--space-200); /* 4px */
69
+ min-width: 0;
70
+ }
71
+
72
+ /* Title. 16px / 28px — the 28px line-height has no exact type token (the scale
73
+ skips from 24px to 32px), so the design value is kept verbatim. Same
74
+ rationale as narrative-summary.css. */
75
+ .seeds-narrative-ordered-list-title {
76
+ margin: 0;
77
+ font-size: var(--font-size-300); /* 16px */
78
+ line-height: 28px; /* off-scale, see comment above */
79
+ font-weight: var(--font-weight-bold);
80
+ color: var(--color-text-body);
81
+ }
82
+
83
+ /* Description. 14px / 24px has no exact type token, so it is kept verbatim —
84
+ same rationale as the title above. */
85
+ .seeds-narrative-ordered-list-description {
86
+ margin: 0;
87
+ font-size: 14px; /* off-scale, see title above */
88
+ line-height: 24px;
89
+ font-weight: var(--font-weight-normal);
90
+ color: var(--color-text-body);
91
+ }
92
+
93
+ .seeds-narrative-ordered-list-action {
94
+ padding-top: var(--space-350); /* 12px */
95
+ }
96
+
97
+ /* Expand the horizontal variant to a row of equal columns once the component is
98
+ wide enough. The threshold is on the component's own width (container query),
99
+ so a narrow card on a wide screen still stacks. 640px = Tailwind/Seeds sm
100
+ breakpoint, matching narrative-summary.css. */
101
+ @container (min-width: 640px) {
102
+ .seeds-narrative-ordered-list-horizontal {
103
+ flex-direction: row;
104
+ }
105
+
106
+ .seeds-narrative-ordered-list-horizontal > .seeds-narrative-ordered-list-item {
107
+ flex: 1 1 0;
108
+ min-width: 0;
109
+ }
110
+ }
111
+
112
+ }