@stackoverflow/stacks 2.5.3 → 2.5.5

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 (101) hide show
  1. package/LICENSE.MD +9 -9
  2. package/README.md +180 -180
  3. package/dist/css/stacks.css +104 -122
  4. package/dist/css/stacks.min.css +1 -1
  5. package/lib/atomic/border.less +139 -139
  6. package/lib/atomic/color.less +36 -36
  7. package/lib/atomic/flex.less +426 -426
  8. package/lib/atomic/gap.less +44 -44
  9. package/lib/atomic/grid.less +139 -139
  10. package/lib/atomic/misc.less +374 -374
  11. package/lib/atomic/spacing.less +98 -98
  12. package/lib/atomic/typography.less +264 -264
  13. package/lib/atomic/width-height.less +194 -194
  14. package/lib/base/body.less +44 -44
  15. package/lib/base/configuration-static.less +61 -61
  16. package/lib/base/fieldset.less +5 -5
  17. package/lib/base/icon.less +11 -11
  18. package/lib/base/internal.less +220 -220
  19. package/lib/base/reset-meyer.less +64 -64
  20. package/lib/base/reset-normalize.less +449 -449
  21. package/lib/base/reset.less +20 -20
  22. package/lib/components/activity-indicator/activity-indicator.less +53 -53
  23. package/lib/components/anchor/anchor.less +78 -68
  24. package/lib/components/avatar/avatar.less +108 -108
  25. package/lib/components/award-bling/award-bling.less +31 -31
  26. package/lib/components/badge/badge.less +258 -258
  27. package/lib/components/banner/banner.less +44 -44
  28. package/lib/components/banner/banner.ts +149 -149
  29. package/lib/components/block-link/block-link.less +82 -82
  30. package/lib/components/breadcrumbs/breadcrumbs.less +41 -41
  31. package/lib/components/button/button.less +473 -473
  32. package/lib/components/button-group/button-group.less +82 -82
  33. package/lib/components/card/card.less +37 -37
  34. package/lib/components/check-control/check-control.less +17 -17
  35. package/lib/components/check-group/check-group.less +19 -19
  36. package/lib/components/checkbox_radio/checkbox_radio.less +159 -159
  37. package/lib/components/code-block/code-block.fixtures.ts +88 -88
  38. package/lib/components/code-block/code-block.less +116 -116
  39. package/lib/components/description/description.less +9 -9
  40. package/lib/components/empty-state/empty-state.less +16 -16
  41. package/lib/components/expandable/expandable.less +118 -118
  42. package/lib/components/expandable/expandable.ts +238 -238
  43. package/lib/components/input-fill/input-fill.less +35 -35
  44. package/lib/components/input-icon/input-icon.less +45 -45
  45. package/lib/components/input-message/input-message.less +49 -49
  46. package/lib/components/input_textarea/input_textarea.less +150 -150
  47. package/lib/components/label/label.less +110 -110
  48. package/lib/components/link/link.less +135 -120
  49. package/lib/components/link-preview/link-preview.less +148 -148
  50. package/lib/components/menu/menu.less +41 -41
  51. package/lib/components/modal/modal.less +118 -118
  52. package/lib/components/modal/modal.ts +383 -383
  53. package/lib/components/navigation/navigation.less +136 -136
  54. package/lib/components/navigation/navigation.ts +128 -128
  55. package/lib/components/notice/notice.less +195 -195
  56. package/lib/components/page-title/page-title.less +51 -51
  57. package/lib/components/pagination/pagination.less +65 -65
  58. package/lib/components/popover/popover.less +159 -157
  59. package/lib/components/popover/popover.ts +651 -651
  60. package/lib/components/popover/tooltip.ts +343 -343
  61. package/lib/components/post-summary/post-summary.less +457 -447
  62. package/lib/components/progress-bar/progress-bar.less +291 -291
  63. package/lib/components/prose/prose.less +452 -452
  64. package/lib/components/select/select.less +138 -138
  65. package/lib/components/sidebar-widget/sidebar-widget.less +257 -257
  66. package/lib/components/spinner/spinner.less +103 -103
  67. package/lib/components/table/table.less +307 -307
  68. package/lib/components/table/table.ts +296 -296
  69. package/lib/components/table-container/table-container.less +4 -4
  70. package/lib/components/tag/tag.less +186 -186
  71. package/lib/components/toast/toast.less +35 -35
  72. package/lib/components/toast/toast.ts +357 -357
  73. package/lib/components/toggle-switch/toggle-switch.less +104 -104
  74. package/lib/components/topbar/topbar.less +553 -553
  75. package/lib/components/uploader/uploader.less +205 -205
  76. package/lib/components/uploader/uploader.ts +207 -207
  77. package/lib/components/user-card/user-card.less +129 -129
  78. package/lib/controllers.ts +33 -33
  79. package/lib/exports/color-mixins.less +283 -283
  80. package/lib/exports/color-sets.less +711 -711
  81. package/lib/exports/color.less +65 -65
  82. package/lib/exports/constants-helpers.less +108 -108
  83. package/lib/exports/constants-type.less +155 -155
  84. package/lib/exports/exports.less +15 -15
  85. package/lib/exports/mixins.less +333 -333
  86. package/lib/exports/spacing-mixins.less +67 -67
  87. package/lib/index.ts +32 -32
  88. package/lib/input-utils.less +41 -41
  89. package/lib/stacks-dynamic.less +24 -24
  90. package/lib/stacks-static.less +93 -93
  91. package/lib/stacks.less +13 -13
  92. package/lib/stacks.ts +113 -113
  93. package/lib/test/a11y-test-utils.ts +94 -94
  94. package/lib/test/assertions.ts +36 -36
  95. package/lib/test/less-test-utils.ts +28 -28
  96. package/lib/test/open-wc-testing-patch.d.ts +26 -26
  97. package/lib/test/test-utils.ts +364 -364
  98. package/lib/test/visual-test-utils.ts +58 -58
  99. package/lib/tsconfig.build.json +4 -4
  100. package/lib/tsconfig.json +17 -17
  101. package/package.json +115 -115
