@stackoverflow/stacks 1.2.0 → 1.3.2

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 (42) hide show
  1. package/dist/controllers/s-expandable-control.d.ts +1 -1
  2. package/dist/controllers/s-tooltip.d.ts +16 -1
  3. package/dist/css/stacks.css +974 -731
  4. package/dist/css/stacks.min.css +1 -1
  5. package/dist/js/stacks.js +174 -91
  6. package/dist/js/stacks.min.js +1 -1
  7. package/lib/css/atomic/borders.less +1 -0
  8. package/lib/css/atomic/colors.less +1 -0
  9. package/lib/css/atomic/misc.less +1 -1
  10. package/lib/css/atomic/typography.less +0 -6
  11. package/lib/css/atomic/width-height.less +1 -1
  12. package/lib/css/components/activity-indicator.less +18 -17
  13. package/lib/css/components/avatars.less +51 -131
  14. package/lib/css/components/badges.less +2 -0
  15. package/lib/css/components/breadcrumbs.less +4 -4
  16. package/lib/css/components/buttons.less +38 -54
  17. package/lib/css/components/empty-states.less +15 -0
  18. package/lib/css/components/{collapsible.less → expandable.less} +0 -0
  19. package/lib/css/components/inputs.less +44 -110
  20. package/lib/css/components/labels.less +98 -0
  21. package/lib/css/components/notices.less +190 -163
  22. package/lib/css/components/post-summary.less +117 -114
  23. package/lib/css/components/progress-bars.less +1 -1
  24. package/lib/css/components/prose.less +4 -4
  25. package/lib/css/components/spinner.less +39 -1
  26. package/lib/css/components/tables.less +1 -5
  27. package/lib/css/components/topbar.less +4 -1
  28. package/lib/css/components/uploader.less +70 -84
  29. package/lib/css/exports/constants-colors.less +68 -49
  30. package/lib/css/stacks-dynamic.less +0 -1
  31. package/lib/css/stacks-static.less +3 -2
  32. package/lib/ts/controllers/s-expandable-control.ts +23 -19
  33. package/lib/ts/controllers/s-modal.ts +16 -16
  34. package/lib/ts/controllers/s-navigation-tablist.ts +13 -13
  35. package/lib/ts/controllers/s-popover.ts +26 -18
  36. package/lib/ts/controllers/s-table.ts +31 -29
  37. package/lib/ts/controllers/s-tooltip.ts +62 -23
  38. package/lib/ts/controllers/s-uploader.ts +26 -12
  39. package/lib/ts/stacks.ts +8 -4
  40. package/package.json +23 -23
  41. package/lib/css/components/banners.less +0 -80
  42. package/lib/css/components/blank-states.less +0 -26
@@ -12,13 +12,29 @@
12
12
  // ----------------------------------------------------------------------------
13
13
 
14
14
  .s-activity-indicator {
15
+ --_focus-ring: var(--focus-ring);
16
+ --_bg-color: var(--theme-secondary-400);
17
+
18
+ &.s-activity-indicator__success {
19
+ --_bg-color: var(--green-500);
20
+ --_focus-ring: var(--focus-ring-success);
21
+ }
22
+ &.s-activity-indicator__warning {
23
+ --_bg-color: var(--yellow-600);
24
+ --_focus-ring: var(--focus-ring-warning);
25
+ }
26
+ &.s-activity-indicator__danger {
27
+ --_bg-color: var(--red-500);
28
+ --_focus-ring: var(--focus-ring-error);
29
+ }
30
+
15
31
  display: inline-block;
16
32
  min-width: var(--su-static12);
17
33
  min-height: var(--su-static12);
18
34
  padding: var(--su2) var(--su4);
19
35
  line-height: 1.1; // Custom line-height to satisfy 1x screens
20
- background-color: var(--theme-secondary-400);
21
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring);
36
+ background-color: var(--_bg-color);
37
+ box-shadow: 0 0 0 var(--su-static4) var(--_focus-ring);
22
38
  border-radius: 1000px;
23
39
  font-size: var(--fs-fine);
24
40
  font-weight: 600;
@@ -27,18 +43,3 @@
27
43
 
28
44
  .highcontrast-mode({ color: var(--white); });
29
45
  }
30
-
31
- .s-activity-indicator__success {
32
- background-color: var(--green-500);
33
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-success);
34
- }
35
-
36
- .s-activity-indicator__warning {
37
- background-color: var(--yellow-600);
38
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-warning);
39
- }
40
-
41
- .s-activity-indicator__danger {
42
- background-color: var(--red-500);
43
- box-shadow: 0 0 0 var(--su-static4) var(--focus-ring-error);
44
- }
@@ -16,11 +16,52 @@
16
16
  // ----------------------------------------------------------------------------
