discourse/app/assets/stylesheets/common/loading-slider.scss
David Taylor c2d94be06e
DEV: Make loading spinner implementation consistent with slider (#24480)
In the past, our loading spinner implementation used Ember's loading substate. That meant that, when the site setting was toggled, there would be fundamental changes in the routing behavior.

This commit simplifies things so that the (non-default) loading spinner implementation is purely a styling thing, and behaves exactly the same as the spinner which appears under the 'slider' configuration when loading takes too long.

This does involve a slight UX change. Now, the entire page will be replaced by a loading spinner instead of just the relevant `{{outlet}}`. We strongly recommend sites use the new default 'slider' behavior.
2023-11-21 16:40:10 +00:00

68 lines
1.3 KiB
SCSS

.loading-indicator-container {
--loading-width: 0.8;
--still-loading-width: 0.9;
--still-loading-duration: 10s;
--done-duration: 0.4s;
--fade-out-duration: 0.4s;
position: fixed;
top: 0;
left: 0;
z-index: z("header") + 1;
height: 3px;
width: 100%;
opacity: 0;
transition: opacity var(--fade-out-duration) ease var(--done-duration);
background-color: var(--primary-low);
.loading-indicator {
height: 100%;
width: 100%;
transform: scaleX(0);
transform-origin: left;
background-color: var(--tertiary);
}
&.loading,
&.still-loading {
opacity: 1;
transition: opacity 0s;
}
&.loading .loading-indicator {
transition: transform var(--loading-duration) ease-in;
transform: scaleX(var(--loading-width));
}
&.still-loading .loading-indicator {
transition: transform var(--still-loading-duration) linear;
transform: scaleX(var(--still-loading-width));
}
&.done .loading-indicator {
transition: transform var(--done-duration) ease-out;
transform: scaleX(1);
}
&.discourse-hub-webview {
// DiscourseHub obscures the top 1px to work around an iOS bug
top: 1px;
}
body.footer-nav-ipad & {
top: var(--footer-nav-height);
}
}
.route-loading-spinner {
padding-top: 1.8em;
}
body.has-route-loading-spinner #main-outlet {
display: none;
}