@stackoverflow/stacks 1.3.0 → 1.3.3

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 (39) 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 +848 -559
  4. package/dist/css/stacks.min.css +1 -1
  5. package/dist/js/stacks.js +153 -84
  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/components/activity-indicator.less +18 -17
  12. package/lib/css/components/avatars.less +50 -131
  13. package/lib/css/components/breadcrumbs.less +4 -4
  14. package/lib/css/components/buttons.less +8 -48
  15. package/lib/css/components/empty-states.less +15 -0
  16. package/lib/css/components/{collapsible.less → expandable.less} +0 -0
  17. package/lib/css/components/inputs.less +37 -101
  18. package/lib/css/components/labels.less +98 -0
  19. package/lib/css/components/links.less +15 -3
  20. package/lib/css/components/notices.less +190 -163
  21. package/lib/css/components/post-summary.less +98 -35
  22. package/lib/css/components/progress-bars.less +1 -1
  23. package/lib/css/components/prose.less +4 -4
  24. package/lib/css/components/spinner.less +39 -1
  25. package/lib/css/components/tables.less +1 -5
  26. package/lib/css/components/uploader.less +70 -84
  27. package/lib/css/exports/constants-colors.less +19 -0
  28. package/lib/css/stacks-dynamic.less +0 -1
  29. package/lib/css/stacks-static.less +3 -2
  30. package/lib/ts/controllers/s-expandable-control.ts +23 -19
  31. package/lib/ts/controllers/s-modal.ts +16 -16
  32. package/lib/ts/controllers/s-navigation-tablist.ts +13 -13
  33. package/lib/ts/controllers/s-popover.ts +26 -18
  34. package/lib/ts/controllers/s-table.ts +31 -29
  35. package/lib/ts/controllers/s-tooltip.ts +62 -23
  36. package/lib/ts/stacks.ts +8 -4
  37. package/package.json +17 -17
  38. package/lib/css/components/banners.less +0 -80
  39. 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%;
@@ -39,7 +80,7 @@
39
80
  .s-avatar--letter {
40
81
  display: block; // Make sure we're treating the letter as a block-level element
41
82
  color: @white; // Force a light appearance of text rendering
42
- 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
43
84
  font-weight: bold;
44
85
  line-height: 1.4; // Guards against some line-height trolling from the parent
45
86
  text-align: center;
@@ -55,136 +96,14 @@
55
96
  position: absolute;
56
97
  right: -4px;
57
98
  bottom: -4px;
99
+ -webkit-transform: scale(var(--_scale-badge));
100
+ transform: scale(var(--_scale-badge));
58
101
  }
59
102
 
60
103
  .s-avatar--image {
61
- width: var(--su-static16);
62
- height: var(--su-static16);
63
- border-radius: var(--br-sm);
104
+ width: var(--_size);
105
+ height: var(--_size);
106
+ border-radius: var(--_br);
64
107
  display: block;
65
108
  }
