@sproutsocial/seeds-react-theme 4.3.1 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,8 +26,8 @@ yarn add @sproutsocial/seeds-react-theme
26
26
  ### React (styled-components)
27
27
 
28
28
  ```jsx
29
- import { ThemeProvider } from 'styled-components';
30
- import theme from '@sproutsocial/seeds-react-theme';
29
+ import { ThemeProvider } from "styled-components";
30
+ import theme from "@sproutsocial/seeds-react-theme";
31
31
 
32
32
  function App() {
33
33
  return (
@@ -47,11 +47,9 @@ See [MULTI_FRAMEWORK_GUIDE.md](./MULTI_FRAMEWORK_GUIDE.md) for complete document
47
47
  ```javascript
48
48
  // tailwind.config.js
49
49
  module.exports = {
50
- presets: [
51
- require('@sproutsocial/seeds-react-theme/dist/tailwind-preset'),
52
- ],
53
- content: ['./src/**/*.{js,jsx,ts,tsx}'],
54
- }
50
+ presets: [require("@sproutsocial/seeds-react-theme/dist/tailwind-preset")],
51
+ content: ["./src/**/*.{js,jsx,ts,tsx}"],
52
+ };
55
53
  ```
56
54
 
57
55
  ```jsx
@@ -63,14 +61,19 @@ module.exports = {
63
61
  ### CSS Custom Properties
64
62
 
65
63
  ```html
66
- <link rel="stylesheet" href="node_modules/@sproutsocial/seeds-react-theme/dist/theme.css">
64
+ <link
65
+ rel="stylesheet"
66
+ href="node_modules/@sproutsocial/seeds-react-theme/dist/theme.css"
67
+ />
67
68
 
68
- <button style="
69
+ <button
70
+ style="
69
71
  background: var(--color-button-primary-bg-base);
70
72
  color: var(--color-button-primary-text-base);
71
73
  padding: var(--space-400);
72
74
  border-radius: var(--radius-500);
73
- ">
75
+ "
76
+ >
74
77
  Primary Button
75
78
  </button>
76
79
  ```
@@ -109,9 +112,9 @@ Use the dark mode preset:
109
112
  ```javascript
110
113
  module.exports = {
111
114
  presets: [
112
- require('@sproutsocial/seeds-react-theme/dist/tailwind-preset-dark'),
115
+ require("@sproutsocial/seeds-react-theme/dist/tailwind-preset-dark"),
113
116
  ],
114
- }
117
+ };
115
118
  ```
116
119
 
117
120
  ### CSS Variables
@@ -128,15 +131,16 @@ Toggle with JavaScript:
128
131
 
129
132
  ```javascript
130
133
  // Enable dark mode
131
- document.documentElement.setAttribute('data-theme', 'dark');
134
+ document.documentElement.setAttribute("data-theme", "dark");
132
135
 
133
136
  // Disable dark mode
134
- document.documentElement.removeAttribute('data-theme');
137
+ document.documentElement.removeAttribute("data-theme");
135
138
  ```
136
139
 
137
140
  ## Available Tokens
138
141
 
139
142
  ### Colors
143
+
140
144
  - Button colors (primary, secondary, destructive, etc.)
141
145
  - Text colors (headline, body, subtext, inverse)
142
146
  - Link colors
@@ -145,14 +149,17 @@ document.documentElement.removeAttribute('data-theme');
145
149
  - Icon colors
146
150
 
147
151
  ### Spacing
152
+
148
153
  - `0`, `100`, `200`, `300`, `350`, `400`, `450`, `500`, `600`
149
154
 
150
155
  ### Typography
156
+
151
157
  - Font sizes and line heights (`100` - `1200`)
152
158
  - Font families
153
159
  - Font weights (normal, semibold, bold, extrabold)
154
160
 
155
161
  ### Other
162
+
156
163
  - Border radius values
157
164
  - Box shadows
158
165
  - Motion (easing, duration)
@@ -4,10 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.buildCSSVariables = buildCSSVariables;
7
+ exports.generateCombinedCSS = generateCombinedCSS;
7
8
  var _fs = _interopRequireDefault(require("fs"));
8
9
  var _path = _interopRequireDefault(require("path"));
9
- var _theme = _interopRequireDefault(require("../light/theme"));
10
- var _theme2 = _interopRequireDefault(require("../dark/theme"));
10
+ var _theme = _interopRequireDefault(require("../extendedThemes/sproutTheme/light/theme"));
11
+ var _theme2 = _interopRequireDefault(require("../extendedThemes/sproutTheme/dark/theme"));
11
12
  var _utils = require("./utils");
12
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
14
  function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
@@ -26,7 +27,13 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
26
27
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
27
28
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } /**
28
29
  * Build CSS custom properties (variables) from Seeds theme objects
29
- */
30
+ */ // Source the full production theme (base + extended sproutTheme namespaces:
31
+ // growth, ai, navigation, datePicker, analytics, listening, cardControl, tags),
32
+ // not the base theme alone. The styled-system shim resolves color props to
33
+ // var(--color-...) references and is theme-agnostic, so every namespace must
34
+ // have a real CSS var wherever the shim runs. Both sprout themes spread the
35
+ // base theme, so all non-color fields (space, typography, radii, ...) are
36
+ // unchanged and base color tokens keep identical values.
30
37
  /**
31
38
  * Convert a flat object into CSS custom properties
32
39
  */
