@sproutsocial/racine 31.5.0 → 31.7.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 (3) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/dist/components.css +982 -101
  3. package/package.json +65 -65
@@ -487,6 +487,51 @@
487
487
  }
488
488
 
489
489
  } /* end @layer components */
490
+ /* --- seeds-react-collapsible --- */
491
+ /**
492
+ * Seeds Collapsible component classes
493
+ * Use these instead of writing out individual Tailwind utility classes.
494
+ *
495
+ * Open/closed state is driven by Radix's data-state attribute on the panel.
496
+ *
497
+ * Usage:
498
+ * <div class="seeds-collapsible-content" data-state="open">…</div>
499
+ */
500
+
501
+ /* @keyframes are not subject to cascade layers; keep them outside @layer so
502
+ they stay resolvable by name from the layered animation rules below. */
503
+ @keyframes collapsibleSlideDown {
504
+ from {
505
+ height: 0;
506
+ }
507
+ to {
508
+ height: var(--radix-collapsible-content-height);
509
+ }
510
+ }
511
+
512
+ @keyframes collapsibleSlideUp {
513
+ from {
514
+ height: var(--radix-collapsible-content-height);
515
+ }
516
+ to {
517
+ height: 0;
518
+ }
519
+ }
520
+
521
+ @layer components {
522
+ .seeds-collapsible-content {
523
+ overflow: hidden;
524
+ }
525
+
526
+ .seeds-collapsible-content[data-state="open"] {
527
+ animation: collapsibleSlideDown 300ms ease-in-out;
528
+ }
529
+
530
+ .seeds-collapsible-content[data-state="closed"] {
531
+ animation: collapsibleSlideUp 300ms ease-in-out;
532
+ }
533
+ }
534
+
490
535
  /* --- seeds-react-content-block --- */
491
536
  /**
492
537
  * Seeds ContentBlock component classes
@@ -846,6 +891,42 @@
846
891
  .seeds-drawer-popup[data-nested-drawer-open][data-nested-drawer-swiping] > * {
847
892
  opacity: 1;
848
893
  }
894
+
895
+ /* Header ------------------------------------------------------------------ */
896
+
897
+ /* Port of the styled-components Box header (DrawerShared.tsx): flex row with
898
+ the title and close button, fixed at the top of the popup. */
899
+ .seeds-drawer-header {
900
+ display: flex;
901
+ flex: 0 0 auto;
902
+ justify-content: space-between;
903
+ align-items: center;
904
+ padding-top: var(--space-400);
905
+ padding-left: var(--space-450);
906
+ padding-right: var(--space-450);
907
+ }
908
+
909
+ /* Default title typography. `margin: 0` neutralises the user-agent <h2>
910
+ margin that the styled path's <Text> reset for us, avoiding a layout shift
911
+ between the Tailwind and styled headers. */
912
+ .seeds-drawer-header-title {
913
+ margin: 0;
914
+ font-size: var(--font-size-400);
915
+ line-height: var(--line-height-400);
916
+ font-weight: var(--font-weight-semibold);
917
+ color: var(--color-text-headline);
918
+ }
919
+
920
+ /* Content ----------------------------------------------------------------- */
921
+
922
+ /* Port of the styled-components Content (styles.ts) plus the styled-system
923
+ props it was rendered with (height/padding/color). */
924
+ .seeds-drawer-content {
925
+ height: 100%;
926
+ padding: var(--space-450);
927
+ overflow-y: auto;
928
+ color: var(--color-text-body);
929
+ }
849
930
  }
850
931
 
851
932
  /* --- seeds-react-link --- */
@@ -917,19 +998,23 @@
917
998
  *
918
999
  * Usage:
919
1000
  * <div class="seeds-loader seeds-loader-delay">
1001
+ * <span class="seeds-loader-spinner" aria-hidden="true"></span>
920
1002
  * <span class="seeds-loader-visually-hidden">Loading</span>
921
1003
  * </div>
922
1004
  * <div class="seeds-loader seeds-loader-sm">...</div> (small)
923
1005
  * <div class="seeds-loader">...</div> (no delay)
1006
+ *
1007
+ * The visual is a thin rotating arc (--color-neutral-0) over a faint arc ring
1008
+ * (--color-neutral-600), both clipped to the bottom half by the spinner span.
924
1009
  */
925
1010
 
926
1011
  @layer components {
927
1012
  @keyframes seeds-loader-spin {
928
1013
  from {
929
- transform: translate(-50%, -50%) rotate(0deg);
1014
+ transform: rotate(0deg);
930
1015
  }
931
1016
  to {
932
- transform: translate(-50%, -50%) rotate(360deg);
1017
+ transform: rotate(360deg);
933
1018
  }
934
1019
  }
935
1020
 
@@ -945,70 +1030,84 @@
945
1030
  }
946
1031
  }
947
1032
 
948
- /* Base (large / 40px) */
1033
+ /* Base (large / 40px) — slow outer rotation hosting the spinner */
949
1034
  .seeds-loader {
950
1035
  position: relative;
951
1036
  margin: 0 auto;
952
1037
  padding: 0;
953
- overflow: hidden;
954
- border-radius: 100%;
955
1038
  width: 40px;
956
1039
  height: 40px;
957
- box-shadow:
958
- 0 0 0 2px var(--color-neutral-600),
959
- inset 0 0 0 6px var(--color-neutral-600);
1040
+ animation: seeds-loader-spin 3s infinite linear;
960
1041
  }
961
1042
 
