@sproutsocial/racine 31.7.15 → 31.7.16

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.
@@ -98,7 +98,8 @@
98
98
  background: var(--color-container-bg-base);
99
99
  }
100
100
 
101
- .accordion-item[data-state="open"] .seeds-accordion-trigger[data-styled="true"] {
101
+ .accordion-item[data-state="open"]
102
+ .seeds-accordion-trigger[data-styled="true"] {
102
103
  border-bottom: 1px solid transparent;
103
104
  }
104
105
 
@@ -521,7 +522,6 @@
521
522
  */
522
523
 
523
524
  @layer components {
524
-
525
525
  .seeds-btn {
526
526
  display: inline-block;
527
527
  box-sizing: border-box;
@@ -544,9 +544,9 @@
544
544
 
545
545
  .seeds-btn:focus {
546
546
  outline: none;
547
- box-shadow:
548
- 0 0 0 1px var(--color-button-primary-bg-base),
549
- 0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
547
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
548
+ 0 0 0 4px
549
+ color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
550
550
  }
551
551
 
552
552
  /* KNOWN ISSUE: `small` currently renders identically to the default size — both use
@@ -676,8 +676,7 @@
676
676
  border-radius: inherit;
677
677
  padding: 1px;
678
678
  background: var(--color-gradient-ai);
679
- -webkit-mask:
680
- linear-gradient(#fff 0 0) content-box,
679
+ -webkit-mask: linear-gradient(#fff 0 0) content-box,
681
680
  linear-gradient(#fff 0 0);
682
681
  -webkit-mask-composite: xor;
683
682
  mask-composite: exclude;
@@ -747,10 +746,10 @@
747
746
  color: var(--color-button-pill-text-hover);
748
747
  background-color: var(--color-button-pill-bg-active);
749
748
  }
750
-
751
749
  }
752
750
 
753
751
  /* end @layer components */
752
+
754
753
  /* --- seeds-react-character-counter --- */
755
754
  /**
756
755
  * Seeds CharacterCounter component classes
@@ -1018,9 +1017,9 @@
1018
1017
 
1019
1018
  .seeds-content-header-trigger:focus-visible {
1020
1019
  outline: none;
1021
- box-shadow:
1022
- 0 0 0 1px var(--color-button-primary-bg-base),
1023
- 0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
1020
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
1021
+ 0 0 0 4px
1022
+ color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
1024
1023
  }
1025
1024
  }
1026
1025
 
@@ -1184,8 +1183,12 @@
1184
1183
  transform: translateX(-100%);
1185
1184
  }
1186
1185
 
1187
- .seeds-drawer-popup--bottom:not(.seeds-drawer-popup--snap)[data-starting-style],
1188
- .seeds-drawer-popup--bottom:not(.seeds-drawer-popup--snap)[data-ending-style] {
1186
+ .seeds-drawer-popup--bottom:not(
1187
+ .seeds-drawer-popup--snap
1188
+ )[data-starting-style],
1189
+ .seeds-drawer-popup--bottom:not(
1190
+ .seeds-drawer-popup--snap
1191
+ )[data-ending-style] {
1189
1192
  transform: translateY(calc(100% - var(--bleed) + 2px));
1190
1193
  }
1191
1194
 
@@ -1199,8 +1202,12 @@
1199
1202
  RAIL_OFFSET). Translating the popup by its own height alone leaves the rail
1200
1203
  visible at the bottom of the viewport during enter/exit, so we add the rail's
1201
1204
  outset: RAIL_BUTTON_HEIGHT (32) + RAIL_OFFSET (12) = 44px. */
1202
- .seeds-drawer-popup--bottom.seeds-drawer-popup--action-rail:not(.seeds-drawer-popup--snap)[data-starting-style],
1203
- .seeds-drawer-popup--bottom.seeds-drawer-popup--action-rail:not(.seeds-drawer-popup--snap)[data-ending-style] {
1205
+ .seeds-drawer-popup--bottom.seeds-drawer-popup--action-rail:not(
1206
+ .seeds-drawer-popup--snap
1207
+ )[data-starting-style],
1208
+ .seeds-drawer-popup--bottom.seeds-drawer-popup--action-rail:not(
1209
+ .seeds-drawer-popup--snap
1210
+ )[data-ending-style] {
1204
1211
  transform: translateY(calc(100% - var(--bleed) + 2px + 44px));
1205
1212
  }
1206
1213
 
@@ -1226,7 +1233,9 @@
1226
1233
  /* Bottom non-snap stacked bottom-sheet animation. Snap-point drawers don't
1227
1234
  participate: the stack math overwrites --translate-y and clips overflow,
1228
1235
  which collides with base-ui's snap-offset transform. */
1229
- .seeds-drawer-popup--bottom:not(.seeds-drawer-popup--snap)[data-nested-drawer-open] {
1236
+ .seeds-drawer-popup--bottom:not(
1237
+ .seeds-drawer-popup--snap
1238
+ )[data-nested-drawer-open] {
1230
1239
  --stack-step: 0.05;
1231
1240
  --stack-progress: clamp(0, var(--drawer-swipe-progress), 1);
1232
1241
  /* Override default vars; base transform rule picks them up automatically */
@@ -1714,8 +1723,7 @@
1714
1723
  background-color: var(--color-form-bg-base);
1715
1724
  color: var(--color-text-body);
1716
1725
  outline: none;
1717
- transition:
1718
- border-color var(--duration-fast) var(--ease-ease_in),
1726
+ transition: border-color var(--duration-fast) var(--ease-ease_in),
1719
1727
  box-shadow var(--duration-fast) var(--ease-ease_in);
1720
1728
  font-family: var(--font-family);
1721
1729
  font-weight: var(--font-weight-normal);
@@ -1741,9 +1749,9 @@
1741
1749
 
1742
1750
  .seeds-input input:focus {
1743
1751
  outline: none;
1744
- box-shadow:
1745
- 0 0 0 1px var(--color-button-primary-bg-base),
1746
- 0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
1752
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
1753
+ 0 0 0 4px
1754
+ color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
1747
1755
  }
1748
1756
 
1749
1757
  /* Fix for red ring when input is marked required in Firefox */
@@ -1905,9 +1913,9 @@
1905
1913
 
1906
1914
  .seeds-link:focus {
1907
1915
  outline: none;
1908
- box-shadow:
1909
- 0 0 0 1px var(--color-button-primary-bg-base),
1910
- 0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
1916
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
1917
+ 0 0 0 4px
1918
+ color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
1911
1919
  }
1912
1920
 
1913
1921
  .seeds-link:focus:active {
@@ -2095,31 +2103,29 @@
2095
2103
  */
2096
2104
 
2097
2105
  @layer components {
2098
-
2099
- .seeds-ai-container {
2100
- position: relative;
2101
- overflow: hidden;
2102
- box-sizing: border-box;
2103
- border-radius: var(--radius-800);
2104
- box-shadow: var(--shadow-low);
2105
- font-family: var(--font-family);
2106
- /* Subtle (default): the 20% AI gradient tint composited over the base
2106
+ .seeds-ai-container {
2107
+ position: relative;
2108
+ overflow: hidden;
2109
+ box-sizing: border-box;
2110
+ border-radius: var(--radius-800);
2111
+ box-shadow: var(--shadow-low);
2112
+ font-family: var(--font-family);
2113
+ /* Subtle (default): the 20% AI gradient tint composited over the base
2107
2114
  surface. --color-gradient-ai-subtle is already translucent, so layering it
2108
2115
  over the opaque base color produces the soft wash. */
2109
- background-color: var(--color-container-bg-base);
2110
- background-image: var(--color-gradient-ai-subtle);
2111
- color: var(--color-text-headline);
2112
- }
2116
+ background-color: var(--color-container-bg-base);
2117
+ background-image: var(--color-gradient-ai-subtle);
2118
+ color: var(--color-text-headline);
2119
+ }
2113
2120
 
2114
- /* Vivid: the full-saturation AI gradient with white content. White has no
2121
+ /* Vivid: the full-saturation AI gradient with white content. White has no
2115
2122
  semantic Seeds token; it is part of the AI gradient treatment (mirrors the
2116
2123
  raw brand hex used in --color-gradient-ai). */
2117
- .seeds-ai-container-vivid {
2118
- background-color: transparent;
2119
- background-image: var(--color-gradient-ai);
2120
- color: #fff;
2121
- }
2122
-
2124
+ .seeds-ai-container-vivid {
2125
+ background-color: transparent;
2126
+ background-image: var(--color-gradient-ai);
2127
+ color: #fff;
2128
+ }
2123
2129
  }
2124
2130
 
2125
2131
  /* --- seeds-react-narrative-kit --- */
@@ -2135,30 +2141,28 @@
2135
2141
  */
2136
2142
 
2137
2143
  @layer components {
2138
-
2139
- /* A solid gray pill matching the design: background and border are both the
2144
+ /* A solid gray pill matching the design: background and border are both the
2140
2145
  #dee1e1 container-border-base token, which also tracks dark mode. The two
2141
2146
  pixel literals below have no exact theme token — the --space scale skips 6px
2142
2147
  (4px→8px) and the --font-size scale skips 12px (11px→13px) — so the design's
2143
2148
  values are kept verbatim. All colors use tokens. */
2144
- .seeds-eyebrow-token {
2145
- box-sizing: border-box;
2146
- display: inline-flex;
2147
- align-items: center;
2148
- justify-content: center;
2149
- gap: var(--space-100); /* 2px */
2150
- padding: var(--space-100) var(--space-300); /* 2px / 8px */
2151
- border: 1px solid var(--color-container-border-base); /* #dee1e1 */
2152
- border-radius: var(--radius-500); /* 6px */
2153
- background-color: var(--color-container-border-base); /* #dee1e1 */
2154
- font-family: var(--font-family);
2155
- font-size: 12px; /* text-sm */
2156
- line-height: 20px;
2157
- font-weight: var(--font-weight-normal);
2158
- color: var(--color-text-body);
2159
- white-space: nowrap;
2160
- }
2161
-
2149
+ .seeds-eyebrow-token {
2150
+ box-sizing: border-box;
2151
+ display: inline-flex;
2152
+ align-items: center;
2153
+ justify-content: center;
2154
+ gap: var(--space-100); /* 2px */
2155
+ padding: var(--space-100) var(--space-300); /* 2px / 8px */
2156
+ border: 1px solid var(--color-container-border-base); /* #dee1e1 */
2157
+ border-radius: var(--radius-500); /* 6px */
2158
+ background-color: var(--color-container-border-base); /* #dee1e1 */
2159
+ font-family: var(--font-family);
2160
+ font-size: 12px; /* text-sm */
2161
+ line-height: 20px;
2162
+ font-weight: var(--font-weight-normal);
2163
+ color: var(--color-text-body);
2164
+ white-space: nowrap;
2165
+ }
2162
2166
  }
2163
2167
 
2164
2168
  /* --- seeds-react-narrative-kit --- */
@@ -2177,167 +2181,175 @@
2177
2181
  */
2178
2182
 
2179
2183
  @layer components {
2180
-
2181
- .seeds-metric-highlight {
2182
- box-sizing: border-box;
2183
- display: flex;
2184
- /* Wrap the fixed-width chart onto its own line when the metric block + chart
2184
+ .seeds-metric-highlight {
2185
+ box-sizing: border-box;
2186
+ display: flex;
2187
+ /* Wrap the fixed-width chart onto its own line when the metric block + chart
2185
2188
  can't sit side by side (narrow cards / mobile). The metric block claims its
2186
2189
  min-content width below, so a cramped row drops the chart down rather than
2187
2190
  overflowing the card and getting clipped by the container. */
2188
- flex-wrap: wrap;
2189
- align-items: flex-start;
2190
- gap: var(--space-350); /* 12px */
2191
- border-radius: var(--radius-800); /* 12px */
2192
- font-family: var(--font-family);
2193
- /* Container (default): a padded gray app surface (matches the design's
2191
+ flex-wrap: wrap;
2192
+ align-items: flex-start;
2193
+ gap: var(--space-350); /* 12px */
2194
+ border-radius: var(--radius-800); /* 12px */
2195
+ font-family: var(--font-family);
2196
+ /* Container (default): a padded gray app surface (matches the design's
2194
2197
  #f3f4f4 box). `-bare` strips it. */
2195
- padding: var(--space-400) var(--space-450); /* 16px / 24px */
2196
- background-color: var(--color-app-bg-base);
2197
- }
2198
+ padding: var(--space-400) var(--space-450); /* 16px / 24px */
2199
+ background-color: var(--color-app-bg-base);
2200
+ }
2198
2201
 
2199
- .seeds-metric-highlight-bare {
2200
- padding: 0;
2201
- background-color: transparent;
2202
- }
2202
+ .seeds-metric-highlight-bare {
2203
+ padding: 0;
2204
+ background-color: transparent;
2205
+ }
2203
2206
 
2204
- .seeds-metric-highlight-vertical {
2205
- flex-direction: column;
2206
- }
2207
+ .seeds-metric-highlight-vertical {
2208
+ flex-direction: column;
2209
+ }
2207
2210
 
2208
- /* The metric block: label + value/trend. Grows to fill the row in horizontal. */
2209
- .seeds-metric-highlight-metric {
2210
- box-sizing: border-box;
2211
- display: flex;
2212
- flex-direction: column;
2213
- align-items: flex-start;
2214
- gap: var(--space-200); /* 4px */
2215
- /* Grow to fill the row, but never shrink below the metric's own content
2211
+ /* The metric block: label + value/trend. Grows to fill the row in horizontal. */
2212
+ .seeds-metric-highlight-metric {
2213
+ box-sizing: border-box;
2214
+ display: flex;
2215
+ flex-direction: column;
2216
+ align-items: flex-start;
2217
+ gap: var(--space-200); /* 4px */
2218
+ /* Grow to fill the row, but never shrink below the metric's own content
2216
2219
  (the nowrap value + trend pill). That min-content floor is what forces the
2217
2220
  chart to wrap below on narrow cards instead of the row overflowing. */
2218
- flex: 1 1 auto;
2219
- min-width: min-content;
2220
- }
2221
+ flex: 1 1 auto;
2222
+ min-width: min-content;
2223
+ }
2221
2224
 
2222
- .seeds-metric-highlight-vertical .seeds-metric-highlight-metric {
2223
- width: 100%;
2224
- flex: 0 0 auto;
2225
- }
2225
+ .seeds-metric-highlight-vertical .seeds-metric-highlight-metric {
2226
+ width: 100%;
2227
+ flex: 0 0 auto;
2228
+ }
2226
2229
 
2227
- /* Small: label and value collapse onto a single centered row. */
2228
- .seeds-metric-highlight-small .seeds-metric-highlight-metric {
2229
- flex-direction: row;
2230
- align-items: center;
2231
- gap: var(--space-300); /* 8px */
2232
- }
2230
+ /* Small: label and value collapse onto a single centered row. */
2231
+ .seeds-metric-highlight-small .seeds-metric-highlight-metric {
2232
+ flex-direction: row;
2233
+ align-items: center;
2234
+ gap: var(--space-300); /* 8px */
2235
+ }
2233
2236
 
2234
- .seeds-metric-highlight-label {
2235
- margin: 0;
2236
- font-size: var(--font-size-300); /* 16px */
2237
- line-height: var(--line-height-400); /* ~28px */
2238
- font-weight: var(--font-weight-normal);
2239
- color: var(--color-text-body);
2240
- overflow-wrap: break-word;
2241
- }
2237
+ .seeds-metric-highlight-label {
2238
+ margin: 0;
2239
+ font-size: var(--font-size-300); /* 16px */
2240
+ line-height: var(--line-height-400); /* ~28px */
2241
+ font-weight: var(--font-weight-normal);
2242
+ color: var(--color-text-body);
2243
+ overflow-wrap: break-word;
2244
+ }
2242
2245
 
2243
- /* In small, the label takes the slack so the value/trend align to the end. */
2244
- .seeds-metric-highlight-small .seeds-metric-highlight-label {
2245
- flex: 1 0 0;
2246
- min-width: 0;
2247
- }
2246
+ /* In small, the label takes the slack so the value/trend align to the end. */
2247
+ .seeds-metric-highlight-small .seeds-metric-highlight-label {
2248
+ flex: 1 0 0;
2249
+ min-width: 0;
2250
+ }
2248
2251
 
2249
- .seeds-metric-highlight-value-row {
2250
- display: flex;
2251
- flex-wrap: wrap; /* trend pill drops under the value on very narrow cards */
2252
- align-items: center;
2253
- gap: var(--space-300); /* 8px */
2254
- }
2252
+ .seeds-metric-highlight-value-row {
2253
+ display: flex;
2254
+ flex-wrap: wrap; /* trend pill drops under the value on very narrow cards */
2255
+ align-items: center;
2256
+ gap: var(--space-300); /* 8px */
2257
+ }
2255
2258
 
2256
- .seeds-metric-highlight-small .seeds-metric-highlight-value-row {
2257
- justify-content: flex-end;
2258
- }
2259
+ .seeds-metric-highlight-small .seeds-metric-highlight-value-row {
2260
+ justify-content: flex-end;
2261
+ }
2259
2262
 
2260
- .seeds-metric-highlight-value {
2261
- margin: 0;
2262
- /* No mono token exists yet; fall back to a system monospace stack. Mirrors the
2263
+ .seeds-metric-highlight-value {
2264
+ margin: 0;
2265
+ /* No mono token exists yet; fall back to a system monospace stack. Mirrors the
2263
2266
  font/font-mono treatment in the design. */
2264
- font-family: var(--font-family-mono, ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace);
2265
- font-size: var(--font-size-700); /* 32px */
2266
- line-height: var(--line-height-700); /* 40px */
2267
- font-weight: var(--font-weight-bold);
2268
- color: var(--color-text-headline);
2269
- white-space: nowrap;
2270
- }
2267
+ font-family: var(
2268
+ --font-family-mono,
2269
+ ui-monospace,
2270
+ "SF Mono",
2271
+ SFMono-Regular,
2272
+ Menlo,
2273
+ monospace
2274
+ );
2275
+ font-size: var(--font-size-700); /* 32px */
2276
+ line-height: var(--line-height-700); /* 40px */
2277
+ font-weight: var(--font-weight-bold);
2278
+ color: var(--color-text-headline);
2279
+ white-space: nowrap;
2280
+ }
2271
2281
 
2272
- .seeds-metric-highlight-small .seeds-metric-highlight-value {
2273
- font-size: var(--font-size-600); /* 24px */
2274
- line-height: var(--line-height-600); /* 32px */
2275
- }
2282
+ .seeds-metric-highlight-small .seeds-metric-highlight-value {
2283
+ font-size: var(--font-size-600); /* 24px */
2284
+ line-height: var(--line-height-600); /* 32px */
2285
+ }
2276
2286
 
2277
- /* Trend badge — a rounded pill. Up is the positive (green) treatment; down
2287
+ /* Trend badge — a rounded pill. Up is the positive (green) treatment; down
2278
2288
  swaps to the negative (red) treatment. Color flows to the arrow + value via
2279
2289
  currentColor. */
2280
- .seeds-metric-highlight-trend {
2281
- display: inline-flex;
2282
- align-items: center;
2283
- gap: var(--space-200); /* 4px */
2284
- padding: var(--space-100) var(--space-300); /* 2px / 8px */
2285
- border-radius: 999px;
2286
- font-size: var(--font-size-200); /* 13px */
2287
- line-height: var(--line-height-200);
2288
- font-weight: var(--font-weight-bold);
2289
- white-space: nowrap;
2290
- background-color: var(--color-container-bg-decorative-green);
2291
- color: var(--color-text-decorative-green);
2292
- }
2290
+ .seeds-metric-highlight-trend {
2291
+ display: inline-flex;
2292
+ align-items: center;
2293
+ gap: var(--space-200); /* 4px */
2294
+ padding: var(--space-100) var(--space-300); /* 2px / 8px */
2295
+ border-radius: 999px;
2296
+ font-size: var(--font-size-200); /* 13px */
2297
+ line-height: var(--line-height-200);
2298
+ font-weight: var(--font-weight-bold);
2299
+ white-space: nowrap;
2300
+ background-color: var(--color-container-bg-decorative-green);
2301
+ color: var(--color-text-decorative-green);
2302
+ }
2293
2303
 
2294
- .seeds-metric-highlight-trend-down {
2295
- background-color: var(--color-container-bg-decorative-red);
2296
- color: var(--color-text-decorative-red);
2297
- }
2304
+ .seeds-metric-highlight-trend-down {
2305
+ background-color: var(--color-container-bg-decorative-red);
2306
+ color: var(--color-text-decorative-red);
2307
+ }
2298
2308
 
2299
- .seeds-metric-highlight-trend-arrow {
2300
- flex: 0 0 auto;
2301
- width: 1em;
2302
- height: 1em;
2303
- stroke: currentColor;
2304
- stroke-width: 1.5;
2305
- }
2309
+ .seeds-metric-highlight-trend-arrow {
2310
+ flex: 0 0 auto;
2311
+ width: 1em;
2312
+ height: 1em;
2313
+ stroke: currentColor;
2314
+ stroke-width: 1.5;
2315
+ }
2306
2316
 
2307
- /* Slot for an injected chart (e.g. a data-viz SparklineChart). Layout only — no
2317
+ /* Slot for an injected chart (e.g. a data-viz SparklineChart). Layout only — no
2308
2318
  stroke/background styling, so the injected chart controls its own look. Heights
2309
2319
  are explicit (never percentage/stretch) so a Highcharts chart always measures a
2310
2320
  concrete container instead of falling back to its 400px default. */
2311
- .seeds-metric-highlight-chart {
2312
- box-sizing: border-box;
2313
- flex: 0 0 auto;
2314
- align-self: center;
2315
- /* Center the injected chart as a flex item — an inline/inline-block child
2321
+ .seeds-metric-highlight-chart {
2322
+ box-sizing: border-box;
2323
+ flex: 0 0 auto;
2324
+ align-self: center;
2325
+ /* Center the injected chart as a flex item — an inline/inline-block child
2316
2326
  (e.g. the data-viz SparklineChart) otherwise sits on the text baseline with
2317
2327
  descender space below it, reading as vertically off-center in the slot. */
2318
- display: flex;
2319
- align-items: center;
2320
- }
2321
-
2322
- .seeds-metric-highlight:not(.seeds-metric-highlight-vertical) .seeds-metric-highlight-chart {
2323
- width: 104px;
2324
- height: 48px;
2325
- }
2328
+ display: flex;
2329
+ align-items: center;
2330
+ }
2326
2331
 
2327
- .seeds-metric-highlight-small:not(.seeds-metric-highlight-vertical) .seeds-metric-highlight-chart {
2328
- width: 88px;
2329
- height: 40px;
2330
- }
2332
+ .seeds-metric-highlight:not(.seeds-metric-highlight-vertical)
2333
+ .seeds-metric-highlight-chart {
2334
+ width: 104px;
2335
+ height: 48px;
2336
+ }
2331
2337
 
2332
- .seeds-metric-highlight-vertical .seeds-metric-highlight-chart {
2333
- width: 100%;
2334
- height: 96px;
2335
- }
2338
+ .seeds-metric-highlight-small:not(.seeds-metric-highlight-vertical)
2339
+ .seeds-metric-highlight-chart {
2340
+ width: 88px;
2341
+ height: 40px;
2342
+ }
2336
2343
 
2337
- .seeds-metric-highlight-vertical.seeds-metric-highlight-small .seeds-metric-highlight-chart {
2338
- height: 56px;
2339
- }
2344
+ .seeds-metric-highlight-vertical .seeds-metric-highlight-chart {
2345
+ width: 100%;
2346
+ height: 96px;
2347
+ }
2340
2348
 
2349
+ .seeds-metric-highlight-vertical.seeds-metric-highlight-small
2350
+ .seeds-metric-highlight-chart {
2351
+ height: 56px;
2352
+ }
2341
2353
  }
2342
2354
 
2343
2355
  /* --- seeds-react-narrative-kit --- */
@@ -2357,45 +2369,43 @@
2357
2369
  */
2358
2370
 
2359
2371
  @layer components {
2372
+ /* Main container — horizontal layout with avatar, social icon, and user name. */
2373
+ .seeds-narrative-attribution {
2374
+ box-sizing: border-box;
2375
+ display: flex;
2376
+ align-items: center;
2377
+ gap: var(--space-300); /* 8px */
2378
+ font-family: var(--font-family);
2379
+ }
2360
2380
 
2361
- /* Main container — horizontal layout with avatar, social icon, and user name. */
2362
- .seeds-narrative-attribution {
2363
- box-sizing: border-box;
2364
- display: flex;
2365
- align-items: center;
2366
- gap: var(--space-300); /* 8px */;
2367
- font-family: var(--font-family);
2368
- }
2369
-
2370
- /* Circular avatar image — fixed size with rounded corners. */
2371
- .seeds-narrative-attribution-avatar {
2372
- width: var(--space-450); /* 24px */
2373
- height: var(--space-450); /* 24px */
2374
- border-radius: var(--radius-circular); /* 50% */
2375
- object-fit: cover;
2376
- flex-shrink: 0;
2377
- }
2378
-
2379
- /* Social network icon container — flexible sizing for partner logos. */
2380
- .seeds-narrative-attribution-social-icon {
2381
- flex-shrink: 0;
2382
- display: flex;
2383
- align-items: center;
2384
- justify-content: center;
2385
- }
2381
+ /* Circular avatar image — fixed size with rounded corners. */
2382
+ .seeds-narrative-attribution-avatar {
2383
+ width: var(--space-450); /* 24px */
2384
+ height: var(--space-450); /* 24px */
2385
+ border-radius: var(--radius-circular); /* 50% */
2386
+ object-fit: cover;
2387
+ flex-shrink: 0;
2388
+ }
2386
2389
 
2387
- /* User name text — bold headline text with ellipsis overflow. */
2388
- .seeds-narrative-attribution-user-name {
2389
- overflow: hidden;
2390
- color: var(--color-text-headline);
2391
- text-overflow: ellipsis;
2392
- font-family: var(--font-family);
2393
- font-size: var(--text-base-font-size, 14px);
2394
- font-style: normal;
2395
- font-weight: var(--font-weight-bold, 700);
2396
- line-height: var(--text-base-line-height, 24px);
2397
- }
2390
+ /* Social network icon container — flexible sizing for partner logos. */
2391
+ .seeds-narrative-attribution-social-icon {
2392
+ flex-shrink: 0;
2393
+ display: flex;
2394
+ align-items: center;
2395
+ justify-content: center;
2396
+ }
2398
2397
 
2398
+ /* User name text — bold headline text with ellipsis overflow. */
2399
+ .seeds-narrative-attribution-user-name {
2400
+ overflow: hidden;
2401
+ color: var(--color-text-headline);
2402
+ text-overflow: ellipsis;
2403
+ font-family: var(--font-family);
2404
+ font-size: var(--text-base-font-size, 14px);
2405
+ font-style: normal;
2406
+ font-weight: var(--font-weight-bold, 700);
2407
+ line-height: var(--text-base-line-height, 24px);
2408
+ }
2399
2409
  }
2400
2410
 
2401
2411
  /* --- seeds-react-narrative-kit --- */
@@ -2411,22 +2421,21 @@
2411
2421
  */
2412
2422
 
2413
2423
  @layer components {
2424
+ .seeds-narrative-container {
2425
+ position: relative;
2426
+ overflow: hidden;
2427
+ box-sizing: border-box;
2428
+ display: flex;
2429
+ flex-direction: column;
2430
+ align-items: stretch;
2431
+ padding: var(--space-500);
2432
+ border-radius: var(--radius-800);
2433
+ box-shadow: var(--shadow-low);
2434
+ background-color: var(--color-container-bg-base);
2435
+ font-family: var(--font-family);
2436
+ }
2414
2437
 
2415
- .seeds-narrative-container {
2416
- position: relative;
2417
- overflow: hidden;
2418
- box-sizing: border-box;
2419
- display: flex;
2420
- flex-direction: column;
2421
- align-items: stretch;
2422
- padding: var(--space-500);
2423
- border-radius: var(--radius-800);
2424
- box-shadow: var(--shadow-low);
2425
- background-color: var(--color-container-bg-base);
2426
- font-family: var(--font-family);
2427
- }
2428
-
2429
- /* Grid and flex items default to `min-width: auto`, so they never shrink below
2438
+ /* Grid and flex items default to `min-width: auto`, so they never shrink below
2430
2439
  their own min-content. A wide row of widgets (a metric grid, a card grid) then
2431
2440
  forces its column wider than the padded surface — and since the container clips
2432
2441
  with overflow:hidden, the excess is cut off at the edge, eating the right-hand
@@ -2439,39 +2448,37 @@
2439
2448
  default. Any component that needs a real floor (e.g. the data callout's 270px
2440
2449
  donut slot) sets its own min-width via a plain class and always wins, instead
2441
2450
  of racing this rule on source order. */
2442
- :where(.seeds-narrative-container),
2443
- :where(.seeds-narrative-container *) {
2444
- min-width: 0;
2445
- }
2451
+ :where(.seeds-narrative-container),
2452
+ :where(.seeds-narrative-container *) {
2453
+ min-width: 0;
2454
+ }
2446
2455
 
2447
- /* Decorative inner gradient border anchored to the top-left corner.
2456
+ /* Decorative inner gradient border anchored to the top-left corner.
2448
2457
  A masked ::before so the gradient renders as a uniform-width ring that follows
2449
2458
  border-radius and never tints the content. The radial ellipse fades to
2450
2459
  transparent away from the corner; its x-radius (80%) is larger than its
2451
2460
  y-radius (60%) so the accent runs slightly further along the top edge than down
2452
2461
  the left edge. Brand stops mirror --color-gradient-ai — tokenize to a
2453
2462
  --color-gradient-* token once one exists for a fade-to-transparent variant. */
2454
- .seeds-narrative-container-accent::before {
2455
- content: "";
2456
- position: absolute;
2457
- inset: 0;
2458
- border-radius: inherit;
2459
- padding: 4px;
2460
- background: radial-gradient(
2461
- ellipse 80% 60% at top left,
2462
- #205bc3 0%,
2463
- #9747ff 28%,
2464
- #f282f5 50%,
2465
- transparent 72%
2466
- );
2467
- -webkit-mask:
2468
- linear-gradient(#fff 0 0) content-box,
2469
- linear-gradient(#fff 0 0);
2470
- -webkit-mask-composite: xor;
2471
- mask-composite: exclude;
2472
- pointer-events: none;
2473
- }
2474
-
2463
+ .seeds-narrative-container-accent::before {
2464
+ content: "";
2465
+ position: absolute;
2466
+ inset: 0;
2467
+ border-radius: inherit;
2468
+ padding: 4px;
2469
+ background: radial-gradient(
2470
+ ellipse 80% 60% at top left,
2471
+ #205bc3 0%,
2472
+ #9747ff 28%,
2473
+ #f282f5 50%,
2474
+ transparent 72%
2475
+ );
2476
+ -webkit-mask: linear-gradient(#fff 0 0) content-box,
2477
+ linear-gradient(#fff 0 0);
2478
+ -webkit-mask-composite: xor;
2479
+ mask-composite: exclude;
2480
+ pointer-events: none;
2481
+ }
2475
2482
  }
2476
2483
 
2477
2484
  /* --- seeds-react-narrative-kit --- */
@@ -2496,89 +2503,87 @@
2496
2503
  */
2497
2504
 
2498
2505
  @layer components {
2499
-
2500
- /* Establishes the query container. The row inside reacts to this element's
2506
+ /* Establishes the query container. The row inside reacts to this element's
2501
2507
  inline size. A container query only styles DESCENDANTS of the query container,
2502
2508
  so the flex row lives on the inner element, not this one. */
2503
- .seeds-narrative-data-callout {
2504
- container-type: inline-size;
2505
- box-sizing: border-box;
2506
- font-family: var(--font-family);
2507
- }
2509
+ .seeds-narrative-data-callout {
2510
+ container-type: inline-size;
2511
+ box-sizing: border-box;
2512
+ font-family: var(--font-family);
2513
+ }
2508
2514
 
2509
- /* Stacked single column by default (narrow). The container query below turns it
2515
+ /* Stacked single column by default (narrow). The container query below turns it
2510
2516
  into the horizontal 1/3 + 2/3 row once there is room. */
2511
- .seeds-narrative-data-callout-row {
2512
- box-sizing: border-box;
2513
- display: flex;
2514
- flex-direction: column;
2515
- align-items: center;
2516
- gap: var(--space-450); /* 24px */
2517
- }
2517
+ .seeds-narrative-data-callout-row {
2518
+ box-sizing: border-box;
2519
+ display: flex;
2520
+ flex-direction: column;
2521
+ align-items: center;
2522
+ gap: var(--space-450); /* 24px */
2523
+ }
2518
2524
 
2519
- /* Visual slot — layout only, no stroke/background so the injected chart controls
2525
+ /* Visual slot — layout only, no stroke/background so the injected chart controls
2520
2526
  its own look and its own size. No fixed height: charts like the data-viz
2521
2527
  DonutChart carry their own intrinsic height (and a legend), so the slot sizes
2522
2528
  to the chart rather than clipping it. Stacked full-width until the container
2523
2529
  query expands the row. */
2524
- .seeds-narrative-data-callout-visual {
2525
- box-sizing: border-box;
2526
- display: flex;
2527
- align-items: center;
2528
- justify-content: center;
2529
- width: 100%;
2530
- min-width: 0;
2531
- }
2530
+ .seeds-narrative-data-callout-visual {
2531
+ box-sizing: border-box;
2532
+ display: flex;
2533
+ align-items: center;
2534
+ justify-content: center;
2535
+ width: 100%;
2536
+ min-width: 0;
2537
+ }
2532
2538
 
2533
- /* Stretch the injected visual to the slot's full width. A fluid-width chart like
2539
+ /* Stretch the injected visual to the slot's full width. A fluid-width chart like
2534
2540
  the v2 DonutChart otherwise shrinks to content inside this centered flex slot,
2535
2541
  so Highcharts fills that shrunk width and the ring gets width-capped below its
2536
2542
  fixed 270px height — leaving an empty vertical band. Filling the width lets the
2537
2543
  ring become height-capped and fill its box top-to-bottom, like the standalone
2538
2544
  chart story. */
2539
- .seeds-narrative-data-callout-visual > * {
2540
- width: 100%;
2541
- }
2545
+ .seeds-narrative-data-callout-visual > * {
2546
+ width: 100%;
2547
+ }
2542
2548
 
2543
- /* Body copy — fills the remaining space. */
2544
- .seeds-narrative-data-callout-body {
2545
- box-sizing: border-box;
2546
- min-width: 0;
2547
- font-size: var(--font-size-300); /* 16px */
2548
- line-height: var(--line-height-400); /* ~28px */
2549
- font-weight: var(--font-weight-normal);
2550
- color: var(--color-text-body);
2551
- overflow-wrap: break-word;
2552
- }
2549
+ /* Body copy — fills the remaining space. */
2550
+ .seeds-narrative-data-callout-body {
2551
+ box-sizing: border-box;
2552
+ min-width: 0;
2553
+ font-size: var(--font-size-300); /* 16px */
2554
+ line-height: var(--line-height-400); /* ~28px */
2555
+ font-weight: var(--font-weight-normal);
2556
+ color: var(--color-text-body);
2557
+ overflow-wrap: break-word;
2558
+ }
2553
2559
 
2554
- /* Expand to the horizontal 1/3 + 2/3 split once the component is wide enough.
2560
+ /* Expand to the horizontal 1/3 + 2/3 split once the component is wide enough.
2555
2561
  The threshold is on the component's own width (container query), so a narrow
2556
2562
  callout on a wide screen still stacks. 480px keeps the donut + copy readable
2557
2563
  side by side. */
2558
- @container (min-width: 480px) {
2559
- .seeds-narrative-data-callout-row {
2560
- flex-direction: row;
2561
- }
2564
+ @container (min-width: 480px) {
2565
+ .seeds-narrative-data-callout-row {
2566
+ flex-direction: row;
2567
+ }
2562
2568
 
2563
- .seeds-narrative-data-callout-visual {
2564
- /* Nominally one-third, but never narrower than the injected chart's fixed
2569
+ .seeds-narrative-data-callout-visual {
2570
+ /* Nominally one-third, but never narrower than the injected chart's fixed
2565
2571
  height (the v2 DonutChart is 270px tall). Below that width a fluid-width,
2566
2572
  fixed-height chart like the donut gets width-capped and leaves an empty
2567
2573
  vertical band above/below the ring; the min-width keeps the visual square
2568
2574
  enough that the ring fills its box top-to-bottom, matching the standalone
2569
2575
  chart story. */
2570
- flex: 0 0 33.333%;
2571
- min-width: 270px;
2572
- width: auto;
2573
- }
2576
+ flex: 0 0 33.333%;
2577
+ min-width: 270px;
2578
+ width: auto;
2579
+ }
2574
2580
 
2575
- .seeds-narrative-data-callout-body {
2576
- flex: 1 1 0;
2581
+ .seeds-narrative-data-callout-body {
2582
+ flex: 1 1 0;
2583
+ }
2577
2584
  }
2578
2585
  }
2579
2586
 
2580
- }
2581
-
2582
2587
  /* --- seeds-react-narrative-kit --- */
2583
2588
  /**
2584
2589
  * Seeds NarrativeDivider component classes.
@@ -2592,20 +2597,18 @@
2592
2597
  */
2593
2598
 
2594
2599
  @layer components {
2595
-
2596
- /* A full-width, 1px horizontal rule. The <hr> ships with user-agent margins
2600
+ /* A full-width, 1px horizontal rule. The <hr> ships with user-agent margins
2597
2601
  and a beveled border, so reset those and draw the line with a single
2598
2602
  border-top using the container-border-base token (#dee1e1), which also
2599
2603
  tracks dark mode. */
2600
- .seeds-narrative-divider {
2601
- box-sizing: border-box;
2602
- width: 100%;
2603
- height: 0;
2604
- margin: 0;
2605
- border: 0;
2606
- border-top: 1px solid var(--color-container-border-base); /* #dee1e1 */
2607
- }
2608
-
2604
+ .seeds-narrative-divider {
2605
+ box-sizing: border-box;
2606
+ width: 100%;
2607
+ height: 0;
2608
+ margin: 0;
2609
+ border: 0;
2610
+ border-top: 1px solid var(--color-container-border-base); /* #dee1e1 */
2611
+ }
2609
2612
  }
2610
2613
 
2611
2614
  /* --- seeds-react-narrative-kit --- */
@@ -2625,121 +2628,120 @@
2625
2628
  */
2626
2629
 
2627
2630
  @layer components {
2631
+ /* Headline text. Rendered as an h1–h6, so reset the UA heading margins. */
2632
+ .seeds-narrative-headline {
2633
+ box-sizing: border-box;
2634
+ margin: 0;
2635
+ font-family: var(--font-family);
2636
+ font-size: var(--font-size-700);
2637
+ line-height: var(--line-height-700);
2638
+ font-weight: var(--font-weight-bold);
2639
+ letter-spacing: -0.02em;
2640
+ color: var(--color-text-headline);
2641
+ }
2628
2642
 
2629
- /* Headline text. Rendered as an h1–h6, so reset the UA heading margins. */
2630
- .seeds-narrative-headline {
2631
- box-sizing: border-box;
2632
- margin: 0;
2633
- font-family: var(--font-family);
2634
- font-size: var(--font-size-700);
2635
- line-height: var(--line-height-700);
2636
- font-weight: var(--font-weight-bold);
2637
- letter-spacing: -0.02em;
2638
- color: var(--color-text-headline);
2639
- }
2640
-
2641
- /* Compact size for denser layouts (e.g. NarrativeSummary). Weight, letter
2643
+ /* Compact size for denser layouts (e.g. NarrativeSummary). Weight, letter
2642
2644
  spacing, and color are inherited from the base class. */
2643
- .seeds-narrative-headline-small {
2644
- font-size: var(--font-size-600); /* 24px */
2645
- line-height: var(--line-height-600); /* 32px */
2646
- }
2645
+ .seeds-narrative-headline-small {
2646
+ font-size: var(--font-size-600); /* 24px */
2647
+ line-height: var(--line-height-600); /* 32px */
2648
+ }
2647
2649
 
2648
- /* Static gradient accent for a span of headline text ("highlighted word").
2650
+ /* Static gradient accent for a span of headline text ("highlighted word").
2649
2651
  Paints the AI brand gradient onto the glyphs via background-clip. */
2650
- .seeds-narrative-headline-highlight {
2651
- background: var(--color-gradient-ai);
2652
- -webkit-background-clip: text;
2653
- background-clip: text;
2654
- color: transparent;
2655
- }
2652
+ .seeds-narrative-headline-highlight {
2653
+ background: var(--color-gradient-ai);
2654
+ -webkit-background-clip: text;
2655
+ background-clip: text;
2656
+ color: transparent;
2657
+ }
2656
2658
 
2657
- /* -------------------------------------------------------------------------
2659
+ /* -------------------------------------------------------------------------
2658
2660
  "Roll" variant — vertical word roll. The active word slides into view
2659
2661
  while the previous one rolls out.
2660
2662
  ------------------------------------------------------------------------- */
2661
- .seeds-narrative-headline-roll {
2662
- display: inline-block;
2663
- position: relative;
2664
- /* clip-path rather than overflow:hidden: overflow:hidden on an inline-block
2663
+ .seeds-narrative-headline-roll {
2664
+ display: inline-block;
2665
+ position: relative;
2666
+ /* clip-path rather than overflow:hidden: overflow:hidden on an inline-block
2665
2667
  snaps its baseline to the bottom margin edge, dropping the rolling word
2666
2668
  below the surrounding text. clip-path keeps the natural baseline. */
2667
- clip-path: inset(0);
2668
- }
2669
+ clip-path: inset(0);
2670
+ }
2669
2671
 
2670
- /* Invisible word that holds the box width to the active word. */
2671
- .seeds-narrative-headline-roll-sizer {
2672
- display: inline-block;
2673
- visibility: hidden;
2674
- white-space: nowrap;
2675
- pointer-events: none;
2676
- }
2672
+ /* Invisible word that holds the box width to the active word. */
2673
+ .seeds-narrative-headline-roll-sizer {
2674
+ display: inline-block;
2675
+ visibility: hidden;
2676
+ white-space: nowrap;
2677
+ pointer-events: none;
2678
+ }
2677
2679
 
2678
- .seeds-narrative-headline-roll-word {
2679
- display: inline-block;
2680
- position: absolute;
2681
- top: 0;
2682
- left: 0;
2683
- white-space: nowrap;
2684
- transform: translateY(100%);
2685
- opacity: 0;
2686
- transition:
2687
- transform var(--seeds-narrative-headline-roll-ms, 500ms) ease,
2688
- opacity var(--seeds-narrative-headline-roll-ms, 500ms) ease;
2689
- }
2680
+ .seeds-narrative-headline-roll-word {
2681
+ display: inline-block;
2682
+ position: absolute;
2683
+ top: 0;
2684
+ left: 0;
2685
+ white-space: nowrap;
2686
+ transform: translateY(100%);
2687
+ opacity: 0;
2688
+ transition: transform var(--seeds-narrative-headline-roll-ms, 500ms) ease,
2689
+ opacity var(--seeds-narrative-headline-roll-ms, 500ms) ease;
2690
+ }
2690
2691
 
2691
- .seeds-narrative-headline-roll-word-active {
2692
- transform: translateY(0);
2693
- opacity: 1;
2694
- }
2692
+ .seeds-narrative-headline-roll-word-active {
2693
+ transform: translateY(0);
2694
+ opacity: 1;
2695
+ }
2695
2696
 
2696
- .seeds-narrative-headline-roll-word-past {
2697
- transform: translateY(-100%);
2698
- opacity: 0;
2699
- }
2700
-
2701
- /* Reverse the roll direction. */
2702
- .seeds-narrative-headline-roll-down .seeds-narrative-headline-roll-word {
2703
- transform: translateY(-100%);
2704
- }
2705
- .seeds-narrative-headline-roll-down .seeds-narrative-headline-roll-word-active {
2706
- transform: translateY(0);
2707
- }
2708
- .seeds-narrative-headline-roll-down .seeds-narrative-headline-roll-word-past {
2709
- transform: translateY(100%);
2710
- }
2711
-
2712
- /* Gradient-painted rolling words with a slow shimmer. */
2713
- .seeds-narrative-headline-roll-gradient .seeds-narrative-headline-roll-word {
2714
- background: var(--color-gradient-ai);
2715
- background-size: 200% 200%;
2716
- -webkit-background-clip: text;
2717
- background-clip: text;
2718
- color: transparent;
2719
- animation: seeds-narrative-headline-grad-shift 8s ease infinite;
2720
- }
2697
+ .seeds-narrative-headline-roll-word-past {
2698
+ transform: translateY(-100%);
2699
+ opacity: 0;
2700
+ }
2721
2701
 
2722
- @keyframes seeds-narrative-headline-grad-shift {
2723
- 0%,
2724
- 100% {
2725
- background-position: 0% 50%;
2702
+ /* Reverse the roll direction. */
2703
+ .seeds-narrative-headline-roll-down .seeds-narrative-headline-roll-word {
2704
+ transform: translateY(-100%);
2726
2705
  }
2727
- 50% {
2728
- background-position: 100% 50%;
2706
+ .seeds-narrative-headline-roll-down
2707
+ .seeds-narrative-headline-roll-word-active {
2708
+ transform: translateY(0);
2729
2709
  }
2730
- }
2731
-
2732
- /* The JS cycle is already disabled under reduced-motion (the first word holds);
2733
- also flatten the transition and shimmer so any in-flight motion settles. */
2734
- @media (prefers-reduced-motion: reduce) {
2735
- .seeds-narrative-headline-roll-word {
2736
- transition: none;
2710
+ .seeds-narrative-headline-roll-down .seeds-narrative-headline-roll-word-past {
2711
+ transform: translateY(100%);
2737
2712
  }
2713
+
2714
+ /* Gradient-painted rolling words with a slow shimmer. */
2738
2715
  .seeds-narrative-headline-roll-gradient .seeds-narrative-headline-roll-word {
2739
- animation: none;
2716
+ background: var(--color-gradient-ai);
2717
+ background-size: 200% 200%;
2718
+ -webkit-background-clip: text;
2719
+ background-clip: text;
2720
+ color: transparent;
2721
+ animation: seeds-narrative-headline-grad-shift 8s ease infinite;
2722
+ }
2723
+
2724
+ @keyframes seeds-narrative-headline-grad-shift {
2725
+ 0%,
2726
+ 100% {
2727
+ background-position: 0% 50%;
2728
+ }
2729
+ 50% {
2730
+ background-position: 100% 50%;
2731
+ }
2740
2732
  }
2741
- }
2742
2733
 
2734
+ /* The JS cycle is already disabled under reduced-motion (the first word holds);
2735
+ also flatten the transition and shimmer so any in-flight motion settles. */
2736
+ @media (prefers-reduced-motion: reduce) {
2737
+ .seeds-narrative-headline-roll-word {
2738
+ transition: none;
2739
+ }
2740
+ .seeds-narrative-headline-roll-gradient
2741
+ .seeds-narrative-headline-roll-word {
2742
+ animation: none;
2743
+ }
2744
+ }
2743
2745
  }
2744
2746
 
2745
2747
  /* --- seeds-react-narrative-kit --- */
@@ -2759,103 +2761,109 @@
2759
2761
  */
2760
2762
 
2761
2763
  @layer components {
2762
-
2763
- /* Establishes the query container. The track inside reacts to this element's
2764
+ /* Establishes the query container. The track inside reacts to this element's
2764
2765
  inline size — a container query can only style descendants of the container,
2765
2766
  never the container element itself. */
2766
- .seeds-narrative-ordered-list {
2767
- container-type: inline-size;
2768
- box-sizing: border-box;
2769
- font-family: var(--font-family);
2770
- }
2767
+ .seeds-narrative-ordered-list {
2768
+ container-type: inline-size;
2769
+ box-sizing: border-box;
2770
+ font-family: var(--font-family);
2771
+ }
2771
2772
 
2772
- /* The list itself, and the default (stacked) layout. The horizontal modifier
2773
+ /* The list itself, and the default (stacked) layout. The horizontal modifier
2773
2774
  only expands to a row once the container query below has room, so horizontal
2774
2775
  collapses back to this stack when narrow. */
2775
- .seeds-narrative-ordered-list-track {
2776
- display: flex;
2777
- flex-direction: column;
2778
- gap: var(--space-400); /* 16px */
2779
- margin: 0;
2780
- padding: 0;
2781
- list-style: none;
2782
- }
2776
+ .seeds-narrative-ordered-list-track {
2777
+ display: flex;
2778
+ flex-direction: column;
2779
+ gap: var(--space-400); /* 16px */
2780
+ margin: 0;
2781
+ padding: 0;
2782
+ list-style: none;
2783
+ }
2783
2784
 
2784
- /* An item row: the ordinal beside the body, on its own rounded surface. */
2785
- .seeds-narrative-ordered-list-item {
2786
- display: flex;
2787
- gap: var(--space-450); /* 24px */
2788
- align-items: flex-start;
2789
- box-sizing: border-box;
2790
- min-width: 0;
2791
- padding: var(--space-400) var(--space-450); /* 16px 24px */
2792
- border-radius: var(--radius-800); /* 12px */
2793
- background-color: var(--color-app-bg-base);
2794
- }
2785
+ /* An item row: the ordinal beside the body, on its own rounded surface. */
2786
+ .seeds-narrative-ordered-list-item {
2787
+ display: flex;
2788
+ gap: var(--space-450); /* 24px */
2789
+ align-items: flex-start;
2790
+ box-sizing: border-box;
2791
+ min-width: 0;
2792
+ padding: var(--space-400) var(--space-450); /* 16px 24px */
2793
+ border-radius: var(--radius-800); /* 12px */
2794
+ background-color: var(--color-app-bg-base);
2795
+ }
2795
2796
 
2796
- /* The ordinal (01, 02, …). No mono token exists yet, so fall back to a system
2797
+ /* The ordinal (01, 02, …). No mono token exists yet, so fall back to a system
2797
2798
  monospace stack — mirrors the value treatment in metric-highlight.css. */
2798
- .seeds-narrative-ordered-list-number {
2799
- margin: 0;
2800
- flex-shrink: 0;
2801
- font-family: var(--font-family-mono, ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace);
2802
- font-size: var(--font-size-700); /* 32px */
2803
- line-height: var(--line-height-700); /* 40px */
2804
- font-weight: var(--font-weight-bold);
2805
- color: var(--color-text-headline);
2806
- }
2799
+ .seeds-narrative-ordered-list-number {
2800
+ margin: 0;
2801
+ flex-shrink: 0;
2802
+ font-family: var(
2803
+ --font-family-mono,
2804
+ ui-monospace,
2805
+ "SF Mono",
2806
+ SFMono-Regular,
2807
+ Menlo,
2808
+ monospace
2809
+ );
2810
+ font-size: var(--font-size-700); /* 32px */
2811
+ line-height: var(--line-height-700); /* 40px */
2812
+ font-weight: var(--font-weight-bold);
2813
+ color: var(--color-text-headline);
2814
+ }
2807
2815
 
2808
- /* Title + description + optional action, stacked. */
2809
- .seeds-narrative-ordered-list-body {
2810
- flex: 1 1 auto;
2811
- display: flex;
2812
- flex-direction: column;
2813
- gap: var(--space-200); /* 4px */
2814
- min-width: 0;
2815
- }
2816
+ /* Title + description + optional action, stacked. */
2817
+ .seeds-narrative-ordered-list-body {
2818
+ flex: 1 1 auto;
2819
+ display: flex;
2820
+ flex-direction: column;
2821
+ gap: var(--space-200); /* 4px */
2822
+ min-width: 0;
2823
+ }
2816
2824
 
2817
- /* Title. 16px / 28px — the 28px line-height has no exact type token (the scale
2825
+ /* Title. 16px / 28px — the 28px line-height has no exact type token (the scale
2818
2826
  skips from 24px to 32px), so the design value is kept verbatim. Same
2819
2827
  rationale as narrative-summary.css. */
2820
- .seeds-narrative-ordered-list-title {
2821
- margin: 0;
2822
- font-size: var(--font-size-300); /* 16px */
2823
- line-height: 28px; /* off-scale, see comment above */
2824
- font-weight: var(--font-weight-bold);
2825
- color: var(--color-text-body);
2826
- }
2828
+ .seeds-narrative-ordered-list-title {
2829
+ margin: 0;
2830
+ font-size: var(--font-size-300); /* 16px */
2831
+ line-height: 28px; /* off-scale, see comment above */
2832
+ font-weight: var(--font-weight-bold);
2833
+ color: var(--color-text-body);
2834
+ }
2827
2835
 
2828
- /* Description. 14px / 24px has no exact type token, so it is kept verbatim —
2836
+ /* Description. 14px / 24px has no exact type token, so it is kept verbatim —
2829
2837
  same rationale as the title above. */
2830
- .seeds-narrative-ordered-list-description {
2831
- margin: 0;
2832
- font-size: 14px; /* off-scale, see title above */
2833
- line-height: 24px;
2834
- font-weight: var(--font-weight-normal);
2835
- color: var(--color-text-body);
2836
- }
2838
+ .seeds-narrative-ordered-list-description {
2839
+ margin: 0;
2840
+ font-size: 14px; /* off-scale, see title above */
2841
+ line-height: 24px;
2842
+ font-weight: var(--font-weight-normal);
2843
+ color: var(--color-text-body);
2844
+ }
2837
2845
 
2838
- .seeds-narrative-ordered-list-action {
2839
- padding-top: var(--space-350); /* 12px */
2840
- }
2846
+ .seeds-narrative-ordered-list-action {
2847
+ padding-top: var(--space-350); /* 12px */
2848
+ }
2841
2849
 
2842
- /* Expand the horizontal variant to a row of equal columns once the component is
2850
+ /* Expand the horizontal variant to a row of equal columns once the component is
2843
2851
  wide enough. The threshold is on the component's own width (container query),
2844
2852
  so a narrow card on a wide screen still stacks. 640px = Tailwind/Seeds sm
2845
2853
  breakpoint, matching narrative-summary.css. */
2846
- @container (min-width: 640px) {
2847
- .seeds-narrative-ordered-list-horizontal {
2848
- flex-direction: row;
2849
- }
2854
+ @container (min-width: 640px) {
2855
+ .seeds-narrative-ordered-list-horizontal {
2856
+ flex-direction: row;
2857
+ }
2850
2858
 
2851
- .seeds-narrative-ordered-list-horizontal > .seeds-narrative-ordered-list-item {
2852
- flex: 1 1 0;
2853
- min-width: 0;
2859
+ .seeds-narrative-ordered-list-horizontal
2860
+ > .seeds-narrative-ordered-list-item {
2861
+ flex: 1 1 0;
2862
+ min-width: 0;
2863
+ }
2854
2864
  }
2855
2865
  }
2856
2866
 
2857
- }
2858
-
2859
2867
  /* --- seeds-react-narrative-kit --- */
2860
2868
  /**
2861
2869
  * Seeds NarrativeSection component classes.
@@ -2872,36 +2880,34 @@
2872
2880
  */
2873
2881
 
2874
2882
  @layer components {
2875
-
2876
- /* The wrapper stacks the title above the content with a small gap. It carries
2883
+ /* The wrapper stacks the title above the content with a small gap. It carries
2877
2884
  no surface of its own — it's meant to sit inside a NarrativeContainer. */
2878
- .seeds-narrative-section {
2879
- display: flex;
2880
- flex-direction: column;
2881
- gap: var(--space-400); /* 16px — title to content */
2882
- }
2885
+ .seeds-narrative-section {
2886
+ display: flex;
2887
+ flex-direction: column;
2888
+ gap: var(--space-400); /* 16px — title to content */
2889
+ }
2883
2890
 
2884
- /* The content slot stacks the section's widgets with the same 32px rhythm a
2891
+ /* The content slot stacks the section's widgets with the same 32px rhythm a
2885
2892
  single-column grid (gap={500}) would give them, so multiple primitives inside
2886
2893
  one section are spaced exactly as they are between sections. */
2887
- .seeds-narrative-section-content {
2888
- display: flex;
2889
- flex-direction: column;
2890
- gap: var(--space-500); /* 32px — between widgets */
2891
- }
2894
+ .seeds-narrative-section-content {
2895
+ display: flex;
2896
+ flex-direction: column;
2897
+ gap: var(--space-500); /* 32px — between widgets */
2898
+ }
2892
2899
 
2893
- /* The section title: bold 14px/24px in the headline color token (#273333,
2900
+ /* The section title: bold 14px/24px in the headline color token (#273333,
2894
2901
  which also tracks dark mode). Matches the summary-label recipe used across
2895
2902
  the kit. The heading element ships with user-agent margins, so reset them. */
2896
- .seeds-narrative-section-title {
2897
- margin: 0;
2898
- font-family: var(--font-family);
2899
- font-size: 14px;
2900
- line-height: 24px;
2901
- font-weight: var(--font-weight-bold);
2902
- color: var(--color-text-headline); /* #273333 */
2903
- }
2904
-
2903
+ .seeds-narrative-section-title {
2904
+ margin: 0;
2905
+ font-family: var(--font-family);
2906
+ font-size: 14px;
2907
+ line-height: 24px;
2908
+ font-weight: var(--font-weight-bold);
2909
+ color: var(--color-text-headline); /* #273333 */
2910
+ }
2905
2911
  }
2906
2912
 
2907
2913
  /* --- seeds-react-narrative-kit --- */
@@ -2921,71 +2927,77 @@
2921
2927
  */
2922
2928
 
2923
2929
  @layer components {
2924
-
2925
- /* Main card container — gray background with rounded corners and padding.
2930
+ /* Main card container — gray background with rounded corners and padding.
2926
2931
  Uses Seeds tokens for spacing, colors, and radius to match the design system.
2927
2932
  Fills the width it is given (e.g. a grid column) and stretches its content to
2928
2933
  match, mirroring the horizontal NarrativeOrderedList — so a row of cards grows
2929
2934
  and resizes together instead of being pinned to a fixed 320px. */
2930
- .seeds-narrative-social-media-card {
2931
- box-sizing: border-box;
2932
- display: flex;
2933
- flex-direction: column;
2934
- align-items: stretch;
2935
- width: 100%;
2936
- padding: var(--space-450); /* 24px */
2937
- border-radius: var(--radius-500); /* 6px */
2938
- background-color: var(--color-app-bg-base);
2939
- font-family: var(--font-family);
2940
- color: var(--color-text-body);
2941
- }
2942
-
2943
- /* No background — transparent background for cards that blend seamlessly with the page. */
2944
- .seeds-narrative-social-media-card--no-background {
2945
- background-color: transparent;
2946
- }
2947
-
2948
- /* Main content area — standard body text styling. */
2949
- .seeds-narrative-social-media-card-content {
2950
- flex: 1;
2951
- margin-top: var(--space-400); /* 16px */
2952
- font-family: var(--font-family);
2953
- font-size: 14px;
2954
- font-style: normal;
2955
- font-weight: 400;
2956
- line-height: 24px;
2957
- color: var(--color-text-body);
2958
- }
2935
+ .seeds-narrative-social-media-card {
2936
+ box-sizing: border-box;
2937
+ display: flex;
2938
+ flex-direction: column;
2939
+ align-items: stretch;
2940
+ width: 100%;
2941
+ padding: var(--space-450); /* 24px */
2942
+ border-radius: var(--radius-500); /* 6px */
2943
+ background-color: var(--color-app-bg-base);
2944
+ font-family: var(--font-family);
2945
+ color: var(--color-text-body);
2946
+ }
2959
2947
 
2960
- /* Footer section — horizontal layout for stats with equal spacing. */
2961
- .seeds-narrative-social-media-card-footer {
2962
- display: flex;
2963
- align-items: center;
2964
- gap: var(--space-400); /* 16px */
2965
- margin-top: var(--space-400); /* 16px */;
2966
- }
2948
+ /* No background — transparent background for cards that blend seamlessly with the page. */
2949
+ .seeds-narrative-social-media-card--no-background {
2950
+ background-color: transparent;
2951
+ }
2967
2952
 
2968
- /* Hide footer when empty (no metadata items). */
2969
- .seeds-narrative-social-media-card-footer:empty {
2970
- display: none;
2971
- }
2953
+ /* Main content area — standard body text styling. */
2954
+ .seeds-narrative-social-media-card-content {
2955
+ flex: 1;
2956
+ margin-top: var(--space-400); /* 16px */
2957
+ font-family: var(--font-family);
2958
+ font-size: 14px;
2959
+ font-style: normal;
2960
+ font-weight: 400;
2961
+ line-height: 24px;
2962
+ color: var(--color-text-body);
2963
+ }
2972
2964
 
2973
- /* Individual stat container — icon + value in horizontal layout. */
2974
- .seeds-narrative-social-media-card-stat {
2975
- display: flex;
2976
- align-items: center;
2977
- gap: var(--space-200); /* 4px */
2978
- }
2965
+ /* Footer section — horizontal layout for stats with equal spacing. */
2966
+ .seeds-narrative-social-media-card-footer {
2967
+ display: flex;
2968
+ align-items: center;
2969
+ gap: var(--space-400); /* 16px */
2970
+ margin-top: var(--space-400); /* 16px */
2971
+ }
2979
2972
 
2980
- /* Stat value text — monospace font for numeric values. */
2981
- .seeds-narrative-social-media-card-stat-value {
2982
- font-family: var(--font-family-mono, ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace); font-size: 14px;
2983
- font-style: normal;
2984
- font-weight: 400;
2985
- line-height: 24px;
2986
- color: var(--color-text-body);
2987
- }
2973
+ /* Hide footer when empty (no metadata items). */
2974
+ .seeds-narrative-social-media-card-footer:empty {
2975
+ display: none;
2976
+ }
2988
2977
 
2978
+ /* Individual stat container — icon + value in horizontal layout. */
2979
+ .seeds-narrative-social-media-card-stat {
2980
+ display: flex;
2981
+ align-items: center;
2982
+ gap: var(--space-200); /* 4px */
2983
+ }
2984
+
2985
+ /* Stat value text — monospace font for numeric values. */
2986
+ .seeds-narrative-social-media-card-stat-value {
2987
+ font-family: var(
2988
+ --font-family-mono,
2989
+ ui-monospace,
2990
+ "SF Mono",
2991
+ SFMono-Regular,
2992
+ Menlo,
2993
+ monospace
2994
+ );
2995
+ font-size: 14px;
2996
+ font-style: normal;
2997
+ font-weight: 400;
2998
+ line-height: 24px;
2999
+ color: var(--color-text-body);
3000
+ }
2989
3001
  }
2990
3002
 
2991
3003
  /* --- seeds-react-narrative-kit --- */
@@ -3007,115 +3019,113 @@
3007
3019
  */
3008
3020
 
3009
3021
  @layer components {
3010
-
3011
- /* Establishes the query container. The grid inside reacts to this element's
3022
+ /* Establishes the query container. The grid inside reacts to this element's
3012
3023
  inline size. */
3013
- .seeds-narrative-summary {
3014
- container-type: inline-size;
3015
- box-sizing: border-box;
3016
- font-family: var(--font-family);
3017
- }
3024
+ .seeds-narrative-summary {
3025
+ container-type: inline-size;
3026
+ box-sizing: border-box;
3027
+ font-family: var(--font-family);
3028
+ }
3018
3029
 
3019
- /* Stacked single column by default (narrow). The container query below expands
3030
+ /* Stacked single column by default (narrow). The container query below expands
3020
3031
  it once there is room. */
3021
- .seeds-narrative-summary-grid {
3022
- display: grid;
3023
- grid-template-columns: 1fr;
3024
- gap: var(--space-450); /* 24px */
3025
- }
3032
+ .seeds-narrative-summary-grid {
3033
+ display: grid;
3034
+ grid-template-columns: 1fr;
3035
+ gap: var(--space-450); /* 24px */
3036
+ }
3026
3037
 
3027
- /* The lead column: eyebrow, headline, optional action. align-items:flex-start
3038
+ /* The lead column: eyebrow, headline, optional action. align-items:flex-start
3028
3039
  keeps the eyebrow pill and the action sized to their content — without it the
3029
3040
  column's default stretch would blow the eyebrow out to full width. The
3030
3041
  headline still fills and wraps because its text is wider than the track. */
3031
- .seeds-narrative-summary-lead {
3032
- display: flex;
3033
- flex-direction: column;
3034
- align-items: flex-start;
3035
- gap: var(--space-300); /* 8px */
3036
- min-width: 0;
3037
- }
3042
+ .seeds-narrative-summary-lead {
3043
+ display: flex;
3044
+ flex-direction: column;
3045
+ align-items: flex-start;
3046
+ gap: var(--space-300); /* 8px */
3047
+ min-width: 0;
3048
+ }
3038
3049
 
3039
- /* The headline area grows so the action anchors toward the bottom of the lead
3050
+ /* The headline area grows so the action anchors toward the bottom of the lead
3040
3051
  column when the neighboring columns are taller. align-self:stretch fills the
3041
3052
  track width (the lead column pins other items to flex-start) so the headline
3042
3053
  wraps at the column edge regardless of its length. */
3043
- .seeds-narrative-summary-headline {
3044
- flex: 1 1 auto;
3045
- align-self: stretch;
3046
- }
3054
+ .seeds-narrative-summary-headline {
3055
+ flex: 1 1 auto;
3056
+ align-self: stretch;
3057
+ }
3047
3058
 
3048
- /* In three-column mode the content wrapper is transparent to the grid, so its
3059
+ /* In three-column mode the content wrapper is transparent to the grid, so its
3049
3060
  two sections become grid items in their own columns. In two-column mode the
3050
3061
  container query below turns it into a real, stacking grid item. */
3051
- .seeds-narrative-summary-content {
3052
- display: contents;
3053
- }
3062
+ .seeds-narrative-summary-content {
3063
+ display: contents;
3064
+ }
3054
3065
 
3055
- .seeds-narrative-summary-section {
3056
- display: flex;
3057
- flex-direction: column;
3058
- gap: var(--space-300); /* 8px */
3059
- min-width: 0;
3060
- }
3066
+ .seeds-narrative-summary-section {
3067
+ display: flex;
3068
+ flex-direction: column;
3069
+ gap: var(--space-300); /* 8px */
3070
+ min-width: 0;
3071
+ }
3061
3072
 
3062
- /* Section label. 14px / 24px has no exact type token (the scale skips from
3073
+ /* Section label. 14px / 24px has no exact type token (the scale skips from
3063
3074
  13px to 16px), so the design value is kept verbatim — same rationale as
3064
3075
  eyebrow-token.css. All other values use tokens. */
3065
- .seeds-narrative-summary-label {
3066
- margin: 0;
3067
- font-size: 14px;
3068
- line-height: 24px;
3069
- font-weight: var(--font-weight-bold);
3070
- color: var(--color-text-headline);
3071
- }
3076
+ .seeds-narrative-summary-label {
3077
+ margin: 0;
3078
+ font-size: 14px;
3079
+ line-height: 24px;
3080
+ font-weight: var(--font-weight-bold);
3081
+ color: var(--color-text-headline);
3082
+ }
3072
3083
 
3073
- .seeds-narrative-summary-text {
3074
- margin: 0;
3075
- font-size: 14px; /* off-scale, see label above */
3076
- line-height: 24px;
3077
- font-weight: var(--font-weight-normal);
3078
- color: var(--color-text-body);
3079
- }
3084
+ .seeds-narrative-summary-text {
3085
+ margin: 0;
3086
+ font-size: 14px; /* off-scale, see label above */
3087
+ line-height: 24px;
3088
+ font-weight: var(--font-weight-normal);
3089
+ color: var(--color-text-body);
3090
+ }
3080
3091
 
3081
- .seeds-narrative-summary-list {
3082
- margin: 0;
3083
- padding-inline-start: 21px;
3084
- list-style: disc;
3085
- font-size: 14px; /* off-scale, see label above */
3086
- line-height: 24px;
3087
- font-weight: var(--font-weight-normal);
3088
- color: var(--color-text-body);
3089
- }
3092
+ .seeds-narrative-summary-list {
3093
+ margin: 0;
3094
+ padding-inline-start: 21px;
3095
+ list-style: disc;
3096
+ font-size: 14px; /* off-scale, see label above */
3097
+ line-height: 24px;
3098
+ font-weight: var(--font-weight-normal);
3099
+ color: var(--color-text-body);
3100
+ }
3090
3101
 
3091
- .seeds-narrative-summary-list li {
3092
- margin: 0;
3093
- }
3102
+ .seeds-narrative-summary-list li {
3103
+ margin: 0;
3104
+ }
3094
3105
 
3095
- /* Expand to the multi-column layout once the component is wide enough. The
3106
+ /* Expand to the multi-column layout once the component is wide enough. The
3096
3107
  threshold is on the component's own width (container query), so a narrow card
3097
3108
  on a wide screen still stacks. 640px = Tailwind/Seeds sm breakpoint. */
3098
- @container (min-width: 640px) {
3099
- .seeds-narrative-summary-grid {
3100
- grid-template-columns: repeat(3, 1fr);
3101
- }
3109
+ @container (min-width: 640px) {
3110
+ .seeds-narrative-summary-grid {
3111
+ grid-template-columns: repeat(3, 1fr);
3112
+ }
3102
3113
 
3103
- /* 1/3 lead + 2/3 content. */
3104
- .seeds-narrative-summary-two-column {
3105
- grid-template-columns: 1fr 2fr;
3106
- }
3114
+ /* 1/3 lead + 2/3 content. */
3115
+ .seeds-narrative-summary-two-column {
3116
+ grid-template-columns: 1fr 2fr;
3117
+ }
3107
3118
 
3108
- /* The content wrapper becomes a real grid item that stacks its two sections. */
3109
- .seeds-narrative-summary-two-column .seeds-narrative-summary-content {
3110
- display: flex;
3111
- flex-direction: column;
3112
- gap: var(--space-450); /* 24px */
3113
- min-width: 0;
3119
+ /* The content wrapper becomes a real grid item that stacks its two sections. */
3120
+ .seeds-narrative-summary-two-column .seeds-narrative-summary-content {
3121
+ display: flex;
3122
+ flex-direction: column;
3123
+ gap: var(--space-450); /* 24px */
3124
+ min-width: 0;
3125
+ }
3114
3126
  }
3115
3127
  }
3116
3128
 
3117
- }
3118
-
3119
3129
  /* --- seeds-react-narrative-kit --- */
3120
3130
  /**
3121
3131
  * Seeds PullQuote component classes.
@@ -3130,60 +3140,58 @@
3130
3140
  */
3131
3141
 
3132
3142
  @layer components {
3133
-
3134
- .seeds-pull-quote {
3135
- width: 100%;
3136
- display: flex;
3137
- flex-direction: column;
3138
- align-items: flex-start;
3139
- margin: 0; /* reset the browser default <figure> margin */
3140
- /* 40px block / 48px inline — 48px is off the space scale, so derive it from
3143
+ .seeds-pull-quote {
3144
+ width: 100%;
3145
+ display: flex;
3146
+ flex-direction: column;
3147
+ align-items: flex-start;
3148
+ margin: 0; /* reset the browser default <figure> margin */
3149
+ /* 40px block / 48px inline — 48px is off the space scale, so derive it from
3141
3150
  two tokens (40 + 8) rather than hardcoding an off-scale value. */
3142
- padding: var(--space-600) calc(var(--space-600) + var(--space-300));
3143
- }
3151
+ padding: var(--space-600) calc(var(--space-600) + var(--space-300));
3152
+ }
3144
3153
 
3145
- /* The accented bar holding the quote and attribution. */
3146
- .seeds-pull-quote-bar {
3147
- box-sizing: border-box;
3148
- display: flex;
3149
- flex-direction: column;
3150
- align-items: flex-start;
3151
- gap: var(--space-450); /* 24px */
3152
- width: 100%;
3153
- padding-left: var(--space-450); /* 24px */
3154
- /* 4px is off the border-width scale (max token is 3px); the bar is a
3154
+ /* The accented bar holding the quote and attribution. */
3155
+ .seeds-pull-quote-bar {
3156
+ box-sizing: border-box;
3157
+ display: flex;
3158
+ flex-direction: column;
3159
+ align-items: flex-start;
3160
+ gap: var(--space-450); /* 24px */
3161
+ width: 100%;
3162
+ padding-left: var(--space-450); /* 24px */
3163
+ /* 4px is off the border-width scale (max token is 3px); the bar is a
3155
3164
  decorative accent, mirroring NarrativeContainer's hardcoded 4px ring. The
3156
3165
  subtle accent uses the AI gradient mid stop (#9747ff — no exact token). */
3157
- border-left: 4px solid #9747ff;
3158
- }
3166
+ border-left: 4px solid #9747ff;
3167
+ }
3159
3168
 
3160
- .seeds-pull-quote-vivid .seeds-pull-quote-bar {
3161
- border-left-color: #fff;
3162
- }
3169
+ .seeds-pull-quote-vivid .seeds-pull-quote-bar {
3170
+ border-left-color: #fff;
3171
+ }
3163
3172
 
3164
- .seeds-pull-quote-text {
3165
- margin: 0; /* reset the browser default <blockquote> margin */
3166
- font-size: var(--font-size-600);
3167
- line-height: var(--line-height-600);
3168
- font-style: italic;
3169
- font-weight: var(--font-weight-normal);
3170
- color: inherit;
3171
- overflow-wrap: break-word;
3172
- }
3173
+ .seeds-pull-quote-text {
3174
+ margin: 0; /* reset the browser default <blockquote> margin */
3175
+ font-size: var(--font-size-600);
3176
+ line-height: var(--line-height-600);
3177
+ font-style: italic;
3178
+ font-weight: var(--font-weight-normal);
3179
+ color: inherit;
3180
+ overflow-wrap: break-word;
3181
+ }
3173
3182
 
3174
- /* Attribution row — a flex container for author name, avatar, network, etc.
3183
+ /* Attribution row — a flex container for author name, avatar, network, etc.
3175
3184
  Direct text inherits a bold, small treatment to match the display-name style;
3176
3185
  richer content (e.g. an Avatar) composes freely. */
3177
- .seeds-pull-quote-attribution {
3178
- display: flex;
3179
- align-items: center;
3180
- gap: var(--space-300); /* 8px */
3181
- font-size: var(--font-size-200);
3182
- line-height: var(--line-height-200);
3183
- font-weight: var(--font-weight-bold);
3184
- color: inherit;
3185
- }
3186
-
3186
+ .seeds-pull-quote-attribution {
3187
+ display: flex;
3188
+ align-items: center;
3189
+ gap: var(--space-300); /* 8px */
3190
+ font-size: var(--font-size-200);
3191
+ line-height: var(--line-height-200);
3192
+ font-weight: var(--font-weight-bold);
3193
+ color: inherit;
3194
+ }
3187
3195
  }
3188
3196
 
3189
3197
  /* --- seeds-react-numeral --- */
@@ -3310,6 +3318,100 @@
3310
3318
  }
3311
3319
  }
3312
3320
 
3321
+ /* --- seeds-react-panel --- */
3322
+ /**
3323
+ * Seeds Panel component classes.
3324
+ * Component-scoped port of the static styled-components chrome in styles.ts.
3325
+ * Used by PanelTailwind.tsx and the Tailwind sub-component paths.
3326
+ *
3327
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for the
3328
+ * CSS variable definitions (and dark mode support).
3329
+ *
3330
+ * Runtime geometry (flex-basis, the gap margin, the direction shape, and the
3331
+ * inner min-width/min-height) is applied as inline style on the elements, not
3332
+ * here — the jsdom tests assert those computed values and CSS is not loaded in
3333
+ * that environment. Only static chrome lives in these classes.
3334
+ *
3335
+ * All rules live in `@layer components` so consumer Tailwind utilities (e.g.
3336
+ * mx-200, p-300, inline-flex) win the cascade and can override these component
3337
+ * defaults, rather than tying/beating them on specificity. Unlayered rules
3338
+ * would outrank any layered utility per the CSS cascade-layers spec.
3339
+ */
3340
+
3341
+ @layer components {
3342
+ /* Container --------------------------------------------------------------- */
3343
+
3344
+ .seeds-panel {
3345
+ background: var(--color-container-bg-base);
3346
+ flex-grow: 0;
3347
+ flex-shrink: 0;
3348
+ overflow: hidden;
3349
+ border-radius: var(--radius-800);
3350
+ transition: flex-basis var(--duration-medium) ease-in-out,
3351
+ margin var(--duration-medium) ease-in-out;
3352
+ }
3353
+
3354
+ .seeds-panel-inner {
3355
+ display: flex;
3356
+ flex-direction: column;
3357
+ overflow: hidden;
3358
+ }
3359
+
3360
+ /* Header ------------------------------------------------------------------ */
3361
+
3362
+ .seeds-panel-header {
3363
+ display: flex;
3364
+ flex: 0 0 auto;
3365
+ justify-content: space-between;
3366
+ align-items: center;
3367
+ padding: var(--space-400);
3368
+ border-bottom: 1px solid var(--color-container-border-base);
3369
+ }
3370
+
3371
+ /* Content ----------------------------------------------------------------- */
3372
+
3373
+ /* overflow-y (and, when headerless, display/flex-direction) are set inline
3374
+ by PanelContentTailwind because the tests assert them under jsdom. */
3375
+ .seeds-panel-content {
3376
+ flex: 1 1 auto;
3377
+ min-height: 0;
3378
+ padding: var(--space-450);
3379
+ color: var(--color-text-body);
3380
+ }
3381
+
3382
+ /* Headerless content renders flush; the children own all chrome/padding. */
3383
+ .seeds-panel-content--headerless {
3384
+ padding: 0;
3385
+ }
3386
+
3387
+ /* Footer ------------------------------------------------------------------ */
3388
+
3389
+ /* margin-bottom (var(--bleed, 0px)) is set inline by PanelFooterTailwind. */
3390
+ .seeds-panel-footer {
3391
+ flex: 0 0 auto;
3392
+ overflow: hidden;
3393
+ padding: var(--space-450);
3394
+ }
3395
+
3396
+ /* Mobile actions header --------------------------------------------------- */
3397
+
3398
+ .seeds-panel-mobile-actions-header {
3399
+ display: flex;
3400
+ flex: 0 0 auto;
3401
+ align-items: center;
3402
+ justify-content: space-between;
3403
+ padding-top: var(--space-400);
3404
+ padding-left: var(--space-450);
3405
+ padding-right: var(--space-450);
3406
+ }
3407
+
3408
+ .seeds-panel-mobile-actions-buttons {
3409
+ display: flex;
3410
+ align-items: center;
3411
+ gap: var(--space-200);
3412
+ }
3413
+ }
3414
+
3313
3415
  /* --- seeds-react-partner-logo --- */
3314
3416
  /**
3315
3417
  * Seeds Partner Logo component classes
@@ -3346,6 +3448,62 @@
3346
3448
  }
3347
3449
  }
3348
3450
 
3451
+ /* --- seeds-react-peek-in --- */
3452
+ /**
3453
+ * Seeds PeekIn component classes
3454
+ * Use these instead of writing out individual Tailwind utility classes.
3455
+ *
3456
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
3457
+ * CSS variable definitions and dark mode support.
3458
+ *
3459
+ * These classes back only the root layout wrappers PeekIn authors directly
3460
+ * (the mobile bottom-sheet header row and the desktop main column). The rest
3461
+ * of PeekIn's appearance comes from the composed Seeds primitives (Modal,
3462
+ * Drawer, Panel, Text, Button), which own their own styling.
3463
+ *
3464
+ * Rules are wrapped in @layer components so consumer Tailwind utilities (which
3465
+ * live in @layer utilities) win the cascade. Without this layer the unlayered
3466
+ * component CSS would beat utilities like px-450 / gap-300 and they could not
3467
+ * override component styling. Keep every rule inside this single block.
3468
+ */
3469
+
3470
+ @layer components {
3471
+ /* Mobile bottom-sheet header row (Drawer.Header render wrapper) */
3472
+ .seeds-peek-in-drawer-header {
3473
+ display: flex;
3474
+ align-items: center;
3475
+ justify-content: space-between;
3476
+ padding-top: var(--space-400);
3477
+ padding-right: var(--space-450);
3478
+ padding-left: var(--space-450);
3479
+ flex: 0 0 auto;
3480
+ }
3481
+
3482
+ /* Header left group: optional back button + title */
3483
+ .seeds-peek-in-titlegroup {
3484
+ display: flex;
3485
+ align-items: center;
3486
+ gap: var(--space-300);
3487
+ }
3488
+
3489
+ /* Header right group: consumer actions + inline pills/close */
3490
+ .seeds-peek-in-header-actions {
3491
+ display: flex;
3492
+ align-items: center;
3493
+ gap: var(--space-200);
3494
+ }
3495
+
3496
+ /* Desktop main column: header + content, alongside the optional panel */
3497
+ .seeds-peek-in-main {
3498
+ display: flex;
3499
+ flex-direction: column;
3500
+ flex: 1 1 auto;
3501
+ overflow: hidden;
3502
+ background: var(--color-container-bg-base);
3503
+ border-radius: var(--radius-800);
3504
+ }
3505
+ }
3506
+
3349
3507
  /* --- seeds-react-profile --- */
3350
3508
  /**
3351
3509
  * Seeds InlineProfile component classes
@@ -3496,6 +3654,7 @@
3496
3654
  gap: var(--space-300);
3497
3655
  }
3498
3656
  }
3657
+
3499
3658
  /* --- seeds-react-profile --- */
3500
3659
  /**
3501
3660
  * Seeds ProfileToken component classes
@@ -3602,17 +3761,16 @@
3602
3761
  border: 1px solid var(--color-form-border-base);
3603
3762
  border-radius: 50%;
3604
3763
  background-color: var(--color-form-bg-base);
3605
- transition:
3606
- border-color var(--duration-fast) ease-in,
3764
+ transition: border-color var(--duration-fast) ease-in,
3607
3765
  background-color var(--duration-fast) ease-in;
3608
3766
  }
3609
3767
 
3610
3768
  /* Focus ring mirrors button.css (the CSS form of the focusRing mixin) */
3611
3769
  .seeds-radio-input:focus {
3612
3770
  outline: none;
3613
- box-shadow:
3614
- 0 0 0 1px var(--color-button-primary-bg-base),
3615
- 0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
3771
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
3772
+ 0 0 0 4px
3773
+ color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
3616
3774
  }
3617
3775
 
3618
3776
  .seeds-radio-wrapper:before {
@@ -3632,7 +3790,8 @@
3632
3790
 
3633
3791
  /* Unchecked hover / focus: show the dot (only when NOT checked) */
3634
3792
  .seeds-radio-wrapper:not(.seeds-radio-checked):hover .seeds-radio-input,
3635
- .seeds-radio-wrapper:not(.seeds-radio-checked):focus-within .seeds-radio-input {
3793
+ .seeds-radio-wrapper:not(.seeds-radio-checked):focus-within
3794
+ .seeds-radio-input {
3636
3795
  border-color: var(--color-form-border-base);
3637
3796
  background-color: var(--color-form-bg-base);
3638
3797
  }
@@ -3644,7 +3803,9 @@
3644
3803
  }
3645
3804
 
3646
3805
  /* Disabled-unchecked keeps the hover dot hidden (parity with opacity: disabled ? 0 : 1) */
3647
- .seeds-radio-wrapper.seeds-radio-disabled:not(.seeds-radio-checked):hover:before {
3806
+ .seeds-radio-wrapper.seeds-radio-disabled:not(
3807
+ .seeds-radio-checked
3808
+ ):hover:before {
3648
3809
  opacity: 0;
3649
3810
  }
3650
3811
 
@@ -3796,8 +3957,7 @@
3796
3957
  cursor: pointer;
3797
3958
  outline: none;
3798
3959
  appearance: none;
3799
- transition:
3800
- border-color var(--duration-fast) var(--ease-ease_in),
3960
+ transition: border-color var(--duration-fast) var(--ease-ease_in),
3801
3961
  box-shadow var(--duration-fast) var(--ease-ease_in);
3802
3962
  font-family: var(--font-family);
3803
3963
  font-weight: var(--font-weight-normal);
@@ -3812,16 +3972,14 @@
3812
3972
  }
3813
3973
 
3814
3974
  .seeds-select .seeds-select-input:focus {
3815
- box-shadow:
3816
- 0 0 0 1px var(--color-button-primary-bg-base),
3975
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
3817
3976
  0 0px 0px 4px
3818
3977
  color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
3819
3978
  outline: none;
3820
3979
  }
3821
3980
 
3822
3981
  /* Fix for red ring when input is marked required in Firefox */
3823
- .seeds-select
3824
- .seeds-select-input:not(output):not(:focus):-moz-ui-invalid {
3982
+ .seeds-select .seeds-select-input:not(output):not(:focus):-moz-ui-invalid {
3825
3983
  box-shadow: none;
3826
3984
  }
3827
3985
 
@@ -4187,9 +4345,9 @@
4187
4345
  /* Mixin for styled focus ring — copied from button.css:34-39 */
4188
4346
  .seeds-switch:focus {
4189
4347
  outline: none;
4190
- box-shadow:
4191
- 0 0 0 1px var(--color-button-primary-bg-base),
4192
- 0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
4348
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
4349
+ 0 0 0 4px
4350
+ color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
4193
4351
  }
4194
4352
 
4195
4353
  /* Base styles for circle element */
@@ -4291,6 +4449,95 @@
4291
4449
  }
4292
4450
  }
4293
4451
 
4452
+ /* --- seeds-react-table --- */
4453
+ /**
4454
+ * Seeds v2 Table component classes
4455
+ * Use these instead of writing out individual Tailwind utility classes.
4456
+ *
4457
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
4458
+ * CSS variable definitions and dark mode support.
4459
+ *
4460
+ * Usage:
4461
+ * <div class="seeds-table-v2-container" role="region" tabindex="0">
4462
+ * <table class="seeds-table-v2">
4463
+ * <caption class="seeds-table-v2-caption">Caption</caption>
4464
+ * <thead class="seeds-table-v2-header">
4465
+ * <tr class="seeds-table-v2-row">
4466
+ * <th class="seeds-table-v2-header-cell" scope="col">Header</th>
4467
+ * </tr>
4468
+ * </thead>
4469
+ * <tbody class="seeds-table-v2-body">
4470
+ * <tr class="seeds-table-v2-row">
4471
+ * <td class="seeds-table-v2-cell">Data</td>
4472
+ * </tr>
4473
+ * </tbody>
4474
+ * </table>
4475
+ * </div>
4476
+ *
4477
+ * All rules are wrapped in `@layer components` so that consumer Tailwind
4478
+ * utilities (unlayered) win the cascade over these styles.
4479
+ */
4480
+
4481
+ @layer components {
4482
+ .seeds-table-v2-container {
4483
+ overflow-x: auto;
4484
+ max-width: 100%;
4485
+ }
4486
+
4487
+ .seeds-table-v2 {
4488
+ width: 100%;
4489
+ border-collapse: collapse;
4490
+ color: var(--color-text-body);
4491
+ font-family: var(--font-family);
4492
+ }
4493
+
4494
+ .seeds-table-v2-caption {
4495
+ text-align: left;
4496
+ font-size: var(--font-size-400);
4497
+ line-height: var(--line-height-400);
4498
+ font-weight: var(--font-weight-semibold);
4499
+ padding: var(--space-300);
4500
+ margin-top: var(--space-200);
4501
+ }
4502
+
4503
+ .seeds-table-v2-caption-hidden {
4504
+ position: absolute;
4505
+ width: 1px;
4506
+ height: 1px;
4507
+ padding: 0;
4508
+ margin: -1px;
4509
+ overflow: hidden;
4510
+ clip: rect(0, 0, 0, 0);
4511
+ border: 0;
4512
+ }
4513
+
4514
+ .seeds-table-v2-header {
4515
+ vertical-align: bottom;
4516
+ border-bottom: 1px solid var(--color-container-border-base);
4517
+ }
4518
+
4519
+ .seeds-table-v2-row {
4520
+ border-bottom: 1px solid var(--color-container-border-base);
4521
+ }
4522
+
4523
+ .seeds-table-v2-header-cell {
4524
+ font-size: var(--font-size-100);
4525
+ line-height: var(--line-height-100);
4526
+ font-weight: var(--font-weight-semibold);
4527
+ padding: var(--space-300);
4528
+ text-align: left;
4529
+ min-width: 0;
4530
+ }
4531
+
4532
+ .seeds-table-v2-cell {
4533
+ font-size: var(--font-size-200);
4534
+ line-height: var(--line-height-200);
4535
+ font-weight: var(--font-weight-normal);
4536
+ padding: var(--space-300);
4537
+ text-align: left;
4538
+ }
4539
+ }
4540
+
4294
4541
  /* --- seeds-react-tabs --- */
4295
4542
  /**
4296
4543
  * Seeds Tabs component classes
@@ -4500,6 +4747,7 @@
4500
4747
  line-height: var(--line-height-200);
4501
4748
  }
4502
4749
  }
4750
+
4503
4751
  /* --- seeds-react-textarea --- */
4504
4752
  /**
4505
4753
  * Seeds Textarea component classes
@@ -4545,9 +4793,9 @@
4545
4793
  }
4546
4794
 
4547
4795
  .seeds-textarea-input:focus {
4548
- box-shadow:
4549
- 0 0 0 1px var(--color-button-primary-bg-base),
4550
- 0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
4796
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
4797
+ 0 0 0 4px
4798
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
4551
4799
  outline: none;
4552
4800
  }
4553
4801
 
@@ -4624,8 +4872,7 @@
4624
4872
  }
4625
4873
 
4626
4874
  .seeds-token:focus {
4627
- box-shadow:
4628
- 0 0 0 1px var(--color-button-primary-bg-base),
4875
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
4629
4876
  0 0px 0px 4px
4630
4877
  color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
4631
4878
  outline: none;
@@ -4658,7 +4905,11 @@
4658
4905
  cursor: pointer;
4659
4906
  box-shadow: var(--shadow-low);
4660
4907
  border: 1px solid
4661
- color-mix(in srgb, var(--color-container-border-decorative-blue), black 20%);
4908
+ color-mix(
4909
+ in srgb,
4910
+ var(--color-container-border-decorative-blue),
4911
+ black 20%
4912
+ );
4662
4913
  }
4663
4914
 
4664
4915
  /* disabled */
@@ -4729,7 +4980,11 @@
4729
4980
  .lights-out .seeds-token-blue:hover,
4730
4981
  .lights-out .seeds-token-blue:active {
4731
4982
  border: 1px solid
4732
- color-mix(in srgb, var(--color-container-border-decorative-blue), white 20%);
4983
+ color-mix(
4984
+ in srgb,
4985
+ var(--color-container-border-decorative-blue),
4986
+ white 20%
4987
+ );
4733
4988
  }
4734
4989
 
4735
4990
  [data-theme="dark"] .seeds-token-invalid:hover,
@@ -4959,14 +5214,9 @@
4959
5214
  }
4960
5215
 
4961
5216
  .seeds-tree-combobox-input-group:focus-within {
4962
- box-shadow:
4963
- 0 0 0 1px var(--color-button-primary-bg-base),
5217
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
4964
5218
  0 0px 0px 4px
4965
- color-mix(
4966
- in srgb,
4967
- var(--color-button-primary-bg-base),
4968
- transparent 70%
4969
- );
5219
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
4970
5220
  outline: none;
4971
5221
  }
4972
5222
 
@@ -5023,8 +5273,7 @@
5023
5273
  cursor: default;
5024
5274
  outline: none;
5025
5275
  user-select: none;
5026
- transition:
5027
- border-color var(--duration-fast) var(--ease-ease_in),
5276
+ transition: border-color var(--duration-fast) var(--ease-ease_in),
5028
5277
  box-shadow var(--duration-fast) var(--ease-ease_in);
5029
5278
  }
5030
5279
 
@@ -5033,14 +5282,9 @@
5033
5282
  }
5034
5283
 
5035
5284
  .seeds-tree-select-trigger:focus-visible {
5036
- box-shadow:
5037
- 0 0 0 1px var(--color-button-primary-bg-base),
5285
+ box-shadow: 0 0 0 1px var(--color-button-primary-bg-base),
5038
5286
  0 0px 0px 4px
5039
- color-mix(
5040
- in srgb,
5041
- var(--color-button-primary-bg-base),
5042
- transparent 70%
5043
- );
5287
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
5044
5288
  outline: none;
5045
5289
  }
5046
5290