66
-
67
- &.s-avatar__24 {
68
- width: var(--su-static24);
69
- height: var(--su-static24);
70
-
71
- .s-avatar--letter {
72
- font-size: 16px; // Force the font size regardless of the parent
73
- }
74
-
75
- .s-avatar--badge {
76
- -webkit-transform: scale(1.1);
77
- transform: scale(1.1);
78
- }
79
-
80
- .s-avatar--image {
81
- width: var(--su-static24);
82
- height: var(--su-static24);
83
- }
84
- }
85
-
86
- &.s-avatar__32 {
87
- width: var(--su-static32);
88
- height: var(--su-static32);
89
- border-radius: var(--br-md);
90
-
91
- .s-avatar--letter {
92
- font-size: 22px; // Force the font size regardless of the parent
93
- }
94
-
95
- .s-avatar--badge {
96
- -webkit-transform: scale(1.3);
97
- transform: scale(1.3);
98
- }
99
-
100
- .s-avatar--image {
101
- width: var(--su-static32);
102
- height: var(--su-static32);
103
- border-radius: var(--br-md);
104
- }
105
- }
106
-
107
- &.s-avatar__48 {
108
- width: var(--su-static48);
109
- height: var(--su-static48);
110
- border-radius: var(--br-md);
111
-
112
- .s-avatar--letter {
113
- font-size: 34px; // Force the font size regardless of the parent
114
- }
115
-
116
- .s-avatar--badge {
117
- -webkit-transform: scale(1.6);
118
- transform: scale(1.6);
119
- }
120
-
121
- .s-avatar--image {
122
- width: var(--su-static48);
123
- height: var(--su-static48);
124
- border-radius: var(--br-md);
125
- }
126
- }
127
-
128
- &.s-avatar__64 {
129
- width: var(--su-static64);
130
- height: var(--su-static64);
131
- border-radius: var(--br-lg);
132
-
133
- .s-avatar--letter {
134
- font-size: 44px; // Force the font size regardless of the parent
135
- }
136
-
137
- .s-avatar--badge {
138
- -webkit-transform: scale(2.4);
139
- transform: scale(2.4);
140
- }
141
-
142
- .s-avatar--image {
143
- width: var(--su-static64);
144
- height: var(--su-static64);
145
- border-radius: var(--br-lg);
146
- }
147
- }
148
-
149
- &.s-avatar__96 {
150
- width: var(--su-static96);
151
- height: var(--su-static96);
152
- border-radius: calc(var(--br-lg) + var(--br-sm));
153
-
154
- .s-avatar--letter {
155
- font-size: 66px; // Force the font size regardless of the parent
156
- }
157
-
158
- .s-avatar--badge {
159
- -webkit-transform: scale(3);
160
- transform: scale(3);
161
- }
162
-
163
- .s-avatar--image {
164
- width: var(--su-static96);
165
- height: var(--su-static96);
166
- border-radius: calc(var(--br-lg) + var(--br-sm));
167
- }
168
- }
169
-
170
- &.s-avatar__128 {
171
- width: var(--su-static128);
172
- height: var(--su-static128);
173
- border-radius: calc(var(--br-lg) + var(--br-lg));
174
-
175
- .s-avatar--letter {
176
- font-size: 88px; // Force the font size regardless of the parent
177
- }
178
-
179
- .s-avatar--badge {
180
- -webkit-transform: scale(3);
181
- transform: scale(3);
182
- }
183
-
184
- .s-avatar--image {
185
- width: var(--su-static128);
186
- height: var(--su-static128);
187
- border-radius: calc(var(--br-lg) + var(--br-lg));
188
- }
189
- }
190
109
  }
@@ -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 {
@@ -640,50 +638,12 @@
640
638
  }
641
639
 
642
640
  // $$ Loading Icon
643
- // Adds a loading icon into the button
641
+ // see spinner.less for full implementation
644
642
  // ----------------------------------------------------------------------------
645
- .s-btn {
646
- &.is-loading {
647
- padding-left: 2.2em;
648
-
649
- &:before {
650
- content: "";
651
- position: absolute;
652
- opacity: 0.3;
653
- left: 0.6em;
654
- top: calc(50% - 0.6em);
655
- width: 1.23076923em;
656
- height: 1.23076923em;
657
- border-width: 2px;
658
- border-style: solid;
659
- border-color: currentColor;
660
- border-radius: var(--br-circle);
661
- }
662
-
663
- &:after {
664
- content: "";
665
- position: absolute;
666
- left: 0.6em;
667
- top: calc(50% - 0.6em);
668
- width: 1.23076923em;
669
- height: 1.23076923em;
670
- border-width: 2px;
671
- border-style: solid;
672
- border-color: transparent;
673
- border-left-color: currentColor;
674
- border-radius: var(--br-circle);
675
- animation: s-spinner-rotate 0.9s infinite cubic-bezier(0.5, 0.1, 0.5, 0.9);
676
- // see spinner.less for an explanation of the following two
677
- filter: invert(0); // (*)
678
- transform-origin: 50% 50% 1px; // (*)
679
- }
680
-
681
- .svg-icon:first-child {
682
- margin-left: -23px;
683
- // If the first thing in the button is an icon, let's hide it on loading
684
- // We only want to modify the visibility, since we still want it to have shape and keep the same layout.
685
- opacity: 0;
686
- }
687
- }
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;
688
648
  }
