@stackoverflow/stacks 1.8.0 → 1.9.1

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 (137) hide show
  1. package/README.md +161 -153
  2. package/dist/{controllers/s-banner.d.ts → components/banner/banner.d.ts} +1 -1
  3. package/dist/{controllers/s-expandable-control.d.ts → components/expandable/expandable.d.ts} +1 -1
  4. package/dist/{controllers/s-modal.d.ts → components/modal/modal.d.ts} +1 -1
  5. package/dist/{controllers/s-navigation-tablist.d.ts → components/navigation/navigation.d.ts} +1 -1
  6. package/dist/{controllers/s-popover.d.ts → components/popover/popover.d.ts} +1 -1
  7. package/dist/{controllers/s-tooltip.d.ts → components/popover/tooltip.d.ts} +1 -1
  8. package/dist/components/table/table.d.ts +30 -0
  9. package/dist/{controllers/s-toast.d.ts → components/toast/toast.d.ts} +1 -1
  10. package/dist/{controllers/s-uploader.d.ts → components/uploader/uploader.d.ts} +1 -1
  11. package/dist/controllers.d.ts +9 -0
  12. package/dist/css/stacks.css +2063 -1994
  13. package/dist/css/stacks.min.css +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/js/stacks.js +1465 -1436
  16. package/dist/js/stacks.min.js +1 -1
  17. package/lib/{css/atomic/borders.less → atomic/border.less} +397 -379
  18. package/lib/{css/atomic/colors.less → atomic/color.less} +210 -210
  19. package/lib/{css/atomic → atomic}/flex.less +426 -426
  20. package/lib/{css/atomic → atomic}/gap.less +44 -44
  21. package/lib/{css/atomic → atomic}/grid.less +139 -139
  22. package/lib/{css/atomic → atomic}/misc.less +343 -343
  23. package/lib/{css/atomic → atomic}/spacing.less +342 -342
  24. package/lib/{css/atomic → atomic}/typography.less +267 -267
  25. package/lib/{css/atomic → atomic}/width-height.less +194 -194
  26. package/lib/{css/base → base}/body.less +44 -44
  27. package/lib/{css/base → base}/configuration-static.less +61 -61
  28. package/lib/{css/base → base}/fieldset.less +5 -5
  29. package/lib/{css/base/icons.less → base/icon.less} +11 -20
  30. package/lib/{css/base/internals.less → base/internal.less} +220 -220
  31. package/lib/{css/base → base}/reset-meyer.less +64 -64
  32. package/lib/{css/base → base}/reset-normalize.less +449 -449
  33. package/lib/{css/base → base}/reset.less +20 -20
  34. package/lib/components/activity-indicator/activity-indicator.a11y.test.ts +21 -0
  35. package/lib/{css/components → components/activity-indicator}/activity-indicator.less +40 -40
  36. package/lib/components/activity-indicator/activity-indicator.visual.test.ts +23 -0
  37. package/lib/{css/components/anchors.less → components/anchor/anchor.less} +61 -61
  38. package/lib/components/avatar/avatar.a11y.test.ts +36 -0
  39. package/lib/{css/components/avatars.less → components/avatar/avatar.less} +108 -108
  40. package/lib/components/avatar/avatar.visual.test.ts +54 -0
  41. package/lib/components/award-bling/award-bling.a11y.test.ts +17 -0
  42. package/lib/{css/components → components/award-bling}/award-bling.less +31 -31
  43. package/lib/components/award-bling/award-bling.visual.test.ts +26 -0
  44. package/lib/{css/components/badges.less → components/badge/badge.less} +251 -251
  45. package/lib/components/banner/banner.a11y.test.ts +37 -0
  46. package/lib/components/banner/banner.less +51 -0
  47. package/lib/{test/s-banner.test.ts → components/banner/banner.test.ts} +73 -73
  48. package/lib/{ts/controllers/s-banner.ts → components/banner/banner.ts} +149 -149
  49. package/lib/components/banner/banner.visual.test.ts +37 -0
  50. package/lib/components/block-link/block-link.a11y.test.ts +68 -0
  51. package/lib/{css/components → components/block-link}/block-link.less +80 -80
  52. package/lib/components/block-link/block-link.visual.test.ts +61 -0
  53. package/lib/components/breadcrumbs/breadcrumbs.a11y.test.ts +37 -0
  54. package/lib/{css/components → components/breadcrumbs}/breadcrumbs.less +41 -41
  55. package/lib/components/breadcrumbs/breadcrumbs.visual.test.ts +37 -0
  56. package/lib/components/button/button.a11y.test.ts +32 -0
  57. package/lib/{css/components/buttons.less → components/button/button.less} +502 -501
  58. package/lib/components/button/button.visual.test.ts +52 -0
  59. package/lib/{css/components/button-groups.less → components/button-group/button-group.less} +83 -83
  60. package/lib/components/card/card.a11y.test.ts +13 -0
  61. package/lib/{css/components/cards.less → components/card/card.less} +29 -29
  62. package/lib/components/card/card.visual.test.ts +54 -0
  63. package/lib/components/check-control/check-control.less +17 -0
  64. package/lib/components/check-group/check-group.less +19 -0
  65. package/lib/{css/components/checkboxes-radios.less → components/checkbox_radio/checkbox_radio.less} +158 -158
  66. package/lib/{css/components/code-blocks.less → components/code-block/code-block.less} +116 -116
  67. package/lib/{css/components → components/description}/description.less +9 -9
  68. package/lib/{css/components/empty-states.less → components/empty-state/empty-state.less} +16 -16
  69. package/lib/{css/components → components/expandable}/expandable.less +118 -115
  70. package/lib/components/expandable/expandable.test.ts +51 -0
  71. package/lib/{ts/controllers/s-expandable-control.ts → components/expandable/expandable.ts} +238 -238
  72. package/lib/components/input-fill/input-fill.less +35 -0
  73. package/lib/components/input-icon/input-icon.less +45 -0
  74. package/lib/components/input-message/input-message.less +48 -0
  75. package/lib/{css/components/inputs.less → components/input_textarea/input_textarea.less} +166 -297
  76. package/lib/{css/components/labels.less → components/label/label.less} +111 -111
  77. package/lib/{css/components → components/link}/link.less +119 -119
  78. package/lib/{css/components/link-previews.less → components/link-preview/link-preview.less} +139 -139
  79. package/lib/{css/components → components/menu}/menu.less +41 -41
  80. package/lib/{css/components/modals.less → components/modal/modal.less} +113 -113
  81. package/lib/{ts/controllers/s-modal.ts → components/modal/modal.ts} +379 -379
  82. package/lib/{css/components → components/navigation}/navigation.less +134 -134
  83. package/lib/{ts/controllers/s-navigation-tablist.ts → components/navigation/navigation.ts} +128 -128
  84. package/lib/{css/components/notices.less → components/notice/notice.less} +203 -292
  85. package/lib/{css/components/page-titles.less → components/page-title/page-title.less} +51 -51
  86. package/lib/{css/components → components/pagination}/pagination.less +52 -52
  87. package/lib/{css/components/popovers.less → components/popover/popover.less} +148 -147
  88. package/lib/{ts/controllers/s-popover.ts → components/popover/popover.ts} +651 -651
  89. package/lib/{test/s-tooltip.test.ts → components/popover/tooltip.test.ts} +62 -62
  90. package/lib/{ts/controllers/s-tooltip.ts → components/popover/tooltip.ts} +343 -343
  91. package/lib/{test/s-tooltip.visual.test.ts → components/popover/tooltip.visual.test.ts} +31 -31
  92. package/lib/{css/components → components/post-summary}/post-summary.less +415 -415
  93. package/lib/{css/components/progress-bars.less → components/progress-bar/progress-bar.less} +291 -291
  94. package/lib/{css/components → components/prose}/prose.less +452 -452
  95. package/lib/{css/components → components/select}/select.less +148 -148
  96. package/lib/{css/components/sidebar-widgets.less → components/sidebar-widget/sidebar-widget.less} +257 -259
  97. package/lib/{css/components → components/spinner}/spinner.less +103 -103
  98. package/lib/{css/components → components/table}/table.less +307 -297
  99. package/lib/components/table/table.test.ts +366 -0
  100. package/lib/{ts/controllers/s-table.ts → components/table/table.ts} +296 -263
  101. package/lib/components/table-container/table-container.less +4 -0
  102. package/lib/{css/components/tags.less → components/tag/tag.less} +213 -213
  103. package/lib/components/toast/toast.less +35 -0
  104. package/lib/{test/s-toast.test.ts → components/toast/toast.test.ts} +63 -63
  105. package/lib/{ts/controllers/s-toast.ts → components/toast/toast.ts} +357 -357
  106. package/lib/components/toast/toast.visual.test.ts +27 -0
  107. package/lib/{css/components/toggle-switches.less → components/toggle-switch/toggle-switch.less} +110 -110
  108. package/lib/{css/components → components/topbar}/topbar.less +436 -435
  109. package/lib/{css/components → components/uploader}/uploader.less +195 -195
  110. package/lib/{ts/controllers/s-uploader.ts → components/uploader/uploader.ts} +205 -205
  111. package/lib/{css/components/user-cards.less → components/user-card/user-card.less} +129 -129
  112. package/lib/controllers.ts +33 -0
  113. package/lib/{css/exports → exports}/constants-colors.less +1112 -1111
  114. package/lib/{css/exports → exports}/constants-helpers.less +108 -108
  115. package/lib/{css/exports → exports}/constants-type.less +153 -153
  116. package/lib/{css/exports → exports}/exports.less +15 -15
  117. package/lib/{css/exports → exports}/mixins.less +299 -299
  118. package/lib/{ts/index.ts → index.ts} +32 -32
  119. package/lib/{css/input-utils.less → input-utils.less} +44 -44
  120. package/lib/{css/stacks-dynamic.less → stacks-dynamic.less} +24 -25
  121. package/lib/stacks-static.less +93 -0
  122. package/lib/{css/stacks.less → stacks.less} +13 -13
  123. package/lib/{ts/stacks.ts → stacks.ts} +113 -113
  124. package/lib/test/open-wc-testing-patch.d.ts +26 -0
  125. package/lib/test/test-utils.ts +466 -0
  126. package/lib/tsconfig.build.json +4 -0
  127. package/lib/tsconfig.json +16 -13
  128. package/package.json +106 -105
  129. package/dist/controllers/index.d.ts +0 -9
  130. package/dist/controllers/s-table.d.ts +0 -8
  131. package/lib/css/stacks-static.less +0 -87
  132. package/lib/test/s-avatar.a11y.test.ts +0 -77
  133. package/lib/test/s-banner.visual.test.ts +0 -61
  134. package/lib/test/s-btn.a11y.test.ts +0 -123
  135. package/lib/test/s-btn.visual.test.ts +0 -16
  136. package/lib/test/s-toast.visual.test.ts +0 -48
  137. package/lib/ts/controllers/index.ts +0 -17
