@sproutsocial/racine 31.3.1 → 31.5.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,46 @@
1
1
  # Change Log
2
2
 
3
+ ## 31.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 1aca1d1: `MetricHighlight` now takes a `sparkline` render slot instead of owning the
8
+ chart itself. Pass any node (e.g. a `<SparklineChart />` from
9
+ `@sproutsocial/seeds-react-data-viz/sparkline`) to render it beside/below the
10
+ metric; omit it to render the metric on its own. This replaces the previous
11
+ `data` and `chart` props.
12
+ - 0b37765: Add the `NarrativeDivider` primitive to `seeds-react-narrative-kit` — a full-width,
13
+ 1px horizontal rule for separating sections within a narrative brief, using the
14
+ `container.border` token (dark-mode aware). Exported through `@sproutsocial/racine`.
15
+ - 0b37765: Add the `NarrativeSummary` primitive to `seeds-react-narrative-kit` — a composed
16
+ block pairing a lead column (eyebrow + headline + optional action) with a Summary
17
+ section and a Key themes list, laid out as a container-query-driven grid with
18
+ `three-column` and `two-column` (1/3 | 2/3) arrangements. Also adds a `size` prop
19
+ (`"default" | "small"`) to `NarrativeHeadline`. Exported through
20
+ `@sproutsocial/racine`.
21
+
22
+ ### Patch Changes
23
+
24
+ - Updated dependencies [1aca1d1]
25
+ - Updated dependencies [0b37765]
26
+ - Updated dependencies [0b37765]
27
+ - @sproutsocial/seeds-react-narrative-kit@0.3.0
28
+
29
+ ## 31.4.0
30
+
31
+ ### Minor Changes
32
+
33
+ - 7ce52ce: Add narrative primitives to `seeds-react-narrative-kit`: `MetricHighlight` for
34
+ emphasizing key figures, `NarrativeHeadline` (with highlight and roll variants) for
35
+ section headers, and `PullQuote` for callout quotations. All are exported through
36
+ `@sproutsocial/racine`.
37
+
38
+ ### Patch Changes
39
+
40
+ - Updated dependencies [7ce52ce]
41
+ - @sproutsocial/seeds-react-narrative-kit@0.2.0
42
+ - @sproutsocial/seeds-react-accordion@0.4.47
43
+
3
44
  ## 31.3.1
4
45
 
5
46
  ### Patch Changes
@@ -1078,6 +1078,215 @@
1078
1078
  }
1079
1079
  }
1080
1080
 