17
17
 
18
18
  .s-avatar {
19
+ --_size: var(--su-static16);
20
+ --_br: var(--br-sm);
21
+ --_fs-letter: calc(var(--su-static12) - var(--su-static1));
22
+ --_scale-badge: 1;
23
+
24
+ &.s-avatar__24 {
25
+ --_size: var(--su-static24);
26
+ --_fs-letter: var(--su-static16);
27
+ --_scale-badge: 1.1;
28
+ }
29
+ &.s-avatar__32 {
30
+ --_size: var(--su-static32);
31
+ --_br: var(--br-md);
32
+ --_fs-letter: calc(var(--su-static24) - var(--su-static2));
33
+ --_scale-badge: 1.3;
34
+ }
35
+ &.s-avatar__48 {
36
+ --_size: var(--su-static48);
37
+ --_br: var(--br-md);
38
+ --_fs-letter: calc(var(--su-static32) + var(--su-static2));
39
+ --_scale-badge: 1.6;
40
+ }
41
+ &.s-avatar__64 {
42
+ --_size: var(--su-static64);
43
+ --_br: var(--br-lg);
44
+ --_fs-letter: calc(var(--su-static48) - var(--su-static4));
45
+ --_scale-badge: 2.4;
46
+ }
47
+ &.s-avatar__96 {
48
+ --_size: var(--su-static96);
49
+ --_br: calc(var(--br-lg) + var(--br-sm));
50
+ --_fs-letter: calc(var(--su-static64) + var(--su-static2));
51
+ --_scale-badge: 3;
52
+ }
53
+ &.s-avatar__128 {
54
+ --_size: var(--su-static128);
55
+ --_br: calc(var(--br-lg) + var(--br-sm));
56
+ --_fs-letter: calc(var(--su-static96) - var(--su-static8));
57
+ --_scale-badge: 3;
58
+ }
59
+
19
60
  display: inline-block; // Make sure the avatar has structure regardless of the element eg. span vs. div
20
61
  position: relative;
21
- width: var(--su-static16);
22
- height: var(--su-static16);
23
- border-radius: var(--br-sm);
62
+ width: var(--_size);
63
+ height: var(--_size);
64
+ border-radius: var(--_br);
24
65
  background-color: @white; // Force a white background color for when we have transparent avatars
25
66
  background-repeat: no-repeat;
26
67
  background-size: 100%;
@@ -29,6 +70,7 @@
29
70
  .highcontrast-mode({
30
71
  background-color: var(--black);
31
72
  box-shadow: 0 0 0 1px var(--black);
73
+ color: var(--white);
32
74
 
33
75
  .s-avatar--letter {
34
76
  color: var(--white);
@@ -38,7 +80,7 @@
38
80
  .s-avatar--letter {
39
81
  display: block; // Make sure we're treating the letter as a block-level element
40
82
  color: @white; // Force a light appearance of text rendering
41
- font-size: 11px; // Force a font size so the avatar text doesn't get smaller as the window resizes
83
+ font-size: var(--_fs-letter); // Force a font size so the avatar text doesn't get smaller as the window resizes
42
84
  font-weight: bold;
43
85
  line-height: 1.4; // Guards against some line-height trolling from the parent
44
86
  text-align: center;
@@ -54,136 +96,14 @@
54
96
  position: absolute;
55
97
  right: -4px;
56
98
  bottom: -4px;
99
+ -webkit-transform: scale(var(--_scale-badge));
100
+ transform: scale(var(--_scale-badge));
57
101
  }
58
102
 
59
103
  .s-avatar--image {
60
- width: var(--su-static16);
61
- height: var(--su-static16);
62
- border-radius: var(--br-sm);
104
+ width: var(--_size);
105
+ height: var(--_size);
106
+ border-radius: var(--_br);
63
107
  display: block;
64
108
  }
65
-
66
- &.s-avatar__24 {
67
- width: var(--su-static24);
68
- height: var(--su-static24);
69
-
70
- .s-avatar--letter {
71
- font-size: 16px; // Force the font size regardless of the parent
72
- }
73
-
74
- .s-avatar--badge {
75
- -webkit-transform: scale(1.1);
76
- transform: scale(1.1);
77
- }
78
-
79
- .s-avatar--image {
80
- width: var(--su-static24);
81
- height: var(--su-static24);
82
- }
83
- }
84
-
85
- &.s-avatar__32 {
86
- width: var(--su-static32);
87
- height: var(--su-static32);
88
- border-radius: var(--br-md);
89
-
90
- .s-avatar--letter {
91
- font-size: 22px; // Force the font size regardless of the parent
92
- }
93
-
94
- .s-avatar--badge {
95
- -webkit-transform: scale(1.3);
96
- transform: scale(1.3);
97
- }
98
-
99
- .s-avatar--image {
100
- width: var(--su-static32);
101
- height: var(--su-static32);
102
- border-radius: var(--br-md);
103
- }
104
- }
105
-
106
- &.s-avatar__48 {
107
- width: var(--su-static48);
108
- height: var(--su-static48);
109
- border-radius: var(--br-md);
110
-
111
- .s-avatar--letter {
112
- font-size: 34px; // Force the font size regardless of the parent
113
- }
114
-
115
- .s-avatar--badge {
116
- -webkit-transform: scale(1.6);
117
- transform: scale(1.6);
118
- }
119
-
120
- .s-avatar--image {
121
- width: var(--su-static48);
122
- height: var(--su-static48);
123
- border-radius: var(--br-md);
124
- }
125
- }
126
-
127
- &.s-avatar__64 {
128
- width: var(--su-static64);
129
- height: var(--su-static64);
130
- border-radius: var(--br-lg);
131
-
132
- .s-avatar--letter {
133
- font-size: 44px; // Force the font size regardless of the parent
134
- }
135
-
136
- .s-avatar--badge {
137
- -webkit-transform: scale(2.4);
138
- transform: scale(2.4);
139
- }
140
-
141
- .s-avatar--image {
142
- width: var(--su-static64);
143
- height: var(--su-static64);
144
- border-radius: var(--br-lg);
145
- }
146
- }
147
-
148
- &.s-avatar__96 {
149
- width: var(--su-static96);
150
- height: var(--su-static96);
151
- border-radius: calc(var(--br-lg) + var(--br-sm));
152
-
153
- .s-avatar--letter {
154
- font-size: 66px; // Force the font size regardless of the parent
155
- }
156
-
157
- .s-avatar--badge {
158
- -webkit-transform: scale(3);
159
- transform: scale(3);
160
- }
161
-
162
- .s-avatar--image {
163
- width: var(--su-static96);
164
- height: var(--su-static96);
165
- border-radius: calc(var(--br-lg) + var(--br-sm));
166
- }
167
- }
168
-
169
- &.s-avatar__128 {
170
- width: var(--su-static128);
171
- height: var(--su-static128);
172
- border-radius: calc(var(--br-lg) + var(--br-lg));
173
-
174
- .s-avatar--letter {
175
- font-size: 88px; // Force the font size regardless of the parent
176
- }
177
-
178
- .s-avatar--badge {
179
- -webkit-transform: scale(3);
180
- transform: scale(3);
181
- }
182
-
183
- .s-avatar--image {
184
- width: var(--su-static128);
185
- height: var(--su-static128);
186
- border-radius: calc(var(--br-lg) + var(--br-lg));
187
- }
188
- }
189
109
  }
@@ -192,6 +192,8 @@
192
192
  color: @white;
193
193
  background-color: var(--red-500);
194
194
  border-color: transparent;
195
+
196
+ .highcontrast-mode({ color: var(--white); });
195
197
  }
196
198
  }
197
199
 
@@ -11,7 +11,7 @@
11
11
  display: flex;
12
12
  flex-wrap: wrap;
13
13
  align-items: start;
14
- color: var(--black-150);
14
+ color: var(--black-200);
15
15
  font-size: var(--fs-caption);
16
16
 
17
17
  .s-breadcrumbs--item {
@@ -26,7 +26,7 @@
26
26
  margin-right: var(--su4);
27
27
  margin-left: var(--su4);
28
28
 
29
- .highcontrast-mode({ color: var(--black-350); });
29
+ .highcontrast-mode({ color: var(--fc-light); });
30
30
 
31
31
  #stacks-internals #screen-sm({
32
32
  margin-right: var(--su2);
@@ -35,10 +35,10 @@
35
35
  }
36
36
 
37
37
  .s-breadcrumbs--link {
38
- color: var(--black-350);
38
+ color: var(--fc-light);
39
39
 
40
40
  &:hover {
41
- color: var(--black-600);
41
+ color: var(--fc-medium);
42
42
  }
43
43
  }
44
44
  }
