1 @import 'mediawiki.skin.variables.less';
2 @import 'mw.rcfilters.mixins.less';
4 @rcfilters-spinner-size: 12px;
5 @rcfilters-head-min-height: 210px;
6 @rcfilters-head-margin-bottom: 20px;
7 @rcfilters-wl-head-min-height: 295px;
8 @rcfilters-head-min-height-collapsed: 130px;
9 @rcfilters-wl-head-min-height-collapsed: 220px;
11 // Corrections for the standard special page
13 /* stylelint-disable-next-line selector-class-pattern */
18 // Reserve space for the UI while it loads
20 min-height: @rcfilters-head-min-height;
21 margin-bottom: @rcfilters-head-margin-bottom;
24 // On the watchlist, reserve a bit more
25 .mw-special-Watchlist .mw-rcfilters-head {
26 min-height: @rcfilters-wl-head-min-height;
29 .mw-rcfilters-collapsed {
31 min-height: @rcfilters-head-min-height-collapsed;
34 // On the watchlist, reserve a bit more
35 &.mw-special-Watchlist .mw-rcfilters-head {
36 min-height: @rcfilters-wl-head-min-height-collapsed;
40 .mw-recentchanges-toplinks {
43 &:not( .mw-recentchanges-toplinks-collapsed ) {
44 // Make up for `border` to prevent link movement
45 margin-top: @position-offset-border-width-base;
46 margin-left: @position-offset-border-width-base;
48 border: @border-subtle; // Same as the legend
49 padding: 0 0.5em 0.5em 0.5em;
52 /* stylelint-disable declaration-no-important */
53 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
54 padding-right: 1.2em !important;
56 > .oo-ui-indicatorElement-indicator {
58 width: 0.9375em !important;
61 /* stylelint-enable declaration-no-important */
64 body:not( .mw-rcfilters-ui-initialized ) {
65 .mw-recentchanges-toplinks.mw-recentchanges-toplinks-collapsed {
66 // Similar to the watchlist-details hack, we are going to make this float left
67 // while loading to prevent jumpiness in the min-height calculation
70 .mw-recentchanges-toplinks-content {
79 /* stylelint-disable-next-line selector-class-pattern */
86 .mw-rcfilters-ui-highlights {
91 // Reserve space for the highlight circles
93 table.mw-enhanced-rc {
94 .result-circle-margin();
98 // Temporarily hide the empty results section while we load rcfilters.
99 .mw-changeslist-empty {
103 .mw-recentchangeslinked-errorbox {
107 body.mw-rcfilters-ui-loading .mw-changeslist {
111 .mw-rcfilters-spinner {
115 // Make sure the middle of the spinner is centered, rather than its left edge
116 margin-left: (-3 * @rcfilters-spinner-size / 2);
119 & .mw-rcfilters-spinner-bounce,
123 background-color: @background-color-progressive;
126 width: @rcfilters-spinner-size;
127 height: @rcfilters-spinner-size;
128 border-radius: @border-radius-circle;
129 animation: rcfiltersBouncedelay 1600ms ease-in-out -160ms infinite both;
134 animation-delay: -330ms;
143 body:not( .mw-rcfilters-ui-initialized ) .mw-rcfilters-spinner {
145 // When initializing, display the spinner on top of the area where the UI will appear
146 margin-top: -( @rcfilters-head-min-height + @rcfilters-head-margin-bottom ) / 1.5;
149 body.mw-rcfilters-ui-loading .mw-rcfilters-spinner {
151 // When loading new results, display the spinner on top of the results area
152 margin-top: -( @rcfilters-head-min-height + @rcfilters-head-margin-bottom ) / 8;
156 .mw-watchlist-toollinks,
157 form#mw-watchlist-resetbutton {
161 // Why does rcfilters have a copy of this?
162 // TODO: Remove per T195256.
165 margin-bottom: 0.5em;
168 // Make the watchlist-details message display while loading, but make it not take up any
169 // space. This makes the min-height trick work better.
170 /* stylelint-disable-next-line selector-class-pattern */
173 // The 20em should match the min-width we are setting up
174 // for the .mw-rcfilters-ui-watchlistTopSectionWidget-editWatchlistButton
175 // in mw.rcfilters.ui.WatchlistTopSectionWidget.less
176 width: ~'calc( 100% - 20em )';
180 .mw-rcfilters-staticfilters-selected {
184 // on smaller screen, set .watchlistDetail to full width
185 // so that the spinner doesn't appear beside it. T225127#5518870
186 @media screen and ( max-width: @max-width-breakpoint-mobile ) {
188 /* stylelint-disable-next-line selector-class-pattern */
196 @keyframes rcfiltersBouncedelay {
200 transform: scale( 0.625 );
203 20% { // equals 320ms
205 transform: scale( 1 );