@sproutsocial/racine 31.4.0 → 31.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,124 @@
1
1
  # Change Log
2
2
 
3
+ ## 31.6.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
+ - 2573639: Add a `headerless` prop to `PeekIn.Panel`. When set, the panel renders flush
24
+ without the built-in header or close button, letting the content own its own
25
+ chrome, padding, and scrolling — useful for embedded UIs such as an agent
26
+ surface. Applies to both the desktop side panel and the mobile bottom sheet.
27
+
28
+ ### Patch Changes
29
+
30
+ - Updated dependencies [be93d78]
31
+ - Updated dependencies [e5a385e]
32
+ - Updated dependencies [979bf12]
33
+ - Updated dependencies [2573639]
34
+ - Updated dependencies [a13a571]
35
+ - @sproutsocial/seeds-react-narrative-kit@0.4.0
36
+ - @sproutsocial/seeds-react-peek-in@0.3.0
37
+ - @sproutsocial/seeds-react-theme@4.1.1
38
+ - @sproutsocial/seeds-react-accordion@0.4.48
39
+ - @sproutsocial/seeds-react-avatar@1.1.17
40
+ - @sproutsocial/seeds-react-banner@1.1.23
41
+ - @sproutsocial/seeds-react-box@1.1.22
42
+ - @sproutsocial/seeds-react-breadcrumb@1.1.7
43
+ - @sproutsocial/seeds-react-card@1.1.43
44
+ - @sproutsocial/seeds-react-chart-legend@1.0.41
45
+ - @sproutsocial/seeds-react-container@0.3.16
46
+ - @sproutsocial/seeds-react-content-block@0.5.15
47
+ - @sproutsocial/seeds-react-data-table@2.6.23
48
+ - @sproutsocial/seeds-react-datepicker@1.0.40
49
+ - @sproutsocial/seeds-react-drawer@2.2.8
50
+ - @sproutsocial/seeds-react-duration@1.0.24
51
+ - @sproutsocial/seeds-react-empty-state@1.0.23
52
+ - @sproutsocial/seeds-react-fieldset@1.0.23
53
+ - @sproutsocial/seeds-react-form-field@1.1.17
54
+ - @sproutsocial/seeds-react-grid@0.2.6
55
+ - @sproutsocial/seeds-react-hooks@3.2.3
56
+ - @sproutsocial/seeds-react-icon@2.4.1
57
+ - @sproutsocial/seeds-react-image@1.0.22
58
+ - @sproutsocial/seeds-react-indicator@1.0.41
59
+ - @sproutsocial/seeds-react-keyboard-key@1.0.23
60
+ - @sproutsocial/seeds-react-label@1.0.23
61
+ - @sproutsocial/seeds-react-link@1.1.13
62
+ - @sproutsocial/seeds-react-list@0.3.26
63
+ - @sproutsocial/seeds-react-loader@1.0.23
64
+ - @sproutsocial/seeds-react-loader-button@1.0.46
65
+ - @sproutsocial/seeds-react-message@1.0.49
66
+ - @sproutsocial/seeds-react-mixins@4.3.8
67
+ - @sproutsocial/seeds-react-modal@2.5.23
68
+ - @sproutsocial/seeds-react-numeral@1.0.48
69
+ - @sproutsocial/seeds-react-pagination@0.1.21
70
+ - @sproutsocial/seeds-react-panel@1.0.1
71
+ - @sproutsocial/seeds-react-partner-logo@1.7.14
72
+ - @sproutsocial/seeds-react-progress@0.2.8
73
+ - @sproutsocial/seeds-react-rating@1.0.41
74
+ - @sproutsocial/seeds-react-segmented-control@1.1.22
75
+ - @sproutsocial/seeds-react-select@1.1.41
76
+ - @sproutsocial/seeds-react-skeleton@1.1.21
77
+ - @sproutsocial/seeds-react-stack@1.0.21
78
+ - @sproutsocial/seeds-react-table@1.0.42
79
+ - @sproutsocial/seeds-react-tabs@1.4.12
80
+ - @sproutsocial/seeds-react-textarea@1.0.22
81
+ - @sproutsocial/seeds-react-theme-provider@1.1.21
82
+ - @sproutsocial/seeds-react-toast@1.0.42
83
+ - @sproutsocial/seeds-react-token@1.5.7
84
+ - @sproutsocial/seeds-react-token-input@1.4.49
85
+ - @sproutsocial/seeds-react-tooltip@1.1.28
86
+ - @sproutsocial/seeds-react-visually-hidden@1.0.23
87
+ - @sproutsocial/seeds-react-badge@2.0.35
88
+ - @sproutsocial/seeds-react-checkbox@1.3.42
89
+ - @sproutsocial/seeds-react-content-header@0.2.20
90
+ - @sproutsocial/seeds-react-input@1.5.27
91
+ - @sproutsocial/seeds-react-popout@2.5.10
92
+ - @sproutsocial/seeds-react-button@2.2.2
93
+ - @sproutsocial/seeds-react-switch@1.2.40
94
+ - @sproutsocial/seeds-react-radio@1.3.23
95
+
96
+ ## 31.5.0
97
+
98
+ ### Minor Changes
99
+
100
+ - 1aca1d1: `MetricHighlight` now takes a `sparkline` render slot instead of owning the
101
+ chart itself. Pass any node (e.g. a `<SparklineChart />` from
102
+ `@sproutsocial/seeds-react-data-viz/sparkline`) to render it beside/below the
103
+ metric; omit it to render the metric on its own. This replaces the previous
104
+ `data` and `chart` props.
105
+ - 0b37765: Add the `NarrativeDivider` primitive to `seeds-react-narrative-kit` — a full-width,
106
+ 1px horizontal rule for separating sections within a narrative brief, using the
107
+ `container.border` token (dark-mode aware). Exported through `@sproutsocial/racine`.
108
+ - 0b37765: Add the `NarrativeSummary` primitive to `seeds-react-narrative-kit` — a composed
109
+ block pairing a lead column (eyebrow + headline + optional action) with a Summary
110
+ section and a Key themes list, laid out as a container-query-driven grid with
111
+ `three-column` and `two-column` (1/3 | 2/3) arrangements. Also adds a `size` prop
112
+ (`"default" | "small"`) to `NarrativeHeadline`. Exported through
113
+ `@sproutsocial/racine`.
114
+
115
+ ### Patch Changes
116
+
117
+ - Updated dependencies [1aca1d1]
118
+ - Updated dependencies [0b37765]
119
+ - Updated dependencies [0b37765]
120
+ - @sproutsocial/seeds-react-narrative-kit@0.3.0
121
+
3
122
  ## 31.4.0