@@ -74,7 +74,7 @@
74
74
  }
75
75
 
76
76
  &[disabled] {
77
- opacity: 0.5;
77
+ opacity: var(--_o-disabled-static);
78
78
  pointer-events: none;
79
79
  box-shadow: none !important;
80
80
  }
@@ -151,15 +151,13 @@
151
151
  }
152
152
 
153
153
  .s-btn--badge {
154
- opacity: 0.5;
154
+ opacity: var(--_o-disabled);
155
155
  display: inline-block;
156
156
  border-radius: var(--br-sm);
157
157
  padding: var(--su2) calc(var(--su4) - var(--su1));
158
158
  font-size: var(--fs-caption);
159
159
  line-height: var(--lh-xs);
160
160
  background-color: currentColor;
161
-
162
- .highcontrast-mode({ opacity: 0.8; });
163
161
  }
164
162
 
165
163
  .s-btn--number {
@@ -197,7 +195,11 @@
197
195
  border-color: var(--theme-button-filled-border-color);
198
196
  box-shadow: inset 0 1px 0 0 hsla(0, 0, 100%, 0.7);
199
197
 
200
- .dark-mode({ box-shadow: none; });
198
+ .dark-mode({
199
+ &:not(:focus) {
200
+ box-shadow: none;
201
+ }
202
+ });
201
203
 
202
204
  &:hover,
203
205
  &:focus,
@@ -278,7 +280,11 @@
278
280
  border-color: transparent;
279
281
  box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
280
282
 
281
- .dark-mode({ box-shadow: none; });
283
+ .dark-mode({
284
+ &:not(:focus) {
285
+ box-shadow: none;
286
+ }
287
+ });
282
288
 
283
289
  .highcontrast-mode({
284
290
  background-color: var(--black-400);
@@ -380,7 +386,11 @@
380
386
  border-color: transparent;
381
387
  box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
382
388
 
383
- .dark-mode({ box-shadow: none; });
389
+ .dark-mode({
390
+ &:not(:focus) {
391
+ box-shadow: none;
392
+ }
393
+ });
384
394
 
385
395
  .highcontrast-mode({
386
396
  color: var(--white);
@@ -440,15 +450,19 @@
440
450
  box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
441
451
 
442
452
  .dark-mode({
443
- box-shadow: none;
453
+ &:not(:focus) {
454
+ box-shadow: none;
455
+ }
444
456
 
445
457
  &:not(.is-selected) {
458
+ background-color: var(--theme-secondary-300);
446
459
  color: var(--black);
447
460
  }
448
461
  });
449
462
  .highcontrast-mode({
450
463
  &:not(.is-selected) {
451
464
  border-color: transparent;
465
+ background-color: var(--theme-secondary-400);
452
466
  color: var(--white);
453
467
  }
454
468
  });
@@ -560,7 +574,7 @@
560
574
  .s-btn__unset:focus {
561
575
  padding: 0;
562
576
  border: none;
563
- outline: none;
577
+ outline: initial;
564
578
  font: unset;
565
579
  border-radius: 0;
566
580
  color: unset;
@@ -575,7 +589,7 @@
575
589
  padding: 0;
576
590
  border: none;
577
591
  border-radius: 0;
578
- outline: none;
592
+ outline: initial;
579
593
  font: inherit;
580
594
  background: none;
581
595
  box-shadow: none;
@@ -600,6 +614,14 @@
600
614
  }
601
615
  }
602
616
 
617
+ .s-btn__unset,
618
+ .s-btn__link {
619
+ &:focus,
620
+ &:focus-visible {
621
+ outline-style: auto;
622
+ }
623
+ }
624
+
603
625
  .s-btn__icon {
604
626
  // -- BUTTONS WITH ICONS
605
627
  // ------------------------------------------------------------------------
@@ -616,50 +638,12 @@
616
638
  }
617
639
 
618
640
  // $$ Loading Icon
619
- // Adds a loading icon into the button
641
+ // see spinner.less for full implementation
620
642
  // ----------------------------------------------------------------------------
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
- }
643
+ .s-btn.is-loading .svg-icon:first-child {
644
+ margin-left: -23px;
645
+ // If the first thing in the button is an icon, let's hide it on loading
646
+ // We only want to modify the visibility, since we still want it to have shape and keep the same layout.
647
+ opacity: 0;
664
648
  }
665
649
  }
@@ -0,0 +1,15 @@
1
+ .s-empty-state {
2
+ color: var(--fc-light);
3
+ text-align: center;
4
+ margin-left: auto;
5
+ margin-right: auto;
6
+
7
+ p {
8
+ font-size: var(--fs-body1);
9
+ margin-bottom: var(--su12);
10
+
11
+ strong {
12
+ color: var(--fc-dark);
13
+ }
14
+ }
15
+ }