@@ -1,257 +1,257 @@
1
- .s-sidebarwidget {
2
- // COMPONENT-SPECIFIC CONSTANTS
3
- @sw-content-px: calc(var(--su16) - var(--su1)); // subtract 1px for border
4
- @sw-content-spacing-inner: var(--su12); // the spacing between two adjacent simple items
5
- @sw-content-spacing-outer: var(--su16); // the spacing at the start/end of a group of simple items, as well as between a complex item and its separator line
6
- // COMPONENT-SPECIFIC CUSTOM PROPERTIES
7
- --_sw-bc: var(--bc-medium);
8
- --_sw-after-bc: var(--_sw-bc);
9
- --_sw-content-bc: var(--bc-light);
10
- --_sw-header-bc: var(--_sw-content-bc);
11
-
12
- // MODIFIERS
13
- &:not(.s-anchors) {
14
- a:not(.button):not(.post-tag):not(.s-btn):not(.s-sidebarwidget--action):not(.s-user-card--link) {
15
- &,
16
- &:visited {
17
- color: var(--black-400);
18
- }
19
- }
20
- }
21
-
22
- // VARIANTS
23
- .alternate-color(blue);
24
- .alternate-color(yellow);
25
- .alternate-color(green);
26
-
27
- // CHILD ELEMENTS
28
- & &--action {
29
- color: var(--blue-400);
30
- float: right;
31
- font-size: var(--fs-fine);
32
- line-height: calc(var(--fs-body1) * 1.5); // 19.5px - line-height should be the same as in the outside element, so the header and action baselines line up
33
- margin: 0 0 var(--su4) var(--su8);
34
- }
35
-
36
- & &--content {
37
- &:not(table) {
38
- &:not(.s-sidebarwidget__items),
39
- &:not(.s-sidebarwidget__block-items) .s-sidebarwidget--item {
40
- display: flex;
41
- }
42
- }
43
-
44
- &.s-sidebarwidget__items {
45
- &,
46
- &.s-sidebarwidget__block-items .s-sidebarwidget--item {
47
- display: block;
48
- }
49
-
50
- padding: calc(@sw-content-spacing-outer - @sw-content-spacing-inner) @sw-content-px; // the items themselves provide part of the spacing, so the content padding needs to account for that
51
- }
52
-
53
- &:active {
54
- outline: none;
55
- }
56
-
57
- border-top: var(--su-static1) solid var(--_sw-content-bc);
58
- margin: 0;
59
- padding: @sw-content-spacing-outer @sw-content-px;
60
- }
61
-
62
- & &--header {
63
- &:first-child {
64
- border-top-left-radius: var(--br-sm);
65
- border-top-right-radius: var(--br-sm);
66
- }
67
-
68
- &.s-sidebarwidget {
69
- &__expanding-control {
70
- &:before {
71
- border: calc(var(--su-static4) + var(--su-static1)) solid transparent;
72
- border-left-color: var(--black-400);
73
- border-right-width: 0;
74
- content: '';
75
- float: left;
76
- margin-right: var(--su12);
77
- margin-top: calc(calc(var(--lh-base) * 1em) / 2 - 5px); // 1.3 is our standard line height
78
- transition: transform 0.3s cubic-bezier(0.4, 0.4, 0.6, 1);
79
- }
80
-
81
- &[aria-expanded='true']:before {
82
- transform: rotate(90deg);
83
- }
84
-
85
- cursor: pointer;
86
- }
87
-
88
- &__small-bold-text {
89
- .s-sidebarwidget--action {
90
- font-weight: normal;
91
- line-height: calc(var(--lh-base) * var(--fs-caption)); // line-height should be the same as in the outside element, so the header and action baselines line up
92
- }
93
-
94
- font-size: var(--fs-caption);
95
- font-weight: bold;
96
- }
97
- }
98
-
99
- &:active {
100
- outline: none;
101
- }
102
-
103
- background: var(--black-100);
104
- border-top: var(--su-static1) solid var(--_sw-header-bc);
105
- color: var(--black-500);
106
- font-size: var(--fs-body2);
107
- font-weight: normal;
108
- margin: 0;
109
- padding: @sw-content-spacing-inner @sw-content-px;
110
- }
111
-
112
- & &--item {
113
- &,
114
- & > :first-child {
115
- &[aria-current="true"],
116
- &[aria-current="page"] {
117
- &:before {
118
- border-left-color: var(--theme-primary);
119
- border-left-style: solid;
120
- border-left-width: calc(var(--su-static1) * 3); // 3px
121
- content: '';
122
- height: calc(100% + @sw-content-spacing-inner);
123
- left: 0;
124
- margin-left: calc(@sw-content-px * -1 - var(--su-static1)); // the orange selection indicator overlaps with the widget border
125
- margin-top: calc(@sw-content-spacing-inner / 2 * -1);
126
- position: absolute;
127
- }
128
-
129
- a { // TODO: this isn't the best way to go about this. There should be a "is current" highlight without font modification for more complex cases
130
- &,
131
- &:visited {
132
- color: inherit;
133
- }
134
- }
135
-
136
- color: var(--black);
137
- font-weight: bold;
138
- position: relative;
139
- }
140
- }
141
-
142
- margin: @sw-content-spacing-inner 0;
143
- }
144
-
145
- & &--subnav {
146
- li {
147
- &[aria-current="page"],
148
- &[aria-current="true"] {
149
- a {
150
- &,
151
- &:visited {
152
- color: inherit;
153
- }
154
- }
155
-
156
- #stacks-internals #bullet-arrow(var(--theme-primary));
157
- color: var(--black);
158
- font-weight: bold;
159
- }
160
-
161
- #stacks-internals #bullet-arrow(var(--black-225));
162
- background-position: 0 calc((1.2em - calc(var(--su-static8) + var(--su-static2))) / 2); // 0 ((1.2em - 10) / 2)
163
- background-repeat: no-repeat;
164
- background-size: auto calc(var(--su-static8) + var(--su-static2)); // auto 10px
165
- margin-top: var(--su-static12);
166
- padding-left: var(--su-static16);
167
- }
168
-
169
- list-style-type: none;
170
- margin-left: var(--su8);
171
- padding-left: 0;
172
- }
173
-
174
- & table&--content&__items {
175
- tr.s-sidebarwidget--item {
176
- td {
177
- padding: 0;
178
- }
179
-
180
- display: table-row;
181
- }
182
-
183
- border-collapse: separate;
184
- border-spacing: @sw-content-spacing-inner;
185
- padding: calc(@sw-content-spacing-outer - @sw-content-spacing-inner) calc(@sw-content-px - @sw-content-spacing-inner);
186
- }
187
-
188
- &:before { // [1]
189
- content: '';
190
- display: block;
191
- margin-top: calc(var(--su-static1) * -1); // -1px
192
- }
193
-
194
- &:after { // [2]
195
- border: var(--su-static1) solid var(--_sw-after-bc);
196
- border-radius: var(--br-sm);
197
- clip-path: polygon(0% 0%, 100% 0%, 100% 50%, 0% 50%); // [3]
198
- content: '';
199
- // TODO: this makes no sense. revisit.
200
- height: calc(var(--su-static2) + var(--br-sm)); // we need 2px border + 2px border radius to have the correct corner shape
201
- left: calc(var(--su-static1) * -1); // -1px
202
- pointer-events: none; // if the top item is clickable, then we don't want to prevent clicking the top 2 pixels
203
- position: absolute;
204
- right: calc(var(--su-static1) * -1); // -1px
205
- top: calc(var(--su-static1) * -1); // -1px
206
- }
207
-
208
- background-color: var(--white);
209
- border: var(--su-static1) solid var(--_sw-bc);
210
- border-radius: var(--br-sm);
211
- font-size: var(--fs-body1);
212
- position: relative; // so that it's the positioning parent for the :after
213
- }
214
-
215
- // COLOR ALTERNATIVES
216
- .alternate-color(@name) {
217
- &.s-sidebarwidget__@{name} {
218
- --_sw-bc: var(~"--@{name}-300");
219
-
220
- .highcontrast-mode({
221
- --_sw-bc: var(~"--@{name}-500");
222
- });
223
-
224
- &:after,
225
- .s-sidebarwidget--content,
226
- .s-sidebarwidget--header {
227
- border-color: var(--_sw-bc);
228
- }
229
-
230
- .s-sidebarwidget--header {
231
- background-color: var(~"--@{name}-200");
232
- color: var(--fc-medium);
233
- }
234
-
235
- background-color: var(~"--@{name}-100");
236
- border-color: var(--_sw-bc);
237
- }
238
- }
239
-
240
- // [1] We must support things like collapsible (in particular invisble) elements, wrapper elements,
241
- // etc. Therefore every .-content and .-header must stand on its own; we cannot rely on things
242
- // like :first-child, because the *first* child may not be the first *visible* child, and it may
243
- // also be the :first-child of some wrapper. This is why every .-header and .-content has a
244
- // border-top. But because you shouldn't see the first visible item's or header's top border
245
- // (the widget itself provides for that border), we shift everything up by one pixel with the following pseudo-element.
246
-
247
- // [2] The top item's divider line sits above the .s-sidebarwidget's top border.
248
- // We could fix this by using overflow: hidden, but that would constrain users of
249
- // .s-sidebarwidget to never have things like tooltips, autocompletes or the like that reach
250
- // outside the widget boundaries.
251
- // What we do instead is re-create the widget's top border in an absolutely positioned :after,
252
- // which sits above our item's top border. Technically, a tiny corner of the item's border will
253
- // still be visible, but at its highest point, this corner has a height of 0.27 pixels. And for
254
- // this sub-pixel issues, we're talking about different shades of gray. So we can live with that.
255
-
256
- // [3] In order to perfectly recreate the inner corner shape, our pseudo-element needs
257
- // the border on all sides. But we can only do that if we're able to hide the bottom part.
1
+ .s-sidebarwidget {
2
+ // COMPONENT-SPECIFIC CONSTANTS
3
+ @sw-content-px: calc(var(--su16) - var(--su1)); // subtract 1px for border
4
+ @sw-content-spacing-inner: var(--su12); // the spacing between two adjacent simple items
5
+ @sw-content-spacing-outer: var(--su16); // the spacing at the start/end of a group of simple items, as well as between a complex item and its separator line
6
+ // COMPONENT-SPECIFIC CUSTOM PROPERTIES
7
+ --_sw-bc: var(--bc-medium);
8
+ --_sw-after-bc: var(--_sw-bc);
9
+ --_sw-content-bc: var(--bc-light);
10
+ --_sw-header-bc: var(--_sw-content-bc);
11
+
12
+ // MODIFIERS
13
+ &:not(.s-anchors) {
14
+ a:not(.button):not(.post-tag):not(.s-btn):not(.s-sidebarwidget--action):not(.s-user-card--link) {
15
+ &,
16
+ &:visited {
17
+ color: var(--black-400);
18
+ }
19
+ }
20
+ }
21
+
22
+ // VARIANTS
23
+ .alternate-color(blue);
24
+ .alternate-color(yellow);
25
+ .alternate-color(green);
26
+
27
+ // CHILD ELEMENTS
28
+ & &--action {
29
+ color: var(--blue-400);
30
+ float: right;
31
+ font-size: var(--fs-fine);
32
+ line-height: calc(var(--fs-body1) * 1.5); // 19.5px - line-height should be the same as in the outside element, so the header and action baselines line up
33
+ margin: 0 0 var(--su4) var(--su8);
34
+ }
35
+
36
+ & &--content {
37
+ &:not(table) {
38
+ &:not(.s-sidebarwidget__items),
39
+ &:not(.s-sidebarwidget__block-items) .s-sidebarwidget--item {
40
+ display: flex;
41
+ }
42
+ }
43
+
44
+ &.s-sidebarwidget__items {
45
+ &,
46
+ &.s-sidebarwidget__block-items .s-sidebarwidget--item {
47
+ display: block;
48
+ }
49
+
50
+ padding: calc(@sw-content-spacing-outer - @sw-content-spacing-inner) @sw-content-px; // the items themselves provide part of the spacing, so the content padding needs to account for that
51
+ }
52
+
53
+ &:active {
54
+ outline: none;
55
+ }
56
+
57
+ border-top: var(--su-static1) solid var(--_sw-content-bc);
58
+ margin: 0;
59
+ padding: @sw-content-spacing-outer @sw-content-px;
60
+ }
61
+
62
+ & &--header {
63
+ &:first-child {
64
+ border-top-left-radius: var(--br-sm);
65
+ border-top-right-radius: var(--br-sm);
66
+ }
67
+
68
+ &.s-sidebarwidget {
69
+ &__expanding-control {
70
+ &:before {
71
+ border: calc(var(--su-static4) + var(--su-static1)) solid transparent;
72
+ border-left-color: var(--black-400);
73
+ border-right-width: 0;
74
+ content: '';
75
+ float: left;
76
+ margin-right: var(--su12);
77
+ margin-top: calc(calc(var(--lh-base) * 1em) / 2 - 5px); // 1.3 is our standard line height
78
+ transition: transform 0.3s cubic-bezier(0.4, 0.4, 0.6, 1);
79
+ }
80
+
81
+ &[aria-expanded='true']:before {
82
+ transform: rotate(90deg);
83
+ }
84
+
85
+ cursor: pointer;
86
+ }
87
+
88
+ &__small-bold-text {
89
+ .s-sidebarwidget--action {
90
+ font-weight: normal;
91
+ line-height: calc(var(--lh-base) * var(--fs-caption)); // line-height should be the same as in the outside element, so the header and action baselines line up
92
+ }
93
+
94
+ font-size: var(--fs-caption);
95
+ font-weight: bold;
96
+ }
97
+ }
98
+
99
+ &:active {
100
+ outline: none;
101
+ }
102
+
103
+ background: var(--black-100);
104
+ border-top: var(--su-static1) solid var(--_sw-header-bc);
105
+ color: var(--black-500);
106
+ font-size: var(--fs-body2);
107
+ font-weight: normal;
108
+ margin: 0;
109
+ padding: @sw-content-spacing-inner @sw-content-px;
110
+ }
111
+
112
+ & &--item {
113
+ &,
114
+ & > :first-child {
115
+ &[aria-current="true"],
116
+ &[aria-current="page"] {
117
+ &:before {
118
+ border-left-color: var(--theme-primary);
119
+ border-left-style: solid;
120
+ border-left-width: calc(var(--su-static1) * 3); // 3px
121
+ content: '';
122
+ height: calc(100% + @sw-content-spacing-inner);
123
+ left: 0;
124
+ margin-left: calc(@sw-content-px * -1 - var(--su-static1)); // the orange selection indicator overlaps with the widget border
125
+ margin-top: calc(@sw-content-spacing-inner / 2 * -1);
126
+ position: absolute;
127
+ }
128
+
129
+ a { // TODO: this isn't the best way to go about this. There should be a "is current" highlight without font modification for more complex cases
130
+ &,
131
+ &:visited {
132
+ color: inherit;
133
+ }
134
+ }
135
+
136
+ color: var(--black);
137
+ font-weight: bold;
138
+ position: relative;
139
+ }
140
+ }
141
+
142
+ margin: @sw-content-spacing-inner 0;
143
+ }
144
+
145
+ & &--subnav {
146
+ li {
147
+ &[aria-current="page"],
148
+ &[aria-current="true"] {
149
+ a {
150
+ &,
151
+ &:visited {
152
+ color: inherit;
153
+ }
154
+ }
155
+
156
+ #stacks-internals #bullet-arrow(var(--theme-primary));
157
+ color: var(--black);
158
+ font-weight: bold;
159
+ }
160
+
161
+ #stacks-internals #bullet-arrow(var(--black-225));
162
+ background-position: 0 calc((1.2em - calc(var(--su-static8) + var(--su-static2))) / 2); // 0 ((1.2em - 10) / 2)
163
+ background-repeat: no-repeat;
164
+ background-size: auto calc(var(--su-static8) + var(--su-static2)); // auto 10px
165
+ margin-top: var(--su-static12);
166
+ padding-left: var(--su-static16);
167
+ }
168
+
169
+ list-style-type: none;
170
+ margin-left: var(--su8);
171
+ padding-left: 0;
172
+ }
173
+
174
+ & table&--content&__items {
175
+ tr.s-sidebarwidget--item {
176
+ td {
177
+ padding: 0;
178
+ }
179
+
180
+ display: table-row;
181
+ }
182
+
183
+ border-collapse: separate;
184
+ border-spacing: @sw-content-spacing-inner;
185
+ padding: calc(@sw-content-spacing-outer - @sw-content-spacing-inner) calc(@sw-content-px - @sw-content-spacing-inner);
186
+ }
187
+
188
+ &:before { // [1]
189
+ content: '';
190
+ display: block;
191
+ margin-top: calc(var(--su-static1) * -1); // -1px
192
+ }
193
+
194
+ &:after { // [2]
195
+ border: var(--su-static1) solid var(--_sw-after-bc);
196
+ border-radius: var(--br-sm);
197
+ clip-path: polygon(0% 0%, 100% 0%, 100% 50%, 0% 50%); // [3]
198
+ content: '';
199
+ // TODO: this makes no sense. revisit.
200
+ height: calc(var(--su-static2) + var(--br-sm)); // we need 2px border + 2px border radius to have the correct corner shape
201
+ left: calc(var(--su-static1) * -1); // -1px
202
+ pointer-events: none; // if the top item is clickable, then we don't want to prevent clicking the top 2 pixels
203
+ position: absolute;
204
+ right: calc(var(--su-static1) * -1); // -1px
205
+ top: calc(var(--su-static1) * -1); // -1px
206
+ }
207
+
208
+ background-color: var(--white);
209
+ border: var(--su-static1) solid var(--_sw-bc);
210
+ border-radius: var(--br-sm);
211
+ font-size: var(--fs-body1);
212
+ position: relative; // so that it's the positioning parent for the :after
213
+ }
214
+
215
+ // COLOR ALTERNATIVES
216
+ .alternate-color(@name) {
217
+ &.s-sidebarwidget__@{name} {
218
+ --_sw-bc: var(~"--@{name}-300");
219
+
220
+ .highcontrast-mode({
221
+ --_sw-bc: var(~"--@{name}-500");
222
+ });
223
+
224
+ &:after,
225
+ .s-sidebarwidget--content,
226
+ .s-sidebarwidget--header {
227
+ border-color: var(--_sw-bc);
228
+ }
229
+
230
+ .s-sidebarwidget--header {
231
+ background-color: var(~"--@{name}-200");
232
+ color: var(--fc-medium);
233
+ }
234
+
235
+ background-color: var(~"--@{name}-100");
236
+ border-color: var(--_sw-bc);
237
+ }
238
+ }
239
+
240
+ // [1] We must support things like collapsible (in particular invisble) elements, wrapper elements,
241
+ // etc. Therefore every .-content and .-header must stand on its own; we cannot rely on things
242
+ // like :first-child, because the *first* child may not be the first *visible* child, and it may
243
+ // also be the :first-child of some wrapper. This is why every .-header and .-content has a
244
+ // border-top. But because you shouldn't see the first visible item's or header's top border
245
+ // (the widget itself provides for that border), we shift everything up by one pixel with the following pseudo-element.
246
+
247
+ // [2] The top item's divider line sits above the .s-sidebarwidget's top border.
248
+ // We could fix this by using overflow: hidden, but that would constrain users of
249
+ // .s-sidebarwidget to never have things like tooltips, autocompletes or the like that reach
250
+ // outside the widget boundaries.
251
+ // What we do instead is re-create the widget's top border in an absolutely positioned :after,
252
+ // which sits above our item's top border. Technically, a tiny corner of the item's border will
253
+ // still be visible, but at its highest point, this corner has a height of 0.27 pixels. And for
254
+ // this sub-pixel issues, we're talking about different shades of gray. So we can live with that.
255
+
256
+ // [3] In order to perfectly recreate the inner corner shape, our pseudo-element needs
257
+ // the border on all sides. But we can only do that if we're able to hide the bottom part.