962
- .seeds-loader::after {
1043
+ /* Visual spinner — clipped to bottom half, faster eased rotation */
1044
+ .seeds-loader-spinner {
963
1045
  position: absolute;
964
- top: 50%;
965
- left: 50%;
1046
+ inset: 0;
1047
+ margin: auto;
1048
+ width: 40px;
1049
+ height: 40px;
1050
+ clip: rect(20px, 40px, 40px, 0);
1051
+ animation: seeds-loader-spin 1.5s cubic-bezier(0.77, 0, 0.175, 1) infinite;
1052
+ }
1053
+
1054
+ /* Bright arc */
1055
+ .seeds-loader-spinner::before {
1056
+ content: "";
1057
+ position: absolute;
1058
+ inset: 0;
1059
+ margin: auto;
966
1060
  width: 40px;
967
1061
  height: 40px;
968
1062
  box-sizing: border-box;
969
- border-width: 4px;
970
- background: transparent;
971
- border-style: solid;
1063
+ border: 4px solid transparent;
1064
+ border-top-color: var(--color-neutral-0);
972
1065
  border-radius: 100%;
973
- content: "";
974
- transition: opacity 250ms;
975
- border-color: var(--color-neutral-0) var(--color-neutral-0)
976
- var(--color-neutral-600) var(--color-neutral-600);
977
- animation: seeds-loader-spin 2.25s infinite linear;
1066
+ animation: seeds-loader-spin 1.5s cubic-bezier(0.77, 0, 0.175, 1) infinite;
978
1067
  }
979
1068
 
980
- .no-cssanimations .seeds-loader::after {
981
- background-size: 40px;
1069
+ /* Faint arc ring (static) — clipped to bottom half alongside the bright arc */
1070
+ .seeds-loader-spinner::after {
1071
+ content: "";
1072
+ position: absolute;
1073
+ inset: 0;
1074
+ margin: auto;
1075
+ width: 40px;
1076
+ height: 40px;
1077
+ box-sizing: border-box;
1078
+ border: 4px solid var(--color-neutral-600);
1079
+ border-radius: 100%;
982
1080
  }
983
1081
 
984
- /* Delay variant adds the delay fade-in to the container and the spinner */
985
- .seeds-loader-delay {
986
- animation: seeds-loader-delay-anim 2s 1;
1082
+ /* When animations are disabled, the faint arc still renders so the loader
1083
+ is never invisible. */
1084
+ .no-cssanimations .seeds-loader-spinner::after {
1085
+ border-color: var(--color-neutral-600);
987
1086
  }
988
1087
 
989
- .seeds-loader-delay::after {
1088
+ /* Delay variant — fades the whole spinner in alongside the outer rotation */
1089
+ .seeds-loader-delay {
990
1090
  animation:
991
- seeds-loader-spin 2.25s infinite linear,
1091
+ seeds-loader-spin 3s infinite linear,
992
1092
  seeds-loader-delay-anim 2s 1;
993
1093
  }
994
1094
 
995
- /* Small (20px) */
996
- .seeds-loader-sm {
1095
+ /* Small (20px) — scale size, border width, and the clip rect together */
1096
+ .seeds-loader-sm,
1097
+ .seeds-loader-sm .seeds-loader-spinner,
1098
+ .seeds-loader-sm .seeds-loader-spinner::before,
1099
+ .seeds-loader-sm .seeds-loader-spinner::after {
997
1100
  width: 20px;
998
1101
  height: 20px;
999
- box-shadow:
1000
- 0 0 0 2px var(--color-neutral-600),
1001
- inset 0 0 0 4px var(--color-neutral-600);
1002
1102
  }
1003
1103
 
1004
- .seeds-loader-sm::after {
1005
- width: 20px;
1006
- height: 20px;
1007
- border-width: 2px;
1104
+ .seeds-loader-sm .seeds-loader-spinner {
1105
+ clip: rect(10px, 20px, 20px, 0);
1008
1106
  }
1009
1107
 
1010
- .no-cssanimations .seeds-loader-sm::after {
1011
- background-size: 20px;
1108
+ .seeds-loader-sm .seeds-loader-spinner::before,
1109
+ .seeds-loader-sm .seeds-loader-spinner::after {
1110
+ border-width: 2px;
1012
1111
  }
1013
1112
 
1014
1113
  /* Visually-hidden accessibility text */
@@ -1078,6 +1177,47 @@
1078
1177
  }
1079
1178
  }
1080
1179
 
1180
+ /* --- seeds-react-narrative-kit --- */
1181
+ /**
1182
+ * Seeds AIContainer component classes.
1183
+ * Use these instead of writing out individual Tailwind utility classes.
1184
+ *
1185
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1186
+ * CSS variable definitions and dark mode support.
1187
+ *
1188
+ * Usage:
1189
+ * <div class="seeds-ai-container">…</div> // subtle (default)
1190
+ * <div class="seeds-ai-container seeds-ai-container-vivid">…</div>
1191
+ */
1192
+
1193
+ @layer components {
1194
+
1195
+ .seeds-ai-container {
1196
+ position: relative;
1197
+ overflow: hidden;
1198
+ box-sizing: border-box;
1199
+ border-radius: var(--radius-800);
1200
+ box-shadow: var(--shadow-low);
1201
+ font-family: var(--font-family);
1202
+ /* Subtle (default): the 20% AI gradient tint composited over the base
1203
+ surface. --color-gradient-ai-subtle is already translucent, so layering it
1204
+ over the opaque base color produces the soft wash. */
1205
+ background-color: var(--color-container-bg-base);
1206
+ background-image: var(--color-gradient-ai-subtle);
1207
+ color: var(--color-text-headline);
1208
+ }
1209
+
1210
+ /* Vivid: the full-saturation AI gradient with white content. White has no
1211
+ semantic Seeds token; it is part of the AI gradient treatment (mirrors the
1212
+ raw brand hex used in --color-gradient-ai). */
1213
+ .seeds-ai-container-vivid {
1214
+ background-color: transparent;
1215
+ background-image: var(--color-gradient-ai);
1216
+ color: #fff;
1217
+ }
1218
+
1219
+ }
1220
+
1081
1221
  /* --- seeds-react-narrative-kit --- */
1082
1222
  /**
1083
1223
  * Seeds EyebrowToken component classes.
@@ -1287,6 +1427,64 @@
1287
1427
 
1288
1428
  }
1289
1429
 
1430
+ /* --- seeds-react-narrative-kit --- */
1431
+ /**
1432
+ * Seeds NarrativeAttribution component classes.
1433
+ * Use these instead of writing out individual Tailwind utility classes.
1434
+ *
1435
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1436
+ * CSS variable definitions and dark mode support.
1437
+ *
1438
+ * Usage:
1439
+ * <div class="seeds-narrative-attribution">
1440
+ * <img class="seeds-narrative-attribution-avatar" />
1441
+ * <div class="seeds-narrative-attribution-social-icon">...</div>
1442
+ * <span class="seeds-narrative-attribution-user-name">...</span>
1443
+ * </div>
1444
+ */
1445
+
1446
+ @layer components {
1447
+
1448
+ /* Main container — horizontal layout with avatar, social icon, and user name. */
1449
+ .seeds-narrative-attribution {
1450
+ box-sizing: border-box;
1451
+ display: flex;
1452
+ align-items: center;
1453
+ gap: var(--space-300); /* 8px */;
1454
+ font-family: var(--font-family);
1455
+ }
1456
+
1457
+ /* Circular avatar image — fixed size with rounded corners. */
1458
+ .seeds-narrative-attribution-avatar {
1459
+ width: var(--space-450); /* 24px */
1460
+ height: var(--space-450); /* 24px */
1461
+ border-radius: var(--radius-circular); /* 50% */
1462
+ object-fit: cover;
1463
+ flex-shrink: 0;
1464
+ }
1465
+
1466
+ /* Social network icon container — flexible sizing for partner logos. */
1467
+ .seeds-narrative-attribution-social-icon {
1468
+ flex-shrink: 0;
1469
+ display: flex;
1470
+ align-items: center;
1471
+ justify-content: center;
1472
+ }
1473
+
1474
+ /* User name text — bold headline text with ellipsis overflow. */
1475
+ .seeds-narrative-attribution-user-name {
1476
+ overflow: hidden;
1477
+ color: var(--color-text-headline);
1478
+ text-overflow: ellipsis;
1479
+ font-family: var(--font-family);
1480
+ font-size: var(--text-base-font-size, 14px);
1481
+ font-style: normal;
1482
+ font-weight: var(--font-weight-bold, 700);
1483
+ line-height: var(--text-base-line-height, 24px);
1484
+ }
1485
+
1486
+ }
1487
+
1290
1488
  /* --- seeds-react-narrative-kit --- */
1291
1489
  /**
1292
1490
  * Seeds NarrativeContainer component classes.
@@ -1345,6 +1543,111 @@
1345
1543
 
1346
1544
  }
1347
1545
 
1546
+ /* --- seeds-react-narrative-kit --- */
1547
+ /**
1548
+ * Seeds NarrativeDataCallout component classes.
1549
+ * Use these instead of writing out individual Tailwind utility classes.
1550
+ *
1551
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1552
+ * CSS variable definitions and dark mode support.
1553
+ *
1554
+ * The layout is a flex row driven by a container query on the root, so the
1555
+ * visual/text columns stack based on the width the component is given, not the
1556
+ * viewport.
1557
+ *
1558
+ * Usage:
1559
+ * <div class="seeds-narrative-data-callout">
1560
+ * <div class="seeds-narrative-data-callout-row">
1561
+ * <div class="seeds-narrative-data-callout-visual">…chart…</div>
1562
+ * <div class="seeds-narrative-data-callout-body">…copy…</div>
1563
+ * </div>
1564
+ * </div>
1565
+ */
1566
+
1567
+ @layer components {
1568
+
1569
+ /* Establishes the query container. The row inside reacts to this element's
1570
+ inline size. A container query only styles DESCENDANTS of the query container,
1571
+ so the flex row lives on the inner element, not this one. */
1572
+ .seeds-narrative-data-callout {
1573
+ container-type: inline-size;
1574
+ box-sizing: border-box;
1575
+ font-family: var(--font-family);
1576
+ }
1577
+
1578
+ /* Stacked single column by default (narrow). The container query below turns it
1579
+ into the horizontal 1/3 + 2/3 row once there is room. */
1580
+ .seeds-narrative-data-callout-row {
1581
+ box-sizing: border-box;
1582
+ display: flex;
1583
+ flex-direction: column;
1584
+ align-items: center;
1585
+ gap: var(--space-450); /* 24px */
1586
+ }
1587
+
1588
+ /* Visual slot — layout only, no stroke/background so the injected chart controls
1589
+ its own look and its own size. No fixed height: charts like the data-viz
1590
+ DonutChart carry their own intrinsic height (and a legend), so the slot sizes
1591
+ to the chart rather than clipping it. Stacked full-width until the container
1592
+ query expands the row. */
1593
+ .seeds-narrative-data-callout-visual {
1594
+ box-sizing: border-box;
1595
+ display: flex;
1596
+ align-items: center;
1597
+ justify-content: center;
1598
+ width: 100%;
1599
+ min-width: 0;
1600
+ }
1601
+
1602
+ /* Stretch the injected visual to the slot's full width. A fluid-width chart like
1603
+ the v2 DonutChart otherwise shrinks to content inside this centered flex slot,
1604
+ so Highcharts fills that shrunk width and the ring gets width-capped below its
1605
+ fixed 270px height — leaving an empty vertical band. Filling the width lets the
1606
+ ring become height-capped and fill its box top-to-bottom, like the standalone
1607
+ chart story. */
1608
+ .seeds-narrative-data-callout-visual > * {
1609
+ width: 100%;
1610
+ }
1611
+
1612
+ /* Body copy — fills the remaining space. */
1613
+ .seeds-narrative-data-callout-body {
1614
+ box-sizing: border-box;
1615
+ min-width: 0;
1616
+ font-size: var(--font-size-300); /* 16px */
1617
+ line-height: var(--line-height-400); /* ~28px */
1618
+ font-weight: var(--font-weight-normal);
1619
+ color: var(--color-text-body);
1620
+ overflow-wrap: break-word;
1621
+ }
1622
+
1623
+ /* Expand to the horizontal 1/3 + 2/3 split once the component is wide enough.
1624
+ The threshold is on the component's own width (container query), so a narrow
1625
+ callout on a wide screen still stacks. 480px keeps the donut + copy readable
1626
+ side by side. */
1627
+ @container (min-width: 480px) {
1628
+ .seeds-narrative-data-callout-row {
1629
+ flex-direction: row;
1630
+ }
1631
+
1632
+ .seeds-narrative-data-callout-visual {
1633
+ /* Nominally one-third, but never narrower than the injected chart's fixed
1634
+ height (the v2 DonutChart is 270px tall). Below that width a fluid-width,
1635
+ fixed-height chart like the donut gets width-capped and leaves an empty
1636
+ vertical band above/below the ring; the min-width keeps the visual square
1637
+ enough that the ring fills its box top-to-bottom, matching the standalone
1638
+ chart story. */
1639
+ flex: 0 0 33.333%;
1640
+ min-width: 270px;
1641
+ width: auto;
1642
+ }
1643
+
1644
+ .seeds-narrative-data-callout-body {
1645
+ flex: 1 1 0;
1646
+ }
1647
+ }
1648
+
1649
+ }
1650
+
1348
1651
  /* --- seeds-react-narrative-kit --- */
1349
1652
  /**
1350
1653
  * Seeds NarrativeDivider component classes.
@@ -1510,69 +1813,267 @@
1510
1813
 
1511
1814
  /* --- seeds-react-narrative-kit --- */
1512
1815
  /**
1513
- * Seeds NarrativeSummary component classes.
1816
+ * Seeds NarrativeOrderedList component classes.
1514
1817
  * Use these instead of writing out individual Tailwind utility classes.
1515
1818
  *
1516
1819
  * 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.
1820
+ * CSS variable definitions and dark mode support.
1522
1821
  *
1523
1822
  * Usage:
1524
- * <div class="seeds-narrative-summary">
1525
- * <div class="seeds-narrative-summary-grid">…</div>
1823
+ * <div class="seeds-narrative-ordered-list">
1824
+ * <ol class="seeds-narrative-ordered-list-track">
1825
+ * <li class="seeds-narrative-ordered-list-item">…</li>
1826
+ * </ol>
1526
1827
  * </div>
1527
1828
  */
1528
1829
 
1529
1830
  @layer components {
1530
1831
 
1531
- /* Establishes the query container. The grid inside reacts to this element's
1532
- inline size. */
1533
- .seeds-narrative-summary {
1832
+ /* Establishes the query container. The track inside reacts to this element's
1833
+ inline size — a container query can only style descendants of the container,
1834
+ never the container element itself. */
1835
+ .seeds-narrative-ordered-list {
1534
1836
  container-type: inline-size;
1535
1837
  box-sizing: border-box;
1536
1838
  font-family: var(--font-family);
1537
1839
  }
1538
1840
 
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 */
1841
+ /* The list itself, and the default (stacked) layout. The horizontal modifier
1842
+ only expands to a row once the container query below has room, so horizontal
1843
+ collapses back to this stack when narrow. */
1844
+ .seeds-narrative-ordered-list-track {
1845
+ display: flex;
1846
+ flex-direction: column;
1847
+ gap: var(--space-400); /* 16px */
1848
+ margin: 0;
1849
+ padding: 0;
1850
+ list-style: none;
1545
1851
  }
1546
1852
 
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 {
1853
+ /* An item row: the ordinal beside the body, on its own rounded surface. */
1854
+ .seeds-narrative-ordered-list-item {
1552
1855
  display: flex;
1553
- flex-direction: column;
1856
+ gap: var(--space-450); /* 24px */
1554
1857
  align-items: flex-start;
1555
- gap: var(--space-300); /* 8px */
1858
+ box-sizing: border-box;
1556
1859
  min-width: 0;
1860
+ padding: var(--space-400) var(--space-450); /* 16px 24px */
1861
+ border-radius: var(--radius-800); /* 12px */
1862
+ background-color: var(--color-app-bg-base);
1557
1863
  }
1558
1864
 
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;
1865
+ /* The ordinal (01, 02, …). No mono token exists yet, so fall back to a system
1866
+ monospace stack — mirrors the value treatment in metric-highlight.css. */
1867
+ .seeds-narrative-ordered-list-number {
1868
+ margin: 0;
1869
+ flex-shrink: 0;
1870
+ font-family: var(--font-family-mono, ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace);
1871
+ font-size: var(--font-size-700); /* 32px */
1872
+ line-height: var(--line-height-700); /* 40px */
1873
+ font-weight: var(--font-weight-bold);
1874
+ color: var(--color-text-headline);
1573
1875
  }
1574
1876
 
1575
- .seeds-narrative-summary-section {
1877
+ /* Title + description + optional action, stacked. */
1878
+ .seeds-narrative-ordered-list-body {
1879
+ flex: 1 1 auto;
1880
+ display: flex;
1881
+ flex-direction: column;
1882
+ gap: var(--space-200); /* 4px */
1883
+ min-width: 0;
1884
+ }
1885
+
1886
+ /* Title. 16px / 28px — the 28px line-height has no exact type token (the scale
1887
+ skips from 24px to 32px), so the design value is kept verbatim. Same
1888
+ rationale as narrative-summary.css. */
1889
+ .seeds-narrative-ordered-list-title {
1890
+ margin: 0;
1891
+ font-size: var(--font-size-300); /* 16px */
1892
+ line-height: 28px; /* off-scale, see comment above */
1893
+ font-weight: var(--font-weight-bold);
1894
+ color: var(--color-text-body);
1895
+ }
1896
+
1897
+ /* Description. 14px / 24px has no exact type token, so it is kept verbatim —
1898
+ same rationale as the title above. */
1899
+ .seeds-narrative-ordered-list-description {
1900
+ margin: 0;
1901
+ font-size: 14px; /* off-scale, see title above */
1902
+ line-height: 24px;
1903
+ font-weight: var(--font-weight-normal);
1904
+ color: var(--color-text-body);
1905
+ }
1906
+
1907
+ .seeds-narrative-ordered-list-action {
1908
+ padding-top: var(--space-350); /* 12px */
1909
+ }
1910
+
1911
+ /* Expand the horizontal variant to a row of equal columns once the component is
1912
+ wide enough. The threshold is on the component's own width (container query),
1913
+ so a narrow card on a wide screen still stacks. 640px = Tailwind/Seeds sm
1914
+ breakpoint, matching narrative-summary.css. */
1915
+ @container (min-width: 640px) {
1916
+ .seeds-narrative-ordered-list-horizontal {
1917
+ flex-direction: row;
1918
+ }
1919
+
1920
+ .seeds-narrative-ordered-list-horizontal > .seeds-narrative-ordered-list-item {
1921
+ flex: 1 1 0;
1922
+ min-width: 0;
1923
+ }
1924
+ }
1925
+
1926
+ }
1927
+
1928
+ /* --- seeds-react-narrative-kit --- */
1929
+ /**
1930
+ * Seeds NarrativeSocialMediaCard component classes.
1931
+ * Use these instead of writing out individual Tailwind utility classes.
1932
+ *
1933
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1934
+ * CSS variable definitions and dark mode support.
1935
+ *
1936
+ * Usage:
1937
+ * <div class="seeds-narrative-social-media-card">
1938
+ * <div class="seeds-narrative-social-media-card-header">...</div>
1939
+ * <div class="seeds-narrative-social-media-card-content">...</div>
1940
+ * <div class="seeds-narrative-social-media-card-footer">...</div>
1941
+ * </div>
1942
+ */
1943
+
1944
+ /* Import dependent component styles */
1945
+ @import "./narrative-attribution.css";
1946
+
1947
+ @layer components {
1948
+
1949
+ /* Main card container — gray background with rounded corners and padding.
1950
+ Uses Seeds tokens for spacing, colors, and radius to match the design system. */
1951
+ .seeds-narrative-social-media-card {
1952
+ box-sizing: border-box;
1953
+ display: flex;
1954
+ flex-direction: column;
1955
+ align-items: flex-start;
1956
+ max-width: 320px;
1957
+ padding: var(--space-450); /* 24px */
1958
+ border-radius: var(--radius-500); /* 6px */
1959
+ background-color: var(--color-app-bg-base);
1960
+ font-family: var(--font-family);
1961
+ color: var(--color-text-body);
1962
+ }
1963
+
1964
+ /* No background — transparent background for cards that blend seamlessly with the page. */
1965
+ .seeds-narrative-social-media-card--no-background {
1966
+ background-color: transparent;
1967
+ }
1968
+
1969
+ /* Main content area — standard body text styling. */
1970
+ .seeds-narrative-social-media-card-content {
1971
+ flex: 1;
1972
+ margin-top: var(--space-400); /* 16px */
1973
+ font-family: var(--font-family);
1974
+ font-size: 14px;
1975
+ font-style: normal;
1976
+ font-weight: 400;
1977
+ line-height: 24px;
1978
+ color: var(--color-text-body);
1979
+ }
1980
+
1981
+ /* Footer section — horizontal layout for stats with equal spacing. */
1982
+ .seeds-narrative-social-media-card-footer {
1983
+ display: flex;
1984
+ align-items: center;
1985
+ gap: var(--space-400); /* 16px */
1986
+ margin-top: var(--space-400); /* 16px */;
1987
+ }
1988
+
1989
+ /* Hide footer when empty (no metadata items). */
1990
+ .seeds-narrative-social-media-card-footer:empty {
1991
+ display: none;
1992
+ }
1993
+
1994
+ /* Individual stat container — icon + value in horizontal layout. */
1995
+ .seeds-narrative-social-media-card-stat {
1996
+ display: flex;
1997
+ align-items: center;
1998
+ gap: var(--space-200); /* 4px */
1999
+ }
2000
+
2001
+ /* Stat value text — monospace font for numeric values. */
2002
+ .seeds-narrative-social-media-card-stat-value {
2003
+ font-family: var(--font-family-mono, ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace); font-size: 14px;
2004
+ font-style: normal;
2005
+ font-weight: 400;
2006
+ line-height: 24px;
2007
+ color: var(--color-text-body);
2008
+ }
2009
+
2010
+ }
2011
+
2012
+ /* --- seeds-react-narrative-kit --- */
2013
+ /**
2014
+ * Seeds NarrativeSummary component classes.
2015
+ * Use these instead of writing out individual Tailwind utility classes.
2016
+ *
2017
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
2018
+ * CSS variable definitions and dark mode support. Also relies on
2019
+ * narrative-headline.css (headline) and eyebrow-token.css (eyebrow).
2020
+ *
2021
+ * The layout is a CSS grid driven by a container query on the root, so the
2022
+ * columns collapse based on the width the component is given, not the viewport.
2023
+ *
2024
+ * Usage:
2025
+ * <div class="seeds-narrative-summary">
2026
+ * <div class="seeds-narrative-summary-grid">…</div>
2027
+ * </div>
2028
+ */
2029
+
2030
+ @layer components {
2031
+
2032
+ /* Establishes the query container. The grid inside reacts to this element's
2033
+ inline size. */
2034
+ .seeds-narrative-summary {
2035
+ container-type: inline-size;
2036
+ box-sizing: border-box;
2037
+ font-family: var(--font-family);
2038
+ }
2039
+
2040
+ /* Stacked single column by default (narrow). The container query below expands
2041
+ it once there is room. */
2042
+ .seeds-narrative-summary-grid {
2043
+ display: grid;
2044
+ grid-template-columns: 1fr;
2045
+ gap: var(--space-450); /* 24px */
2046
+ }
2047
+
2048
+ /* The lead column: eyebrow, headline, optional action. align-items:flex-start
2049
+ keeps the eyebrow pill and the action sized to their content — without it the
2050
+ column's default stretch would blow the eyebrow out to full width. The
2051
+ headline still fills and wraps because its text is wider than the track. */
2052
+ .seeds-narrative-summary-lead {
2053
+ display: flex;
2054
+ flex-direction: column;
2055
+ align-items: flex-start;
2056
+ gap: var(--space-300); /* 8px */
2057
+ min-width: 0;
2058
+ }
2059
+
2060
+ /* The headline area grows so the action anchors toward the bottom of the lead
2061
+ column when the neighboring columns are taller. align-self:stretch fills the
2062
+ track width (the lead column pins other items to flex-start) so the headline
2063
+ wraps at the column edge regardless of its length. */
2064
+ .seeds-narrative-summary-headline {
2065
+ flex: 1 1 auto;
2066
+ align-self: stretch;
2067
+ }
2068
+
2069
+ /* In three-column mode the content wrapper is transparent to the grid, so its
2070
+ two sections become grid items in their own columns. In two-column mode the
2071
+ container query below turns it into a real, stacking grid item. */
2072
+ .seeds-narrative-summary-content {
2073
+ display: contents;
2074
+ }
2075
+
2076
+ .seeds-narrative-summary-section {
1576
2077
  display: flex;
1577
2078
  flex-direction: column;
1578
2079
  gap: var(--space-300); /* 8px */
@@ -1641,20 +2142,17 @@
1641
2142
  * Seeds PullQuote component classes.
1642
2143
  * Use these instead of writing out individual Tailwind utility classes.
1643
2144
  *
1644
- * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
1645
- * CSS variable definitions and dark mode support.
2145
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css and
2146
+ * ai-container.css imported for CSS variable definitions and surface styles.
1646
2147
  *
1647
2148
  * Usage:
1648
- * <figure class="seeds-pull-quote">…</figure> // subtle (default)
1649
- * <figure class="seeds-pull-quote seeds-pull-quote-vivid">…</figure>
2149
+ * <figure class="seeds-pull-quote seeds-ai-container">…</figure> // subtle (default)
2150
+ * <figure class="seeds-pull-quote seeds-ai-container seeds-ai-container-vivid seeds-pull-quote-vivid">…</figure>
1650
2151
  */
1651
2152
 
1652
2153
  @layer components {
1653
2154
 
1654
2155
  .seeds-pull-quote {
1655
- position: relative;
1656
- overflow: hidden;
1657
- box-sizing: border-box;
1658
2156
  width: 100%;
1659
2157
  display: flex;
1660
2158
  flex-direction: column;
@@ -1663,24 +2161,6 @@
1663
2161
  /* 40px block / 48px inline — 48px is off the space scale, so derive it from
1664
2162
  two tokens (40 + 8) rather than hardcoding an off-scale value. */
1665
2163
  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
2164
  }
1685
2165
 
1686
2166
  /* The accented bar holding the quote and attribution. */
@@ -1727,6 +2207,197 @@
1727
2207
 
1728
2208
  }
1729
2209
 
2210
+ /* --- seeds-react-progress --- */
2211
+ /**
2212
+ * Seeds Progress component classes
2213
+ * Use these instead of writing out individual Tailwind utility classes.
2214
+ *
2215
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
2216
+ * CSS variable definitions and dark mode support.
2217
+ *
2218
+ * Usage:
2219
+ * <div class="Progress seeds-progress"><div class="seeds-progress-indicator" /></div>
2220
+ */
2221
+
2222
+ @layer components {
2223
+ .seeds-progress {
2224
+ position: relative;
2225
+ overflow: hidden;
2226
+ width: 100%;
2227
+ height: 8px;
2228
+ border-radius: var(--radius-outer);
2229
+ background-color: var(--color-container-border-base);
2230
+ }
2231
+
2232
+ .seeds-progress-indicator {
2233
+ height: 100%;
2234
+ width: 100%;
2235
+ border-radius: var(--radius-outer);
2236
+ background-color: var(--color-icon-base);
2237
+ transition: transform 150ms ease;
2238
+ }
2239
+ }
2240
+
2241
+ /* --- seeds-react-select --- */
2242
+ /**
2243
+ * Seeds Select component classes
2244
+ * Use these instead of writing out individual Tailwind utility classes.
2245
+ *
2246
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
2247
+ * CSS variable definitions and dark mode support.
2248
+ *
2249
+ * Usage:
2250
+ * <div class="seeds-select seeds-select-default">
2251
+ * <select class="seeds-select-input">…</select>
2252
+ * <span class="seeds-select-arrow seeds-select-arrow-default">…</span>
2253
+ * </div>
2254
+ */
2255
+
2256
+ @layer components {
2257
+ .seeds-select {
2258
+ position: relative;
2259
+ box-sizing: border-box;
2260
+ }
2261
+
2262
+ .seeds-select .seeds-select-input {
2263
+ box-sizing: border-box;
2264
+ width: 100%;
2265
+ border: 1px solid var(--color-form-border-base);
2266
+ border-radius: var(--radius-500);
2267
+ background-color: var(--color-form-bg-base);
2268
+ color: var(--color-text-body);
2269
+ cursor: pointer;
2270
+ outline: none;
2271
+ appearance: none;
2272
+ transition:
2273
+ border-color var(--duration-fast) var(--ease-ease_in),
2274
+ box-shadow var(--duration-fast) var(--ease-ease_in);
2275
+ font-family: var(--font-family);
2276
+ font-weight: var(--font-weight-normal);
2277
+ margin: 0;
2278
+ /* We do this because the Sprout app sets it to hidden in Classic mode. We can delete after Nectar launches. */
2279
+ visibility: visible;
2280
+ }
2281
+
2282
+ /* kill the dropdown arrow on IE 11 */
2283
+ .seeds-select .seeds-select-input::-ms-expand {
2284
+ display: none;
2285
+ }
2286
+
2287
+ .seeds-select .seeds-select-input:focus {
2288
+ box-shadow:
2289
+ 0 0 0 1px var(--color-button-primary-bg-base),
2290
+ 0 0px 0px 4px
2291
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
2292
+ outline: none;
2293
+ }
2294
+
2295
+ /* Fix for red ring when input is marked required in Firefox */
2296
+ .seeds-select
2297
+ .seeds-select-input:not(output):not(:focus):-moz-ui-invalid {
2298
+ box-shadow: none;
2299
+ }
2300
+
2301
+ /* size: default */
2302
+ .seeds-select-default .seeds-select-input {
2303
+ padding: var(--space-300) var(--space-500) var(--space-300) var(--space-300);
2304
+ font-size: var(--font-size-200);
2305
+ line-height: normal;
2306
+ }
2307
+
2308
+ /* size: large */
2309
+ .seeds-select-large .seeds-select-input {
2310
+ padding: var(--space-350) var(--space-600) var(--space-350) var(--space-400);
2311
+ font-size: var(--font-size-300);
2312
+ line-height: var(--line-height-300);
2313
+ }
2314
+
2315
+ /* size: small */
2316
+ .seeds-select-small .seeds-select-input {
2317
+ padding: var(--space-200) var(--space-500) var(--space-200) var(--space-200);
2318
+ font-size: var(--font-size-200);
2319
+ line-height: normal;
2320
+ }
2321
+
2322
+ .seeds-select-arrow {
2323
+ position: absolute;
2324
+ top: 50%;
2325
+ transform: translateY(-50%);
2326
+ color: var(--color-icon-base);
2327
+ pointer-events: none;
2328
+ }
2329
+
2330
+ .seeds-select-arrow-default,
2331
+ .seeds-select-arrow-small {
2332
+ right: var(--space-300);
2333
+ }
2334
+
2335
+ .seeds-select-arrow-large {
2336
+ right: var(--space-350);
2337
+ }
2338
+
2339
+ /* disabled */
2340
+ .seeds-select-disabled {
2341
+ opacity: 0.4;
2342
+ }
2343
+
2344
+ .seeds-select-disabled .seeds-select-input {
2345
+ cursor: not-allowed;
2346
+ }
2347
+
2348
+ /* invalid */
2349
+ .seeds-select-invalid .seeds-select-input {
2350
+ border-color: var(--color-form-border-error);
2351
+ }
2352
+
2353
+ .seeds-select-invalid .seeds-select-arrow {
2354
+ color: var(--color-icon-error);
2355
+ }
2356
+ }
2357
+
2358
+ /* --- seeds-react-spot-illustration --- */
2359
+ /**
2360
+ * Seeds SpotIllustration component classes
2361
+ * Use these instead of writing out individual Tailwind utility classes.
2362
+ *
2363
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
2364
+ * CSS variable definitions and dark mode support.
2365
+ *
2366
+ * Usage:
2367
+ * <svg class="seeds-spot-illustration seeds-spot-illustration-red">…</svg>
2368
+ */
2369
+
2370
+ @layer components {
2371
+ .seeds-spot-illustration {
2372
+ fill: var(--color-illustration-fill);
2373
+ color: var(--color-illustration-stroke);
2374
+ }
2375
+
2376
+ .seeds-spot-illustration-red {
2377
+ fill: var(--color-red-400);
2378
+ }
2379
+
2380
+ .seeds-spot-illustration-green {
2381
+ fill: var(--color-green-400);
2382
+ }
2383
+
2384
+ .seeds-spot-illustration-yellow {
2385
+ fill: var(--color-yellow-400);
2386
+ }
2387
+
2388
+ .seeds-spot-illustration-magenta {
2389
+ fill: var(--color-magenta-400);
2390
+ }
2391
+
2392
+ .seeds-spot-illustration-purple {
2393
+ fill: var(--color-purple-400);
2394
+ }
2395
+
2396
+ .seeds-spot-illustration-aqua {
2397
+ fill: var(--color-aqua-400);
2398
+ }
2399
+ }
2400
+
1730
2401
  /* --- seeds-react-text --- */
1731
2402
  /**
1732
2403
  * Seeds Text component classes
@@ -1762,4 +2433,214 @@
1762
2433
  word-break: break-word;
1763
2434
  hyphens: auto;
1764
2435
  }
2436
+
2437
+ .seeds-text-headline {
2438
+ color: var(--color-text-headline);
2439
+ font-weight: var(--font-weight-bold);
2440
+ font-size: var(--font-size-400);
2441
+ line-height: var(--line-height-400);
2442
+ }
2443
+
2444
+ .seeds-text-subheadline {
2445
+ color: var(--color-text-headline);
2446
+ font-weight: var(--font-weight-bold);
2447
+ font-size: var(--font-size-300);
2448
+ line-height: var(--line-height-300);
2449
+ }
2450
+
2451
+ .seeds-text-small-subheadline {
2452
+ color: var(--color-text-headline);
2453
+ font-weight: var(--font-weight-bold);
2454
+ font-size: var(--font-size-200);
2455
+ line-height: var(--line-height-200);
2456
+ }
2457
+
2458
+ .seeds-text-byline {
2459
+ color: var(--color-text-subtext);
2460
+ font-weight: var(--font-weight-normal);
2461
+ font-size: var(--font-size-200);
2462
+ line-height: var(--line-height-200);
2463
+ }
2464
+
2465
+ .seeds-text-small-byline {
2466
+ color: var(--color-text-subtext);
2467
+ font-weight: var(--font-weight-normal);
2468
+ font-size: var(--font-size-100);
2469
+ line-height: var(--line-height-100);
2470
+ }
2471
+
2472
+ .seeds-text-body {
2473
+ color: var(--color-text-body);
2474
+ font-weight: var(--font-weight-normal);
2475
+ font-size: var(--font-size-300);
2476
+ line-height: var(--line-height-300);
2477
+ }
2478
+
2479
+ .seeds-text-small-body {
2480
+ color: var(--color-text-body);
2481
+ font-weight: var(--font-weight-normal);
2482
+ font-size: var(--font-size-200);
2483
+ line-height: var(--line-height-200);
2484
+ }
2485
+ }
2486
+ /* --- seeds-react-token --- */
2487
+ /**
2488
+ * Seeds Token component classes
2489
+ * Use these instead of writing out individual Tailwind utility classes.
2490
+ *
2491
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
2492
+ * CSS variable definitions and dark mode support.
2493
+ *
2494
+ * Usage:
2495
+ * <button class="seeds-token seeds-token-closeable">Token</button>
2496
+ */
2497
+
2498
+ @layer components {
2499
+ .seeds-token {
2500
+ position: relative;
2501
+ display: inline-flex;
2502
+ align-items: center;
2503
+ margin: 0;
2504
+ outline: none;
2505
+ font-family: var(--font-family);
2506
+ font-size: var(--font-size-200);
2507
+ line-height: 13px;
2508
+ font-weight: var(--font-weight-normal);
2509
+ border: 1px solid var(--color-container-border-base);
2510
+ border-radius: var(--radius-500);
2511
+ color: var(--color-text-body);
2512
+ background: var(--color-container-bg-base);
2513
+ padding: var(--space-200) var(--space-300);
2514
+ transition: all var(--duration-fast) var(--ease-ease_inout);
2515
+ }
2516
+
2517
+ .seeds-token:focus {
2518
+ box-shadow:
2519
+ 0 0 0 1px var(--color-button-primary-bg-base),
2520
+ 0 0px 0px 4px
2521
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
2522
+ outline: none;
2523
+ }
2524
+
2525
+ .seeds-token::-moz-focus-inner {
2526
+ border: 0;
2527
+ }
2528
+
2529
+ /* closeable / clickable */
2530
+ .seeds-token-closeable {
2531
+ cursor: pointer;
2532
+ }
2533
+
2534
+ .seeds-token-closeable:hover,
2535
+ .seeds-token-closeable:active {
2536
+ box-shadow: var(--shadow-low);
2537
+ border: 1px solid
2538
+ color-mix(in srgb, var(--color-container-border-base), black 20%);
2539
+ }
2540
+
2541
+ /* palette="blue" */
2542
+ .seeds-token-blue {
2543
+ background: var(--color-container-bg-decorative-blue);
2544
+ border: 1px solid var(--color-container-border-decorative-blue);
2545
+ }
2546
+
2547
+ .seeds-token-blue:hover,
2548
+ .seeds-token-blue:active {
2549
+ cursor: pointer;
2550
+ box-shadow: var(--shadow-low);
2551
+ border: 1px solid
2552
+ color-mix(in srgb, var(--color-container-border-decorative-blue), black 20%);
2553
+ }
2554
+
2555
+ /* disabled */
2556
+ .seeds-token-disabled {
2557
+ opacity: 0.4;
2558
+ cursor: not-allowed;
2559
+ }
2560
+
2561
+ .seeds-token-disabled:hover,
2562
+ .seeds-token-disabled:active {
2563
+ box-shadow: none;
2564
+ border: 1px solid var(--color-container-border-base);
2565
+ }
2566
+
2567
+ /* valid={false} */
2568
+ .seeds-token-invalid {
2569
+ color: var(--color-text-error);
2570
+ background: var(--color-container-bg-error);
2571
+ border: 1px solid var(--color-container-border-error);
2572
+ }
2573
+
2574
+ .seeds-token-invalid:hover {
2575
+ box-shadow: var(--shadow-low);
2576
+ border: 1px solid
2577
+ color-mix(in srgb, var(--color-container-border-error), black 20%);
2578
+ }
2579
+
2580
+ /* hasWarning */
2581
+ .seeds-token-warning {
2582
+ background: var(--color-container-bg-warning);
2583
+ border: 1px solid var(--color-container-border-warning);
2584
+ }
2585
+
2586
+ .seeds-token-warning:hover {
2587
+ box-shadow: var(--shadow-low);
2588
+ border: 1px solid
2589
+ color-mix(in srgb, var(--color-container-border-warning), black 20%);
2590
+ }
2591
+
2592
+ /* isGenerated (AI) */
2593
+ .seeds-token-generated {
2594
+ background: var(--color-container-bg-ai_generated);
2595
+ border: 1px solid var(--color-container-border-ai_generated);
2596
+ color: var(--color-text-ai_generated);
2597
+ }
2598
+
2599
+ .seeds-token-generated:hover {
2600
+ box-shadow: var(--shadow-low);
2601
+ border: 1px solid
2602
+ color-mix(in srgb, var(--color-container-border-ai_generated), black 20%);
2603
+ }
2604
+
2605
+ /* Dark mode: useInteractiveColor lightens (white) instead of darkening (black). */
2606
+ [data-theme="dark"] .seeds-token-closeable:hover,
2607
+ [data-theme="dark"] .seeds-token-closeable:active,
2608
+ .dark .seeds-token-closeable:hover,
2609
+ .dark .seeds-token-closeable:active,
2610
+ .lights-out .seeds-token-closeable:hover,
2611
+ .lights-out .seeds-token-closeable:active {
2612
+ border: 1px solid
2613
+ color-mix(in srgb, var(--color-container-border-base), white 20%);
2614
+ }
2615
+
2616
+ [data-theme="dark"] .seeds-token-blue:hover,
2617
+ [data-theme="dark"] .seeds-token-blue:active,
2618
+ .dark .seeds-token-blue:hover,
2619
+ .dark .seeds-token-blue:active,
2620
+ .lights-out .seeds-token-blue:hover,
2621
+ .lights-out .seeds-token-blue:active {
2622
+ border: 1px solid
2623
+ color-mix(in srgb, var(--color-container-border-decorative-blue), white 20%);
2624
+ }
2625
+
2626
+ [data-theme="dark"] .seeds-token-invalid:hover,
2627
+ .dark .seeds-token-invalid:hover,
2628
+ .lights-out .seeds-token-invalid:hover {
2629
+ border: 1px solid
2630
+ color-mix(in srgb, var(--color-container-border-error), white 20%);
2631
+ }
2632
+
2633
+ [data-theme="dark"] .seeds-token-warning:hover,
2634
+ .dark .seeds-token-warning:hover,
2635
+ .lights-out .seeds-token-warning:hover {
2636
+ border: 1px solid
2637
+ color-mix(in srgb, var(--color-container-border-warning), white 20%);
2638
+ }
2639
+
2640
+ [data-theme="dark"] .seeds-token-generated:hover,
2641
+ .dark .seeds-token-generated:hover,
2642
+ .lights-out .seeds-token-generated:hover {
2643
+ border: 1px solid
2644
+ color-mix(in srgb, var(--color-container-border-ai_generated), white 20%);
2645
+ }
1765
2646
  }