@@ -123,6 +130,11 @@ function generateCSSVariables(themeObj, mode) {
123
130
  variables.push.apply(variables, _toConsumableArray(objectToCSSVariables(radii, "radius")));
124
131
  console.log(" - Mapped ".concat(Object.keys(radii).length, " border radius values"));
125
132
 
133
+ // Border width
134
+ var borderWidths = (0, _utils.flattenBorderWidths)(themeObj.borderWidths);
135
+ variables.push.apply(variables, _toConsumableArray(objectToCSSVariables(borderWidths, "border-width")));
136
+ console.log(" - Mapped ".concat(Object.keys(borderWidths).length, " border width values"));
137
+
126
138
  // Shadows
127
139
  var shadows = (0, _utils.flattenShadows)(themeObj.shadows);
128
140
  variables.push.apply(variables, _toConsumableArray(objectToCSSVariables(shadows, "shadow")));
@@ -143,7 +155,8 @@ function generateCSSVariables(themeObj, mode) {
143
155
  }
144
156
 
145
157
  /**
146
- * Build a combined CSS file with both light and dark themes
158
+ * Build a combined CSS file with both light and dark themes. Exported so tests
159
+ * can assert the source theme (extended sproutTheme) actually feeds the output.
147
160
  */
148
161
  function generateCombinedCSS() {
149
162
  console.log("Building combined CSS with light and dark themes...");
@@ -42,7 +42,7 @@ function buildTailwindV4Preset() {
42
42
  }
43
43
  function _buildTailwindV4Preset() {
44
44
  _buildTailwindV4Preset = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
45
- var distDir, lines, spacingMap, _i, _Object$entries, _Object$entries$_i, key, value, radiusMap, _i2, _Object$entries2, _Object$entries2$_i, _key, _value, typographyScales, _i3, _typographyScales, scale, _key2, val, buttonColors, _i4, _Object$entries3, _Object$entries3$_i, _key3, _value2, semanticColors, _i5, _Object$entries4, _Object$entries4$_i, _key4, _value3, darkButtonColors, _i6, _Object$entries5, _Object$entries5$_i, _key5, _value4, css, outPath;
45
+ var distDir, lines, spacingMap, _i, _Object$entries, _Object$entries$_i, key, value, radiusMap, _i2, _Object$entries2, _Object$entries2$_i, _key, _value, borderWidthMap, _i3, _Object$entries3, _Object$entries3$_i, _key2, _value2, typographyScales, _i4, _typographyScales, scale, _key3, val, buttonColors, _i5, _Object$entries4, _Object$entries4$_i, _key4, _value3, semanticColors, _i6, _Object$entries5, _Object$entries5$_i, _key5, _value4, darkButtonColors, _i7, _Object$entries6, _Object$entries6$_i, _key6, _value5, css, outPath;
46
46
  return _regenerator().w(function (_context) {
47
47
  while (1) switch (_context.n) {
48
48
  case 0:
@@ -99,16 +99,34 @@ function _buildTailwindV4Preset() {
99
99
  console.log(" - Mapped ".concat(Object.keys(radiusMap).length, " border radius tokens"));
100
100
  lines.push("");
101
101
 
102
+ // -------------------------------------------------------------------------
103
+ // Border width — from @sproutsocial/seeds-border
104
+ // Seeds' own `border-w-{key}` utility (not Tailwind's numeric border-<n>
105
+ // scale) — see seeds-react-system-props/src/scales.ts SCALE_PROPS.borderWidth
106
+ // -------------------------------------------------------------------------
107
+ lines.push(" /* Border width — from @sproutsocial/seeds-border */");
108
+ borderWidthMap = {
109
+ 500: BORDER.BORDER_WIDTH_500,
110
+ 600: BORDER.BORDER_WIDTH_600,
111
+ 700: BORDER.BORDER_WIDTH_700
112
+ };
113
+ for (_i3 = 0, _Object$entries3 = Object.entries(borderWidthMap); _i3 < _Object$entries3.length; _i3++) {
114
+ _Object$entries3$_i = _slicedToArray(_Object$entries3[_i3], 2), _key2 = _Object$entries3$_i[0], _value2 = _Object$entries3$_i[1];
115
+ lines.push(" --border-width-".concat(_key2, ": ").concat(_value2, ";"));
116
+ }
117
+ console.log(" - Mapped ".concat(Object.keys(borderWidthMap).length, " border width tokens"));
118
+ lines.push("");
119
+
102
120
  // -------------------------------------------------------------------------
103
121
  // Font size — from @sproutsocial/seeds-typography
104
122
  // Tailwind v4: --text-{key}--font-size + --text-{key}--line-height → text-{key}
105
123
  // -------------------------------------------------------------------------
106
124
  lines.push(" /* Font size — from @sproutsocial/seeds-typography */");
107
125
  typographyScales = [100, 200, 300, 400, 500, 600, 700];
108
- for (_i3 = 0, _typographyScales = typographyScales; _i3 < _typographyScales.length; _i3++) {
109
- scale = _typographyScales[_i3];
110
- _key2 = "TYPOGRAPHY_SIZE_".concat(scale);
111
- val = TYPOGRAPHY[_key2];
126
+ for (_i4 = 0, _typographyScales = typographyScales; _i4 < _typographyScales.length; _i4++) {
127
+ scale = _typographyScales[_i4];
128
+ _key3 = "TYPOGRAPHY_SIZE_".concat(scale);
129
+ val = TYPOGRAPHY[_key3];
112
130
  if (val && val.fontSize && val.lineHeight) {
113
131
  // Tailwind v4 uses --text-*--font-size and --text-*--line-height for
114
132
  // the two-value tuple equivalent
@@ -154,9 +172,9 @@ function _buildTailwindV4Preset() {
154
172
  "color-button-placeholder-text-hover": COLORS.COLOR_BLUE_800,
155
173
  "color-button-placeholder-border-base": COLORS.COLOR_NEUTRAL_500
156
174
  };
157
- for (_i4 = 0, _Object$entries3 = Object.entries(buttonColors); _i4 < _Object$entries3.length; _i4++) {
158
- _Object$entries3$_i = _slicedToArray(_Object$entries3[_i4], 2), _key3 = _Object$entries3$_i[0], _value2 = _Object$entries3$_i[1];
159
- lines.push(" --".concat(_key3, ": ").concat(_value2, ";"));
175
+ for (_i5 = 0, _Object$entries4 = Object.entries(buttonColors); _i5 < _Object$entries4.length; _i5++) {
176
+ _Object$entries4$_i = _slicedToArray(_Object$entries4[_i5], 2), _key4 = _Object$entries4$_i[0], _value3 = _Object$entries4$_i[1];
177
+ lines.push(" --".concat(_key4, ": ").concat(_value3, ";"));
160
178
  }
161
179
  console.log(" - Mapped ".concat(Object.keys(buttonColors).length, " button color tokens"));
162
180
  lines.push("");
@@ -186,9 +204,9 @@ function _buildTailwindV4Preset() {
186
204
  "color-form-border-selected": "var(--color-form-border-selected)",
187
205
  "color-form-placeholder-base": "var(--color-form-placeholder-base)"
188
206
  };
189
- for (_i5 = 0, _Object$entries4 = Object.entries(semanticColors); _i5 < _Object$entries4.length; _i5++) {
190
- _Object$entries4$_i = _slicedToArray(_Object$entries4[_i5], 2), _key4 = _Object$entries4$_i[0], _value3 = _Object$entries4$_i[1];
191
- lines.push(" --".concat(_key4, ": ").concat(_value3, ";"));
207
+ for (_i6 = 0, _Object$entries5 = Object.entries(semanticColors); _i6 < _Object$entries5.length; _i6++) {
208
+ _Object$entries5$_i = _slicedToArray(_Object$entries5[_i6], 2), _key5 = _Object$entries5$_i[0], _value4 = _Object$entries5$_i[1];
209
+ lines.push(" --".concat(_key5, ": ").concat(_value4, ";"));
192
210
  }
193
211
  console.log(" - Mapped ".concat(Object.keys(semanticColors).length, " semantic color tokens"));
194
212
 
@@ -217,9 +235,9 @@ function _buildTailwindV4Preset() {
217
235
  "color-button-placeholder-text-base-dark": COLORS.COLOR_BLUE_400,
218
236
  "color-button-placeholder-text-hover-dark": COLORS.COLOR_BLUE_300
219
237
  };
220
- for (_i6 = 0, _Object$entries5 = Object.entries(darkButtonColors); _i6 < _Object$entries5.length; _i6++) {
221
- _Object$entries5$_i = _slicedToArray(_Object$entries5[_i6], 2), _key5 = _Object$entries5$_i[0], _value4 = _Object$entries5$_i[1];
222
- lines.push(" --".concat(_key5, ": ").concat(_value4, ";"));
238
+ for (_i7 = 0, _Object$entries6 = Object.entries(darkButtonColors); _i7 < _Object$entries6.length; _i7++) {
239
+ _Object$entries6$_i = _slicedToArray(_Object$entries6[_i7], 2), _key6 = _Object$entries6$_i[0], _value5 = _Object$entries6$_i[1];
240
+ lines.push(" --".concat(_key6, ": ").concat(_value5, ";"));
223
241
  }
224
242
  console.log(" - Mapped ".concat(Object.keys(darkButtonColors).length, " dark mode button color tokens"));
225
243
  lines.push("}");
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.abbreviate = abbreviate;
6
7
  exports.filterComplexColors = filterComplexColors;
8
+ exports.flattenBorderWidths = flattenBorderWidths;
7
9
  exports.flattenColors = flattenColors;
8
10
  exports.flattenDuration = flattenDuration;
9
11
  exports.flattenEasing = flattenEasing;
@@ -38,7 +40,9 @@ var ABBREVIATIONS = {
38
40
  };
39
41
 
40
42
  /**
41
- * Apply abbreviation rules to a key
43
+ * Apply abbreviation rules to a single token-path segment. Shared by the CSS
44
+ * var generator (`flattenObject`) and the seeds-react-system-props shim's
45
+ * color-prop fallback, so the `--color-*` names each side produces can't drift.
42
46
  */
43
47
  function abbreviate(key) {
44
48
  return ABBREVIATIONS[key] || key;
@@ -134,11 +138,11 @@ function flattenRadii(radii) {
134
138
  }
135
139
 
136
140
  /**
137
- * Flatten shadows
141
+ * Flatten border widths
138
142
  */
139
- function flattenShadows(shadows) {
143
+ function flattenBorderWidths(borderWidths) {
140
144
  var flattened = {};
141
- for (var _i5 = 0, _Object$entries5 = Object.entries(shadows); _i5 < _Object$entries5.length; _i5++) {
145
+ for (var _i5 = 0, _Object$entries5 = Object.entries(borderWidths); _i5 < _Object$entries5.length; _i5++) {
142
146
  var _Object$entries5$_i = _slicedToArray(_Object$entries5[_i5], 2),
143
147
  key = _Object$entries5$_i[0],
144
148
  value = _Object$entries5$_i[1];
@@ -150,15 +154,15 @@ function flattenShadows(shadows) {
150
154
  }
151
155
 
152
156
  /**
153
- * Flatten font weights
157
+ * Flatten shadows
154
158
  */
155
- function flattenFontWeights(fontWeights) {
159
+ function flattenShadows(shadows) {
156
160
  var flattened = {};
157
- for (var _i6 = 0, _Object$entries6 = Object.entries(fontWeights); _i6 < _Object$entries6.length; _i6++) {
161
+ for (var _i6 = 0, _Object$entries6 = Object.entries(shadows); _i6 < _Object$entries6.length; _i6++) {
158
162
  var _Object$entries6$_i = _slicedToArray(_Object$entries6[_i6], 2),
159
163
  key = _Object$entries6$_i[0],
160
164
  value = _Object$entries6$_i[1];
161
- if (typeof value === "string" || typeof value === "number") {
165
+ if (typeof value === "string") {
162
166
  flattened[key] = value;
163
167
  }
164
168
  }
@@ -166,15 +170,15 @@ function flattenFontWeights(fontWeights) {
166
170
  }
167
171
 
168
172
  /**
169
- * Flatten easing (transition timing functions)
173
+ * Flatten font weights
170
174
  */
171
- function flattenEasing(easing) {
175
+ function flattenFontWeights(fontWeights) {
172
176
  var flattened = {};
173
- for (var _i7 = 0, _Object$entries7 = Object.entries(easing); _i7 < _Object$entries7.length; _i7++) {
177
+ for (var _i7 = 0, _Object$entries7 = Object.entries(fontWeights); _i7 < _Object$entries7.length; _i7++) {
174
178
  var _Object$entries7$_i = _slicedToArray(_Object$entries7[_i7], 2),
175
179
  key = _Object$entries7$_i[0],
176
180
  value = _Object$entries7$_i[1];
177
- if (typeof value === "string") {
181
+ if (typeof value === "string" || typeof value === "number") {
178
182
  flattened[key] = value;
179
183
  }
180
184
  }
@@ -182,11 +186,11 @@ function flattenEasing(easing) {
182
186
  }
183
187
 
184
188
  /**
185
- * Flatten duration (transition durations)
189
+ * Flatten easing (transition timing functions)
186
190
  */
187
- function flattenDuration(duration) {
191
+ function flattenEasing(easing) {
188
192
  var flattened = {};
189
- for (var _i8 = 0, _Object$entries8 = Object.entries(duration); _i8 < _Object$entries8.length; _i8++) {
193
+ for (var _i8 = 0, _Object$entries8 = Object.entries(easing); _i8 < _Object$entries8.length; _i8++) {
190
194
  var _Object$entries8$_i = _slicedToArray(_Object$entries8[_i8], 2),
191
195
  key = _Object$entries8$_i[0],
192
196
  value = _Object$entries8$_i[1];
@@ -197,6 +201,22 @@ function flattenDuration(duration) {
197
201
  return flattened;
198
202
  }
199
203
 
204
+ /**
205
+ * Flatten duration (transition durations)
206
+ */
207
+ function flattenDuration(duration) {
208
+ var flattened = {};
209
+ for (var _i9 = 0, _Object$entries9 = Object.entries(duration); _i9 < _Object$entries9.length; _i9++) {
210
+ var _Object$entries9$_i = _slicedToArray(_Object$entries9[_i9], 2),
211
+ key = _Object$entries9$_i[0],
212
+ value = _Object$entries9$_i[1];
213
+ if (typeof value === "string") {
214
+ flattened[key] = value;
215
+ }
216
+ }
217
+ return flattened;
218
+ }
219
+
200
220
  /**
201
221
  * Check if a value is a valid CSS color
202
222
  * Filters out complex values like color-mix() which may not work everywhere
@@ -210,10 +230,10 @@ function isSimpleColor(value) {
210
230
  */
211
231
  function filterComplexColors(colors) {
212
232
  var filtered = {};
213
- for (var _i9 = 0, _Object$entries9 = Object.entries(colors); _i9 < _Object$entries9.length; _i9++) {
214
- var _Object$entries9$_i = _slicedToArray(_Object$entries9[_i9], 2),
215
- key = _Object$entries9$_i[0],
216
- value = _Object$entries9$_i[1];
233
+ for (var _i0 = 0, _Object$entries0 = Object.entries(colors); _i0 < _Object$entries0.length; _i0++) {
234
+ var _Object$entries0$_i = _slicedToArray(_Object$entries0[_i0], 2),
235
+ key = _Object$entries0$_i[0],
236
+ value = _Object$entries0$_i[1];
217
237
  if (isSimpleColor(value)) {
218
238
  filtered[key] = value;
219
239
  } else {
@@ -96,7 +96,12 @@ var colors = exports.colors = _objectSpread(_objectSpread({}, _theme.default.col
96
96
  // contrast against the dark surface (Figma Sprout Variables, "Trellis" dark).
97
97
  gradient: {
98
98
  ai: "radial-gradient(circle at bottom left, #679eff 0%, #b984ff 61%, #f282f5 100%)",
99
- "ai-subtle": "radial-gradient(circle at bottom left, color-mix(in srgb, #679eff, transparent 80%) 0%, color-mix(in srgb, #b984ff, transparent 80%) 61%, color-mix(in srgb, #f282f5, transparent 80%) 100%)"
99
+ "ai-subtle": "radial-gradient(circle at bottom left, color-mix(in srgb, #679eff, transparent 80%) 0%, color-mix(in srgb, #b984ff, transparent 80%) 61%, color-mix(in srgb, #f282f5, transparent 80%) 100%)",
100
+ // Discrete stops for SVG paint servers — see the light theme for why these
101
+ // exist alongside the composed gradient strings.
102
+ "ai-stop-1": "#679eff",
103
+ "ai-stop-2": "#b984ff",
104
+ "ai-stop-3": "#f282f5"
100
105
  },
101
106
  button: {
102
107
  primary: {
@@ -105,7 +105,16 @@ var colors = exports.colors = _objectSpread(_objectSpread({
105
105
  ai: "radial-gradient(circle at bottom left, #205bc3 0%, #9747ff 61%, #f282f5 100%)",
106
106
  // 20% tint — AI secondary (composited over a white base in CSS).
107
107
  // Kebab key so it flattens to --color-gradient-ai-subtle.
108
- "ai-subtle": "radial-gradient(circle at bottom left, color-mix(in srgb, #205bc3, transparent 80%) 0%, color-mix(in srgb, #9747ff, transparent 80%) 61%, color-mix(in srgb, #f282f5, transparent 80%) 100%)"
108
+ "ai-subtle": "radial-gradient(circle at bottom left, color-mix(in srgb, #205bc3, transparent 80%) 0%, color-mix(in srgb, #9747ff, transparent 80%) 61%, color-mix(in srgb, #f282f5, transparent 80%) 100%)",
109
+ // The same three stops as discrete colors, flattening to
110
+ // --color-gradient-ai-stop-{1,2,3}. SVG needs a real <radialGradient> with
111
+ // separate <stop> elements to use as a paint server, and a CSS
112
+ // radial-gradient() string can't be decomposed back into stops. Consumed by
113
+ // seeds-react-icon's gradient defs (see icon.css) so gradient-filled icons
114
+ // pick up dark mode through the usual .dark variable swap.
115
+ "ai-stop-1": "#205bc3",
116
+ "ai-stop-2": "#9747ff",
117
+ "ai-stop-3": "#f282f5"
109
118
  },
110
119
  button: {
111
120
  primary: {
@@ -32,6 +32,11 @@
32
32
  --radius-inner: 4px;
33
33
  --radius-outer: 8px;
34
34
 
35
+ /* Border width — from @sproutsocial/seeds-border */
36
+ --border-width-500: 1px;
37
+ --border-width-600: 2px;
38
+ --border-width-700: 3px;
39
+
35
40
  /* Font size — from @sproutsocial/seeds-typography */
36
41
  --text-100--font-size: 11px;
37
42
  --text-100--line-height: 18.666666666666668px;
@@ -50,6 +50,9 @@
50
50
  --color-container-border-ai_generated: #6f5ed3;
51
51
  --color-gradient-ai: radial-gradient(circle at bottom left, #205bc3 0%, #9747ff 61%, #f282f5 100%);
52
52
  --color-gradient-ai-subtle: radial-gradient(circle at bottom left, color-mix(in srgb, #205bc3, transparent 80%) 0%, color-mix(in srgb, #9747ff, transparent 80%) 61%, color-mix(in srgb, #f282f5, transparent 80%) 100%);
53
+ --color-gradient-ai-stop-1: #205bc3;
54
+ --color-gradient-ai-stop-2: #9747ff;
55
+ --color-gradient-ai-stop-3: #f282f5;
53
56
  --color-button-primary-bg-base: #205bc3;
54
57
  --color-button-primary-bg-hover: #1150aa;
55
58
  --color-button-primary-bg-active: #0c3f89;
@@ -421,6 +424,94 @@
421
424
  --color-DATAVIZ_COLORS_MAP-19: #0ca750;
422
425
  --color-DATAVIZ_COLORS_MAP-20: #ba7506;
423
426
  --color-PLACEHOLDER: #c8cccc;
427
+ --color-ai-feature-decorative-primary: #067c7c;
428
+ --color-ai-feature-decorative-secondary: #0c3f89;
429
+ --color-ai-feature-bg-primary: #067c7c;
430
+ --color-ai-feature-bg-secondary: #0c3f89;
431
+ --color-ai-feature-bg-default-primary: #067c7c;
432
+ --color-ai-feature-bg-default-secondary: #0c3f89;
433
+ --color-ai-feature-bg-inverse-primary: #cdf7ef;
434
+ --color-ai-feature-bg-inverse-secondary: #c7dbf9;
435
+ --color-navigation-main-bg-base: #273333;
436
+ --color-navigation-main-bg-overflowGradient: #162020;
437
+ --color-navigation-main-border-base: #162020;
438
+ --color-navigation-secondary-bg-base: #364141;
439
+ --color-navigation-secondary-widget-bg-base: #162020;
440
+ --color-navigation-secondary-accordion-bg-base: #273333;
441
+ --color-navigation-settings-listItem-bg-base: transparent;
442
+ --color-navigation-settings-listItem-bg-hover: #dee1e1;
443
+ --color-navigation-settings-listItem-bg-selected: #FFFFFF;
444
+ --color-navigation-text-base: #FFFFFF;
445
+ --color-navigation-text-hover: #FFFFFF;
446
+ --color-navigation-icon-base: #FFFFFF;
447
+ --color-navigation-icon-hover: #FFFFFF;
448
+ --color-navigation-listItem-bg-base: #364141;
449
+ --color-navigation-listItem-bg-hover: #162020;
450
+ --color-navigation-listItem-bg-selected: #515e5f;
451
+ --color-datePicker-comparison-bg-base: #b0b6b7;
452
+ --color-datePicker-comparison-text-base: #364141;
453
+ --color-analytics-trend-positive: #067c7c;
454
+ --color-analytics-trend-neutral: #364141;
455
+ --color-analytics-trend-negative: #364141;
456
+ --color-analytics-overlay-bg-base: color-mix(in srgb, #FFFFFF, transparent 20%);
457
+ --color-listening-chart-indicator-default-primary: #b0b6b7;
458
+ --color-listening-chart-indicator-default-secondary: #FFFFFF;
459
+ --color-listening-chart-indicator-hover-primary: #162020;
460
+ --color-listening-chart-indicator-hover-secondary: #FFFFFF;
461
+ --color-listening-chart-spike-bg-base: #08c4b2;
462
+ --color-listening-chart-spike-icon-base: #FFFFFF;
463
+ --color-listening-topicTypes-customTopic: #679eff;
464
+ --color-listening-topicTypes-brandHealth: #ff7f6e;
465
+ --color-listening-topicTypes-industryInsights: #75dd66;
466
+ --color-listening-topicTypes-competitiveAnalysis: #ffd943;
467
+ --color-listening-topicTypes-campaignAnalysis: #f282f5;
468
+ --color-listening-topicTypes-eventMonitoring: #33d6e2;
469
+ --color-listening-topicTypes-featuredTopic: #75dd66;
470
+ --color-listening-worldMap-empty: #dee1e1;
471
+ --color-listening-worldMap-q0: #d8d7f9;
472
+ --color-listening-worldMap-q1: #c1c1f7;
473
+ --color-listening-worldMap-q2: #a193f2;
474
+ --color-listening-worldMap-q3: #9180f4;
475
+ --color-listening-worldMap-q4: #816fea;
476
+ --color-listening-worldMap-q5: #6f5ed3;
477
+ --color-listening-worldMap-q6: #5e4eba;
478
+ --color-listening-worldMap-q7: #483a9c;
479
+ --color-growth-carousel-indicator-active: #2b68d3;
480
+ --color-growth-carousel-indicator-inactive: #c8cccc;
481
+ --color-growth-education-decorative-aqua: #0797ae;
482
+ --color-growth-education-decorative-teal: #0b968f;
483
+ --color-growth-opportunity-bg-base: #6f5ed3;
484
+ --color-growth-opportunity-bg-secondary: #273333;
485
+ --color-growth-opportunity-bg-hover: #c1c1f7;
486
+ --color-growth-opportunity-button-primary-base: #6f5ed3;
487
+ --color-growth-opportunity-button-primary-hover: #5e4eba;
488
+ --color-growth-opportunity-badge-bg-base: #d8d7f9;
489
+ --color-growth-opportunity-badge-bg-active: #5e4eba;
490
+ --color-growth-opportunity-badge-icon-base: #6f5ed3;
491
+ --color-growth-opportunity-badge-icon-active: #eaeaf9;
492
+ --color-growth-opportunity-badge-text-base: #6f5ed3;
493
+ --color-growth-opportunity-decorative-green: #0ca750;
494
+ --color-growth-opportunity-decorative-lightAqua: #0797ae;
495
+ --color-growth-opportunity-decorative-darkAqua: #002838;
496
+ --color-growth-opportunity-decorative-purple: #6f5ed3;
497
+ --color-growth-featuredDemo-bg-primary-base: #205bc3;
498
+ --color-growth-featuredDemo-bg-primary-hover: #0c3f89;
499
+ --color-growth-featuredDemo-bg-secondary-base: #5e4eba;
500
+ --color-growth-featuredDemo-bg-secondary-hover: #5e4eba;
501
+ --color-growth-darkModal-bg-base: #002838;
502
+ --color-growth-darkModal-text-base: #FFFFFF;
503
+ --color-growth-darkModal-cards-bg-base: #FFFFFF;
504
+ --color-growth-darkModal-cards-bg-hover: #eaeaf9;
505
+ --color-growth-darkModal-cards-text-base: #364141;
506
+ --color-growth-darkModal-cards-text-hover: #273333;
507
+ --color-growth-darkModal-cards-border-base: #FFFFFF;
508
+ --color-growth-darkModal-cards-border-hover: #6f5ed3;
509
+ --color-growth-user-status-online: #0ca750;
510
+ --color-cardControl-bg-base: #FFFFFF;
511
+ --color-cardControl-bg-selected: #364141;
512
+ --color-cardControl-bg-hover: #f3f4f4;
513
+ --color-cardControl-text-selected: #FFFFFF;
514
+ --color-tags-collections-bg-base: #f3f4f4;
424
515
  --space-0: 0px;
425
516
  --space-100: 2px;
426
517
  --space-200: 4px;
@@ -468,6 +559,9 @@
468
559
  --radius-inner: 6px;
469
560
  --radius-outer: 8px;
470
561
  --radius-pill: 999999px;
562
+ --border-width-500: 1px;
563
+ --border-width-600: 2px;
564
+ --border-width-700: 3px;
471
565
  --shadow-low: 0px 2px 4px #2733333D;
472
566
  --shadow-medium: 0px 8px 16px #2733333D;
473
567
  --shadow-high: 0px 16px 32px #2733333D;
@@ -531,6 +625,9 @@
531
625
  --color-container-border-ai_generated: #6f5ed3;
532
626
  --color-gradient-ai: radial-gradient(circle at bottom left, #679eff 0%, #b984ff 61%, #f282f5 100%);
533
627
  --color-gradient-ai-subtle: radial-gradient(circle at bottom left, color-mix(in srgb, #679eff, transparent 80%) 0%, color-mix(in srgb, #b984ff, transparent 80%) 61%, color-mix(in srgb, #f282f5, transparent 80%) 100%);
628
+ --color-gradient-ai-stop-1: #679eff;
629
+ --color-gradient-ai-stop-2: #b984ff;
630
+ --color-gradient-ai-stop-3: #f282f5;
534
631
  --color-button-primary-bg-base: #679eff;
535
632
  --color-button-primary-bg-hover: #a1c2f8;
536
633
  --color-button-primary-bg-active: #c7dbf9;
@@ -902,6 +999,94 @@
902
999
  --color-DATAVIZ_COLORS_MAP-19: #c2f2bd;
903
1000
  --color-DATAVIZ_COLORS_MAP-20: #ffe99a;
904
1001
  --color-PLACEHOLDER: #364141;
1002
+ --color-navigation-main-bg-base: #162020;
1003
+ --color-navigation-main-bg-overflowGradient: #040404;
1004
+ --color-navigation-main-border-base: #040404;
1005
+ --color-navigation-secondary-bg-base: #273333;
1006
+ --color-navigation-secondary-widget-bg-base: #364141;
1007
+ --color-navigation-secondary-accordion-bg-base: #162020A3;
1008
+ --color-navigation-settings-listItem-bg-base: transparent;
1009
+ --color-navigation-settings-listItem-bg-hover: #040404;
1010
+ --color-navigation-settings-listItem-bg-selected: #364141;
1011
+ --color-navigation-text-base: #FFFFFF;
1012
+ --color-navigation-text-hover: #FFFFFF;
1013
+ --color-navigation-icon-base: #FFFFFF;
1014
+ --color-navigation-icon-hover: #FFFFFF;
1015
+ --color-navigation-listItem-bg-base: #162020;
1016
+ --color-navigation-listItem-bg-hover: #040404;
1017
+ --color-navigation-listItem-bg-selected: #515e5f;
1018
+ --color-datePicker-comparison-bg-base: #b0b6b7;
1019
+ --color-datePicker-comparison-text-base: #364141;
1020
+ --color-ai-feature-decorative-primary: #067c7c;
1021
+ --color-ai-feature-decorative-secondary: #0c3f89;
1022
+ --color-ai-feature-bg-primary: #cdf7ef;
1023
+ --color-ai-feature-bg-secondary: #c7dbf9;
1024
+ --color-ai-feature-bg-default-primary: #cdf7ef;
1025
+ --color-ai-feature-bg-default-secondary: #c7dbf9;
1026
+ --color-ai-feature-bg-inverse-primary: #067c7c;
1027
+ --color-ai-feature-bg-inverse-secondary: #0c3f89;
1028
+ --color-analytics-trend-positive: #08c4b2;
1029
+ --color-analytics-trend-neutral: #f3f4f4;
1030
+ --color-analytics-trend-negative: #f3f4f4;
1031
+ --color-analytics-overlay-bg-base: color-mix(in srgb, #273333, transparent 20%);
1032
+ --color-listening-chart-indicator-default-primary: #f3f4f4;
1033
+ --color-listening-chart-indicator-default-secondary: #273333;
1034
+ --color-listening-chart-indicator-hover-primary: #c8cccc;
1035
+ --color-listening-chart-indicator-hover-secondary: #FFFFFF;
1036
+ --color-listening-chart-spike-bg-base: #08c4b2;
1037
+ --color-listening-chart-spike-icon-base: #FFFFFF;
1038
+ --color-listening-topicTypes-customTopic: #24e0c5;
1039
+ --color-listening-topicTypes-brandHealth: #ff7f6e;
1040
+ --color-listening-topicTypes-industryInsights: #75dd66;
1041
+ --color-listening-topicTypes-competitiveAnalysis: #ffd943;
1042
+ --color-listening-topicTypes-campaignAnalysis: #f282f5;
1043
+ --color-listening-topicTypes-eventMonitoring: #33d6e2;
1044
+ --color-listening-topicTypes-featuredTopic: #75dd66;
1045
+ --color-listening-worldMap-empty: #dee1e1;
1046
+ --color-listening-worldMap-q0: #d8d7f9;
1047
+ --color-listening-worldMap-q1: #c1c1f7;
1048
+ --color-listening-worldMap-q2: #a193f2;
1049
+ --color-listening-worldMap-q3: #9180f4;
1050
+ --color-listening-worldMap-q4: #816fea;
1051
+ --color-listening-worldMap-q5: #6f5ed3;
1052
+ --color-listening-worldMap-q6: #5e4eba;
1053
+ --color-listening-worldMap-q7: #483a9c;
1054
+ --color-growth-carousel-indicator-active: #2b68d3;
1055
+ --color-growth-carousel-indicator-inactive: #c8cccc;
1056
+ --color-growth-education-decorative-aqua: #0797ae;
1057
+ --color-growth-education-decorative-teal: #08c4b2;
1058
+ --color-growth-opportunity-bg-base: #6f5ed3;
1059
+ --color-growth-opportunity-bg-secondary: #515e5f;
1060
+ --color-growth-opportunity-bg-hover: #9180f4;
1061
+ --color-growth-opportunity-button-primary-base: #a193f2;
1062
+ --color-growth-opportunity-button-primary-hover: #c1c1f7;
1063
+ --color-growth-opportunity-badge-bg-base: #6f5ed3;
1064
+ --color-growth-opportunity-badge-bg-active: #eaeaf9;
1065
+ --color-growth-opportunity-badge-icon-base: #d8d7f9;
1066
+ --color-growth-opportunity-badge-icon-active: #5e4eba;
1067
+ --color-growth-opportunity-badge-text-base: #d8d7f9;
1068
+ --color-growth-opportunity-decorative-green: #0ca750;
1069
+ --color-growth-opportunity-decorative-lightAqua: #0797ae;
1070
+ --color-growth-opportunity-decorative-darkAqua: #002838;
1071
+ --color-growth-opportunity-decorative-purple: #6f5ed3;
1072
+ --color-growth-featuredDemo-bg-primary-base: #679eff;
1073
+ --color-growth-featuredDemo-bg-primary-hover: #deebfe;
1074
+ --color-growth-featuredDemo-bg-secondary-base: #9180f4;
1075
+ --color-growth-featuredDemo-bg-secondary-hover: #eaeaf9;
1076
+ --color-growth-darkModal-bg-base: #002838;
1077
+ --color-growth-darkModal-text-base: #FFFFFF;
1078
+ --color-growth-darkModal-cards-bg-base: #FFFFFF;
1079
+ --color-growth-darkModal-cards-bg-hover: #eaeaf9;
1080
+ --color-growth-darkModal-cards-text-base: #364141;
1081
+ --color-growth-darkModal-cards-text-hover: #273333;
1082
+ --color-growth-darkModal-cards-border-base: #FFFFFF;
1083
+ --color-growth-darkModal-cards-border-hover: #6f5ed3;
1084
+ --color-growth-user-status-online: #0ca750;
1085
+ --color-cardControl-bg-base: #273333;
1086
+ --color-cardControl-bg-selected: #515e5f;
1087
+ --color-cardControl-bg-hover: #364141;
1088
+ --color-cardControl-text-selected: #f3f4f4;
1089
+ --color-tags-collections-bg-base: #364141;
905
1090
  --space-0: 0px;
906
1091
  --space-100: 2px;
907
1092
  --space-200: 4px;
@@ -949,6 +1134,9 @@
949
1134
  --radius-inner: 6px;
950
1135
  --radius-outer: 8px;
951
1136
  --radius-pill: 999999px;
1137
+ --border-width-500: 1px;
1138
+ --border-width-600: 2px;
1139
+ --border-width-700: 3px;
952
1140
  --shadow-low: 0px 2px 4px #040404FF;
953
1141
  --shadow-medium: 0px 8px 16px #040404FF;
954
1142
  --shadow-high: 0px 16px 32px #040404FF;