@sproutsocial/racine 29.1.1 → 31.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +646 -0
- package/dist/components.css +1174 -0
- package/dist/esm/icon/v2/index.js +7 -0
- package/dist/esm/icon/v2/index.js.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/icon/v2/index.d.mts +1 -0
- package/dist/icon/v2/index.d.ts +1 -0
- package/dist/icon/v2/index.js +42 -0
- package/dist/icon/v2/index.js.map +1 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/modal/v1/index.d.mts +1 -0
- package/dist/modal/v1/index.d.ts +1 -0
- package/package.json +82 -70
|
@@ -0,0 +1,1174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeds Design System - Combined Component CSS
|
|
3
|
+
* Auto-generated — do not edit directly.
|
|
4
|
+
*
|
|
5
|
+
* Provides pre-built component classes (seeds-btn, etc.) using Seeds CSS
|
|
6
|
+
* custom properties. Import alongside theme-all.css:
|
|
7
|
+
*
|
|
8
|
+
* import "@sproutsocial/seeds-react-theme/css/theme-all";
|
|
9
|
+
* import "@sproutsocial/racine/css/components";
|
|
10
|
+
*
|
|
11
|
+
* @see https://github.com/sproutsocial/seeds
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/* --- seeds-react-accordion --- */
|
|
15
|
+
/**
|
|
16
|
+
* Seeds Accordion component classes
|
|
17
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
18
|
+
*
|
|
19
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
20
|
+
* CSS variable definitions and dark mode support.
|
|
21
|
+
*
|
|
22
|
+
* These classes mirror the styled-components implementation in styles.ts so the
|
|
23
|
+
* Tailwind and styled-components rendering paths are visually identical. The
|
|
24
|
+
* `[data-styled="true"]` rules deliver the bordered "card" appearance when the
|
|
25
|
+
* accordion is rendered with `styled` enabled.
|
|
26
|
+
*
|
|
27
|
+
* Rules live in the Tailwind `components` layer so consumer utility classes
|
|
28
|
+
* (e.g. `mx-200`, `p-300`, `inline-flex`) win the cascade and can override the
|
|
29
|
+
* component's own styles. Keyframes are at-rules unaffected by layering and stay
|
|
30
|
+
* outside the `@layer` wrapper.
|
|
31
|
+
*
|
|
32
|
+
* Usage:
|
|
33
|
+
* <div class="accordion-item">
|
|
34
|
+
* <div class="seeds-accordion-trigger" data-styled="true">…</div>
|
|
35
|
+
* <div class="seeds-accordion-content" data-styled="true">
|
|
36
|
+
* <div class="seeds-accordion-content-inner" data-styled="true">…</div>
|
|
37
|
+
* </div>
|
|
38
|
+
* </div>
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/* Keyframes are prefixed to avoid collisions in the aggregated stylesheet
|
|
42
|
+
(styled-components previously scoped slideDown/slideUp per component). */
|
|
43
|
+
@keyframes seeds-accordion-slideDown {
|
|
44
|
+
from {
|
|
45
|
+
height: 0;
|
|
46
|
+
}
|
|
47
|
+
to {
|
|
48
|
+
height: var(--radix-accordion-content-height);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@keyframes seeds-accordion-slideUp {
|
|
53
|
+
from {
|
|
54
|
+
height: var(--radix-accordion-content-height);
|
|
55
|
+
}
|
|
56
|
+
to {
|
|
57
|
+
height: 0;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@layer components {
|
|
62
|
+
/* TriggerContainer -> .seeds-accordion-trigger */
|
|
63
|
+
.seeds-accordion-trigger {
|
|
64
|
+
display: flex;
|
|
65
|
+
align-items: center;
|
|
66
|
+
color: var(--color-text-body);
|
|
67
|
+
font-size: var(--font-size-200);
|
|
68
|
+
line-height: var(--line-height-200);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Override Text.Headline styles to match original accordion trigger typography */
|
|
72
|
+
.seeds-accordion-trigger h1,
|
|
73
|
+
.seeds-accordion-trigger h2,
|
|
74
|
+
.seeds-accordion-trigger h3,
|
|
75
|
+
.seeds-accordion-trigger h4,
|
|
76
|
+
.seeds-accordion-trigger h5,
|
|
77
|
+
.seeds-accordion-trigger h6 {
|
|
78
|
+
font-size: inherit;
|
|
79
|
+
font-weight: normal;
|
|
80
|
+
line-height: inherit;
|
|
81
|
+
color: inherit;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.seeds-accordion-trigger[data-styled="true"] h1,
|
|
85
|
+
.seeds-accordion-trigger[data-styled="true"] h2,
|
|
86
|
+
.seeds-accordion-trigger[data-styled="true"] h3,
|
|
87
|
+
.seeds-accordion-trigger[data-styled="true"] h4,
|
|
88
|
+
.seeds-accordion-trigger[data-styled="true"] h5,
|
|
89
|
+
.seeds-accordion-trigger[data-styled="true"] h6 {
|
|
90
|
+
font-weight: var(--font-weight-semibold);
|
|
91
|
+
color: var(--color-text-headline);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.seeds-accordion-trigger[data-styled="true"] {
|
|
95
|
+
border-top: 1px solid var(--color-container-border-base);
|
|
96
|
+
border-left: 1px solid var(--color-container-border-base);
|
|
97
|
+
border-right: 1px solid var(--color-container-border-base);
|
|
98
|
+
background: var(--color-container-bg-base);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.accordion-item[data-state="open"] .seeds-accordion-trigger[data-styled="true"] {
|
|
102
|
+
border-bottom: 1px solid transparent;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.accordion-item[data-state="closed"]
|
|
106
|
+
.seeds-accordion-trigger[data-styled="true"] {
|
|
107
|
+
transition: border-bottom-color 0s ease-in-out 0.3s;
|
|
108
|
+
border-bottom: 1px solid transparent;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.accordion-item:first-child .seeds-accordion-trigger[data-styled="true"] {
|
|
112
|
+
border-top-left-radius: var(--radius-outer);
|
|
113
|
+
border-top-right-radius: var(--radius-outer);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.accordion-item:last-child[data-state="closed"]
|
|
117
|
+
.seeds-accordion-trigger[data-styled="true"] {
|
|
118
|
+
transition: border-radius 0s linear 0.3s,
|
|
119
|
+
border-bottom-color 0s ease-in-out 0.3s;
|
|
120
|
+
border-bottom: 1px solid var(--color-container-border-base);
|
|
121
|
+
border-bottom-left-radius: var(--radius-outer);
|
|
122
|
+
border-bottom-right-radius: var(--radius-outer);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* StyledRadixAccordionContent -> .seeds-accordion-content */
|
|
126
|
+
.seeds-accordion-content {
|
|
127
|
+
overflow: hidden;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.seeds-accordion-content[data-state="open"] {
|
|
131
|
+
animation: seeds-accordion-slideDown 300ms ease-in-out;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.seeds-accordion-content[data-state="closed"] {
|
|
135
|
+
animation: seeds-accordion-slideUp 300ms ease-in-out;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.seeds-accordion-content[data-styled="true"] {
|
|
139
|
+
border-left: 1px solid var(--color-container-border-base);
|
|
140
|
+
border-right: 1px solid var(--color-container-border-base);
|
|
141
|
+
background: var(--color-container-bg-base);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.accordion-item:last-child[data-state="open"]
|
|
145
|
+
.seeds-accordion-content[data-styled="true"],
|
|
146
|
+
.accordion-item:last-child[data-state="closed"]
|
|
147
|
+
.seeds-accordion-content[data-styled="true"] {
|
|
148
|
+
border-bottom: 1px solid var(--color-container-border-base);
|
|
149
|
+
border-bottom-left-radius: var(--radius-outer);
|
|
150
|
+
border-bottom-right-radius: var(--radius-outer);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* ContentContainer -> .seeds-accordion-content-inner */
|
|
154
|
+
.seeds-accordion-content-inner {
|
|
155
|
+
color: var(--color-text-body);
|
|
156
|
+
background: transparent;
|
|
157
|
+
font-family: var(--font-family);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.seeds-accordion-content-inner[data-styled="true"] {
|
|
161
|
+
padding: 0 var(--space-400) var(--space-400);
|
|
162
|
+
font-size: var(--font-size-200);
|
|
163
|
+
line-height: var(--line-height-200);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.accordion-item:last-child[data-state="open"]
|
|
167
|
+
.seeds-accordion-content-inner[data-styled="true"],
|
|
168
|
+
.accordion-item:last-child[data-state="closed"]
|
|
169
|
+
.seeds-accordion-content-inner[data-styled="true"] {
|
|
170
|
+
border-bottom-left-radius: var(--radius-outer);
|
|
171
|
+
border-bottom-right-radius: var(--radius-outer);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* --- seeds-react-banner --- */
|
|
176
|
+
/**
|
|
177
|
+
* Seeds Banner component classes
|
|
178
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
179
|
+
*
|
|
180
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
181
|
+
* CSS variable definitions and dark mode support.
|
|
182
|
+
*
|
|
183
|
+
* Rules live in the Tailwind `components` layer so consumer utility classes
|
|
184
|
+
* (e.g. mx-200, p-300, inline-flex) win the cascade over these defaults.
|
|
185
|
+
*/
|
|
186
|
+
|
|
187
|
+
@layer components {
|
|
188
|
+
.seeds-banner {
|
|
189
|
+
display: flex;
|
|
190
|
+
overflow: hidden;
|
|
191
|
+
align-items: center;
|
|
192
|
+
justify-content: space-between;
|
|
193
|
+
color: var(--color-text-body);
|
|
194
|
+
border-radius: var(--radius-outer);
|
|
195
|
+
font-family: var(--font-family);
|
|
196
|
+
font-size: var(--font-size-200);
|
|
197
|
+
line-height: var(--line-height-200);
|
|
198
|
+
padding: var(--space-300);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.seeds-banner a,
|
|
202
|
+
.seeds-banner button {
|
|
203
|
+
font-weight: var(--font-weight-semibold);
|
|
204
|
+
color: var(--color-text-body);
|
|
205
|
+
font-size: inherit;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.seeds-banner a:hover,
|
|
209
|
+
.seeds-banner button:hover {
|
|
210
|
+
color: var(--color-text-body);
|
|
211
|
+
text-decoration: underline;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.seeds-banner > span:not(.Icon) {
|
|
215
|
+
display: block;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.seeds-banner-icon {
|
|
219
|
+
align-self: flex-start;
|
|
220
|
+
min-width: 16px;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.seeds-banner-ghost {
|
|
224
|
+
border: 1px solid var(--color-container-border-base);
|
|
225
|
+
background-color: var(--color-container-bg-base);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.seeds-banner-success {
|
|
229
|
+
border: 1px solid var(--color-container-border-success);
|
|
230
|
+
background-color: var(--color-container-bg-success);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.seeds-banner-info {
|
|
234
|
+
border: 1px solid var(--color-container-border-info);
|
|
235
|
+
background-color: var(--color-container-bg-info);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.seeds-banner-error {
|
|
239
|
+
border: 1px solid var(--color-container-border-error);
|
|
240
|
+
background-color: var(--color-container-bg-error);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.seeds-banner-warning {
|
|
244
|
+
border: 1px solid var(--color-container-border-warning);
|
|
245
|
+
background-color: var(--color-container-bg-warning);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.seeds-banner-opportunity {
|
|
249
|
+
border: 1px solid var(--color-container-border-opportunity);
|
|
250
|
+
background-color: var(--color-container-bg-opportunity);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/* --- seeds-react-button --- */
|
|
255
|
+
/**
|
|
256
|
+
* Seeds Button component classes
|
|
257
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
258
|
+
*
|
|
259
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
260
|
+
* CSS variable definitions and dark mode support.
|
|
261
|
+
*
|
|
262
|
+
* Usage:
|
|
263
|
+
* <button class="seeds-btn seeds-btn-primary">Click me</button>
|
|
264
|
+
* <button class="seeds-btn seeds-btn-primary seeds-btn-lg">Large</button>
|
|
265
|
+
* <button class="seeds-btn seeds-btn-primary seeds-btn-disabled" disabled>Disabled</button>
|
|
266
|
+
*/
|
|
267
|
+
|
|
268
|
+
@layer components {
|
|
269
|
+
|
|
270
|
+
.seeds-btn {
|
|
271
|
+
display: inline-block;
|
|
272
|
+
box-sizing: border-box;
|
|
273
|
+
text-align: center;
|
|
274
|
+
font-family: var(--font-family);
|
|
275
|
+
border-width: 1px;
|
|
276
|
+
border-style: solid;
|
|
277
|
+
border-radius: var(--radius-500);
|
|
278
|
+
cursor: pointer;
|
|
279
|
+
text-decoration: none;
|
|
280
|
+
line-height: 1rem;
|
|
281
|
+
white-space: nowrap;
|
|
282
|
+
font-weight: var(--font-weight-bold);
|
|
283
|
+
transition-property: all;
|
|
284
|
+
transition-duration: var(--duration-fast);
|
|
285
|
+
margin: 0;
|
|
286
|
+
padding: var(--space-300);
|
|
287
|
+
font-size: var(--font-size-200);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.seeds-btn:focus {
|
|
291
|
+
outline: none;
|
|
292
|
+
box-shadow:
|
|
293
|
+
0 0 0 1px var(--color-button-primary-bg-base),
|
|
294
|
+
0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/* KNOWN ISSUE: `small` currently renders identically to the default size — both use
|
|
298
|
+
--space-300 / --font-size-200 (only --lg differs). So size="small" has no visual
|
|
299
|
+
effect for ANY appearance. A real fix needs distinct small tokens confirmed against
|
|
300
|
+
Figma (24px target); left out of scope intentionally. */
|
|
301
|
+
.seeds-btn-sm {
|
|
302
|
+
padding: var(--space-300);
|
|
303
|
+
font-size: var(--font-size-200);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.seeds-btn-lg {
|
|
307
|
+
padding: var(--space-350);
|
|
308
|
+
font-size: var(--font-size-300);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.seeds-btn-primary {
|
|
312
|
+
background-color: var(--color-button-primary-bg-base);
|
|
313
|
+
color: var(--color-button-primary-text-base);
|
|
314
|
+
border-color: var(--color-button-primary-border-base);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.seeds-btn-primary:hover {
|
|
318
|
+
background-color: var(--color-button-primary-bg-hover);
|
|
319
|
+
color: var(--color-button-primary-text-hover);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.seeds-btn-primary:active {
|
|
323
|
+
background-color: var(--color-button-primary-bg-active);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.seeds-btn-secondary {
|
|
327
|
+
background-color: var(--color-button-secondary-bg-base);
|
|
328
|
+
color: var(--color-button-secondary-text-base);
|
|
329
|
+
border-color: var(--color-button-secondary-border-base);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.seeds-btn-secondary:hover {
|
|
333
|
+
background-color: var(--color-button-secondary-bg-hover);
|
|
334
|
+
color: var(--color-button-secondary-text-hover);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.seeds-btn-secondary:active {
|
|
338
|
+
background-color: var(--color-button-secondary-bg-active);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.seeds-btn-destructive {
|
|
342
|
+
background-color: var(--color-button-destructive-bg-base);
|
|
343
|
+
color: var(--color-button-destructive-text-base);
|
|
344
|
+
border-color: var(--color-button-destructive-border-base);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.seeds-btn-destructive:hover {
|
|
348
|
+
background-color: var(--color-button-destructive-bg-hover);
|
|
349
|
+
color: var(--color-button-destructive-text-hover);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.seeds-btn-destructive:active {
|
|
353
|
+
background-color: var(--color-button-destructive-bg-active);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.seeds-btn-placeholder {
|
|
357
|
+
background-color: var(--color-button-placeholder-bg-base);
|
|
358
|
+
color: var(--color-button-placeholder-text-base);
|
|
359
|
+
border-color: var(--color-button-placeholder-border-base);
|
|
360
|
+
border-style: dashed;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.seeds-btn-placeholder:hover {
|
|
364
|
+
background-color: var(--color-button-placeholder-bg-hover);
|
|
365
|
+
color: var(--color-button-placeholder-text-hover);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
.seeds-btn-unstyled {
|
|
369
|
+
background-color: var(--color-button-unstyled-bg-base);
|
|
370
|
+
color: var(--color-button-unstyled-text-base);
|
|
371
|
+
border-color: transparent;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
.seeds-btn-unstyled:hover {
|
|
375
|
+
color: var(--color-button-unstyled-text-hover);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/* AI brand appearances — built on the shared --color-gradient-ai* tokens.
|
|
379
|
+
Rendered only via this Tailwind/CSS path (see ButtonHybrid routing guard). */
|
|
380
|
+
.seeds-btn-ai-primary {
|
|
381
|
+
background-color: transparent;
|
|
382
|
+
background-image: var(--color-button-ai-primary-bg-base);
|
|
383
|
+
/* Cover the full border box (incl. the base 1px transparent border) and don't
|
|
384
|
+
tile — otherwise the gradient repeats as a 1px strip along each edge. */
|
|
385
|
+
background-origin: border-box;
|
|
386
|
+
background-repeat: no-repeat;
|
|
387
|
+
color: var(--color-button-ai-primary-text-base);
|
|
388
|
+
border-color: transparent;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
.seeds-btn-ai-secondary {
|
|
392
|
+
/* White base shows through the 20% gradient tint to produce the soft fill. */
|
|
393
|
+
background-color: #fff;
|
|
394
|
+
background-image: var(--color-button-ai-secondary-bg-base);
|
|
395
|
+
background-origin: border-box;
|
|
396
|
+
background-repeat: no-repeat;
|
|
397
|
+
color: var(--color-button-ai-secondary-text-base);
|
|
398
|
+
border-color: transparent;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
.seeds-btn-ai-outline {
|
|
402
|
+
position: relative;
|
|
403
|
+
background-color: transparent;
|
|
404
|
+
color: var(--color-button-ai-outline-text-base);
|
|
405
|
+
border-color: transparent;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/* Rounded gradient border via a masked ::before so it respects border-radius
|
|
409
|
+
and does not tint the label/icon. */
|
|
410
|
+
.seeds-btn-ai-outline::before {
|
|
411
|
+
content: "";
|
|
412
|
+
position: absolute;
|
|
413
|
+
inset: 0;
|
|
414
|
+
border-radius: inherit;
|
|
415
|
+
padding: 1px;
|
|
416
|
+
background: var(--color-gradient-ai);
|
|
417
|
+
-webkit-mask:
|
|
418
|
+
linear-gradient(#fff 0 0) content-box,
|
|
419
|
+
linear-gradient(#fff 0 0);
|
|
420
|
+
-webkit-mask-composite: xor;
|
|
421
|
+
mask-composite: exclude;
|
|
422
|
+
pointer-events: none;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/* Subtle, brand-consistent hover across all three AI appearances. */
|
|
426
|
+
.seeds-btn-ai-primary:hover,
|
|
427
|
+
.seeds-btn-ai-secondary:hover,
|
|
428
|
+
.seeds-btn-ai-outline:hover {
|
|
429
|
+
filter: brightness(0.96);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/* Active (sustained selected) state — mirrors styled-components: hover text color + active background */
|
|
433
|
+
.seeds-btn-primary.seeds-btn-active {
|
|
434
|
+
color: var(--color-button-primary-text-hover);
|
|
435
|
+
background-color: var(--color-button-primary-bg-active);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.seeds-btn-secondary.seeds-btn-active {
|
|
439
|
+
color: var(--color-button-secondary-text-hover);
|
|
440
|
+
background-color: var(--color-button-secondary-bg-active);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
.seeds-btn-destructive.seeds-btn-active {
|
|
444
|
+
color: var(--color-button-destructive-text-hover);
|
|
445
|
+
background-color: var(--color-button-destructive-bg-active);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
.seeds-btn-placeholder.seeds-btn-active {
|
|
449
|
+
color: var(--color-button-placeholder-text-hover);
|
|
450
|
+
background-color: var(--color-button-placeholder-bg-active);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/* unstyled active: only text color changes (no background token) */
|
|
454
|
+
.seeds-btn-unstyled.seeds-btn-active {
|
|
455
|
+
color: var(--color-button-unstyled-text-hover);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.seeds-btn-disabled {
|
|
459
|
+
opacity: 0.5;
|
|
460
|
+
cursor: not-allowed;
|
|
461
|
+
pointer-events: none;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
.seeds-btn-pill {
|
|
465
|
+
display: inline-flex;
|
|
466
|
+
align-items: center;
|
|
467
|
+
justify-content: center;
|
|
468
|
+
background-color: transparent;
|
|
469
|
+
border: none;
|
|
470
|
+
border-radius: var(--radius-pill);
|
|
471
|
+
min-width: var(--space-600);
|
|
472
|
+
min-height: var(--space-600);
|
|
473
|
+
padding: var(--space-300);
|
|
474
|
+
color: var(--color-button-pill-text-base);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
.seeds-btn-pill:hover,
|
|
478
|
+
.seeds-btn-pill:focus:active {
|
|
479
|
+
background-color: transparent;
|
|
480
|
+
color: var(--color-button-pill-text-hover);
|
|
481
|
+
box-shadow: inset 0px 0px 0px 1px var(--color-button-pill-border-hover);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.seeds-btn-pill.seeds-btn-active {
|
|
485
|
+
color: var(--color-button-pill-text-hover);
|
|
486
|
+
background-color: var(--color-button-pill-bg-active);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
} /* end @layer components */
|
|
490
|
+
/* --- seeds-react-content-block --- */
|
|
491
|
+
/**
|
|
492
|
+
* Seeds ContentBlock component classes
|
|
493
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
494
|
+
*
|
|
495
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
496
|
+
* CSS variable definitions and dark mode support.
|
|
497
|
+
*
|
|
498
|
+
* Usage:
|
|
499
|
+
* <div class="seeds-content-block-footer">...</div>
|
|
500
|
+
*/
|
|
501
|
+
|
|
502
|
+
@layer components {
|
|
503
|
+
.seeds-content-block {
|
|
504
|
+
background: var(--color-container-bg-base);
|
|
505
|
+
border: 1px solid var(--color-container-border-base);
|
|
506
|
+
border-radius: var(--radius-outer);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
.seeds-content-block-content {
|
|
510
|
+
padding: var(--space-400);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
.seeds-content-block-content.flush {
|
|
514
|
+
padding: 0;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/* When there is no footer, the content node rounds the card's bottom corners. */
|
|
518
|
+
.seeds-content-block-content.no-footer {
|
|
519
|
+
border-bottom-left-radius: var(--radius-outer);
|
|
520
|
+
border-bottom-right-radius: var(--radius-outer);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
.seeds-content-block-loader {
|
|
524
|
+
margin: var(--space-400) 0;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
.seeds-content-block-footer {
|
|
528
|
+
box-sizing: border-box;
|
|
529
|
+
display: flex;
|
|
530
|
+
justify-content: space-between;
|
|
531
|
+
align-items: center;
|
|
532
|
+
width: 100%;
|
|
533
|
+
padding: var(--space-400);
|
|
534
|
+
border-top: 1px solid var(--color-container-border-base);
|
|
535
|
+
border-bottom-left-radius: var(--radius-outer);
|
|
536
|
+
border-bottom-right-radius: var(--radius-outer);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/* --- seeds-react-content-header --- */
|
|
541
|
+
/**
|
|
542
|
+
* Seeds ContentHeader component classes
|
|
543
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
544
|
+
*
|
|
545
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
546
|
+
* CSS variable definitions and dark mode support.
|
|
547
|
+
*
|
|
548
|
+
* Rules live in the Tailwind `components` layer so consumer utility classes
|
|
549
|
+
* (e.g. mx-200, p-300, inline-flex) win the cascade over these defaults.
|
|
550
|
+
*/
|
|
551
|
+
|
|
552
|
+
@layer components {
|
|
553
|
+
.seeds-content-header {
|
|
554
|
+
box-sizing: border-box;
|
|
555
|
+
display: flex;
|
|
556
|
+
justify-content: space-between;
|
|
557
|
+
align-items: center;
|
|
558
|
+
width: 100%;
|
|
559
|
+
color: var(--color-text-headline);
|
|
560
|
+
padding: var(--space-400);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
.seeds-content-header-bordered {
|
|
564
|
+
border-bottom: 1px solid var(--color-container-border-base);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/* Delay hiding the divider until the close animation finishes */
|
|
568
|
+
.seeds-content-header:has(button[data-state="closed"]) {
|
|
569
|
+
transition: border-bottom-color 0s ease-in-out 0.3s;
|
|
570
|
+
border-bottom-color: transparent;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
.seeds-content-header-trigger {
|
|
574
|
+
all: unset;
|
|
575
|
+
display: flex;
|
|
576
|
+
align-items: center;
|
|
577
|
+
justify-content: space-between;
|
|
578
|
+
flex: 1;
|
|
579
|
+
width: 100%;
|
|
580
|
+
cursor: pointer;
|
|
581
|
+
min-width: 0;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
.seeds-content-header-trigger .triggerIcon {
|
|
585
|
+
flex-shrink: 0;
|
|
586
|
+
transition: transform 300ms ease-in-out;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
.seeds-content-header-trigger[data-state="open"] .triggerIcon {
|
|
590
|
+
transform: rotate(-180deg);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
.seeds-content-header-trigger:focus-visible {
|
|
594
|
+
outline: none;
|
|
595
|
+
box-shadow:
|
|
596
|
+
0 0 0 1px var(--color-button-primary-bg-base),
|
|
597
|
+
0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/* --- seeds-react-drawer --- */
|
|
602
|
+
/**
|
|
603
|
+
* Seeds Drawer component classes.
|
|
604
|
+
* Component-scoped port of the styled-components shell in styles.ts. Used by
|
|
605
|
+
* DrawerTailwind.tsx on the Base UI primitives (Backdrop/Viewport/Popup).
|
|
606
|
+
*
|
|
607
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for the
|
|
608
|
+
* CSS variable definitions (and dark mode support).
|
|
609
|
+
*
|
|
610
|
+
* Runtime numerics (z-index, and width/offset for side drawers) are applied as
|
|
611
|
+
* inline styles on the popup, not here. The Base-UI-injected custom properties
|
|
612
|
+
* (--drawer-snap-point-offset, --drawer-swipe-movement-y, --drawer-swipe-progress,
|
|
613
|
+
* --nested-drawers, --drawer-height, --drawer-frontmost-height) arrive on the
|
|
614
|
+
* popup at runtime and are read via var(...) below.
|
|
615
|
+
*
|
|
616
|
+
* All rules live in `@layer components` so Tailwind utilities (which the
|
|
617
|
+
* Storybook/racine setup registers in the canonical theme/base/components/
|
|
618
|
+
* utilities layer order) can override these component defaults. Unlayered
|
|
619
|
+
* rules would outrank any layered utility per the CSS cascade-layers spec,
|
|
620
|
+
* so utilities like `mx-200`/`p-300`/`inline-flex` passed via `className`
|
|
621
|
+
* would otherwise have no effect on the popup. Inline-styled geometry
|
|
622
|
+
* (width/offset/zIndex on the popup) is unaffected by layers and stays
|
|
623
|
+
* non-overridable by design.
|
|
624
|
+
*/
|
|
625
|
+
|
|
626
|
+
@layer components {
|
|
627
|
+
/* Viewport ---------------------------------------------------------------- */
|
|
628
|
+
|
|
629
|
+
.seeds-drawer-viewport {
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
.seeds-drawer-viewport--snap {
|
|
633
|
+
position: fixed;
|
|
634
|
+
inset: 0;
|
|
635
|
+
display: flex;
|
|
636
|
+
align-items: flex-end;
|
|
637
|
+
justify-content: center;
|
|
638
|
+
touch-action: none;
|
|
639
|
+
/* The viewport spans the whole screen but the popup only fills part of it.
|
|
640
|
+
Letting clicks fall through the empty area means a nested snap-point drawer
|
|
641
|
+
doesn't block selection/interaction with the parent drawer visible
|
|
642
|
+
underneath. The popup re-enables events. */
|
|
643
|
+
pointer-events: none;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/* Backdrop ---------------------------------------------------------------- */
|
|
647
|
+
|
|
648
|
+
.seeds-drawer-backdrop {
|
|
649
|
+
position: fixed;
|
|
650
|
+
inset: 0;
|
|
651
|
+
background: transparent;
|
|
652
|
+
pointer-events: none;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
/* Drag handle ------------------------------------------------------------- */
|
|
656
|
+
|
|
657
|
+
.seeds-drawer-drag-handle {
|
|
658
|
+
position: absolute;
|
|
659
|
+
top: 8px;
|
|
660
|
+
left: 50%;
|
|
661
|
+
transform: translateX(-50%);
|
|
662
|
+
width: 36px;
|
|
663
|
+
height: 4px;
|
|
664
|
+
border-radius: 2px;
|
|
665
|
+
background-color: var(--color-container-border-base);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/* Popup base -------------------------------------------------------------- */
|
|
669
|
+
|
|
670
|
+
.seeds-drawer-popup {
|
|
671
|
+
display: flex;
|
|
672
|
+
flex-direction: column;
|
|
673
|
+
position: fixed;
|
|
674
|
+
background-color: var(--color-container-bg-base);
|
|
675
|
+
filter: blur(0);
|
|
676
|
+
transition: transform var(--duration-medium) ease,
|
|
677
|
+
border-radius var(--duration-medium) ease,
|
|
678
|
+
height var(--duration-medium) ease;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/* Always-on opacity transition so content fades smoothly both into and out of
|
|
682
|
+
stacked state. */
|
|
683
|
+
.seeds-drawer-popup > * {
|
|
684
|
+
transition: opacity var(--duration-medium) ease;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
/* Side (left/right) layout. width + left/right come from inline style. */
|
|
688
|
+
.seeds-drawer-popup--side {
|
|
689
|
+
top: 0;
|
|
690
|
+
height: 100%;
|
|
691
|
+
box-shadow: var(--shadow-medium);
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
/* Bottom layout (non-snap bottom sheet). */
|
|
695
|
+
.seeds-drawer-popup--bottom:not(.seeds-drawer-popup--snap) {
|
|
696
|
+
--bleed: 3rem;
|
|
697
|
+
--stack-scale: 1;
|
|
698
|
+
--translate-y: 0px;
|
|
699
|
+
bottom: 0;
|
|
700
|
+
left: 0;
|
|
701
|
+
right: 0;
|
|
702
|
+
width: 100%;
|
|
703
|
+
height: calc(90vh + var(--bleed));
|
|
704
|
+
margin-bottom: calc(-1 * var(--bleed));
|
|
705
|
+
border-radius: var(--radius-800) var(--radius-800) 0 0;
|
|
706
|
+
transform: translateY(var(--translate-y)) scale(var(--stack-scale));
|
|
707
|
+
transform-origin: 50% calc(100% - var(--bleed));
|
|
708
|
+
box-shadow: 0px -8px 16px rgba(39, 51, 51, 0.25);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/* Bottom snap-points layout. Follows base-ui's reference layout. Critical:
|
|
712
|
+
- box-sizing: border-box so offsetHeight ignores padding-bottom; otherwise
|
|
713
|
+
base-ui's ResizeObserver feedback (padding-bottom driven by snap offset)
|
|
714
|
+
grows popupHeight on every measurement and snap math diverges.
|
|
715
|
+
- height (not max-height) so popupHeight is large enough that base-ui's snap
|
|
716
|
+
offset = max(0, popupHeight - snapHeight) distinguishes snap points.
|
|
717
|
+
- position: relative inside the flex-end Viewport so base-ui can measure
|
|
718
|
+
popupHeight vs viewportHeight for snap math. */
|
|
719
|
+
.seeds-drawer-popup--bottom.seeds-drawer-popup--snap {
|
|
720
|
+
box-sizing: border-box;
|
|
721
|
+
position: relative;
|
|
722
|
+
width: 100%;
|
|
723
|
+
height: calc(100dvh - 1rem);
|
|
724
|
+
padding-bottom: max(
|
|
725
|
+
0px,
|
|
726
|
+
calc(
|
|
727
|
+
var(--drawer-snap-point-offset, 0px) +
|
|
728
|
+
var(--drawer-swipe-movement-y, 0px)
|
|
729
|
+
)
|
|
730
|
+
);
|
|
731
|
+
overflow: visible;
|
|
732
|
+
touch-action: none;
|
|
733
|
+
/* Counterpart to the viewport's pointer-events: none — the popup itself
|
|
734
|
+
stays interactive. */
|
|
735
|
+
pointer-events: auto;
|
|
736
|
+
border-radius: var(--radius-800) var(--radius-800) 0 0;
|
|
737
|
+
box-shadow: 0px -8px 16px rgba(39, 51, 51, 0.25);
|
|
738
|
+
transform: translateY(
|
|
739
|
+
calc(
|
|
740
|
+
var(--drawer-snap-point-offset, 0px) +
|
|
741
|
+
var(--drawer-swipe-movement-y, 0px)
|
|
742
|
+
)
|
|
743
|
+
);
|
|
744
|
+
will-change: transform;
|
|
745
|
+
transition: transform var(--duration-medium) cubic-bezier(0.32, 0.72, 0, 1),
|
|
746
|
+
box-shadow var(--duration-medium) cubic-bezier(0.32, 0.72, 0, 1);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/* Enter / exit ------------------------------------------------------------ */
|
|
750
|
+
|
|
751
|
+
.seeds-drawer-popup--right[data-starting-style],
|
|
752
|
+
.seeds-drawer-popup--right[data-ending-style] {
|
|
753
|
+
transform: translateX(100%);
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
.seeds-drawer-popup--left[data-starting-style],
|
|
757
|
+
.seeds-drawer-popup--left[data-ending-style] {
|
|
758
|
+
transform: translateX(-100%);
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
.seeds-drawer-popup--bottom:not(.seeds-drawer-popup--snap)[data-starting-style],
|
|
762
|
+
.seeds-drawer-popup--bottom:not(.seeds-drawer-popup--snap)[data-ending-style] {
|
|
763
|
+
transform: translateY(calc(100% - var(--bleed) + 2px));
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
.seeds-drawer-popup--bottom.seeds-drawer-popup--snap[data-starting-style],
|
|
767
|
+
.seeds-drawer-popup--bottom.seeds-drawer-popup--snap[data-ending-style] {
|
|
768
|
+
transform: translateY(calc(100% + 2px));
|
|
769
|
+
padding-bottom: 0;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
/* The action rail lives above the popup (position: absolute, bottom: 100% +
|
|
773
|
+
RAIL_OFFSET). Translating the popup by its own height alone leaves the rail
|
|
774
|
+
visible at the bottom of the viewport during enter/exit, so we add the rail's
|
|
775
|
+
outset: RAIL_BUTTON_HEIGHT (32) + RAIL_OFFSET (12) = 44px. */
|
|
776
|
+
.seeds-drawer-popup--bottom.seeds-drawer-popup--action-rail:not(.seeds-drawer-popup--snap)[data-starting-style],
|
|
777
|
+
.seeds-drawer-popup--bottom.seeds-drawer-popup--action-rail:not(.seeds-drawer-popup--snap)[data-ending-style] {
|
|
778
|
+
transform: translateY(calc(100% - var(--bleed) + 2px + 44px));
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
.seeds-drawer-popup--bottom.seeds-drawer-popup--snap.seeds-drawer-popup--action-rail[data-starting-style],
|
|
782
|
+
.seeds-drawer-popup--bottom.seeds-drawer-popup--snap.seeds-drawer-popup--action-rail[data-ending-style] {
|
|
783
|
+
transform: translateY(calc(100% + 2px + 44px));
|
|
784
|
+
padding-bottom: 0;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
/* Swiping ----------------------------------------------------------------- */
|
|
788
|
+
|
|
789
|
+
.seeds-drawer-popup[data-swiping],
|
|
790
|
+
.seeds-drawer-popup[data-nested-drawer-swiping] {
|
|
791
|
+
transition-duration: 0ms;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/* Nested drawer open ------------------------------------------------------ */
|
|
795
|
+
|
|
796
|
+
.seeds-drawer-popup[data-nested-drawer-open] {
|
|
797
|
+
border-radius: var(--radius-800);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
/* Bottom non-snap stacked bottom-sheet animation. Snap-point drawers don't
|
|
801
|
+
participate: the stack math overwrites --translate-y and clips overflow,
|
|
802
|
+
which collides with base-ui's snap-offset transform. */
|
|
803
|
+
.seeds-drawer-popup--bottom:not(.seeds-drawer-popup--snap)[data-nested-drawer-open] {
|
|
804
|
+
--stack-step: 0.05;
|
|
805
|
+
--stack-progress: clamp(0, var(--drawer-swipe-progress), 1);
|
|
806
|
+
/* Override default vars; base transform rule picks them up automatically */
|
|
807
|
+
--stack-scale: max(
|
|
808
|
+
0,
|
|
809
|
+
calc(
|
|
810
|
+
1 - (var(--nested-drawers) * var(--stack-step)) +
|
|
811
|
+
(var(--stack-step) * var(--stack-progress))
|
|
812
|
+
)
|
|
813
|
+
);
|
|
814
|
+
--stack-shrink: calc(1 - var(--stack-scale));
|
|
815
|
+
--stack-height: max(
|
|
816
|
+
0px,
|
|
817
|
+
calc(var(--drawer-frontmost-height, var(--drawer-height)) - var(--bleed))
|
|
818
|
+
);
|
|
819
|
+
--stack-peek-offset: max(
|
|
820
|
+
0px,
|
|
821
|
+
calc((var(--nested-drawers) - var(--stack-progress)) * 1rem)
|
|
822
|
+
);
|
|
823
|
+
--translate-y: calc(
|
|
824
|
+
var(--drawer-swipe-movement-y) - var(--stack-peek-offset) -
|
|
825
|
+
(var(--stack-shrink) * var(--stack-height))
|
|
826
|
+
);
|
|
827
|
+
height: calc(var(--stack-height) + var(--bleed));
|
|
828
|
+
overflow: hidden;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
/* Side stacked animation. */
|
|
832
|
+
.seeds-drawer-popup--side[data-nested-drawer-open] {
|
|
833
|
+
transform: translateY(calc(var(--nested-drawers) * -20px))
|
|
834
|
+
scale(calc(1 - var(--nested-drawers) * 0.08));
|
|
835
|
+
transform-origin: top center;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
/* Fade children out while stacked — every direction except snap. */
|
|
839
|
+
.seeds-drawer-popup:not(.seeds-drawer-popup--snap)[data-nested-drawer-open]
|
|
840
|
+
> * {
|
|
841
|
+
opacity: 0;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
/* While actively swiping a nested drawer, keep children visible. Equal
|
|
845
|
+
specificity to the fade-out rule above, so this must come after it. */
|
|
846
|
+
.seeds-drawer-popup[data-nested-drawer-open][data-nested-drawer-swiping] > * {
|
|
847
|
+
opacity: 1;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
/* --- seeds-react-link --- */
|
|
852
|
+
/**
|
|
853
|
+
* Seeds Link component classes
|
|
854
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
855
|
+
*
|
|
856
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
857
|
+
* CSS variable definitions and dark mode support.
|
|
858
|
+
*
|
|
859
|
+
* Rules live in the Tailwind `components` layer so consumer utility classes
|
|
860
|
+
* (e.g. mx-200, p-300, inline-flex) win the cascade over these defaults.
|
|
861
|
+
*/
|
|
862
|
+
|
|
863
|
+
@layer components {
|
|
864
|
+
.seeds-link {
|
|
865
|
+
border: 0;
|
|
866
|
+
appearance: none;
|
|
867
|
+
cursor: pointer;
|
|
868
|
+
font-family: var(--font-family);
|
|
869
|
+
font-weight: var(--font-weight-semibold);
|
|
870
|
+
color: var(--color-link-base);
|
|
871
|
+
text-decoration: none;
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
.seeds-link-underline {
|
|
875
|
+
text-decoration: underline;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
.seeds-link:hover {
|
|
879
|
+
color: var(--color-link-hover);
|
|
880
|
+
text-decoration: underline;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
.seeds-link:active {
|
|
884
|
+
color: var(--color-link-hover);
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
.seeds-link:focus {
|
|
888
|
+
outline: none;
|
|
889
|
+
box-shadow:
|
|
890
|
+
0 0 0 1px var(--color-button-primary-bg-base),
|
|
891
|
+
0 0 0 4px color-mix(in srgb, var(--color-button-primary-bg-base) 30%, transparent);
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
.seeds-link:focus:active {
|
|
895
|
+
box-shadow: none;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
.seeds-link-disabled {
|
|
899
|
+
opacity: 0.4;
|
|
900
|
+
cursor: not-allowed;
|
|
901
|
+
pointer-events: none;
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
/* When rendered as a button (no href) remove the native button background */
|
|
905
|
+
.seeds-link-no-href {
|
|
906
|
+
background: none;
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
/* --- seeds-react-loader --- */
|
|
911
|
+
/**
|
|
912
|
+
* Seeds Loader component classes
|
|
913
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
914
|
+
*
|
|
915
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
916
|
+
* CSS variable definitions and dark mode support.
|
|
917
|
+
*
|
|
918
|
+
* Usage:
|
|
919
|
+
* <div class="seeds-loader seeds-loader-delay">
|
|
920
|
+
* <span class="seeds-loader-visually-hidden">Loading</span>
|
|
921
|
+
* </div>
|
|
922
|
+
* <div class="seeds-loader seeds-loader-sm">...</div> (small)
|
|
923
|
+
* <div class="seeds-loader">...</div> (no delay)
|
|
924
|
+
*/
|
|
925
|
+
|
|
926
|
+
@layer components {
|
|
927
|
+
@keyframes seeds-loader-spin {
|
|
928
|
+
from {
|
|
929
|
+
transform: translate(-50%, -50%) rotate(0deg);
|
|
930
|
+
}
|
|
931
|
+
to {
|
|
932
|
+
transform: translate(-50%, -50%) rotate(360deg);
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
@keyframes seeds-loader-delay-anim {
|
|
937
|
+
0% {
|
|
938
|
+
opacity: 0;
|
|
939
|
+
}
|
|
940
|
+
80% {
|
|
941
|
+
opacity: 0;
|
|
942
|
+
}
|
|
943
|
+
100% {
|
|
944
|
+
opacity: 1;
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
/* Base (large / 40px) */
|
|
949
|
+
.seeds-loader {
|
|
950
|
+
position: relative;
|
|
951
|
+
margin: 0 auto;
|
|
952
|
+
padding: 0;
|
|
953
|
+
overflow: hidden;
|
|
954
|
+
border-radius: 100%;
|
|
955
|
+
width: 40px;
|
|
956
|
+
height: 40px;
|
|
957
|
+
box-shadow:
|
|
958
|
+
0 0 0 2px var(--color-neutral-600),
|
|
959
|
+
inset 0 0 0 6px var(--color-neutral-600);
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
.seeds-loader::after {
|
|
963
|
+
position: absolute;
|
|
964
|
+
top: 50%;
|
|
965
|
+
left: 50%;
|
|
966
|
+
width: 40px;
|
|
967
|
+
height: 40px;
|
|
968
|
+
box-sizing: border-box;
|
|
969
|
+
border-width: 4px;
|
|
970
|
+
background: transparent;
|
|
971
|
+
border-style: solid;
|
|
972
|
+
border-radius: 100%;
|
|
973
|
+
content: "";
|
|
974
|
+
transition: opacity 250ms;
|
|
975
|
+
border-color: var(--color-neutral-0) var(--color-neutral-0)
|
|
976
|
+
var(--color-neutral-600) var(--color-neutral-600);
|
|
977
|
+
animation: seeds-loader-spin 2.25s infinite linear;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
.no-cssanimations .seeds-loader::after {
|
|
981
|
+
background-size: 40px;
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
/* Delay variant — adds the delay fade-in to the container and the spinner */
|
|
985
|
+
.seeds-loader-delay {
|
|
986
|
+
animation: seeds-loader-delay-anim 2s 1;
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
.seeds-loader-delay::after {
|
|
990
|
+
animation:
|
|
991
|
+
seeds-loader-spin 2.25s infinite linear,
|
|
992
|
+
seeds-loader-delay-anim 2s 1;
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
/* Small (20px) */
|
|
996
|
+
.seeds-loader-sm {
|
|
997
|
+
width: 20px;
|
|
998
|
+
height: 20px;
|
|
999
|
+
box-shadow:
|
|
1000
|
+
0 0 0 2px var(--color-neutral-600),
|
|
1001
|
+
inset 0 0 0 4px var(--color-neutral-600);
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
.seeds-loader-sm::after {
|
|
1005
|
+
width: 20px;
|
|
1006
|
+
height: 20px;
|
|
1007
|
+
border-width: 2px;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
.no-cssanimations .seeds-loader-sm::after {
|
|
1011
|
+
background-size: 20px;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
/* Visually-hidden accessibility text */
|
|
1015
|
+
.seeds-loader-visually-hidden {
|
|
1016
|
+
position: absolute;
|
|
1017
|
+
width: 1px;
|
|
1018
|
+
height: 1px;
|
|
1019
|
+
padding: 0;
|
|
1020
|
+
margin: -1px;
|
|
1021
|
+
overflow: hidden;
|
|
1022
|
+
clip: rect(0 0 0 0);
|
|
1023
|
+
border: 0;
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
/* --- seeds-react-loader-button --- */
|
|
1028
|
+
/**
|
|
1029
|
+
* Seeds LoaderButton component classes
|
|
1030
|
+
* Layered on top of the Button (.seeds-btn*) classes to reproduce the disabled
|
|
1031
|
+
* background dimming the styled-components LoaderButton applied.
|
|
1032
|
+
*
|
|
1033
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
1034
|
+
* CSS variable definitions and dark mode support.
|
|
1035
|
+
*
|
|
1036
|
+
* Rules live in the Tailwind `components` layer so consumer utility classes
|
|
1037
|
+
* (e.g. mx-200, p-300, inline-flex) win the cascade over these defaults.
|
|
1038
|
+
*/
|
|
1039
|
+
|
|
1040
|
+
@layer components {
|
|
1041
|
+
/* Keep the loader fully visible by overriding .seeds-btn-disabled opacity: 0.5 */
|
|
1042
|
+
.seeds-loader-btn-disabled.seeds-btn-disabled {
|
|
1043
|
+
opacity: 1;
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
/* Disabled background: the appearance's base color at 40% alpha. */
|
|
1047
|
+
.seeds-loader-btn-disabled.seeds-btn-primary {
|
|
1048
|
+
background-color: color-mix(
|
|
1049
|
+
in srgb,
|
|
1050
|
+
var(--color-button-primary-bg-base) 40%,
|
|
1051
|
+
transparent
|
|
1052
|
+
);
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
.seeds-loader-btn-disabled.seeds-btn-destructive {
|
|
1056
|
+
background-color: color-mix(
|
|
1057
|
+
in srgb,
|
|
1058
|
+
var(--color-button-destructive-bg-base) 40%,
|
|
1059
|
+
transparent
|
|
1060
|
+
);
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
/* Appearances whose base background is transparent resolve to transparent. */
|
|
1064
|
+
.seeds-loader-btn-disabled.seeds-btn-secondary {
|
|
1065
|
+
background-color: transparent;
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
.seeds-loader-btn-disabled.seeds-btn-placeholder {
|
|
1069
|
+
background-color: transparent;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
.seeds-loader-btn-disabled.seeds-btn-unstyled {
|
|
1073
|
+
background-color: transparent;
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
.seeds-loader-btn-disabled.seeds-btn-pill {
|
|
1077
|
+
background-color: transparent;
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
/* --- seeds-react-narrative-kit --- */
|
|
1082
|
+
/**
|
|
1083
|
+
* Seeds NarrativeContainer component classes.
|
|
1084
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
1085
|
+
*
|
|
1086
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
1087
|
+
* CSS variable definitions and dark mode support.
|
|
1088
|
+
*
|
|
1089
|
+
* Usage:
|
|
1090
|
+
* <div class="seeds-narrative-container seeds-narrative-container-accent">…</div>
|
|
1091
|
+
*/
|
|
1092
|
+
|
|
1093
|
+
@layer components {
|
|
1094
|
+
|
|
1095
|
+
.seeds-narrative-container {
|
|
1096
|
+
position: relative;
|
|
1097
|
+
overflow: hidden;
|
|
1098
|
+
box-sizing: border-box;
|
|
1099
|
+
display: flex;
|
|
1100
|
+
flex-direction: column;
|
|
1101
|
+
align-items: flex-start;
|
|
1102
|
+
padding: var(--space-500);
|
|
1103
|
+
border-radius: var(--radius-800);
|
|
1104
|
+
box-shadow: var(--shadow-low);
|
|
1105
|
+
background-color: var(--color-container-bg-base);
|
|
1106
|
+
font-family: var(--font-family);
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
/* Decorative inner gradient border anchored to the top-left corner.
|
|
1110
|
+
A masked ::before so the gradient renders as a uniform-width ring that follows
|
|
1111
|
+
border-radius and never tints the content. The radial ellipse fades to
|
|
1112
|
+
transparent away from the corner; its x-radius (80%) is larger than its
|
|
1113
|
+
y-radius (60%) so the accent runs slightly further along the top edge than down
|
|
1114
|
+
the left edge. Brand stops mirror --color-gradient-ai — tokenize to a
|
|
1115
|
+
--color-gradient-* token once one exists for a fade-to-transparent variant. */
|
|
1116
|
+
.seeds-narrative-container-accent::before {
|
|
1117
|
+
content: "";
|
|
1118
|
+
position: absolute;
|
|
1119
|
+
inset: 0;
|
|
1120
|
+
border-radius: inherit;
|
|
1121
|
+
padding: 4px;
|
|
1122
|
+
background: radial-gradient(
|
|
1123
|
+
ellipse 80% 60% at top left,
|
|
1124
|
+
#205bc3 0%,
|
|
1125
|
+
#9747ff 28%,
|
|
1126
|
+
#f282f5 50%,
|
|
1127
|
+
transparent 72%
|
|
1128
|
+
);
|
|
1129
|
+
-webkit-mask:
|
|
1130
|
+
linear-gradient(#fff 0 0) content-box,
|
|
1131
|
+
linear-gradient(#fff 0 0);
|
|
1132
|
+
-webkit-mask-composite: xor;
|
|
1133
|
+
mask-composite: exclude;
|
|
1134
|
+
pointer-events: none;
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
/* --- seeds-react-text --- */
|
|
1140
|
+
/**
|
|
1141
|
+
* Seeds Text component classes
|
|
1142
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
1143
|
+
*
|
|
1144
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
1145
|
+
* CSS variable definitions and dark mode support.
|
|
1146
|
+
*
|
|
1147
|
+
* Rules live in the Tailwind `components` layer so consumer utility classes
|
|
1148
|
+
* (e.g. mx-200, p-300, inline-flex) win the cascade over these defaults.
|
|
1149
|
+
*/
|
|
1150
|
+
|
|
1151
|
+
@layer components {
|
|
1152
|
+
.seeds-text {
|
|
1153
|
+
margin: 0;
|
|
1154
|
+
padding-left: 0;
|
|
1155
|
+
padding-right: 0;
|
|
1156
|
+
font-family: var(--font-family);
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
.seeds-text-italic {
|
|
1160
|
+
font-style: italic;
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
.seeds-text-truncated {
|
|
1164
|
+
display: block;
|
|
1165
|
+
overflow: hidden;
|
|
1166
|
+
white-space: nowrap;
|
|
1167
|
+
text-overflow: ellipsis;
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
.seeds-text-break-word {
|
|
1171
|
+
word-break: break-word;
|
|
1172
|
+
hyphens: auto;
|
|
1173
|
+
}
|
|
1174
|
+
}
|