1081
+ /* --- seeds-react-narrative-kit --- */
1082
+ /**
1083
+ * Seeds EyebrowToken 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
+ * <span class="seeds-eyebrow-token">May 31, 2026</span>
1091
+ */
1092
+
1093
+ @layer components {
1094
+
1095
+ /* A solid gray pill matching the design: background and border are both the
1096
+ #dee1e1 container-border-base token, which also tracks dark mode. The two
1097
+ pixel literals below have no exact theme token — the --space scale skips 6px
1098
+ (4px→8px) and the --font-size scale skips 12px (11px→13px) — so the design's
1099
+ values are kept verbatim. All colors use tokens. */
1100
+ .seeds-eyebrow-token {
1101
+ box-sizing: border-box;
1102
+ display: inline-flex;
1103
+ align-items: center;
1104
+ justify-content: center;
1105
+ gap: var(--space-100); /* 2px */
1106
+ padding: var(--space-100) var(--space-300); /* 2px / 8px */
1107
+ border: 1px solid var(--color-container-border-base); /* #dee1e1 */
1108
+ border-radius: var(--radius-500); /* 6px */
1109
+ background-color: var(--color-container-border-base); /* #dee1e1 */
1110
+ font-family: var(--font-family);
1111
+ font-size: 12px; /* text-sm */
1112
+ line-height: 20px;
1113
+ font-weight: var(--font-weight-normal);
1114
+ color: var(--color-text-body);
1115
+ white-space: nowrap;
1116
+ }
1117
+
1118
+ }
1119
+
1120
+ /* --- seeds-react-narrative-kit --- */
1121
+ /**
1122
+ * Seeds MetricHighlight component classes.
1123
+ * Use these instead of writing out individual Tailwind utility classes.
1124
+ *
1125
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1126
+ * CSS variable definitions and dark mode support.
1127
+ *
1128
+ * Usage:
1129
+ * <div class="seeds-metric-highlight">…</div> // horizontal, default
1130
+ * <div class="seeds-metric-highlight seeds-metric-highlight-vertical">…</div>
1131
+ * <div class="seeds-metric-highlight seeds-metric-highlight-small">…</div>
1132
+ * <div class="seeds-metric-highlight seeds-metric-highlight-bare">…</div> // no surface
1133
+ */
1134
+
1135
+ @layer components {
1136
+
1137
+ .seeds-metric-highlight {
1138
+ box-sizing: border-box;
1139
+ display: flex;
1140
+ align-items: flex-start;
1141
+ gap: var(--space-350); /* 12px */
1142
+ border-radius: var(--radius-800); /* 12px */
1143
+ font-family: var(--font-family);
1144
+ /* Container (default): a padded gray app surface (matches the design's
1145
+ #f3f4f4 box). `-bare` strips it. */
1146
+ padding: var(--space-400) var(--space-450); /* 16px / 24px */
1147
+ background-color: var(--color-app-bg-base);
1148
+ }
1149
+
1150
+ .seeds-metric-highlight-bare {
1151
+ padding: 0;
1152
+ background-color: transparent;
1153
+ }
1154
+
1155
+ .seeds-metric-highlight-vertical {
1156
+ flex-direction: column;
1157
+ }
1158
+
1159
+ /* The metric block: label + value/trend. Grows to fill the row in horizontal. */
1160
+ .seeds-metric-highlight-metric {
1161
+ box-sizing: border-box;
1162
+ display: flex;
1163
+ flex-direction: column;
1164
+ align-items: flex-start;
1165
+ gap: var(--space-200); /* 4px */
1166
+ flex: 1 0 0;
1167
+ min-width: 0;
1168
+ }
1169
+
1170
+ .seeds-metric-highlight-vertical .seeds-metric-highlight-metric {
1171
+ width: 100%;
1172
+ flex: 0 0 auto;
1173
+ }
1174
+
1175
+ /* Small: label and value collapse onto a single centered row. */
1176
+ .seeds-metric-highlight-small .seeds-metric-highlight-metric {
1177
+ flex-direction: row;
1178
+ align-items: center;
1179
+ gap: var(--space-300); /* 8px */
1180
+ }
1181
+
1182
+ .seeds-metric-highlight-label {
1183
+ margin: 0;
1184
+ font-size: var(--font-size-300); /* 16px */
1185
+ line-height: var(--line-height-400); /* ~28px */
1186
+ font-weight: var(--font-weight-normal);
1187
+ color: var(--color-text-body);
1188
+ overflow-wrap: break-word;
1189
+ }
1190
+
1191
+ /* In small, the label takes the slack so the value/trend align to the end. */
1192
+ .seeds-metric-highlight-small .seeds-metric-highlight-label {
1193
+ flex: 1 0 0;
1194
+ min-width: 0;
1195
+ }
1196
+
1197
+ .seeds-metric-highlight-value-row {
1198
+ display: flex;
1199
+ align-items: center;
1200
+ gap: var(--space-300); /* 8px */
1201
+ }
1202
+
1203
+ .seeds-metric-highlight-small .seeds-metric-highlight-value-row {
1204
+ justify-content: flex-end;
1205
+ }
1206
+
1207
+ .seeds-metric-highlight-value {
1208
+ margin: 0;
1209
+ /* No mono token exists yet; fall back to a system monospace stack. Mirrors the
1210
+ font/font-mono treatment in the design. */
1211
+ font-family: var(--font-family-mono, ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace);
1212
+ font-size: var(--font-size-700); /* 32px */
1213
+ line-height: var(--line-height-700); /* 40px */
1214
+ font-weight: var(--font-weight-bold);
1215
+ color: var(--color-text-headline);
1216
+ white-space: nowrap;
1217
+ }
1218
+
1219
+ .seeds-metric-highlight-small .seeds-metric-highlight-value {
1220
+ font-size: var(--font-size-600); /* 24px */
1221
+ line-height: var(--line-height-600); /* 32px */
1222
+ }
1223
+
1224
+ /* Trend badge — a rounded pill. Up is the positive (green) treatment; down
1225
+ swaps to the negative (red) treatment. Color flows to the arrow + value via
1226
+ currentColor. */
1227
+ .seeds-metric-highlight-trend {
1228
+ display: inline-flex;
1229
+ align-items: center;
1230
+ gap: var(--space-200); /* 4px */
1231
+ padding: var(--space-100) var(--space-300); /* 2px / 8px */
1232
+ border-radius: 999px;
1233
+ font-size: var(--font-size-200); /* 13px */
1234
+ line-height: var(--line-height-200);
1235
+ font-weight: var(--font-weight-bold);
1236
+ white-space: nowrap;
1237
+ background-color: var(--color-container-bg-decorative-green);
1238
+ color: var(--color-text-decorative-green);
1239
+ }
1240
+
1241
+ .seeds-metric-highlight-trend-down {
1242
+ background-color: var(--color-container-bg-decorative-red);
1243
+ color: var(--color-text-decorative-red);
1244
+ }
1245
+
1246
+ .seeds-metric-highlight-trend-arrow {
1247
+ flex: 0 0 auto;
1248
+ width: 1em;
1249
+ height: 1em;
1250
+ stroke: currentColor;
1251
+ stroke-width: 1.5;
1252
+ }
1253
+
1254
+ /* Slot for an injected chart (e.g. a data-viz SparklineChart). Layout only — no
1255
+ stroke/background styling, so the injected chart controls its own look. Heights
1256
+ are explicit (never percentage/stretch) so a Highcharts chart always measures a
1257
+ concrete container instead of falling back to its 400px default. */
1258
+ .seeds-metric-highlight-chart {
1259
+ box-sizing: border-box;
1260
+ flex: 0 0 auto;
1261
+ align-self: center;
1262
+ /* Center the injected chart as a flex item — an inline/inline-block child
1263
+ (e.g. the data-viz SparklineChart) otherwise sits on the text baseline with
1264
+ descender space below it, reading as vertically off-center in the slot. */
1265
+ display: flex;
1266
+ align-items: center;
1267
+ }
1268
+
1269
+ .seeds-metric-highlight:not(.seeds-metric-highlight-vertical) .seeds-metric-highlight-chart {
1270
+ width: 104px;
1271
+ height: 48px;
1272
+ }
1273
+
1274
+ .seeds-metric-highlight-small:not(.seeds-metric-highlight-vertical) .seeds-metric-highlight-chart {
1275
+ width: 88px;
1276
+ height: 40px;
1277
+ }
1278
+
1279
+ .seeds-metric-highlight-vertical .seeds-metric-highlight-chart {
1280
+ width: 100%;
1281
+ height: 96px;
1282
+ }
1283
+
1284
+ .seeds-metric-highlight-vertical.seeds-metric-highlight-small .seeds-metric-highlight-chart {
1285
+ height: 56px;
1286
+ }
1287
+
1288
+ }
1289
+
1081
1290
  /* --- seeds-react-narrative-kit --- */