4
123
 
5
124
  ### Minor Changes
@@ -1078,6 +1078,47 @@
1078
1078
  }
1079
1079
  }
1080
1080
 
1081
+ /* --- seeds-react-narrative-kit --- */
1082
+ /**
1083
+ * Seeds AIContainer component classes.
1084
+ * Use these instead of writing out individual Tailwind utility classes.
1085
+ *
1086
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1087
+ * CSS variable definitions and dark mode support.
1088
+ *
1089
+ * Usage:
1090
+ * <div class="seeds-ai-container">…</div> // subtle (default)
1091
+ * <div class="seeds-ai-container seeds-ai-container-vivid">…</div>
1092
+ */
1093
+
1094
+ @layer components {
1095
+
1096
+ .seeds-ai-container {
1097
+ position: relative;
1098
+ overflow: hidden;
1099
+ box-sizing: border-box;
1100
+ border-radius: var(--radius-800);
1101
+ box-shadow: var(--shadow-low);
1102
+ font-family: var(--font-family);
1103
+ /* Subtle (default): the 20% AI gradient tint composited over the base
1104
+ surface. --color-gradient-ai-subtle is already translucent, so layering it
1105
+ over the opaque base color produces the soft wash. */
1106
+ background-color: var(--color-container-bg-base);
1107
+ background-image: var(--color-gradient-ai-subtle);
1108
+ color: var(--color-text-headline);
1109
+ }
1110
+
1111
+ /* Vivid: the full-saturation AI gradient with white content. White has no
1112
+ semantic Seeds token; it is part of the AI gradient treatment (mirrors the
1113
+ raw brand hex used in --color-gradient-ai). */
1114
+ .seeds-ai-container-vivid {
1115
+ background-color: transparent;
1116
+ background-image: var(--color-gradient-ai);
1117
+ color: #fff;
1118
+ }
1119
+
1120
+ }
1121
+
1081
1122
  /* --- seeds-react-narrative-kit --- */
