@stackoverflow/stacks 0.75.0 → 0.76.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 (87) hide show
  1. package/LICENSE.MD +9 -9
  2. package/README.md +47 -47
  3. package/dist/controllers/index.d.ts +7 -0
  4. package/dist/controllers/s-expandable-control.d.ts +17 -0
  5. package/dist/controllers/s-modal.d.ts +97 -0
  6. package/dist/controllers/s-navigation-tablist.d.ts +36 -0
  7. package/dist/controllers/s-popover.d.ts +155 -0
  8. package/dist/controllers/s-table.d.ts +8 -0
  9. package/dist/controllers/s-tooltip.d.ts +82 -0
  10. package/dist/controllers/s-uploader.d.ts +48 -0
  11. package/dist/css/stacks.css +86 -53
  12. package/dist/css/stacks.min.css +1 -1
  13. package/dist/index.d.ts +3 -0
  14. package/dist/js/stacks.js +6128 -5505
  15. package/dist/js/stacks.min.js +1 -1
  16. package/dist/stacks.d.ts +21 -0
  17. package/lib/css/atomic/_stacks-borders.less +378 -378
  18. package/lib/css/atomic/_stacks-colors.less +209 -209
  19. package/lib/css/atomic/_stacks-flex.less +374 -374
  20. package/lib/css/atomic/_stacks-grid.less +174 -173
  21. package/lib/css/atomic/_stacks-misc.less +343 -343
  22. package/lib/css/atomic/_stacks-spacing.less +168 -168
  23. package/lib/css/atomic/_stacks-typography.less +273 -273
  24. package/lib/css/atomic/_stacks-width-height.less +195 -195
  25. package/lib/css/base/_stacks-body.less +44 -46
  26. package/lib/css/base/_stacks-configuration-static.less +59 -59
  27. package/lib/css/base/_stacks-icons.less +20 -20
  28. package/lib/css/base/_stacks-internals.less +220 -230
  29. package/lib/css/base/_stacks-reset-meyer.less +64 -64
  30. package/lib/css/base/_stacks-reset-normalize.less +449 -449
  31. package/lib/css/base/_stacks-reset.less +20 -20
  32. package/lib/css/components/_stacks-activity-indicator.less +45 -45
  33. package/lib/css/components/_stacks-avatars.less +189 -189
  34. package/lib/css/components/_stacks-badges.less +209 -209
  35. package/lib/css/components/_stacks-banners.less +80 -81
  36. package/lib/css/components/_stacks-blank-states.less +26 -26
  37. package/lib/css/components/_stacks-breadcrumbs.less +44 -44
  38. package/lib/css/components/_stacks-button-groups.less +104 -104
  39. package/lib/css/components/_stacks-buttons.less +658 -660
  40. package/lib/css/components/_stacks-cards.less +44 -44
  41. package/lib/css/components/_stacks-code-blocks.less +130 -130
  42. package/lib/css/components/_stacks-collapsible.less +104 -104
  43. package/lib/css/components/_stacks-inputs.less +728 -728
  44. package/lib/css/components/_stacks-link-previews.less +136 -136
  45. package/lib/css/components/_stacks-links.less +218 -218
  46. package/lib/css/components/_stacks-menu.less +47 -47
  47. package/lib/css/components/_stacks-modals.less +133 -133
  48. package/lib/css/components/_stacks-navigation.less +146 -146
  49. package/lib/css/components/_stacks-notices.less +233 -233
  50. package/lib/css/components/_stacks-page-titles.less +60 -60
  51. package/lib/css/components/_stacks-pagination.less +55 -55
  52. package/lib/css/components/_stacks-popovers.less +197 -197
  53. package/lib/css/components/_stacks-post-summary.less +425 -425
  54. package/lib/css/components/_stacks-progress-bars.less +331 -331
  55. package/lib/css/components/_stacks-prose.less +503 -503
  56. package/lib/css/components/_stacks-spinner.less +107 -107
  57. package/lib/css/components/_stacks-tables.less +341 -341
  58. package/lib/css/components/_stacks-tags.less +236 -244
  59. package/lib/css/components/_stacks-toggle-switches.less +144 -144
  60. package/lib/css/components/_stacks-topbar.less +425 -440
  61. package/lib/css/components/_stacks-uploader.less +210 -210
  62. package/lib/css/components/_stacks-user-cards.less +169 -169
  63. package/lib/css/components/_stacks-widget-dynamic.less +33 -33
  64. package/lib/css/components/_stacks-widget-static.less +272 -272
  65. package/lib/css/exports/_stacks-constants-colors.less +1112 -1112
  66. package/lib/css/exports/_stacks-constants-helpers.less +139 -139
  67. package/lib/css/exports/_stacks-constants-type.less +152 -91
  68. package/lib/css/exports/_stacks-exports.less +15 -15
  69. package/lib/css/exports/_stacks-mixins.less +220 -220
  70. package/lib/css/stacks-dynamic.less +35 -36
  71. package/lib/css/stacks-static.less +86 -86
  72. package/lib/ts/controllers/index.ts +8 -0
  73. package/lib/ts/controllers/s-expandable-control.ts +189 -190
  74. package/lib/ts/controllers/s-modal.ts +321 -323
  75. package/lib/ts/controllers/s-navigation-tablist.ts +118 -119
  76. package/lib/ts/controllers/s-popover.ts +547 -549
  77. package/lib/ts/controllers/s-table.ts +220 -220
  78. package/lib/ts/controllers/s-tooltip.ts +246 -247
  79. package/lib/ts/controllers/s-uploader.ts +172 -174
  80. package/lib/ts/index.ts +20 -0
  81. package/lib/ts/stacks.ts +88 -83
  82. package/lib/tsconfig.json +13 -11
  83. package/package.json +87 -71
  84. package/dist/css/stacks-flexgrid-shim.min.css +0 -1
  85. package/lib/css/base/_stacks-configuration-dynamic.less +0 -106
  86. package/lib/ts/finalize.ts +0 -1
  87. package/lib/ts/stimulus.d.ts +0 -4
