@stackoverflow/stacks 0.76.0 → 1.0.0-beta.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 (86) hide show
  1. package/LICENSE.MD +9 -9
  2. package/README.md +47 -47
  3. package/dist/controllers/index.d.ts +7 -7
  4. package/dist/controllers/s-expandable-control.d.ts +17 -17
  5. package/dist/controllers/s-modal.d.ts +97 -97
  6. package/dist/controllers/s-navigation-tablist.d.ts +36 -36
  7. package/dist/controllers/s-popover.d.ts +155 -155
  8. package/dist/controllers/s-table.d.ts +8 -8
  9. package/dist/controllers/s-tooltip.d.ts +82 -82
  10. package/dist/controllers/s-uploader.d.ts +48 -48
  11. package/dist/css/stacks.css +4321 -2635
  12. package/dist/css/stacks.min.css +1 -1
  13. package/dist/index.d.ts +3 -3
  14. package/dist/js/stacks.js +1978 -1978
  15. package/dist/js/stacks.min.js +1 -1
  16. package/dist/stacks.d.ts +21 -21
  17. package/lib/css/atomic/{_stacks-borders.less → borders.less} +378 -378
  18. package/lib/css/atomic/{_stacks-colors.less → colors.less} +209 -209
  19. package/lib/css/atomic/{_stacks-flex.less → flex.less} +375 -374
  20. package/lib/css/atomic/{_stacks-grid.less → grid.less} +174 -174
  21. package/lib/css/atomic/{_stacks-misc.less → misc.less} +343 -343
  22. package/lib/css/atomic/spacing.less +314 -0
  23. package/lib/css/atomic/{_stacks-typography.less → typography.less} +273 -273
  24. package/lib/css/atomic/width-height.less +194 -0
  25. package/lib/css/base/{_stacks-body.less → body.less} +44 -44
  26. package/lib/css/base/{_stacks-configuration-static.less → configuration-static.less} +61 -59
  27. package/lib/css/base/{_stacks-icons.less → icons.less} +20 -20
  28. package/lib/css/base/{_stacks-internals.less → internals.less} +220 -220
  29. package/lib/css/base/{_stacks-reset-meyer.less → reset-meyer.less} +64 -64
  30. package/lib/css/base/{_stacks-reset-normalize.less → reset-normalize.less} +449 -449
  31. package/lib/css/base/{_stacks-reset.less → reset.less} +20 -20
  32. package/lib/css/components/{_stacks-activity-indicator.less → activity-indicator.less} +45 -45
  33. package/lib/css/components/{_stacks-avatars.less → avatars.less} +189 -189
  34. package/lib/css/components/{_stacks-badges.less → badges.less} +209 -209
  35. package/lib/css/components/{_stacks-banners.less → banners.less} +80 -80
  36. package/lib/css/components/{_stacks-blank-states.less → blank-states.less} +26 -26
  37. package/lib/css/components/{_stacks-breadcrumbs.less → breadcrumbs.less} +44 -44
  38. package/lib/css/components/{_stacks-button-groups.less → button-groups.less} +104 -104
  39. package/lib/css/components/{_stacks-buttons.less → buttons.less} +665 -658
  40. package/lib/css/components/{_stacks-cards.less → cards.less} +44 -44
  41. package/lib/css/components/{_stacks-code-blocks.less → code-blocks.less} +130 -130
  42. package/lib/css/components/{_stacks-collapsible.less → collapsible.less} +104 -104
  43. package/lib/css/components/{_stacks-inputs.less → inputs.less} +728 -728
  44. package/lib/css/components/{_stacks-link-previews.less → link-previews.less} +136 -136
  45. package/lib/css/components/{_stacks-links.less → links.less} +218 -218
  46. package/lib/css/components/{_stacks-menu.less → menu.less} +47 -47
  47. package/lib/css/components/{_stacks-modals.less → modals.less} +133 -133
  48. package/lib/css/components/{_stacks-navigation.less → navigation.less} +146 -146
  49. package/lib/css/components/{_stacks-notices.less → notices.less} +233 -233
  50. package/lib/css/components/{_stacks-page-titles.less → page-titles.less} +60 -60
  51. package/lib/css/components/{_stacks-pagination.less → pagination.less} +55 -55
  52. package/lib/css/components/{_stacks-popovers.less → popovers.less} +197 -197
  53. package/lib/css/components/{_stacks-post-summary.less → post-summary.less} +425 -425
  54. package/lib/css/components/{_stacks-progress-bars.less → progress-bars.less} +330 -331
  55. package/lib/css/components/{_stacks-prose.less → prose.less} +503 -503
  56. package/lib/css/components/{_stacks-spinner.less → spinner.less} +107 -107
  57. package/lib/css/components/{_stacks-tables.less → tables.less} +341 -341
  58. package/lib/css/components/{_stacks-tags.less → tags.less} +236 -236
  59. package/lib/css/components/{_stacks-toggle-switches.less → toggle-switches.less} +144 -144
  60. package/lib/css/components/{_stacks-topbar.less → topbar.less} +427 -425
  61. package/lib/css/components/{_stacks-uploader.less → uploader.less} +210 -210
  62. package/lib/css/components/{_stacks-user-cards.less → user-cards.less} +169 -169
  63. package/lib/css/components/{_stacks-widget-dynamic.less → widget-dynamic.less} +33 -33
  64. package/lib/css/components/{_stacks-widget-static.less → widget-static.less} +273 -272
  65. package/lib/css/exports/{_stacks-constants-colors.less → constants-colors.less} +1092 -1112
  66. package/lib/css/exports/constants-helpers.less +108 -0
  67. package/lib/css/exports/{_stacks-constants-type.less → constants-type.less} +153 -152
  68. package/lib/css/exports/{_stacks-exports.less → exports.less} +15 -15
  69. package/lib/css/exports/{_stacks-mixins.less → mixins.less} +237 -220
  70. package/lib/css/stacks-dynamic.less +35 -35
  71. package/lib/css/stacks-static.less +86 -86
  72. package/lib/ts/controllers/index.ts +7 -7
  73. package/lib/ts/controllers/s-expandable-control.ts +188 -188
  74. package/lib/ts/controllers/s-modal.ts +321 -321
  75. package/lib/ts/controllers/s-navigation-tablist.ts +117 -117
  76. package/lib/ts/controllers/s-popover.ts +547 -547
  77. package/lib/ts/controllers/s-table.ts +220 -220
  78. package/lib/ts/controllers/s-tooltip.ts +246 -246
  79. package/lib/ts/controllers/s-uploader.ts +172 -172
  80. package/lib/ts/index.ts +20 -20
  81. package/lib/ts/stacks.ts +88 -88
  82. package/lib/tsconfig.json +13 -13
  83. package/package.json +87 -87
  84. package/lib/css/atomic/_stacks-spacing.less +0 -168
  85. package/lib/css/atomic/_stacks-width-height.less +0 -195
  86. package/lib/css/exports/_stacks-constants-helpers.less +0 -139
