@stackoverflow/stacks 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +47 -47
  2. package/dist/controllers/s-popover.d.ts +11 -2
  3. package/dist/css/stacks.css +257 -8
  4. package/dist/css/stacks.min.css +1 -1
  5. package/dist/js/stacks.js +18 -2
  6. package/dist/js/stacks.min.js +1 -1
  7. package/lib/css/atomic/borders.less +378 -378
  8. package/lib/css/atomic/colors.less +209 -209
  9. package/lib/css/atomic/flex.less +375 -375
  10. package/lib/css/atomic/grid.less +174 -174
  11. package/lib/css/atomic/misc.less +343 -343
  12. package/lib/css/atomic/spacing.less +342 -314
  13. package/lib/css/atomic/typography.less +273 -273
  14. package/lib/css/atomic/width-height.less +194 -194
  15. package/lib/css/base/body.less +44 -44
  16. package/lib/css/base/configuration-static.less +61 -61
  17. package/lib/css/base/icons.less +20 -20
  18. package/lib/css/base/internals.less +220 -220
  19. package/lib/css/base/reset-meyer.less +64 -64
  20. package/lib/css/base/reset-normalize.less +449 -449
  21. package/lib/css/base/reset.less +20 -20
  22. package/lib/css/components/activity-indicator.less +44 -45
  23. package/lib/css/components/avatars.less +189 -189
  24. package/lib/css/components/badges.less +254 -209
  25. package/lib/css/components/banners.less +80 -80
  26. package/lib/css/components/blank-states.less +26 -26
  27. package/lib/css/components/breadcrumbs.less +44 -44
  28. package/lib/css/components/button-groups.less +104 -104
  29. package/lib/css/components/buttons.less +665 -665
  30. package/lib/css/components/cards.less +44 -44
  31. package/lib/css/components/code-blocks.less +130 -130
  32. package/lib/css/components/collapsible.less +104 -104
  33. package/lib/css/components/inputs.less +728 -728
  34. package/lib/css/components/link-previews.less +136 -136
  35. package/lib/css/components/links.less +218 -218
  36. package/lib/css/components/menu.less +47 -47
  37. package/lib/css/components/modals.less +133 -133
  38. package/lib/css/components/navigation.less +146 -146
  39. package/lib/css/components/notices.less +233 -233
  40. package/lib/css/components/page-titles.less +60 -60
  41. package/lib/css/components/pagination.less +55 -55
  42. package/lib/css/components/popovers.less +197 -197
  43. package/lib/css/components/post-summary.less +436 -425
  44. package/lib/css/components/progress-bars.less +330 -330
  45. package/lib/css/components/prose.less +503 -503
  46. package/lib/css/components/spinner.less +107 -107
  47. package/lib/css/components/tables.less +341 -341
  48. package/lib/css/components/tags.less +236 -236
  49. package/lib/css/components/toggle-switches.less +144 -144
  50. package/lib/css/components/topbar.less +427 -427
  51. package/lib/css/components/uploader.less +210 -210
  52. package/lib/css/components/user-cards.less +169 -169
  53. package/lib/css/components/widget-dynamic.less +33 -33
  54. package/lib/css/components/widget-static.less +273 -273
  55. package/lib/css/exports/constants-colors.less +1092 -1092
  56. package/lib/css/exports/constants-helpers.less +108 -108
  57. package/lib/css/exports/constants-type.less +153 -153
  58. package/lib/css/exports/exports.less +15 -15
  59. package/lib/css/exports/mixins.less +237 -237
  60. package/lib/css/stacks-dynamic.less +35 -35
  61. package/lib/css/stacks-static.less +86 -86
  62. package/lib/css/stacks.less +13 -13
  63. package/lib/ts/controllers/index.ts +7 -7
  64. package/lib/ts/controllers/s-expandable-control.ts +188 -188
  65. package/lib/ts/controllers/s-modal.ts +321 -321
  66. package/lib/ts/controllers/s-navigation-tablist.ts +117 -117
  67. package/lib/ts/controllers/s-popover.ts +567 -547
  68. package/lib/ts/controllers/s-table.ts +220 -220
  69. package/lib/ts/controllers/s-tooltip.ts +246 -246
  70. package/lib/ts/controllers/s-uploader.ts +172 -172
  71. package/lib/ts/index.ts +20 -20
  72. package/lib/ts/stacks.ts +88 -88
  73. package/lib/tsconfig.json +13 -13
  74. package/package.json +86 -87