@@ -1,660 +1,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: @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
- #stacks-internals #load-config();
234
- color: @button-muted-color;
235
-
236
- .highcontrast-mode({
237
- &.s-btn__filled {
238
- border-color: transparent;
239
- }
240
- });
241
-
242
- &:hover,
243
- &:focus,
244
- &:active {
245
- color: @button-muted-hover-color;
246
- background-color: @button-muted-hover-background-color;
247
- }
248
-
249
- &:active {
250
- background: @button-muted-active-background-color;
251
- }
252
-
253
- &:focus {
254
- box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
255
- }
256
-
257
- &.is-selected {
258
- color: @button-muted-selected-color;
259
- background-color: @button-muted-selected-background-color;
260
-
261
- &:focus {
262
- box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
263
- }
264
- }
265
-
266
- // -- Muted (Gray)
267
- &.s-btn__outlined {
268
- border-color: @button-muted-outlined-border-color;
269
-
270
- &.is-selected {
271
- border-color: @button-muted-outlined-selected-border-color;
272
- }
273
- }
274
-
275
- // -- Filled (Gray)
276
- &.s-btn__filled {
277
- color: @button-muted-filled-color;
278
- background-color: @button-muted-filled-background-color;
279
- border-color: transparent;
280
- box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
281
-
282
- .dark-mode({ box-shadow: none; });
283
-
284
- .highcontrast-mode({
285
- background-color: var(--black-400);
286
- border-color: transparent;
287
- color: var(--white);
288
-
289
- .s-btn--number {
290
- color: var(--black);
291
- }
292
- });
293
-
294
- &:hover,
295
- &:focus,
296
- &:active {
297
- color: @button-muted-filled-hover-color;
298
- background-color: @button-muted-filled-hover-background-color;
299
- }
300
-
301
- &:active {
302
- background-color: @button-muted-filled-active-background-color;
303
- box-shadow: none;
304
- }
305
-
306
- &:focus {
307
- box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
308
- .highcontrast-mode({ box-shadow: 0 0 0 @su4 var(--focus-ring-muted); });
309
- }
310
-
311
- &.is-selected {
312
- color: @button-muted-filled-selected-color;
313
- background-color: @button-muted-filled-selected-background-color;
314
- box-shadow: none;
315
-
316
- .highcontrast-mode({
317
- background-color: var(--black-700);
318
-
319
- .s-btn--number {
320
- color: var(--black);
321
- }
322
- });
323
-
324
- &:focus {
325
- box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
326
- }
327
- }
328
- }
329
- }
330
-
331
- // ============================================================================
332
- // $ DANGER BUTTONS & STYLES
333
- // ============================================================================
334
- .s-btn__danger {
335
- #stacks-internals #load-config();
336
- color: @button-danger-color;
337
-
338
- .highcontrast-mode({
339
- &.s-btn__filled {
340
- border-color: transparent;
341
- }
342
- });
343
-
344
- &:hover,
345
- &:focus,
346
- &:active {
347
- color: @button-danger-hover-color;
348
- background-color: @button-danger-hover-background-color;
349
- }
350
-
351
- &:active {
352
- background-color: @button-danger-active-background-color;
353
- }
354
-
355
- &:focus {
356
- box-shadow: 0 0 0 @su4 var(--focus-ring-error);
357
- .highcontrast-mode({ box-shadow: 0 0 0 @su4 var(--focus-ring-error); });
358
- }
359
-
360
- &.is-selected {
361
- color: @button-danger-selected-color;
362
- background-color: @button-danger-selected-background-color;
363
-
364
- &:focus {
365
- box-shadow: 0 0 0 @su4 var(--focus-ring-error);
366
- }
367
- }
368
-
369
- // -- Outlined
370
- &.s-btn__outlined {
371
- border-color: @button-danger-outlined-border-color;
372
-
373
- &.is-selected {
374
- border-color: @button-danger-outlined-selected-border-color;
375
- }
376
- }
377
-
378
- // -- Filled
379
- &.s-btn__filled {
380
- color: @button-danger-filled-color;
381
- background-color: @button-danger-filled-background-color;
382
- border-color: transparent;
383
- box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
384
-
385
- .dark-mode({ box-shadow: none; });
386
-
387
- .highcontrast-mode({
388
- color: var(--white);
389
-
390
- &:focus {
391
- box-shadow: 0 0 0 @su4 var(--focus-ring-error);
392
- }
393
-
394
- .s-btn--number {
395
- color: var(--black);
396
- }
397
- });
398
-
399
- &:hover,
400
- &:focus,
401
- &:active {
402
- color: @button-danger-filled-hover-color;
403
- background-color: @button-danger-filled-hover-background-color;
404
- }
405
-
406
- &:active {
407
- background-color: @button-danger-filled-active-background-color;
408
- box-shadow: none;
409
- }
410
-
411
- &:focus {
412
- box-shadow: 0 0 0 @su4 var(--focus-ring-error);
413
- }
414
-
415
- &.is-selected {
416
- color: @button-danger-filled-selected-color;
417
- background-color: @button-danger-filled-selected-background-color;
418
- box-shadow: none;
419
-
420
- &:focus {
421
- box-shadow: 0 0 0 @su4 var(--focus-ring-error);
422
- }
423
- .highcontrast-mode({
424
- .s-btn--number {
425
- color: var(--black);
426
- }
427
- });
428
- }
429
-
430
- .s-btn--number {
431
- color: @button-danger-filled-number-color;
432
- }
433
- }
434
- }
435
-
436
- // ============================================================================
437
- // $ PRIMARY STYLE
438
- // ============================================================================
439
- .s-btn__primary {
440
- color: var(--theme-button-primary-color);
441
- background-color: var(--theme-button-primary-background-color);
442
- box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
443
-
444
- .dark-mode({
445
- box-shadow: none;
446
-
447
- &:not(.is-selected) {
448
- color: var(--black);
449
- }
450
- });
451
- .highcontrast-mode({
452
- &:not(.is-selected) {
453
- border-color: transparent;
454
- color: var(--white);
455
- }
456
- });
457
-
458
- &:hover,
459
- &:focus,
460
- &:active {
461
- color: var(--theme-button-primary-hover-color);
462
- background-color: var(--theme-button-primary-hover-background-color);
463
- }
464
-
465
- &:active {
466
- background-color: var(--theme-button-primary-active-background-color);
467
- box-shadow: none;
468
- }
469
-
470
- &:focus {
471
- .highcontrast-mode({
472
- box-shadow: 0 0 0 @su4 var(--focus-ring);
473
- });
474
- }
475
-
476
- &.is-selected {
477
- color: var(--theme-button-primary-selected-color);
478
- background-color: var(--theme-button-primary-selected-background-color);
479
- }
480
-
481
- .s-btn--number {
482
- color: var(--theme-button-primary-number-color);
483
- }
484
- }
485
-
486
- // ============================================================================
487
- // $ MISC STYLES
488
- // ============================================================================
489
- .s-btn__google {
490
- border-color: var(--bc-medium);
491
- background-color: var(--white);
492
- color: var(--black-700);
493
-
494
- &:hover,
495
- &:focus {
496
- border-color: var(--bc-darker);
497
- background-color: var(--black-025);
498
- color: var(--black-800);
499
- }
500
-
501
- &:active {
502
- background-color: var(--black-050);
503
- color: var(--black-900);
504
- }
505
-
506
- &:focus {
507
- box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
508
- }
509
- }
510
-
511
- .s-btn__facebook {
512
- border-color: transparent;
513
- background-color: #385499;
514
- color: #fff;
515
-
516
- .highcontrast-mode({ border-color: transparent; });
517
-
518
- &:hover,
519
- &:focus {
520
- background-color: darken(#385499, 5%);
521
- color: #fff;
522
- }
523
-
524
- &:active {
525
- background-color: darken(#385499, 10%);
526
- color: #fff;
527
- }
528
- }
529
-
530
- .s-btn__github {
531
- background-color: var(--black-750);
532
- color: var(--white);
533
-
534
- .highcontrast-mode({ border-color: transparent; });
535
-
536
- &:hover,
537
- &:focus {
538
- background-color: var(--black-800);
539
- color: var(--white);
540
- }
541
-
542
- &:active {
543
- background-color: var(--black-900);
544
- color: var(--white);
545
- }
546
-
547
- &:focus {
548
- box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
549
- }
550
- }
551
-
552
- .s-btn__unset,
553
- .s-btn__unset:hover,
554
- .s-btn__unset:active,
555
- .s-btn__unset:focus {
556
- padding: 0;
557
- border: none;
558
- outline: none;
559
- font: unset;
560
- border-radius: 0;
561
- color: unset;
562
- background: none;
563
- box-shadow: none;
564
- cursor: default;
565
- user-select: auto;
566
- }
567
-
568
- .s-btn__link {
569
- display: inline;
570
- padding: 0;
571
- border: none;
572
- border-radius: 0;
573
- outline: none;
574
- font: inherit;
575
- background: none;
576
- box-shadow: none;
577
- text-align: inherit;
578
-
579
- .s-link();
580
-
581
- &:hover,
582
- &:active,
583
- &:focus,
584
- &[disabled] {
585
- background: none;
586
- box-shadow: none;
587
- }
588
-
589
- &.s-btn__dropdown {
590
- padding-right: 0.9em;
591
-
592
- &:after {
593
- right: 0;
594
- }
595
- }
596
- }
597
-
598
- .s-btn__icon {
599
- // -- BUTTONS WITH ICONS
600
- // ------------------------------------------------------------------------
601
- // [1] Most svg icons are 18px tall, but the button's line-height is 1 (13px).
602
- // This means we need to off set the margin y-axis so we don't add
603
- // additional height to the button.
604
- // ------------------------------------------------------------------------
605
- .svg-icon {
606
- vertical-align: baseline;
607
- margin-top: -0.3em; // [1]
608
- margin-bottom: -0.3em; // [1]
609
- transition: opacity 200ms @te-smooth; // Animate the transition to .is-loading
610
- }
611
- }
612
-
613
- // $$ Loading Icon
614
- // Adds a loading icon into the button
615
- // ----------------------------------------------------------------------------
616
- .s-btn {
617
- &.is-loading {
618
- padding-left: 2.2em;
619
-
620
- &:before {
621
- content: "";
622
- position: absolute;
623
- opacity: 0.3;
624
- left: 0.6em;
625
- top: calc(50% - 0.6em);
626
- width: 1.23076923em;
627
- height: 1.23076923em;
628
- border-width: 2px;
629
- border-style: solid;
630
- border-color: currentColor;
631
- border-radius: @br-circle;
632
- }
633
-
634
- &:after {
635
- content: "";
636
- position: absolute;
637
- left: 0.6em;
638
- top: calc(50% - 0.6em);
639
- width: 1.23076923em;
640
- height: 1.23076923em;
641
- border-width: 2px;
642
- border-style: solid;
643
- border-color: transparent;
644
- border-left-color: currentColor;
645
- border-radius: @br-circle;
646
- animation: s-spinner-rotate 0.9s infinite cubic-bezier(0.5, 0.1, 0.5, 0.9);
647
- // see _stacks-spinner.less for an explanation of the following two
648
- filter: invert(0); // (*)
649
- transform-origin: 50% 50% 1px; // (*)
650
- }
651
-
652
- .svg-icon:first-child {
653
- margin-left: -23px;
654
- // If the first thing in the button is an icon, let's hide it on loading
655
- // We only want to modify the visibility, since we still want it to have shape and keep the same layout.
656
- opacity: 0;
657
- }
658
- }
659
- }
660
- }
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
+ }