689
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
+ }
@@ -12,8 +12,6 @@
12
12
  // - Base Style (Input / Textarea)
13
13
  // - Textarea Styles
14
14
  // - Fieldset Resets
15
- // • Labels
16
- // • Label Statuses
17
15
  // • Text Styles
18
16
  // • Connected Input Fills
19
17
  // • Select Menus
@@ -45,7 +43,11 @@
45
43
  }
46
44
  }
47
45
 
48
- @basic-styling: {
46
+ // ============================================================================
47
+ // $ BASE INPUT / TEXTAREA STYLE
48
+ // ----------------------------------------------------------------------------
49
+ .s-input,
50
+ .s-textarea {
49
51
  -webkit-appearance: none; // Removes shadows we don't want in mobile Safari
50
52
  width: 100%;
51
53
  margin: 0; // A guard against Core's default margins
@@ -95,14 +97,6 @@
95
97
  @autofill();
96
98
  }
97
99
 
98
- // ============================================================================
99
- // $ BASE INPUT / TEXTAREA STYLE
100
- // ----------------------------------------------------------------------------
101
- .s-input,
102
- .s-textarea {
103
- @basic-styling();
104
- }
105
-
106
100
  .s-input.s-input__search,
107
101
  .s-input.s-input__creditcard {
108
102
  padding-left: var(--su-static32);
@@ -122,83 +116,28 @@ fieldset {
122
116
  .s-btn,
123
117
  .s-link {
124
118
  box-shadow: none !important;
125
- opacity: 0.5;
119
+ opacity: var(--_o-disabled-static);
126
120
  pointer-events: none;
127
121
  }
128
122
 
129
123
  .s-checkbox,
130
124
  .s-input-message,
131
- .s-label,
132
125
  .s-radio,
133
126
  .s-toggle-switch,
134
127
  .s-toggle-switch label {
135
128
  cursor: not-allowed;
136
- opacity: 0.5;
129
+ opacity: var(--_o-disabled-static);
137
130
  }
138
131
 
139
132
  .s-input,
140
133
  .s-textarea,
141
134
  .s-select > select {
142
135
  cursor: not-allowed;
143
- opacity: 0.5;
136
+ opacity: var(--_o-disabled-static);
144
137
  }
145
138
  }
146
139
  }
147
140
 
148
- // ============================================================================
149
- // $ LABELS
150
- // ============================================================================
151
- .s-label {
152
- padding: 0 var(--su2); // Helps the label visually line up with inputs
153
- color: var(--fc-dark);
154
- font-family: inherit;
155
- font-size: var(--fs-body2);
156
- font-weight: 600;
157
-
158
- &[for] {
159
- cursor: pointer;
160
- }
161
- }
162
-
163
- // $$ LABEL STATUS FLAG
164
- // ----------------------------------------------------------------------------
165
- // Is this form item required or optional? Flag the status for users.
166
- // Default styling is optional.
167
- .s-label--status {
168
- margin-left: var(--su4);
169
- padding: var(--su2) var(--su8);
170
- border-radius: 1000px;
171
- background-color: var(--black-050);
172
- color: var(--fc-medium);
173
- font-size: var(--fs-caption);
174
- font-weight: 400;
175
- vertical-align: text-bottom;
176
-
177
- .highcontrast-mode({
178
- border: 1px solid currentColor;
179
- });
180
-
181
- &.s-label--status__required {
182
- background-color: var(--red-100);
183
- color: var(--red-600);
184
-
185
- .dark-mode({
186
- color: var(--red-800);
187
- });
188
- }
189
-
190
- &.s-label--status__new {
191
- background-color: var(--green-100);
192
- color: var(--green-700);
193
- }
194
-
195
- &.s-label--status__beta {
196
- background-color: var(--blue-100);
197
- color: var(--blue-700);
198
- }
199
- }
200
-
201
-
202
141
  // ============================================================================
203
142
  // $ TEXT STYLES
204
143
  // ============================================================================
@@ -208,14 +147,6 @@ fieldset {
208
147
  font-size: var(--fs-caption);
209
148
  }
210
149
 
211
- .s-label .s-description,
212
- .s-label .s-input-message {
213
- padding: 0;
214
- margin-top: 4px;
215
- margin-bottom: 0;
216
- font-weight: normal;
217
- }
218
-
219
150
  // ============================================================================
220
151
  // $ CONNECTED INPUTS
221
152
  // To visually connect inputs together
@@ -363,7 +294,7 @@ fieldset {
363
294
 
364
295
  // Disabled
365
296
  &[disabled] {
366
- opacity: 0.5;
297
+ opacity: var(--_o-disabled-static);
367
298
  cursor: not-allowed;
368
299
  }
369
300
  }
@@ -462,21 +393,26 @@ fieldset {
462
393
  .s-input,
463
394
  .s-textarea,
464
395
  .s-select > select {
465
- // Disabled, Read-only
466
- &[disabled],
467
- &[read-only] {
396
+ // Disabled
397
+ &[disabled] {
468
398
  cursor: not-allowed;
469
- opacity: 0.5;
470
-
471
- .highcontrast-mode({
472
- opacity: 0.5;
473
- });
399
+ opacity: var(--_o-disabled-static);
474
400
  }
475
401
 
476
- // Disabled
477
- &[disabled] {
402
+ // Readonly
403
+ // Note: The readonly attribute is not supported on select elements
404
+ // See https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/readonly
405
+ // and https://github.com/StackExchange/Stacks/pull/1040#discussion_r931144086
406
+ &[readonly],
407
+ .is-readonly & {
408
+ border-color: var(--bc-light);
409
+ background-color: var(--black-050);
410
+ color: var(--black-200);
478
411
  cursor: not-allowed;
479
- opacity: 0.5;
412
+
413
+ .highcontrast-mode({
414
+ color: var(--fc-light);
415
+ });
480
416
  }
481
417
  }
482
418
 
@@ -485,6 +421,7 @@ fieldset {
485
421
  // Classes are applied at the wrapping container level.
486
422
  // ----------------------------------------------------------------------------
487
423
  .is-disabled,
424
+ .is-readonly,
488
425
  .has-success,
489
426
  .has-error,
490
427
  .has-warning {
@@ -612,21 +549,24 @@ fieldset {
612
549
  border-color: var(--bc-darker) transparent;
613
550
  }
614
551
 
615
- .s-label,
616
552
  .s-description {
617
- opacity: 0.5;
618
-
619
- .s-description {
620
- opacity: unset;
621
- }
553
+ opacity: var(--_o-disabled-static);
622
554
  }
623
555
 
624
556
  .s-input-icon {
625
557
  color: var(--black-400);
626
558
  }
559
+ }
627
560
 
628
- .s-label {
629
- cursor: not-allowed;
561
+ // $$ READONLY
562
+ // ----------------------------------------------------------------------------
563
+ .is-readonly {
564
+ .s-input-icon {
565
+ color: var(--black-200);
566
+
567
+ .highcontrast-mode({
568
+ color: var(--fc-light);
569
+ });
630
570
  }
631
571
  }
632
572
 
@@ -659,25 +599,21 @@ fieldset {
659
599
  // ----------------------------------------------------------------------------
660
600
  .s-input__sm,
661
601
  .s-textarea__sm,
662
- .s-label__sm,
663
602
  .s-select__sm > select {
664
603
  font-size: var(--fs-caption);
665
604
  }
666
605
  .s-input__md,
667
606
  .s-textarea__md,
668
- .s-label__md,
669
607
  .s-select__md > select {
670
608
  font-size: var(--fs-body3);
671
609
  }
672
610
  .s-input__lg,
673
611
  .s-textarea__lg,
674
- .s-label__lg,
675
612
  .s-select__lg > select {
676
613
  font-size: var(--fs-title);
677
614
  }
678
615
  .s-input__xl,
679
616
  .s-textarea__xl,
680
- .s-label__xl,
681
617
  .s-select__xl > select {
682
618
  font-size: var(--fs-headline1);
683
619
  }