@@ -1,665 +1,665 @@
1
- //
2
- // STACK OVERFLOW
3
- // BUTTONS
4
- //
5
- // This CSS comes from Stacks, our CSS & Pattern library for rapidly building
6
- // Stack Overflow. For documentation of all these classes and how to contribute,
7
- // visit https://stackoverflow.design/
8
- //
9
- // TABLE OF CONTENTS
10
- // • BASE STYLE
11
- // • STYLE MODIFICATIONS
12
- // • LAYOUTS & SIZES
13
- // ----------------------------------------------------------------------------
14
-
15
- // ============================================================================
16
- // $ BASE STYLE
17
- // ----------------------------------------------------------------------------
18
- & {
19
- .s-btn {
20
- position: relative;
21
- display: inline-block;
22
- padding: 0.8em;
23
- color: var(--theme-button-color);
24
- border: 1px solid transparent;
25
- border-radius: var(--br-sm);
26
- background-color: transparent;
27
- outline: none;
28
- font-family: inherit;
29
- font-size: var(--fs-body1);
30
- font-weight: normal;
31
- line-height: var(--lh-sm);
32
- text-align: center;
33
- text-decoration: none;
34
- cursor: pointer;
35
- user-select: none;
36
-
37
- .highcontrast-mode({
38
- border-color: currentColor;
39
-
40
- &:not(.s-btn__link):not(.s-btn__unset) {
41
- text-decoration: none;
42
- }
43
- });
44
-
45
- button &,
46
- button[type="submit"] &,
47
- button[type="reset"] & {
48
- // Guard against the difference in configurable resets
49
- // Eric Meyer's reset does not include this, while normalize.css does
50
- // Correct the inability to style buttons in iOS and Safari.
51
- -webkit-appearance: button;
52
- }
53
-
54
- // Override for buttons having inline-block by default
55
- &.grid {
56
- display: flex;
57
- }
58
-
59
- &:hover,
60
- &:focus,
61
- &:active {
62
- color: var(--theme-button-hover-color);
63
- background: var(--theme-button-hover-background-color);
64
- text-decoration: none;
65
- }
66
-
67
- &:active {
68
- background: var(--theme-button-active-background-color);
69
- }
70
-
71
- &:focus {
72
- outline: none;
73
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring);
74
- }
75
-
76
- &[disabled] {
77
- opacity: 0.5;
78
- pointer-events: none;
79
- box-shadow: none !important;
80
- }
81
-
82
- &.is-selected {
83
- color: var(--theme-button-selected-color);
84
- background: var(--theme-button-selected-background-color);
85
- box-shadow: none;
86
-
87
- &:focus {
88
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring);
89
- }
90
- }
91
-
92
- &.s-btn__dropdown {
93
- padding-right: 2em;
94
-
95
- &:after {
96
- content: "";
97
- position: absolute;
98
- z-index: var(--zi-active);
99
- top: calc(50% - 2px);
100
- right: 0.8em;
101
- border-style: solid;
102
- border-width: var(--su-static4);
103
- border-top-width: var(--su-static4);
104
- border-bottom-width: 0;
105
- border-color: currentColor transparent;
106
- pointer-events: none;
107
- }
108
- }
109
-
110
- &.s-btn__xs {
111
- padding: 0.6em;
112
- font-size: var(--fs-fine);
113
-
114
- &.s-btn__dropdown {
115
- padding-right: 1.5em;
116
-
117
- &:after {
118
- top: calc(50% - 2px);
119
- right: 0.6em;
120
- border-width: calc(var(--su-static4) - var(--su-static1));
121
- border-top-width: calc(var(--su-static4) - var(--su-static1));
122
- border-bottom-width: 0;
123
- }
124
- }
125
- }
126
-
127
- &.s-btn__sm {
128
- font-size: var(--fs-caption);
129
-
130
- &.s-btn__dropdown {
131
- padding-right: 2.05em;
132
- }
133
- }
134
-
135
- &.s-btn__md {
136
- padding: 0.7em;
137
- border-radius: calc(var(--br-sm) + 1px);
138
- font-size: var(--fs-body3);
139
-
140
- &.s-btn__dropdown {
141
- padding-right: 1.8em;
142
-
143
- &:after {
144
- top: calc(50% - 2px);
145
- right: 0.7em;
146
- border-width: calc(var(--su-static4) + var(--su-static1));
147
- border-top-width: calc(var(--su-static4) + var(--su-static1));
148
- border-bottom-width: 0;
149
- }
150
- }
151
- }
152
-
153
- .s-btn--badge {
154
- opacity: 0.5;
155
- display: inline-block;
156
- border-radius: var(--br-sm);
157
- padding: var(--su2) calc(var(--su4) - var(--su1));
158
- font-size: var(--fs-caption);
159
- line-height: var(--lh-xs);
160
- background-color: currentColor;
161
-
162
- .highcontrast-mode({ opacity: 0.8; });
163
- }
164
-
165
- .s-btn--number {
166
- color: var(--white);
167
- }
168
- }
169
-
170
- .s-btn__primary:not(.is-selected) .s-btn--number,
171
- .s-btn__danger.s-btn__filled:not(.is-selected) .s-btn--number {
172
- .dark-mode({ color: var(--white); });
173
- .highcontrast-mode({ color: var(--black); });
174
- }
175
-
176
- // ============================================================================
177
- // $ DEFAULT (SECONDARY) STYLES
178
- // ============================================================================
179
-
180
- // -- Base Outline Style
181
- // Style which applies only a border.
182
- // ----------------------------------------------------------------------------
183
- .s-btn__outlined {
184
- border-color: var(--theme-button-outlined-border-color);
185
-
186
- &.is-selected {
187
- border-color: var(--theme-button-outlined-selected-border-color);
188
- }
189
- }
190
-
191
- // -- Base Filled Style
192
- // Adds in background-colors, background-images, and/or box-shadows.
193
- // ----------------------------------------------------------------------------
194
- .s-btn__filled {
195
- color: var(--theme-button-filled-color);
196
- background-color: var(--theme-button-filled-background-color);
197
- border-color: var(--theme-button-filled-border-color);
198
- box-shadow: inset 0 1px 0 0 hsla(0, 0, 100%, 0.7);
199
-
200
- .dark-mode({ box-shadow: none; });
201
-
202
- &:hover,
203
- &:focus,
204
- &:active {
205
- color: var(--theme-button-filled-hover-color);
206
- background-color: var(--theme-button-filled-hover-background-color);
207
- }
208
-
209
- &:active {
210
- background-color: var(--theme-button-filled-active-background-color);
211
- border-color: var(--theme-button-filled-active-border-color);
212
- box-shadow: none;
213
- }
214
-
215
- &:focus {
216
- .highcontrast-mode({
217
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring);
218
- });
219
- }
220
-
221
- &.is-selected {
222
- color: var(--theme-button-filled-selected-color);
223
- background-color: var(--theme-button-filled-selected-background-color);
224
- border-color: var(--theme-button-filled-selected-border-color);
225
- box-shadow: none;
226
- }
227
- }
228
-
229
- // -- Muted Clear Style
230
- // Creates a gray button style.
231
- // ----------------------------------------------------------------------------
232
- .s-btn__muted {
233
- color: var(--black-500);
234
-
235
- .highcontrast-mode({
236
- &.s-btn__filled {
237
- border-color: transparent;
238
- }
239
- });
240
-
241
- &:hover,
242
- &:focus,
243
- &:active {
244
- color: var(--black-600);
245
- background-color: var(--black-025);
246
- }
247
-
248
- &:active {
249
- background: var(--black-050);
250
- }
251
-
252
- &:focus {
253
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
254
- }
255
-
256
- &.is-selected {
257
- color: var(--black-700);
258
- background-color: var(--black-075);
259
-
260
- &:focus {
261
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
262
- }
263
- }
264
-
265
- // -- Muted (Gray)
266
- &.s-btn__outlined {
267
- border-color: var(--black-300);
268
-
269
- &.is-selected {
270
- border-color: var(--black-400);
271
- }
272
- }
273
-
274
- // -- Filled (Gray)
275
- &.s-btn__filled {
276
- color: var(--black-700);
277
- background-color: var(--black-100);
278
- border-color: transparent;
279
- box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
280
-
281
- .dark-mode({ box-shadow: none; });
282
-
283
- .highcontrast-mode({
284
- background-color: var(--black-400);
285
- border-color: transparent;
286
- color: var(--white);
287
-
288
- .s-btn--number {
289
- color: var(--black);
290
- }
291
- });
292
-
293
- &:hover,
294
- &:focus,
295
- &:active {
296
- color: var(--black-700);
297
- background-color: var(--black-150);
298
- }
299
-
300
- &:active {
301
- background-color: var(--black-200);
302
- box-shadow: none;
303
- }
304
-
305
- &:focus {
306
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
307
- .highcontrast-mode({ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted); });
308
- }
309
-
310
- &.is-selected {
311
- color: var(--black-800);
312
- background-color: var(--black-350);
313
- box-shadow: none;
314
-
315
- .highcontrast-mode({
316
- background-color: var(--black-700);
317
-
318
- .s-btn--number {
319
- color: var(--black);
320
- }
321
- });
322
-
323
- &:focus {
324
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
325
- }
326
- }
327
- }
328
- }
329
-
330
- // ============================================================================
331
- // $ DANGER BUTTONS & STYLES
332
- // ============================================================================
333
- .s-btn__danger {
334
- color: var(--red-600);
335
-
336
- .highcontrast-mode({
337
- &.s-btn__filled {
338
- border-color: transparent;
339
- }
340
- });
341
-
342
- &:hover,
343
- &:focus,
344
- &:active {
345
- color: var(--red-700);
346
- background-color: var(--red-050);
347
- }
348
-
349
- &:active {
350
- background-color: var(--red-100);
351
- }
352
-
353
- &:focus {
354
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
355
- .highcontrast-mode({ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error); });
356
- }
357
-
358
- &.is-selected {
359
- color: var(--red-900);
360
- background-color: var(--red-200);
361
-
362
- &:focus {
363
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
364
- }
365
- }
366
-
367
- // -- Outlined
368
- &.s-btn__outlined {
369
- border-color: var(--red-500);
370
-
371
- &.is-selected {
372
- border-color: var(--red-600);
373
- }
374
- }
375
-
376
- // -- Filled
377
- &.s-btn__filled {
378
- color: @white;
379
- background-color: var(--red-500);
380
- border-color: transparent;
381
- box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
382
-
383
- .dark-mode({ box-shadow: none; });
384
-
385
- .highcontrast-mode({
386
- color: var(--white);
387
-
388
- &:focus {
389
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
390
- }
391
-
392
- .s-btn--number {
393
- color: var(--black);
394
- }
395
- });
396
-
397
- &:hover,
398
- &:focus,
399
- &:active {
400
- color: @white;
401
- background-color: var(--red-600);
402
- }
403
-
404
- &:active {
405
- background-color: var(--red-700);
406
- box-shadow: none;
407
- }
408
-
409
- &:focus {
410
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
411
- }
412
-
413
- &.is-selected {
414
- color: var(--white);
415
- background-color: var(--red-800);
416
- box-shadow: none;
417
-
418
- &:focus {
419
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
420
- }
421
- .highcontrast-mode({
422
- .s-btn--number {
423
- color: var(--black);
424
- }
425
- });
426
- }
427
-
428
- .s-btn--number {
429
- color: var(--black-900);
430
- }
431
- }
432
- }
433
-
434
- // ============================================================================
435
- // $ PRIMARY STYLE
436
- // ============================================================================
437
- .s-btn__primary {
438
- color: var(--theme-button-primary-color);
439
- background-color: var(--theme-button-primary-background-color);
440
- box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
441
-
442
- .dark-mode({
443
- box-shadow: none;
444
-
445
- &:not(.is-selected) {
446
- color: var(--black);
447
- }
448
- });
449
- .highcontrast-mode({
450
- &:not(.is-selected) {
451
- border-color: transparent;
452
- color: var(--white);
453
- }
454
- });
455
- .light-mode-forced({
456
- box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
457
-
458
- &:not(.is-selected) {
459
- color: var(--white);
460
- }
461
- });
462
-
463
- &:hover,
464
- &:focus,
465
- &:active {
466
- color: var(--theme-button-primary-hover-color);
467
- background-color: var(--theme-button-primary-hover-background-color);
468
- }
469
-
470
- &:active {
471
- background-color: var(--theme-button-primary-active-background-color);
472
- box-shadow: none;
473
- }
474
-
475
- &:focus {
476
- .highcontrast-mode({
477
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring);
478
- });
479
- }
480
-
481
- &.is-selected {
482
- color: var(--theme-button-primary-selected-color);
483
- background-color: var(--theme-button-primary-selected-background-color);
484
- }
485
-
486
- .s-btn--number {
487
- color: var(--theme-button-primary-number-color);
488
- }
489
- }
490
-
491
- // ============================================================================
492
- // $ MISC STYLES
493
- // ============================================================================
494
- .s-btn__google {
495
- border-color: var(--bc-medium);
496
- background-color: var(--white);
497
- color: var(--black-700);
498
-
499
- &:hover,
500
- &:focus {
501
- border-color: var(--bc-darker);
502
- background-color: var(--black-025);
503
- color: var(--black-800);
504
- }
505
-
506
- &:active {
507
- background-color: var(--black-050);
508
- color: var(--black-900);
509
- }
510
-
511
- &:focus {
512
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
513
- }
514
- }
515
-
516
- .s-btn__facebook {
517
- border-color: transparent;
518
- background-color: #385499;
519
- color: #fff;
520
-
521
- .highcontrast-mode({ border-color: transparent; });
522
-
523
- &:hover,
524
- &:focus {
525
- background-color: darken(#385499, 5%);
526
- color: #fff;
527
- }
528
-
529
- &:active {
530
- background-color: darken(#385499, 10%);
531
- color: #fff;
532
- }
533
- }
534
-
535
- .s-btn__github {
536
- background-color: var(--black-750);
537
- color: var(--white);
538
-
539
- .highcontrast-mode({ border-color: transparent; });
540
-
541
- &:hover,
542
- &:focus {
543
- background-color: var(--black-800);
544
- color: var(--white);
545
- }
546
-
547
- &:active {
548
- background-color: var(--black-900);
549
- color: var(--white);
550
- }
551
-
552
- &:focus {
553
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
554
- }
555
- }
556
-
557
- .s-btn__unset,
558
- .s-btn__unset:hover,
559
- .s-btn__unset:active,
560
- .s-btn__unset:focus {
561
- padding: 0;
562
- border: none;
563
- outline: none;
564
- font: unset;
565
- border-radius: 0;
566
- color: unset;
567
- background: none;
568
- box-shadow: none;
569
- cursor: default;
570
- user-select: auto;
571
- }
572
-
573
- .s-btn__link {
574
- display: inline;
575
- padding: 0;
576
- border: none;
577
- border-radius: 0;
578
- outline: none;
579
- font: inherit;
580
- background: none;
581
- box-shadow: none;
582
- text-align: inherit;
583
-
584
- .s-link();
585
-
586
- &:hover,
587
- &:active,
588
- &:focus,
589
- &[disabled] {
590
- background: none;
591
- box-shadow: none;
592
- }
593
-
594
- &.s-btn__dropdown {
595
- padding-right: 0.9em;
596
-
597
- &:after {
598
- right: 0;
599
- }
600
- }
601
- }
602
-
603
- .s-btn__icon {
604
- // -- BUTTONS WITH ICONS
605
- // ------------------------------------------------------------------------
606
- // [1] Most svg icons are 18px tall, but the button's line-height is 1 (13px).
607
- // This means we need to off set the margin y-axis so we don't add
608
- // additional height to the button.
609
- // ------------------------------------------------------------------------
610
- .svg-icon {
611
- vertical-align: baseline;
612
- margin-top: -0.3em; // [1]
613
- margin-bottom: -0.3em; // [1]
614
- transition: opacity 200ms var(--te-smooth); // Animate the transition to .is-loading
615
- }
616
- }
617
-
618
- // $$ Loading Icon
619
- // Adds a loading icon into the button
620
- // ----------------------------------------------------------------------------
621
- .s-btn {
622
- &.is-loading {
623
- padding-left: 2.2em;
624
-
625
- &:before {
626
- content: "";
627
- position: absolute;
628
- opacity: 0.3;
629
- left: 0.6em;
630
- top: calc(50% - 0.6em);
631
- width: 1.23076923em;
632
- height: 1.23076923em;
633
- border-width: 2px;
634
- border-style: solid;
635
- border-color: currentColor;
636
- border-radius: var(--br-circle);
637
- }
638
-
639
- &:after {
640
- content: "";
641
- position: absolute;
642
- left: 0.6em;
643
- top: calc(50% - 0.6em);
644
- width: 1.23076923em;
645
- height: 1.23076923em;
646
- border-width: 2px;
647
- border-style: solid;
648
- border-color: transparent;
649
- border-left-color: currentColor;
650
- border-radius: var(--br-circle);
651
- animation: s-spinner-rotate 0.9s infinite cubic-bezier(0.5, 0.1, 0.5, 0.9);
652
- // see spinner.less for an explanation of the following two
653
- filter: invert(0); // (*)
654
- transform-origin: 50% 50% 1px; // (*)
655
- }
656
-
657
- .svg-icon:first-child {
658
- margin-left: -23px;
659
- // If the first thing in the button is an icon, let's hide it on loading
660
- // We only want to modify the visibility, since we still want it to have shape and keep the same layout.
661
- opacity: 0;
662
- }
663
- }
664
- }
665
- }
1
+ //
2
+ // STACK OVERFLOW
3
+ // BUTTONS
4
+ //
5
+ // This CSS comes from Stacks, our CSS & Pattern library for rapidly building
6
+ // Stack Overflow. For documentation of all these classes and how to contribute,
7
+ // visit https://stackoverflow.design/
8
+ //
9
+ // TABLE OF CONTENTS
10
+ // • BASE STYLE
11
+ // • STYLE MODIFICATIONS
12
+ // • LAYOUTS & SIZES
13
+ // ----------------------------------------------------------------------------
14
+
15
+ // ============================================================================
16
+ // $ BASE STYLE
17
+ // ----------------------------------------------------------------------------
18
+ & {
19
+ .s-btn {
20
+ position: relative;
21
+ display: inline-block;
22
+ padding: 0.8em;
23
+ color: var(--theme-button-color);
24
+ border: 1px solid transparent;
25
+ border-radius: var(--br-sm);
26
+ background-color: transparent;
27
+ outline: none;
28
+ font-family: inherit;
29
+ font-size: var(--fs-body1);
30
+ font-weight: normal;
31
+ line-height: var(--lh-sm);
32
+ text-align: center;
33
+ text-decoration: none;
34
+ cursor: pointer;
35
+ user-select: none;
36
+
37
+ .highcontrast-mode({
38
+ border-color: currentColor;
39
+
40
+ &:not(.s-btn__link):not(.s-btn__unset) {
41
+ text-decoration: none;
42
+ }
43
+ });
44
+
45
+ button &,
46
+ button[type="submit"] &,
47
+ button[type="reset"] & {
48
+ // Guard against the difference in configurable resets
49
+ // Eric Meyer's reset does not include this, while normalize.css does
50
+ // Correct the inability to style buttons in iOS and Safari.
51
+ -webkit-appearance: button;
52
+ }
53
+
54
+ // Override for buttons having inline-block by default
55
+ &.grid {
56
+ display: flex;
57
+ }
58
+
59
+ &:hover,
60
+ &:focus,
61
+ &:active {
62
+ color: var(--theme-button-hover-color);
63
+ background: var(--theme-button-hover-background-color);
64
+ text-decoration: none;
65
+ }
66
+
67
+ &:active {
68
+ background: var(--theme-button-active-background-color);
69
+ }
70
+
71
+ &:focus {
72
+ outline: none;
73
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring);
74
+ }
75
+
76
+ &[disabled] {
77
+ opacity: 0.5;
78
+ pointer-events: none;
79
+ box-shadow: none !important;
80
+ }
81
+
82
+ &.is-selected {
83
+ color: var(--theme-button-selected-color);
84
+ background: var(--theme-button-selected-background-color);
85
+ box-shadow: none;
86
+
87
+ &:focus {
88
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring);
89
+ }
90
+ }
91
+
92
+ &.s-btn__dropdown {
93
+ padding-right: 2em;
94
+
95
+ &:after {
96
+ content: "";
97
+ position: absolute;
98
+ z-index: var(--zi-active);
99
+ top: calc(50% - 2px);
100
+ right: 0.8em;
101
+ border-style: solid;
102
+ border-width: var(--su-static4);
103
+ border-top-width: var(--su-static4);
104
+ border-bottom-width: 0;
105
+ border-color: currentColor transparent;
106
+ pointer-events: none;
107
+ }
108
+ }
109
+
110
+ &.s-btn__xs {
111
+ padding: 0.6em;
112
+ font-size: var(--fs-fine);
113
+
114
+ &.s-btn__dropdown {
115
+ padding-right: 1.5em;
116
+
117
+ &:after {
118
+ top: calc(50% - 2px);
119
+ right: 0.6em;
120
+ border-width: calc(var(--su-static4) - var(--su-static1));
121
+ border-top-width: calc(var(--su-static4) - var(--su-static1));
122
+ border-bottom-width: 0;
123
+ }
124
+ }
125
+ }
126
+
127
+ &.s-btn__sm {
128
+ font-size: var(--fs-caption);
129
+
130
+ &.s-btn__dropdown {
131
+ padding-right: 2.05em;
132
+ }
133
+ }
134
+
135
+ &.s-btn__md {
136
+ padding: 0.7em;
137
+ border-radius: calc(var(--br-sm) + 1px);
138
+ font-size: var(--fs-body3);
139
+
140
+ &.s-btn__dropdown {
141
+ padding-right: 1.8em;
142
+
143
+ &:after {
144
+ top: calc(50% - 2px);
145
+ right: 0.7em;
146
+ border-width: calc(var(--su-static4) + var(--su-static1));
147
+ border-top-width: calc(var(--su-static4) + var(--su-static1));
148
+ border-bottom-width: 0;
149
+ }
150
+ }
151
+ }
152
+
153
+ .s-btn--badge {
154
+ opacity: 0.5;
155
+ display: inline-block;
156
+ border-radius: var(--br-sm);
157
+ padding: var(--su2) calc(var(--su4) - var(--su1));
158
+ font-size: var(--fs-caption);
159
+ line-height: var(--lh-xs);
160
+ background-color: currentColor;
161
+
162
+ .highcontrast-mode({ opacity: 0.8; });
163
+ }
164
+
165
+ .s-btn--number {
166
+ color: var(--white);
167
+ }
168
+ }
169
+
170
+ .s-btn__primary:not(.is-selected) .s-btn--number,
171
+ .s-btn__danger.s-btn__filled:not(.is-selected) .s-btn--number {
172
+ .dark-mode({ color: var(--white); });
173
+ .highcontrast-mode({ color: var(--black); });
174
+ }
175
+
176
+ // ============================================================================
177
+ // $ DEFAULT (SECONDARY) STYLES
178
+ // ============================================================================
179
+
180
+ // -- Base Outline Style
181
+ // Style which applies only a border.
182
+ // ----------------------------------------------------------------------------
183
+ .s-btn__outlined {
184
+ border-color: var(--theme-button-outlined-border-color);
185
+
186
+ &.is-selected {
187
+ border-color: var(--theme-button-outlined-selected-border-color);
188
+ }
189
+ }
190
+
191
+ // -- Base Filled Style
192
+ // Adds in background-colors, background-images, and/or box-shadows.
193
+ // ----------------------------------------------------------------------------
194
+ .s-btn__filled {
195
+ color: var(--theme-button-filled-color);
196
+ background-color: var(--theme-button-filled-background-color);
197
+ border-color: var(--theme-button-filled-border-color);
198
+ box-shadow: inset 0 1px 0 0 hsla(0, 0, 100%, 0.7);
199
+
200
+ .dark-mode({ box-shadow: none; });
201
+
202
+ &:hover,
203
+ &:focus,
204
+ &:active {
205
+ color: var(--theme-button-filled-hover-color);
206
+ background-color: var(--theme-button-filled-hover-background-color);
207
+ }
208
+
209
+ &:active {
210
+ background-color: var(--theme-button-filled-active-background-color);
211
+ border-color: var(--theme-button-filled-active-border-color);
212
+ box-shadow: none;
213
+ }
214
+
215
+ &:focus {
216
+ .highcontrast-mode({
217
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring);
218
+ });
219
+ }
220
+
221
+ &.is-selected {
222
+ color: var(--theme-button-filled-selected-color);
223
+ background-color: var(--theme-button-filled-selected-background-color);
224
+ border-color: var(--theme-button-filled-selected-border-color);
225
+ box-shadow: none;
226
+ }
227
+ }
228
+
229
+ // -- Muted Clear Style
230
+ // Creates a gray button style.
231
+ // ----------------------------------------------------------------------------
232
+ .s-btn__muted {
233
+ color: var(--black-500);
234
+
235
+ .highcontrast-mode({
236
+ &.s-btn__filled {
237
+ border-color: transparent;
238
+ }
239
+ });
240
+
241
+ &:hover,
242
+ &:focus,
243
+ &:active {
244
+ color: var(--black-600);
245
+ background-color: var(--black-025);
246
+ }
247
+
248
+ &:active {
249
+ background: var(--black-050);
250
+ }
251
+
252
+ &:focus {
253
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
254
+ }
255
+
256
+ &.is-selected {
257
+ color: var(--black-700);
258
+ background-color: var(--black-075);
259
+
260
+ &:focus {
261
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
262
+ }
263
+ }
264
+
265
+ // -- Muted (Gray)
266
+ &.s-btn__outlined {
267
+ border-color: var(--black-300);
268
+
269
+ &.is-selected {
270
+ border-color: var(--black-400);
271
+ }
272
+ }
273
+
274
+ // -- Filled (Gray)
275
+ &.s-btn__filled {
276
+ color: var(--black-700);
277
+ background-color: var(--black-100);
278
+ border-color: transparent;
279
+ box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
280
+
281
+ .dark-mode({ box-shadow: none; });
282
+
283
+ .highcontrast-mode({
284
+ background-color: var(--black-400);
285
+ border-color: transparent;
286
+ color: var(--white);
287
+
288
+ .s-btn--number {
289
+ color: var(--black);
290
+ }
291
+ });
292
+
293
+ &:hover,
294
+ &:focus,
295
+ &:active {
296
+ color: var(--black-700);
297
+ background-color: var(--black-150);
298
+ }
299
+
300
+ &:active {
301
+ background-color: var(--black-200);
302
+ box-shadow: none;
303
+ }
304
+
305
+ &:focus {
306
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
307
+ .highcontrast-mode({ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted); });
308
+ }
309
+
310
+ &.is-selected {
311
+ color: var(--black-800);
312
+ background-color: var(--black-350);
313
+ box-shadow: none;
314
+
315
+ .highcontrast-mode({
316
+ background-color: var(--black-700);
317
+
318
+ .s-btn--number {
319
+ color: var(--black);
320
+ }
321
+ });
322
+
323
+ &:focus {
324
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
325
+ }
326
+ }
327
+ }
328
+ }
329
+
330
+ // ============================================================================
331
+ // $ DANGER BUTTONS & STYLES
332
+ // ============================================================================
333
+ .s-btn__danger {
334
+ color: var(--red-600);
335
+
336
+ .highcontrast-mode({
337
+ &.s-btn__filled {
338
+ border-color: transparent;
339
+ }
340
+ });
341
+
342
+ &:hover,
343
+ &:focus,
344
+ &:active {
345
+ color: var(--red-700);
346
+ background-color: var(--red-050);
347
+ }
348
+
349
+ &:active {
350
+ background-color: var(--red-100);
351
+ }
352
+
353
+ &:focus {
354
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
355
+ .highcontrast-mode({ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error); });
356
+ }
357
+
358
+ &.is-selected {
359
+ color: var(--red-900);
360
+ background-color: var(--red-200);
361
+
362
+ &:focus {
363
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
364
+ }
365
+ }
366
+
367
+ // -- Outlined
368
+ &.s-btn__outlined {
369
+ border-color: var(--red-500);
370
+
371
+ &.is-selected {
372
+ border-color: var(--red-600);
373
+ }
374
+ }
375
+
376
+ // -- Filled
377
+ &.s-btn__filled {
378
+ color: @white;
379
+ background-color: var(--red-500);
380
+ border-color: transparent;
381
+ box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
382
+
383
+ .dark-mode({ box-shadow: none; });
384
+
385
+ .highcontrast-mode({
386
+ color: var(--white);
387
+
388
+ &:focus {
389
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
390
+ }
391
+
392
+ .s-btn--number {
393
+ color: var(--black);
394
+ }
395
+ });
396
+
397
+ &:hover,
398
+ &:focus,
399
+ &:active {
400
+ color: @white;
401
+ background-color: var(--red-600);
402
+ }
403
+
404
+ &:active {
405
+ background-color: var(--red-700);
406
+ box-shadow: none;
407
+ }
408
+
409
+ &:focus {
410
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
411
+ }
412
+
413
+ &.is-selected {
414
+ color: var(--white);
415
+ background-color: var(--red-800);
416
+ box-shadow: none;
417
+
418
+ &:focus {
419
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
420
+ }
421
+ .highcontrast-mode({
422
+ .s-btn--number {
423
+ color: var(--black);
424
+ }
425
+ });
426
+ }
427
+
428
+ .s-btn--number {
429
+ color: var(--black-900);
430
+ }
431
+ }
432
+ }
433
+
434
+ // ============================================================================
435
+ // $ PRIMARY STYLE
436
+ // ============================================================================
437
+ .s-btn__primary {
438
+ color: var(--theme-button-primary-color);
439
+ background-color: var(--theme-button-primary-background-color);
440
+ box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
441
+
442
+ .dark-mode({
443
+ box-shadow: none;
444
+
445
+ &:not(.is-selected) {
446
+ color: var(--black);
447
+ }
448
+ });
449
+ .highcontrast-mode({
450
+ &:not(.is-selected) {
451
+ border-color: transparent;
452
+ color: var(--white);
453
+ }
454
+ });
455
+ .light-mode-forced({
456
+ box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
457
+
458
+ &:not(.is-selected) {
459
+ color: var(--white);
460
+ }
461
+ });
462
+
463
+ &:hover,
464
+ &:focus,
465
+ &:active {
466
+ color: var(--theme-button-primary-hover-color);
467
+ background-color: var(--theme-button-primary-hover-background-color);
468
+ }
469
+
470
+ &:active {
471
+ background-color: var(--theme-button-primary-active-background-color);
472
+ box-shadow: none;
473
+ }
474
+
475
+ &:focus {
476
+ .highcontrast-mode({
477
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring);
478
+ });
479
+ }
480
+
481
+ &.is-selected {
482
+ color: var(--theme-button-primary-selected-color);
483
+ background-color: var(--theme-button-primary-selected-background-color);
484
+ }
485
+
486
+ .s-btn--number {
487
+ color: var(--theme-button-primary-number-color);
488
+ }
489
+ }
490
+
491
+ // ============================================================================
492
+ // $ MISC STYLES
493
+ // ============================================================================
494
+ .s-btn__google {
495
+ border-color: var(--bc-medium);
496
+ background-color: var(--white);
497
+ color: var(--black-700);
498
+
499
+ &:hover,
500
+ &:focus {
501
+ border-color: var(--bc-darker);
502
+ background-color: var(--black-025);
503
+ color: var(--black-800);
504
+ }
505
+
506
+ &:active {
507
+ background-color: var(--black-050);
508
+ color: var(--black-900);
509
+ }
510
+
511
+ &:focus {
512
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
513
+ }
514
+ }
515
+
516
+ .s-btn__facebook {
517
+ border-color: transparent;
518
+ background-color: #385499;
519
+ color: #fff;
520
+
521
+ .highcontrast-mode({ border-color: transparent; });
522
+
523
+ &:hover,
524
+ &:focus {
525
+ background-color: darken(#385499, 5%);
526
+ color: #fff;
527
+ }
528
+
529
+ &:active {
530
+ background-color: darken(#385499, 10%);
531
+ color: #fff;
532
+ }
533
+ }
534
+
535
+ .s-btn__github {
536
+ background-color: var(--black-750);
537
+ color: var(--white);
538
+
539
+ .highcontrast-mode({ border-color: transparent; });
540
+
541
+ &:hover,
542
+ &:focus {
543
+ background-color: var(--black-800);
544
+ color: var(--white);
545
+ }
546
+
547
+ &:active {
548
+ background-color: var(--black-900);
549
+ color: var(--white);
550
+ }
551
+
552
+ &:focus {
553
+ box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-muted);
554
+ }
555
+ }
556
+
557
+ .s-btn__unset,
558
+ .s-btn__unset:hover,
559
+ .s-btn__unset:active,
560
+ .s-btn__unset:focus {
561
+ padding: 0;
562
+ border: none;
563
+ outline: none;
564
+ font: unset;
565
+ border-radius: 0;
566
+ color: unset;
567
+ background: none;
568
+ box-shadow: none;
569
+ cursor: default;
570
+ user-select: auto;
571
+ }
572
+
573
+ .s-btn__link {
574
+ display: inline;
575
+ padding: 0;
576
+ border: none;
577
+ border-radius: 0;
578
+ outline: none;
579
+ font: inherit;
580
+ background: none;
581
+ box-shadow: none;
582
+ text-align: inherit;
583
+
584
+ .s-link();
585
+
586
+ &:hover,
587
+ &:active,
588
+ &:focus,
589
+ &[disabled] {
590
+ background: none;
591
+ box-shadow: none;
592
+ }
593
+
594
+ &.s-btn__dropdown {
595
+ padding-right: 0.9em;
596
+
597
+ &:after {
598
+ right: 0;
599
+ }
600
+ }
601
+ }
602
+
603
+ .s-btn__icon {
604
+ // -- BUTTONS WITH ICONS
605
+ // ------------------------------------------------------------------------
606
+ // [1] Most svg icons are 18px tall, but the button's line-height is 1 (13px).
607
+ // This means we need to off set the margin y-axis so we don't add
608
+ // additional height to the button.
609
+ // ------------------------------------------------------------------------
610
+ .svg-icon {
611
+ vertical-align: baseline;
612
+ margin-top: -0.3em; // [1]
613
+ margin-bottom: -0.3em; // [1]
614
+ transition: opacity 200ms var(--te-smooth); // Animate the transition to .is-loading
615
+ }
616
+ }
617
+
618
+ // $$ Loading Icon
619
+ // Adds a loading icon into the button
620
+ // ----------------------------------------------------------------------------
621
+ .s-btn {
622
+ &.is-loading {
623
+ padding-left: 2.2em;
624
+
625
+ &:before {
626
+ content: "";
627
+ position: absolute;
628
+ opacity: 0.3;
629
+ left: 0.6em;
630
+ top: calc(50% - 0.6em);
631
+ width: 1.23076923em;
632
+ height: 1.23076923em;
633
+ border-width: 2px;
634
+ border-style: solid;
635
+ border-color: currentColor;
636
+ border-radius: var(--br-circle);
637
+ }
638
+
639
+ &:after {
640
+ content: "";
641
+ position: absolute;
642
+ left: 0.6em;
643
+ top: calc(50% - 0.6em);
644
+ width: 1.23076923em;
645
+ height: 1.23076923em;
646
+ border-width: 2px;
647
+ border-style: solid;
648
+ border-color: transparent;
649
+ border-left-color: currentColor;
650
+ border-radius: var(--br-circle);
651
+ animation: s-spinner-rotate 0.9s infinite cubic-bezier(0.5, 0.1, 0.5, 0.9);
652
+ // see spinner.less for an explanation of the following two
653
+ filter: invert(0); // (*)
654
+ transform-origin: 50% 50% 1px; // (*)
655
+ }
656
+
657
+ .svg-icon:first-child {
658
+ margin-left: -23px;
659
+ // If the first thing in the button is an icon, let's hide it on loading
660
+ // We only want to modify the visibility, since we still want it to have shape and keep the same layout.
661
+ opacity: 0;
662
+ }
663
+ }
664
+ }
665
+ }