1082
1291
  /**
1083
1292
  * Seeds NarrativeContainer component classes.
@@ -1098,7 +1307,7 @@
1098
1307
  box-sizing: border-box;
1099
1308
  display: flex;
1100
1309
  flex-direction: column;
1101
- align-items: flex-start;
1310
+ align-items: stretch;
1102
1311
  padding: var(--space-500);
1103
1312
  border-radius: var(--radius-800);
1104
1313
  box-shadow: var(--shadow-low);
@@ -1136,6 +1345,388 @@
1136
1345
 
1137
1346
  }
1138
1347
 
1348
+ /* --- seeds-react-narrative-kit --- */
1349
+ /**
1350
+ * Seeds NarrativeDivider component classes.
1351
+ * Use these instead of writing out individual Tailwind utility classes.
1352
+ *
1353
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1354
+ * CSS variable definitions and dark mode support.
1355
+ *
1356
+ * Usage:
1357
+ * <hr class="seeds-narrative-divider" />
1358
+ */
1359
+
1360
+ @layer components {
1361
+
1362
+ /* A full-width, 1px horizontal rule. The <hr> ships with user-agent margins
1363
+ and a beveled border, so reset those and draw the line with a single
1364
+ border-top using the container-border-base token (#dee1e1), which also
1365
+ tracks dark mode. */
1366
+ .seeds-narrative-divider {
1367
+ box-sizing: border-box;
1368
+ width: 100%;
1369
+ height: 0;
1370
+ margin: 0;
1371
+ border: 0;
1372
+ border-top: 1px solid var(--color-container-border-base); /* #dee1e1 */
1373
+ }
1374
+
1375
+ }
1376
+
1377
+ /* --- seeds-react-narrative-kit --- */
1378
+ /**
1379
+ * Seeds NarrativeHeadline component classes.
1380
+ * Use these instead of writing out individual Tailwind utility classes.
1381
+ *
1382
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1383
+ * CSS variable definitions and dark mode support.
1384
+ *
1385
+ * Usage:
1386
+ * <h2 class="seeds-narrative-headline">
1387
+ * Headline with a
1388
+ * <span class="seeds-narrative-headline-highlight">highlighted</span>
1389
+ * word
1390
+ * </h2>
1391
+ */
1392
+
1393
+ @layer components {
1394
+
1395
+ /* Headline text. Rendered as an h1–h6, so reset the UA heading margins. */
1396
+ .seeds-narrative-headline {
1397
+ box-sizing: border-box;
1398
+ margin: 0;
1399
+ font-family: var(--font-family);
1400
+ font-size: var(--font-size-700);
1401
+ line-height: var(--line-height-700);
1402
+ font-weight: var(--font-weight-bold);
1403
+ letter-spacing: -0.02em;
1404
+ color: var(--color-text-headline);
1405
+ }
1406
+
1407
+ /* Compact size for denser layouts (e.g. NarrativeSummary). Weight, letter
1408
+ spacing, and color are inherited from the base class. */
1409
+ .seeds-narrative-headline-small {
1410
+ font-size: var(--font-size-600); /* 24px */
1411
+ line-height: var(--line-height-600); /* 32px */
1412
+ }
1413
+
1414
+ /* Static gradient accent for a span of headline text ("highlighted word").
1415
+ Paints the AI brand gradient onto the glyphs via background-clip. */
1416
+ .seeds-narrative-headline-highlight {
1417
+ background: var(--color-gradient-ai);
1418
+ -webkit-background-clip: text;
1419
+ background-clip: text;
1420
+ color: transparent;
1421
+ }
1422
+
1423
+ /* -------------------------------------------------------------------------
1424
+ "Roll" variant — vertical word roll. The active word slides into view
1425
+ while the previous one rolls out.
1426
+ ------------------------------------------------------------------------- */
1427
+ .seeds-narrative-headline-roll {
1428
+ display: inline-block;
1429
+ position: relative;
1430
+ /* clip-path rather than overflow:hidden: overflow:hidden on an inline-block
1431
+ snaps its baseline to the bottom margin edge, dropping the rolling word
1432
+ below the surrounding text. clip-path keeps the natural baseline. */
1433
+ clip-path: inset(0);
1434
+ }
1435
+
1436
+ /* Invisible word that holds the box width to the active word. */
1437
+ .seeds-narrative-headline-roll-sizer {
1438
+ display: inline-block;
1439
+ visibility: hidden;
1440
+ white-space: nowrap;
1441
+ pointer-events: none;
1442
+ }
1443
+
1444
+ .seeds-narrative-headline-roll-word {
1445
+ display: inline-block;
1446
+ position: absolute;
1447
+ top: 0;
1448
+ left: 0;
1449
+ white-space: nowrap;
1450
+ transform: translateY(100%);
1451
+ opacity: 0;
1452
+ transition:
1453
+ transform var(--seeds-narrative-headline-roll-ms, 500ms) ease,
1454
+ opacity var(--seeds-narrative-headline-roll-ms, 500ms) ease;
1455
+ }
1456
+
1457
+ .seeds-narrative-headline-roll-word-active {
1458
+ transform: translateY(0);
1459
+ opacity: 1;
1460
+ }
1461
+
1462
+ .seeds-narrative-headline-roll-word-past {
1463
+ transform: translateY(-100%);
1464
+ opacity: 0;
1465
+ }
1466
+
1467
+ /* Reverse the roll direction. */
1468
+ .seeds-narrative-headline-roll-down .seeds-narrative-headline-roll-word {
1469
+ transform: translateY(-100%);
1470
+ }
1471
+ .seeds-narrative-headline-roll-down .seeds-narrative-headline-roll-word-active {
1472
+ transform: translateY(0);
1473
+ }
1474
+ .seeds-narrative-headline-roll-down .seeds-narrative-headline-roll-word-past {
1475
+ transform: translateY(100%);
1476
+ }
1477
+
1478
+ /* Gradient-painted rolling words with a slow shimmer. */
1479
+ .seeds-narrative-headline-roll-gradient .seeds-narrative-headline-roll-word {
1480
+ background: var(--color-gradient-ai);
1481
+ background-size: 200% 200%;
1482
+ -webkit-background-clip: text;
1483
+ background-clip: text;
1484
+ color: transparent;
1485
+ animation: seeds-narrative-headline-grad-shift 8s ease infinite;
1486
+ }
1487
+
1488
+ @keyframes seeds-narrative-headline-grad-shift {
1489
+ 0%,
1490
+ 100% {
1491
+ background-position: 0% 50%;
1492
+ }
1493
+ 50% {
1494
+ background-position: 100% 50%;
1495
+ }
1496
+ }
1497
+
1498
+ /* The JS cycle is already disabled under reduced-motion (the first word holds);
1499
+ also flatten the transition and shimmer so any in-flight motion settles. */
1500
+ @media (prefers-reduced-motion: reduce) {
1501
+ .seeds-narrative-headline-roll-word {
1502
+ transition: none;
1503
+ }
1504
+ .seeds-narrative-headline-roll-gradient .seeds-narrative-headline-roll-word {
1505
+ animation: none;
1506
+ }
1507
+ }
1508
+
1509
+ }
1510
+
1511
+ /* --- seeds-react-narrative-kit --- */
1512
+ /**
1513
+ * Seeds NarrativeSummary component classes.
1514
+ * Use these instead of writing out individual Tailwind utility classes.
1515
+ *
1516
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1517
+ * CSS variable definitions and dark mode support. Also relies on
1518
+ * narrative-headline.css (headline) and eyebrow-token.css (eyebrow).
1519
+ *
1520
+ * The layout is a CSS grid driven by a container query on the root, so the
1521
+ * columns collapse based on the width the component is given, not the viewport.
1522
+ *
1523
+ * Usage:
1524
+ * <div class="seeds-narrative-summary">
1525
+ * <div class="seeds-narrative-summary-grid">…</div>
1526
+ * </div>
1527
+ */
1528
+
1529
+ @layer components {
1530
+
1531
+ /* Establishes the query container. The grid inside reacts to this element's
1532
+ inline size. */
1533
+ .seeds-narrative-summary {
1534
+ container-type: inline-size;
1535
+ box-sizing: border-box;
1536
+ font-family: var(--font-family);
1537
+ }
1538
+
1539
+ /* Stacked single column by default (narrow). The container query below expands
1540
+ it once there is room. */
1541
+ .seeds-narrative-summary-grid {
1542
+ display: grid;
1543
+ grid-template-columns: 1fr;
1544
+ gap: var(--space-450); /* 24px */
1545
+ }
1546
+
1547
+ /* The lead column: eyebrow, headline, optional action. align-items:flex-start
1548
+ keeps the eyebrow pill and the action sized to their content — without it the
1549
+ column's default stretch would blow the eyebrow out to full width. The
1550
+ headline still fills and wraps because its text is wider than the track. */
1551
+ .seeds-narrative-summary-lead {
1552
+ display: flex;
1553
+ flex-direction: column;
1554
+ align-items: flex-start;
1555
+ gap: var(--space-300); /* 8px */
1556
+ min-width: 0;
1557
+ }
1558
+
1559
+ /* The headline area grows so the action anchors toward the bottom of the lead
1560
+ column when the neighboring columns are taller. align-self:stretch fills the
1561
+ track width (the lead column pins other items to flex-start) so the headline
1562
+ wraps at the column edge regardless of its length. */
1563
+ .seeds-narrative-summary-headline {
1564
+ flex: 1 1 auto;
1565
+ align-self: stretch;
1566
+ }
1567
+
1568
+ /* In three-column mode the content wrapper is transparent to the grid, so its
1569
+ two sections become grid items in their own columns. In two-column mode the
1570
+ container query below turns it into a real, stacking grid item. */
1571
+ .seeds-narrative-summary-content {
1572
+ display: contents;
1573
+ }
1574
+
1575
+ .seeds-narrative-summary-section {
1576
+ display: flex;
1577
+ flex-direction: column;
1578
+ gap: var(--space-300); /* 8px */
1579
+ min-width: 0;
1580
+ }
1581
+
1582
+ /* Section label. 14px / 24px has no exact type token (the scale skips from
1583
+ 13px to 16px), so the design value is kept verbatim — same rationale as
1584
+ eyebrow-token.css. All other values use tokens. */
1585
+ .seeds-narrative-summary-label {
1586
+ margin: 0;
1587
+ font-size: 14px;
1588
+ line-height: 24px;
1589
+ font-weight: var(--font-weight-bold);
1590
+ color: var(--color-text-headline);
1591
+ }
1592
+
1593
+ .seeds-narrative-summary-text {
1594
+ margin: 0;
1595
+ font-size: 14px; /* off-scale, see label above */
1596
+ line-height: 24px;
1597
+ font-weight: var(--font-weight-normal);
1598
+ color: var(--color-text-body);
1599
+ }
1600
+
1601
+ .seeds-narrative-summary-list {
1602
+ margin: 0;
1603
+ padding-inline-start: 21px;
1604
+ list-style: disc;
1605
+ font-size: 14px; /* off-scale, see label above */
1606
+ line-height: 24px;
1607
+ font-weight: var(--font-weight-normal);
1608
+ color: var(--color-text-body);
1609
+ }
1610
+
1611
+ .seeds-narrative-summary-list li {
1612
+ margin: 0;
1613
+ }
1614
+
1615
+ /* Expand to the multi-column layout once the component is wide enough. The
1616
+ threshold is on the component's own width (container query), so a narrow card
1617
+ on a wide screen still stacks. 640px = Tailwind/Seeds sm breakpoint. */
1618
+ @container (min-width: 640px) {
1619
+ .seeds-narrative-summary-grid {
1620
+ grid-template-columns: repeat(3, 1fr);
1621
+ }
1622
+
1623
+ /* 1/3 lead + 2/3 content. */
1624
+ .seeds-narrative-summary-two-column {
1625
+ grid-template-columns: 1fr 2fr;
1626
+ }
1627
+
1628
+ /* The content wrapper becomes a real grid item that stacks its two sections. */
1629
+ .seeds-narrative-summary-two-column .seeds-narrative-summary-content {
1630
+ display: flex;
1631
+ flex-direction: column;
1632
+ gap: var(--space-450); /* 24px */
1633
+ min-width: 0;
1634
+ }
1635
+ }
1636
+
1637
+ }
1638
+
1639
+ /* --- seeds-react-narrative-kit --- */
1640
+ /**
1641
+ * Seeds PullQuote component classes.
1642
+ * Use these instead of writing out individual Tailwind utility classes.
1643
+ *
1644
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1645
+ * CSS variable definitions and dark mode support.
1646
+ *
1647
+ * Usage:
1648
+ * <figure class="seeds-pull-quote">…</figure> // subtle (default)
1649
+ * <figure class="seeds-pull-quote seeds-pull-quote-vivid">…</figure>
1650
+ */
1651
+
1652
+ @layer components {
1653
+
1654
+ .seeds-pull-quote {
1655
+ position: relative;
1656
+ overflow: hidden;
1657
+ box-sizing: border-box;
1658
+ width: 100%;
1659
+ display: flex;
1660
+ flex-direction: column;
1661
+ align-items: flex-start;
1662
+ margin: 0; /* reset the browser default <figure> margin */
1663
+ /* 40px block / 48px inline — 48px is off the space scale, so derive it from
1664
+ two tokens (40 + 8) rather than hardcoding an off-scale value. */
1665
+ padding: var(--space-600) calc(var(--space-600) + var(--space-300));
1666
+ border-radius: var(--radius-800);
1667
+ box-shadow: var(--shadow-low);
1668
+ font-family: var(--font-family);
1669
+ /* Subtle (default): the 20% AI gradient tint composited over the base
1670
+ surface. --color-gradient-ai-subtle is already translucent, so layering it
1671
+ over the opaque base color produces the soft wash. */
1672
+ background-color: var(--color-container-bg-base);
1673
+ background-image: var(--color-gradient-ai-subtle);
1674
+ color: var(--color-text-headline);
1675
+ }
1676
+
1677
+ /* Vivid: the full-saturation AI gradient with white content. White has no
1678
+ semantic Seeds token; it is part of the AI gradient treatment (mirrors the
1679
+ raw brand hex used in --color-gradient-ai). */
1680
+ .seeds-pull-quote-vivid {
1681
+ background-color: transparent;
1682
+ background-image: var(--color-gradient-ai);
1683
+ color: #fff;
1684
+ }
1685
+
1686
+ /* The accented bar holding the quote and attribution. */
1687
+ .seeds-pull-quote-bar {
1688
+ box-sizing: border-box;
1689
+ display: flex;
1690
+ flex-direction: column;
1691
+ align-items: flex-start;
1692
+ gap: var(--space-450); /* 24px */
1693
+ width: 100%;
1694
+ padding-left: var(--space-450); /* 24px */
1695
+ /* 4px is off the border-width scale (max token is 3px); the bar is a
1696
+ decorative accent, mirroring NarrativeContainer's hardcoded 4px ring. The
1697
+ subtle accent uses the AI gradient mid stop (#9747ff — no exact token). */
1698
+ border-left: 4px solid #9747ff;
1699
+ }
1700
+
1701
+ .seeds-pull-quote-vivid .seeds-pull-quote-bar {
1702
+ border-left-color: #fff;
1703
+ }
1704
+
1705
+ .seeds-pull-quote-text {
1706
+ margin: 0; /* reset the browser default <blockquote> margin */
1707
+ font-size: var(--font-size-600);
1708
+ line-height: var(--line-height-600);
1709
+ font-style: italic;
1710
+ font-weight: var(--font-weight-normal);
1711
+ color: inherit;
1712
+ overflow-wrap: break-word;
1713
+ }
1714
+
1715
+ /* Attribution row — a flex container for author name, avatar, network, etc.
1716
+ Direct text inherits a bold, small treatment to match the display-name style;
1717
+ richer content (e.g. an Avatar) composes freely. */
1718
+ .seeds-pull-quote-attribution {
1719
+ display: flex;
1720
+ align-items: center;
1721
+ gap: var(--space-300); /* 8px */
1722
+ font-size: var(--font-size-200);
1723
+ line-height: var(--line-height-200);
1724
+ font-weight: var(--font-weight-bold);
1725
+ color: inherit;
1726
+ }
1727
+
1728
+ }
1729
+
1139
1730
  /* --- seeds-react-text --- */