@@ -1,259 +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-500);
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);
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(--bc-darker);
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-025);
104
- border-top: var(--su-static1) solid var(--_sw-header-bc);
105
- color: var(--black-600);
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-color);
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-color));
157
- color: var(--black);
158
- font-weight: bold;
159
- }
160
-
161
- #stacks-internals #bullet-arrow(var(--black-100));
162
- background-position: 0 calc((1.2em - 10px) / 2);
163
- background-repeat: no-repeat;
164
- background-size: 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(2px + 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
- box-shadow: var(--bs-sm);
212
- font-size: var(--fs-body1);
213
- position: relative; // so that it's the positioning parent for the :after
214
- }
215
-
216
-
217
- // COLOR ALTERNATIVES
218
- .alternate-color(@name) {
219
- &.s-sidebarwidget__@{name} {
220
- --_sw-bc: var(~"--@{name}-200");
221
-
222
- .highcontrast-mode({
223
- --_sw-bc: var(~"--@{name}-700");
224
- });
225
-
226
- &:after,
227
- .s-sidebarwidget--content,
228
- .s-sidebarwidget--header {
229
- border-color: var(--_sw-bc);
230
- }
231
-
232
- .s-sidebarwidget--header {
233
- background-color: var(~"--@{name}-100");
234
- color: var(--fc-medium);
235
- }
236
-
237
- background-color: var(~"--@{name}-050");
238
- border-color: var(--_sw-bc);
239
- }
240
- }
241
-
242
- // [1] We must support things like collapsible (in particular invisble) elements, wrapper elements,
243
- // etc. Therefore every .-content and .-header must stand on its own; we cannot rely on things
244
- // like :first-child, because the *first* child may not be the first *visible* child, and it may
245
- // also be the :first-child of some wrapper. This is why every .-header and .-content has a
246
- // border-top. But because you shouldn't see the first visible item's or header's top border
247
- // (the widget itself provides for that border), we shift everything up by one pixel with the following pseudo-element.
248
-
249
- // [2] The top item's divider line sits above the .s-sidebarwidget's top border.
250
- // We could fix this by using overflow: hidden, but that would constrain users of
251
- // .s-sidebarwidget to never have things like tooltips, autocompletes or the like that reach
252
- // outside the widget boundaries.
253
- // What we do instead is re-create the widget's top border in an absolutely positioned :after,
254
- // which sits above our item's top border. Technically, a tiny corner of the item's border will
255
- // still be visible, but at its highest point, this corner has a height of 0.27 pixels. And for
256
- // this sub-pixel issues, we're talking about different shades of gray. So we can live with that.
257
-
258
- // [3] In order to perfectly recreate the inner corner shape, our pseudo-element needs
259
- // 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-500);
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);
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(--bc-darker);
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-025);
104
+ border-top: var(--su-static1) solid var(--_sw-header-bc);
105
+ color: var(--black-600);
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-color);
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-color));
157
+ color: var(--black);
158
+ font-weight: bold;
159
+ }
160
+
161
+ #stacks-internals #bullet-arrow(var(--black-100));
162
+ background-position: 0 calc((1.2em - 10px) / 2);
163
+ background-repeat: no-repeat;
164
+ background-size: 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(2px + 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}-200");
219
+
220
+ .highcontrast-mode({
221
+ --_sw-bc: var(~"--@{name}-700");
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}-100");
232
+ color: var(--fc-medium);
233
+ }
234
+
235
+ background-color: var(~"--@{name}-050");
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.