@@ -1,658 +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: @br-sm;
26
- background-color: transparent;
27
- outline: none;
28
- font-family: inherit;
29
- font-size: @fs-body1;
30
- font-weight: normal;
31
- line-height: @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 @su4 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 @su4 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: @zi-active;
99
- top: calc(50% - 2px);
100
- right: 0.8em;
101
- border-style: solid;
102
- border-width: @su4;
103
- border-top-width: @su4;
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: @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: @su4 - 1px;
121
- border-top-width: @su4 - 1px;
122
- border-bottom-width: 0;
123
- }
124
- }
125
- }
126
-
127
- &.s-btn__sm {
128
- font-size: @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: @br-sm + 1;
138
- font-size: @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: @su4 + 1px;
147
- border-top-width: @su4 + 1px;
148
- border-bottom-width: 0;
149
- }
150
- }
151
- }
152
-
153
- .s-btn--badge {
154
- opacity: 0.5;
155
- display: inline-block;
156
- border-radius: @br-sm;
157
- padding: @su2 (@su4 - 1px);
158
- font-size: @fs-caption;
159
- line-height: @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 @su4 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 @su4 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 @su4 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 @su4 var(--focus-ring-muted);
307
- .highcontrast-mode({ box-shadow: 0 0 0 @su4 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 @su4 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 @su4 var(--focus-ring-error);
355
- .highcontrast-mode({ box-shadow: 0 0 0 @su4 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 @su4 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 @su4 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 @su4 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 @su4 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
-
456
- &:hover,
457
- &:focus,
458
- &:active {
459
- color: var(--theme-button-primary-hover-color);
460
- background-color: var(--theme-button-primary-hover-background-color);
461
- }
462
-
463
- &:active {
464
- background-color: var(--theme-button-primary-active-background-color);
465
- box-shadow: none;
466
- }
467
-
468
- &:focus {
469
- .highcontrast-mode({
470
- box-shadow: 0 0 0 @su4 var(--focus-ring);
471
- });
472
- }
473
-
474
- &.is-selected {
475
- color: var(--theme-button-primary-selected-color);
476
- background-color: var(--theme-button-primary-selected-background-color);
477
- }
478
-
479
- .s-btn--number {
480
- color: var(--theme-button-primary-number-color);
481
- }
482
- }
483
-
484
- // ============================================================================
485
- // $ MISC STYLES
486
- // ============================================================================
487
- .s-btn__google {
488
- border-color: var(--bc-medium);
489
- background-color: var(--white);
490
- color: var(--black-700);
491
-
492
- &:hover,
493
- &:focus {
494
- border-color: var(--bc-darker);
495
- background-color: var(--black-025);
496
- color: var(--black-800);
497
- }
498
-
499
- &:active {
500
- background-color: var(--black-050);
501
- color: var(--black-900);
502
- }
503
-
504
- &:focus {
505
- box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
506
- }
507
- }
508
-
509
- .s-btn__facebook {
510
- border-color: transparent;
511
- background-color: #385499;
512
- color: #fff;
513
-
514
- .highcontrast-mode({ border-color: transparent; });
515
-
516
- &:hover,
517
- &:focus {
518
- background-color: darken(#385499, 5%);
519
- color: #fff;
520
- }
521
-
522
- &:active {
523
- background-color: darken(#385499, 10%);
524
- color: #fff;
525
- }
526
- }
527
-
528
- .s-btn__github {
529
- background-color: var(--black-750);
530
- color: var(--white);
531
-
532
- .highcontrast-mode({ border-color: transparent; });
533
-
534
- &:hover,
535
- &:focus {
536
- background-color: var(--black-800);
537
- color: var(--white);
538
- }
539
-
540
- &:active {
541
- background-color: var(--black-900);
542
- color: var(--white);
543
- }
544
-
545
- &:focus {
546
- box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
547
- }
548
- }
549
-
550
- .s-btn__unset,
551
- .s-btn__unset:hover,
552
- .s-btn__unset:active,
553
- .s-btn__unset:focus {
554
- padding: 0;
555
- border: none;
556
- outline: none;
557
- font: unset;
558
- border-radius: 0;
559
- color: unset;
560
- background: none;
561
- box-shadow: none;
562
- cursor: default;
563
- user-select: auto;
564
- }
565
-
566
- .s-btn__link {
567
- display: inline;
568
- padding: 0;
569
- border: none;
570
- border-radius: 0;
571
- outline: none;
572
- font: inherit;
573
- background: none;
574
- box-shadow: none;
575
- text-align: inherit;
576
-
577
- .s-link();
578
-
579
- &:hover,
580
- &:active,
581
- &:focus,
582
- &[disabled] {
583
- background: none;
584
- box-shadow: none;
585
- }
586
-
587
- &.s-btn__dropdown {
588
- padding-right: 0.9em;
589
-
590
- &:after {
591
- right: 0;
592
- }
593
- }
594
- }
595
-
596
- .s-btn__icon {
597
- // -- BUTTONS WITH ICONS
598
- // ------------------------------------------------------------------------
599
- // [1] Most svg icons are 18px tall, but the button's line-height is 1 (13px).
600
- // This means we need to off set the margin y-axis so we don't add
601
- // additional height to the button.
602
- // ------------------------------------------------------------------------
603
- .svg-icon {
604
- vertical-align: baseline;
605
- margin-top: -0.3em; // [1]
606
- margin-bottom: -0.3em; // [1]
607
- transition: opacity 200ms @te-smooth; // Animate the transition to .is-loading
608
- }
609
- }
610
-
611
- // $$ Loading Icon
612
- // Adds a loading icon into the button
613
- // ----------------------------------------------------------------------------
614
- .s-btn {
615
- &.is-loading {
616
- padding-left: 2.2em;
617
-
618
- &:before {
619
- content: "";
620
- position: absolute;
621
- opacity: 0.3;
622
- left: 0.6em;
623
- top: calc(50% - 0.6em);
624
- width: 1.23076923em;
625
- height: 1.23076923em;
626
- border-width: 2px;
627
- border-style: solid;
628
- border-color: currentColor;
629
- border-radius: @br-circle;
630
- }
631
-
632
- &:after {
633
- content: "";
634
- position: absolute;
635
- left: 0.6em;
636
- top: calc(50% - 0.6em);
637
- width: 1.23076923em;
638
- height: 1.23076923em;
639
- border-width: 2px;
640
- border-style: solid;
641
- border-color: transparent;
642
- border-left-color: currentColor;
643
- border-radius: @br-circle;
644
- animation: s-spinner-rotate 0.9s infinite cubic-bezier(0.5, 0.1, 0.5, 0.9);
645
- // see _stacks-spinner.less for an explanation of the following two
646
- filter: invert(0); // (*)
647
- transform-origin: 50% 50% 1px; // (*)
648
- }
649
-
650
- .svg-icon:first-child {
651
- margin-left: -23px;
652
- // If the first thing in the button is an icon, let's hide it on loading
653
- // We only want to modify the visibility, since we still want it to have shape and keep the same layout.
654
- opacity: 0;
655
- }
656
- }
657
- }
658
- }
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
+ }