1082
1123
  /**
1083
1124
  * Seeds EyebrowToken component classes.
@@ -1251,47 +1292,37 @@
1251
1292
  stroke-width: 1.5;
1252
1293
  }
1253
1294
 
1254
- /* Sparkline a single normalized polyline stretched to fit. The non-scaling
1255
- stroke keeps a crisp 2px line at any aspect ratio. */
1256
- .seeds-metric-highlight-spark {
1257
- display: block;
1295
+ /* Slot for an injected chart (e.g. a data-viz SparklineChart). Layout only — no
1296
+ stroke/background styling, so the injected chart controls its own look. Heights
1297
+ are explicit (never percentage/stretch) so a Highcharts chart always measures a
1298
+ concrete container instead of falling back to its 400px default. */
1299
+ .seeds-metric-highlight-chart {
1300
+ box-sizing: border-box;
1258
1301
  flex: 0 0 auto;
1259
- /* Matches the design's Data Viz / Categorical 01 line color (#0b968f). */
1260
- stroke: var(--color-teal-700);
1261
- }
1262
-
1263
- /* Downward trend: the red analog at the same scale step (#db3e3e). */
1264
- .seeds-metric-highlight-spark-negative {
1265
- stroke: var(--color-red-700);
1266
- }
1267
-
1268
- .seeds-metric-highlight-spark path {
1269
- stroke: inherit;
1270
- stroke-width: 2;
1271
- vector-effect: non-scaling-stroke;
1302
+ align-self: center;
1303
+ /* Center the injected chart as a flex item — an inline/inline-block child
1304
+ (e.g. the data-viz SparklineChart) otherwise sits on the text baseline with
1305
+ descender space below it, reading as vertically off-center in the slot. */
1306
+ display: flex;
1307
+ align-items: center;
1272
1308
  }
1273
1309
 
1274
- /* Horizontal: a compact fixed-width chart beside the metric, matched to the
1275
- metric block's height. */
1276
- .seeds-metric-highlight:not(.seeds-metric-highlight-vertical) .seeds-metric-highlight-spark {
1310
+ .seeds-metric-highlight:not(.seeds-metric-highlight-vertical) .seeds-metric-highlight-chart {
1277
1311
  width: 104px;
1278
- align-self: stretch;
1279
- min-height: 40px;
1312
+ height: 48px;
1280
1313
  }
1281
1314
 
1282
- .seeds-metric-highlight-small:not(.seeds-metric-highlight-vertical) .seeds-metric-highlight-spark {
1315
+ .seeds-metric-highlight-small:not(.seeds-metric-highlight-vertical) .seeds-metric-highlight-chart {
1283
1316
  width: 88px;
1284
1317
  height: 40px;
1285
- align-self: center;
1286
1318
  }
1287
1319
 
1288
- /* Vertical: a full-width chart stacked beneath the metric. */
1289
- .seeds-metric-highlight-vertical .seeds-metric-highlight-spark {
1320
+ .seeds-metric-highlight-vertical .seeds-metric-highlight-chart {
1290
1321
  width: 100%;
1291
1322
  height: 96px;
1292
1323
  }
1293
1324
 
1294
- .seeds-metric-highlight-vertical.seeds-metric-highlight-small .seeds-metric-highlight-spark {
1325
+ .seeds-metric-highlight-vertical.seeds-metric-highlight-small .seeds-metric-highlight-chart {
1295
1326
  height: 56px;
1296
1327
  }
1297
1328
 
@@ -1355,6 +1386,140 @@
1355
1386
 
1356
1387
  }
1357
1388
 
1389
+ /* --- seeds-react-narrative-kit --- */
1390
+ /**
1391
+ * Seeds NarrativeDataCallout component classes.
1392
+ * Use these instead of writing out individual Tailwind utility classes.
1393
+ *
1394
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1395
+ * CSS variable definitions and dark mode support.
1396
+ *
1397
+ * The layout is a flex row driven by a container query on the root, so the
1398
+ * visual/text columns stack based on the width the component is given, not the
1399
+ * viewport.
1400
+ *
1401
+ * Usage:
1402
+ * <div class="seeds-narrative-data-callout">
1403
+ * <div class="seeds-narrative-data-callout-row">
1404
+ * <div class="seeds-narrative-data-callout-visual">…chart…</div>
1405
+ * <div class="seeds-narrative-data-callout-body">…copy…</div>
1406
+ * </div>
1407
+ * </div>
1408
+ */
1409
+
1410
+ @layer components {
1411
+
1412
+ /* Establishes the query container. The row inside reacts to this element's
1413
+ inline size. A container query only styles DESCENDANTS of the query container,
1414
+ so the flex row lives on the inner element, not this one. */
1415
+ .seeds-narrative-data-callout {
1416
+ container-type: inline-size;
1417
+ box-sizing: border-box;
1418
+ font-family: var(--font-family);
1419
+ }
1420
+
1421
+ /* Stacked single column by default (narrow). The container query below turns it
1422
+ into the horizontal 1/3 + 2/3 row once there is room. */
1423
+ .seeds-narrative-data-callout-row {
1424
+ box-sizing: border-box;
1425
+ display: flex;
1426
+ flex-direction: column;
1427
+ align-items: center;
1428
+ gap: var(--space-450); /* 24px */
1429
+ }
1430
+
1431
+ /* Visual slot — layout only, no stroke/background so the injected chart controls
1432
+ its own look and its own size. No fixed height: charts like the data-viz
1433
+ DonutChart carry their own intrinsic height (and a legend), so the slot sizes
1434
+ to the chart rather than clipping it. Stacked full-width until the container
1435
+ query expands the row. */
1436
+ .seeds-narrative-data-callout-visual {
1437
+ box-sizing: border-box;
1438
+ display: flex;
1439
+ align-items: center;
1440
+ justify-content: center;
1441
+ width: 100%;
1442
+ min-width: 0;
1443
+ }
1444
+
1445
+ /* Stretch the injected visual to the slot's full width. A fluid-width chart like
1446
+ the v2 DonutChart otherwise shrinks to content inside this centered flex slot,
1447
+ so Highcharts fills that shrunk width and the ring gets width-capped below its
1448
+ fixed 270px height — leaving an empty vertical band. Filling the width lets the
1449
+ ring become height-capped and fill its box top-to-bottom, like the standalone
1450
+ chart story. */
1451
+ .seeds-narrative-data-callout-visual > * {
1452
+ width: 100%;
1453
+ }
1454
+
1455
+ /* Body copy — fills the remaining space. */
1456
+ .seeds-narrative-data-callout-body {
1457
+ box-sizing: border-box;
1458
+ min-width: 0;
1459
+ font-size: var(--font-size-300); /* 16px */
1460
+ line-height: var(--line-height-400); /* ~28px */
1461
+ font-weight: var(--font-weight-normal);
1462
+ color: var(--color-text-body);
1463
+ overflow-wrap: break-word;
1464
+ }
1465
+
1466
+ /* Expand to the horizontal 1/3 + 2/3 split once the component is wide enough.
1467
+ The threshold is on the component's own width (container query), so a narrow
1468
+ callout on a wide screen still stacks. 480px keeps the donut + copy readable
1469
+ side by side. */
1470
+ @container (min-width: 480px) {
1471
+ .seeds-narrative-data-callout-row {
1472
+ flex-direction: row;
1473
+ }
1474
+
1475
+ .seeds-narrative-data-callout-visual {
1476
+ /* Nominally one-third, but never narrower than the injected chart's fixed
1477
+ height (the v2 DonutChart is 270px tall). Below that width a fluid-width,
1478
+ fixed-height chart like the donut gets width-capped and leaves an empty
1479
+ vertical band above/below the ring; the min-width keeps the visual square
1480
+ enough that the ring fills its box top-to-bottom, matching the standalone
1481
+ chart story. */
1482
+ flex: 0 0 33.333%;
1483
+ min-width: 270px;
1484
+ width: auto;
1485
+ }
1486
+
1487
+ .seeds-narrative-data-callout-body {
1488
+ flex: 1 1 0;
1489
+ }
1490
+ }
1491
+
1492
+ }
1493
+
1494
+ /* --- seeds-react-narrative-kit --- */
1495
+ /**
1496
+ * Seeds NarrativeDivider component classes.
1497
+ * Use these instead of writing out individual Tailwind utility classes.
1498
+ *
1499
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1500
+ * CSS variable definitions and dark mode support.
1501
+ *
1502
+ * Usage:
1503
+ * <hr class="seeds-narrative-divider" />
1504
+ */
1505
+
1506
+ @layer components {
1507
+
1508
+ /* A full-width, 1px horizontal rule. The <hr> ships with user-agent margins
1509
+ and a beveled border, so reset those and draw the line with a single
1510
+ border-top using the container-border-base token (#dee1e1), which also
1511
+ tracks dark mode. */
1512
+ .seeds-narrative-divider {
1513
+ box-sizing: border-box;
1514
+ width: 100%;
1515
+ height: 0;
1516
+ margin: 0;
1517
+ border: 0;
1518
+ border-top: 1px solid var(--color-container-border-base); /* #dee1e1 */
1519
+ }
1520
+
1521
+ }
1522
+
1358
1523
  /* --- seeds-react-narrative-kit --- */
1359
1524
  /**
1360
1525
  * Seeds NarrativeHeadline component classes.
@@ -1385,6 +1550,13 @@
1385
1550
  color: var(--color-text-headline);
1386
1551
  }
1387
1552
 
1553
+ /* Compact size for denser layouts (e.g. NarrativeSummary). Weight, letter
1554
+ spacing, and color are inherited from the base class. */
1555
+ .seeds-narrative-headline-small {
1556
+ font-size: var(--font-size-600); /* 24px */
1557
+ line-height: var(--line-height-600); /* 32px */
1558
+ }
1559
+
1388
1560
  /* Static gradient accent for a span of headline text ("highlighted word").
1389
1561
  Paints the AI brand gradient onto the glyphs via background-clip. */
1390
1562
  .seeds-narrative-headline-highlight {
@@ -1484,23 +1656,262 @@
1484
1656
 
1485
1657
  /* --- seeds-react-narrative-kit --- */
1486
1658
  /**
1487
- * Seeds PullQuote component classes.
1659
+ * Seeds NarrativeOrderedList component classes.
1488
1660
  * Use these instead of writing out individual Tailwind utility classes.
1489
1661
  *
1490
1662
  * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1491
1663
  * CSS variable definitions and dark mode support.
1492
1664
  *
1493
1665
  * Usage:
1494
- * <figure class="seeds-pull-quote">…</figure> // subtle (default)
1495
- * <figure class="seeds-pull-quote seeds-pull-quote-vivid">…</figure>
1666
+ * <div class="seeds-narrative-ordered-list">
1667
+ * <ol class="seeds-narrative-ordered-list-track">
1668
+ * <li class="seeds-narrative-ordered-list-item">…</li>
1669
+ * </ol>
1670
+ * </div>
1496
1671
  */
1497
1672
 
1498
1673
  @layer components {
1499
1674
 
1500
- .seeds-pull-quote {
1501
- position: relative;
1502
- overflow: hidden;
1675
+ /* Establishes the query container. The track inside reacts to this element's
1676
+ inline size — a container query can only style descendants of the container,
1677
+ never the container element itself. */
1678
+ .seeds-narrative-ordered-list {
1679
+ container-type: inline-size;
1503
1680
  box-sizing: border-box;
1681
+ font-family: var(--font-family);
1682
+ }
1683
+
1684
+ /* The list itself, and the default (stacked) layout. The horizontal modifier
1685
+ only expands to a row once the container query below has room, so horizontal
1686
+ collapses back to this stack when narrow. */
1687
+ .seeds-narrative-ordered-list-track {
1688
+ display: flex;
1689
+ flex-direction: column;
1690
+ gap: var(--space-400); /* 16px */
1691
+ margin: 0;
1692
+ padding: 0;
1693
+ list-style: none;
1694
+ }
1695
+
1696
+ /* An item row: the ordinal beside the body, on its own rounded surface. */
1697
+ .seeds-narrative-ordered-list-item {
1698
+ display: flex;
1699
+ gap: var(--space-450); /* 24px */
1700
+ align-items: flex-start;
1701
+ box-sizing: border-box;
1702
+ min-width: 0;
1703
+ padding: var(--space-400) var(--space-450); /* 16px 24px */
1704
+ border-radius: var(--radius-800); /* 12px */
1705
+ background-color: var(--color-app-bg-base);
1706
+ }
1707
+
1708
+ /* The ordinal (01, 02, …). No mono token exists yet, so fall back to a system
1709
+ monospace stack — mirrors the value treatment in metric-highlight.css. */
1710
+ .seeds-narrative-ordered-list-number {
1711
+ margin: 0;
1712
+ flex-shrink: 0;
1713
+ font-family: var(--font-family-mono, ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace);
1714
+ font-size: var(--font-size-700); /* 32px */
1715
+ line-height: var(--line-height-700); /* 40px */
1716
+ font-weight: var(--font-weight-bold);
1717
+ color: var(--color-text-headline);
1718
+ }
1719
+
1720
+ /* Title + description + optional action, stacked. */
1721
+ .seeds-narrative-ordered-list-body {
1722
+ flex: 1 1 auto;
1723
+ display: flex;
1724
+ flex-direction: column;
1725
+ gap: var(--space-200); /* 4px */
1726
+ min-width: 0;
1727
+ }
1728
+
1729
+ /* Title. 16px / 28px — the 28px line-height has no exact type token (the scale
1730
+ skips from 24px to 32px), so the design value is kept verbatim. Same
1731
+ rationale as narrative-summary.css. */
1732
+ .seeds-narrative-ordered-list-title {
1733
+ margin: 0;
1734
+ font-size: var(--font-size-300); /* 16px */
1735
+ line-height: 28px; /* off-scale, see comment above */
1736
+ font-weight: var(--font-weight-bold);
1737
+ color: var(--color-text-body);
1738
+ }
1739
+
1740
+ /* Description. 14px / 24px has no exact type token, so it is kept verbatim —
1741
+ same rationale as the title above. */
1742
+ .seeds-narrative-ordered-list-description {
1743
+ margin: 0;
1744
+ font-size: 14px; /* off-scale, see title above */
1745
+ line-height: 24px;
1746
+ font-weight: var(--font-weight-normal);
1747
+ color: var(--color-text-body);
1748
+ }
1749
+
1750
+ .seeds-narrative-ordered-list-action {
1751
+ padding-top: var(--space-350); /* 12px */
1752
+ }
1753
+
1754
+ /* Expand the horizontal variant to a row of equal columns once the component is
1755
+ wide enough. The threshold is on the component's own width (container query),
1756
+ so a narrow card on a wide screen still stacks. 640px = Tailwind/Seeds sm
1757
+ breakpoint, matching narrative-summary.css. */
1758
+ @container (min-width: 640px) {
1759
+ .seeds-narrative-ordered-list-horizontal {
1760
+ flex-direction: row;
1761
+ }
1762
+
1763
+ .seeds-narrative-ordered-list-horizontal > .seeds-narrative-ordered-list-item {
1764
+ flex: 1 1 0;
1765
+ min-width: 0;
1766
+ }
1767
+ }
1768
+
1769
+ }
1770
+
1771
+ /* --- seeds-react-narrative-kit --- */
1772
+ /**
1773
+ * Seeds NarrativeSummary component classes.
1774
+ * Use these instead of writing out individual Tailwind utility classes.
1775
+ *
1776
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1777
+ * CSS variable definitions and dark mode support. Also relies on
1778
+ * narrative-headline.css (headline) and eyebrow-token.css (eyebrow).
1779
+ *
1780
+ * The layout is a CSS grid driven by a container query on the root, so the
1781
+ * columns collapse based on the width the component is given, not the viewport.
1782
+ *
1783
+ * Usage:
1784
+ * <div class="seeds-narrative-summary">
1785
+ * <div class="seeds-narrative-summary-grid">…</div>
1786
+ * </div>
1787
+ */
1788
+
1789
+ @layer components {
1790
+
1791
+ /* Establishes the query container. The grid inside reacts to this element's
1792
+ inline size. */
1793
+ .seeds-narrative-summary {
1794
+ container-type: inline-size;
1795
+ box-sizing: border-box;
1796
+ font-family: var(--font-family);
1797
+ }
1798
+
1799
+ /* Stacked single column by default (narrow). The container query below expands
1800
+ it once there is room. */
1801
+ .seeds-narrative-summary-grid {
1802
+ display: grid;
1803
+ grid-template-columns: 1fr;
1804
+ gap: var(--space-450); /* 24px */
1805
+ }
1806
+
1807
+ /* The lead column: eyebrow, headline, optional action. align-items:flex-start
1808
+ keeps the eyebrow pill and the action sized to their content — without it the
1809
+ column's default stretch would blow the eyebrow out to full width. The
1810
+ headline still fills and wraps because its text is wider than the track. */
1811
+ .seeds-narrative-summary-lead {
1812
+ display: flex;
1813
+ flex-direction: column;
1814
+ align-items: flex-start;
1815
+ gap: var(--space-300); /* 8px */
1816
+ min-width: 0;
1817
+ }
1818
+
1819
+ /* The headline area grows so the action anchors toward the bottom of the lead
1820
+ column when the neighboring columns are taller. align-self:stretch fills the
1821
+ track width (the lead column pins other items to flex-start) so the headline
1822
+ wraps at the column edge regardless of its length. */
1823
+ .seeds-narrative-summary-headline {
1824
+ flex: 1 1 auto;
1825
+ align-self: stretch;
1826
+ }
1827
+
1828
+ /* In three-column mode the content wrapper is transparent to the grid, so its
1829
+ two sections become grid items in their own columns. In two-column mode the
1830
+ container query below turns it into a real, stacking grid item. */
1831
+ .seeds-narrative-summary-content {
1832
+ display: contents;
1833
+ }
1834
+
1835
+ .seeds-narrative-summary-section {
1836
+ display: flex;
1837
+ flex-direction: column;
1838
+ gap: var(--space-300); /* 8px */
1839
+ min-width: 0;
1840
+ }
1841
+
1842
+ /* Section label. 14px / 24px has no exact type token (the scale skips from
1843
+ 13px to 16px), so the design value is kept verbatim — same rationale as
1844
+ eyebrow-token.css. All other values use tokens. */
1845
+ .seeds-narrative-summary-label {
1846
+ margin: 0;
1847
+ font-size: 14px;
1848
+ line-height: 24px;
1849
+ font-weight: var(--font-weight-bold);
1850
+ color: var(--color-text-headline);
1851
+ }
1852
+
1853
+ .seeds-narrative-summary-text {
1854
+ margin: 0;
1855
+ font-size: 14px; /* off-scale, see label above */
1856
+ line-height: 24px;
1857
+ font-weight: var(--font-weight-normal);
1858
+ color: var(--color-text-body);
1859
+ }
1860
+
1861
+ .seeds-narrative-summary-list {
1862
+ margin: 0;
1863
+ padding-inline-start: 21px;
1864
+ list-style: disc;
1865
+ font-size: 14px; /* off-scale, see label above */
1866
+ line-height: 24px;
1867
+ font-weight: var(--font-weight-normal);
1868
+ color: var(--color-text-body);
1869
+ }
1870
+
1871
+ .seeds-narrative-summary-list li {
1872
+ margin: 0;
1873
+ }
1874
+
1875
+ /* Expand to the multi-column layout once the component is wide enough. The
1876
+ threshold is on the component's own width (container query), so a narrow card
1877
+ on a wide screen still stacks. 640px = Tailwind/Seeds sm breakpoint. */
1878
+ @container (min-width: 640px) {
1879
+ .seeds-narrative-summary-grid {
1880
+ grid-template-columns: repeat(3, 1fr);
1881
+ }
1882
+
1883
+ /* 1/3 lead + 2/3 content. */
1884
+ .seeds-narrative-summary-two-column {
1885
+ grid-template-columns: 1fr 2fr;
1886
+ }
1887
+
1888
+ /* The content wrapper becomes a real grid item that stacks its two sections. */
1889
+ .seeds-narrative-summary-two-column .seeds-narrative-summary-content {
1890
+ display: flex;
1891
+ flex-direction: column;
1892
+ gap: var(--space-450); /* 24px */
1893
+ min-width: 0;
1894
+ }
1895
+ }
1896
+
1897
+ }
1898
+
1899
+ /* --- seeds-react-narrative-kit --- */
1900
+ /**
1901
+ * Seeds PullQuote component classes.
1902
+ * Use these instead of writing out individual Tailwind utility classes.
1903
+ *
1904
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css and
1905
+ * ai-container.css imported for CSS variable definitions and surface styles.
1906
+ *
1907
+ * Usage:
1908
+ * <figure class="seeds-pull-quote seeds-ai-container">…</figure> // subtle (default)
1909
+ * <figure class="seeds-pull-quote seeds-ai-container seeds-ai-container-vivid seeds-pull-quote-vivid">…</figure>
1910
+ */
1911
+
1912
+ @layer components {
1913
+
1914
+ .seeds-pull-quote {
1504
1915
  width: 100%;
1505
1916
  display: flex;
1506
1917
  flex-direction: column;
@@ -1509,24 +1920,6 @@
1509
1920
  /* 40px block / 48px inline — 48px is off the space scale, so derive it from
1510
1921
  two tokens (40 + 8) rather than hardcoding an off-scale value. */
1511
1922
  padding: var(--space-600) calc(var(--space-600) + var(--space-300));
1512
- border-radius: var(--radius-800);
1513
- box-shadow: var(--shadow-low);
1514
- font-family: var(--font-family);
1515
- /* Subtle (default): the 20% AI gradient tint composited over the base
1516
- surface. --color-gradient-ai-subtle is already translucent, so layering it
1517
- over the opaque base color produces the soft wash. */
1518
- background-color: var(--color-container-bg-base);
1519
- background-image: var(--color-gradient-ai-subtle);
1520
- color: var(--color-text-headline);
1521
- }
1522
-
1523
- /* Vivid: the full-saturation AI gradient with white content. White has no
1524
- semantic Seeds token; it is part of the AI gradient treatment (mirrors the
1525
- raw brand hex used in --color-gradient-ai). */
1526
- .seeds-pull-quote-vivid {
1527
- background-color: transparent;
1528
- background-image: var(--color-gradient-ai);
1529
- color: #fff;
1530
1923
  }
1531
1924
 
1532
1925
  /* The accented bar holding the quote and attribution. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sproutsocial/racine",
3
- "version": "31.4.0",
3
+ "version": "31.6.0",
4
4
  "license": "MIT",
5
5
  "engines": {
6
6
  "node": ">=18"
@@ -73,74 +73,74 @@
73
73
  },
74
74
  "dependencies": {
75
75
  "@size-limit/file": "^11.1.6",
76
- "@sproutsocial/seeds-react-accordion": "^0.4.47",
77
- "@sproutsocial/seeds-react-avatar": "^1.1.16",
78
- "@sproutsocial/seeds-react-badge": "^2.0.34",
79
- "@sproutsocial/seeds-react-banner": "^1.1.22",
80
- "@sproutsocial/seeds-react-box": "^1.1.21",
81
- "@sproutsocial/seeds-react-breadcrumb": "^1.1.6",
82
- "@sproutsocial/seeds-react-button": "^2.2.1",
83
- "@sproutsocial/seeds-react-card": "^1.1.42",
76
+ "@sproutsocial/seeds-react-accordion": "^0.4.48",
77
+ "@sproutsocial/seeds-react-avatar": "^1.1.17",
78
+ "@sproutsocial/seeds-react-badge": "^2.0.35",
79
+ "@sproutsocial/seeds-react-banner": "^1.1.23",
80
+ "@sproutsocial/seeds-react-box": "^1.1.22",
81
+ "@sproutsocial/seeds-react-breadcrumb": "^1.1.7",
82
+ "@sproutsocial/seeds-react-button": "^2.2.2",
83
+ "@sproutsocial/seeds-react-card": "^1.1.43",
84
84
  "@sproutsocial/seeds-react-character-counter": "^1.0.4",
85
- "@sproutsocial/seeds-react-chart-legend": "^1.0.40",
85
+ "@sproutsocial/seeds-react-chart-legend": "^1.0.41",
86
86
  "@sproutsocial/seeds-react-chat-bubble": "^0.2.2",
87
- "@sproutsocial/seeds-react-checkbox": "^1.3.41",
87
+ "@sproutsocial/seeds-react-checkbox": "^1.3.42",
88
88
  "@sproutsocial/seeds-react-collapsible": "^2.0.0",
89
- "@sproutsocial/seeds-react-container": "^0.3.15",
90
- "@sproutsocial/seeds-react-content-block": "^0.5.14",
91
- "@sproutsocial/seeds-react-content-header": "^0.2.19",
92
- "@sproutsocial/seeds-react-data-table": "^2.6.22",
93
- "@sproutsocial/seeds-react-datepicker": "^1.0.39",
94
- "@sproutsocial/seeds-react-drawer": "^2.2.7",
95
- "@sproutsocial/seeds-react-duration": "^1.0.23",
96
- "@sproutsocial/seeds-react-empty-state": "^1.0.22",
97
- "@sproutsocial/seeds-react-fieldset": "^1.0.22",
98
- "@sproutsocial/seeds-react-form-field": "^1.1.16",
99
- "@sproutsocial/seeds-react-grid": "^0.2.5",
100
- "@sproutsocial/seeds-react-hooks": "^3.2.2",
101
- "@sproutsocial/seeds-react-icon": "^2.4.0",
102
- "@sproutsocial/seeds-react-image": "^1.0.21",
103
- "@sproutsocial/seeds-react-indicator": "^1.0.40",
104
- "@sproutsocial/seeds-react-input": "^1.5.26",
105
- "@sproutsocial/seeds-react-keyboard-key": "^1.0.22",
106
- "@sproutsocial/seeds-react-label": "^1.0.22",
107
- "@sproutsocial/seeds-react-link": "^1.1.12",
108
- "@sproutsocial/seeds-react-list": "^0.3.25",
109
- "@sproutsocial/seeds-react-loader": "^1.0.22",
110
- "@sproutsocial/seeds-react-loader-button": "^1.0.45",
111
- "@sproutsocial/seeds-react-message": "^1.0.48",
112
- "@sproutsocial/seeds-react-mixins": "^4.3.7",
113
- "@sproutsocial/seeds-react-modal": "^2.5.22",
114
- "@sproutsocial/seeds-react-narrative-kit": "^0.2.0",
115
- "@sproutsocial/seeds-react-numeral": "^1.0.47",
116
- "@sproutsocial/seeds-react-pagination": "^0.1.20",
117
- "@sproutsocial/seeds-react-panel": "^1.0.0",
118
- "@sproutsocial/seeds-react-peek-in": "^0.2.9",
119
- "@sproutsocial/seeds-react-partner-logo": "^1.7.13",
120
- "@sproutsocial/seeds-react-popout": "^2.5.9",
89
+ "@sproutsocial/seeds-react-container": "^0.3.16",
90
+ "@sproutsocial/seeds-react-content-block": "^0.5.15",
91
+ "@sproutsocial/seeds-react-content-header": "^0.2.20",
92
+ "@sproutsocial/seeds-react-data-table": "^2.6.23",
93
+ "@sproutsocial/seeds-react-datepicker": "^1.0.40",
94
+ "@sproutsocial/seeds-react-drawer": "^2.2.8",
95
+ "@sproutsocial/seeds-react-duration": "^1.0.24",
96
+ "@sproutsocial/seeds-react-empty-state": "^1.0.23",
97
+ "@sproutsocial/seeds-react-fieldset": "^1.0.23",
98
+ "@sproutsocial/seeds-react-form-field": "^1.1.17",
99
+ "@sproutsocial/seeds-react-grid": "^0.2.6",
100
+ "@sproutsocial/seeds-react-hooks": "^3.2.3",
101
+ "@sproutsocial/seeds-react-icon": "^2.4.1",
102
+ "@sproutsocial/seeds-react-image": "^1.0.22",
103
+ "@sproutsocial/seeds-react-indicator": "^1.0.41",
104
+ "@sproutsocial/seeds-react-input": "^1.5.27",
105
+ "@sproutsocial/seeds-react-keyboard-key": "^1.0.23",
106
+ "@sproutsocial/seeds-react-label": "^1.0.23",
107
+ "@sproutsocial/seeds-react-link": "^1.1.13",
108
+ "@sproutsocial/seeds-react-list": "^0.3.26",
109
+ "@sproutsocial/seeds-react-loader": "^1.0.23",
110
+ "@sproutsocial/seeds-react-loader-button": "^1.0.46",
111
+ "@sproutsocial/seeds-react-message": "^1.0.49",
112
+ "@sproutsocial/seeds-react-mixins": "^4.3.8",
113
+ "@sproutsocial/seeds-react-modal": "^2.5.23",
114
+ "@sproutsocial/seeds-react-narrative-kit": "^0.4.0",
115
+ "@sproutsocial/seeds-react-numeral": "^1.0.48",
116
+ "@sproutsocial/seeds-react-pagination": "^0.1.21",
117
+ "@sproutsocial/seeds-react-panel": "^1.0.1",
118
+ "@sproutsocial/seeds-react-peek-in": "^0.3.0",
119
+ "@sproutsocial/seeds-react-partner-logo": "^1.7.14",
120
+ "@sproutsocial/seeds-react-popout": "^2.5.10",
121
121
  "@sproutsocial/seeds-react-portal": "^1.2.0",
122
- "@sproutsocial/seeds-react-progress": "^0.2.7",
123
- "@sproutsocial/seeds-react-radio": "^1.3.22",
124
- "@sproutsocial/seeds-react-rating": "^1.0.40",
125
- "@sproutsocial/seeds-react-segmented-control": "^1.1.21",
122
+ "@sproutsocial/seeds-react-progress": "^0.2.8",
123
+ "@sproutsocial/seeds-react-radio": "^1.3.23",
124
+ "@sproutsocial/seeds-react-rating": "^1.0.41",
125
+ "@sproutsocial/seeds-react-segmented-control": "^1.1.22",
126
126
  "@sproutsocial/seeds-react-spot-illustration": "^1.2.3",
127
- "@sproutsocial/seeds-react-select": "^1.1.40",
128
- "@sproutsocial/seeds-react-skeleton": "^1.1.20",
129
- "@sproutsocial/seeds-react-stack": "^1.0.20",
130
- "@sproutsocial/seeds-react-switch": "^1.2.39",
127
+ "@sproutsocial/seeds-react-select": "^1.1.41",
128
+ "@sproutsocial/seeds-react-skeleton": "^1.1.21",
129
+ "@sproutsocial/seeds-react-stack": "^1.0.21",
130
+ "@sproutsocial/seeds-react-switch": "^1.2.40",
131
131
  "@sproutsocial/seeds-react-system-props": "^3.1.1",
132
- "@sproutsocial/seeds-react-table": "^1.0.41",
133
- "@sproutsocial/seeds-react-tabs": "^1.4.11",
132
+ "@sproutsocial/seeds-react-table": "^1.0.42",
133
+ "@sproutsocial/seeds-react-tabs": "^1.4.12",
134
134
  "@sproutsocial/seeds-react-text": "^1.4.3",
135
- "@sproutsocial/seeds-react-textarea": "^1.0.21",
136
- "@sproutsocial/seeds-react-toast": "^1.0.41",
137
- "@sproutsocial/seeds-react-token": "^1.5.6",
138
- "@sproutsocial/seeds-react-token-input": "^1.4.48",
139
- "@sproutsocial/seeds-react-tooltip": "^1.1.27",
140
- "@sproutsocial/seeds-react-theme": "^4.1.0",
141
- "@sproutsocial/seeds-react-theme-provider": "^1.1.20",
135
+ "@sproutsocial/seeds-react-textarea": "^1.0.22",
136
+ "@sproutsocial/seeds-react-toast": "^1.0.42",
137
+ "@sproutsocial/seeds-react-token": "^1.5.7",
138
+ "@sproutsocial/seeds-react-token-input": "^1.4.49",
139
+ "@sproutsocial/seeds-react-tooltip": "^1.1.28",
140
+ "@sproutsocial/seeds-react-theme": "^4.1.1",
141
+ "@sproutsocial/seeds-react-theme-provider": "^1.1.21",
142
142
  "@sproutsocial/seeds-react-utilities": "^4.3.0",
143
- "@sproutsocial/seeds-react-visually-hidden": "^1.0.22",
143
+ "@sproutsocial/seeds-react-visually-hidden": "^1.0.23",
144
144
  "scroll-into-view-if-needed": "^2.2.20",
145
145
  "lodash.uniqueid": "^4.0.1",
146
146
  "styled-system": "^5.1.5",
@@ -163,7 +163,7 @@
163
163
  "@sproutsocial/seeds-motion": "^1.8.2",
164
164
  "@sproutsocial/seeds-networkcolor": "^2.22.0",
165
165
  "@sproutsocial/seeds-partner-logos": "^2.4.1",
166
- "@sproutsocial/seeds-react-menu": "^1.16.0",
166
+ "@sproutsocial/seeds-react-menu": "^1.16.1",
167
167
  "@sproutsocial/seeds-react-testing-library": "*",
168
168
  "@sproutsocial/seeds-space": "^0.8.1",
169
169
  "@sproutsocial/seeds-testing": "*",