1140
1731
  /**
1141
1732
  * Seeds Text component classes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sproutsocial/racine",
3
- "version": "31.3.1",
3
+ "version": "31.5.0",
4
4
  "license": "MIT",
5
5
  "engines": {
6
6
  "node": ">=18"
@@ -73,7 +73,7 @@
73
73
  },
74
74
  "dependencies": {
75
75
  "@size-limit/file": "^11.1.6",
76
- "@sproutsocial/seeds-react-accordion": "^0.4.46",
76
+ "@sproutsocial/seeds-react-accordion": "^0.4.47",
77
77
  "@sproutsocial/seeds-react-avatar": "^1.1.16",
78
78
  "@sproutsocial/seeds-react-badge": "^2.0.34",
79
79
  "@sproutsocial/seeds-react-banner": "^1.1.22",
@@ -111,7 +111,7 @@
111
111
  "@sproutsocial/seeds-react-message": "^1.0.48",
112
112
  "@sproutsocial/seeds-react-mixins": "^4.3.7",
113
113
  "@sproutsocial/seeds-react-modal": "^2.5.22",
114
- "@sproutsocial/seeds-react-narrative-kit": "^0.1.0",
114
+ "@sproutsocial/seeds-react-narrative-kit": "^0.3.0",
115
115
  "@sproutsocial/seeds-react-numeral": "^1.0.47",
116
116
  "@sproutsocial/seeds-react-pagination": "^0.1.20",
117
117
  "@sproutsocial/seeds-react-panel": "^1.0.0",
@@ -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.15.10",
166
+ "@sproutsocial/seeds-react-menu": "^1.16.0",
167
167
  "@sproutsocial/seeds-react-testing-library": "*",
168
168
  "@sproutsocial/seeds-space": "^0.8.1",
169
169
  "@sproutsocial/seeds-testing": "*",