mirror of https://github.com/jenkinsci/jenkins.git
Refine bottom app bar appearance (#10853)
This commit is contained in:
commit
081dc2496c
|
@ -30,6 +30,7 @@ THE SOFTWARE.
|
|||
This area will always be visible at the bottom of the screen.
|
||||
</st:documentation>
|
||||
|
||||
<div class="jenkins-bottom-app-bar__shadow"></div>
|
||||
<div id="bottom-sticker">
|
||||
<div class="bottom-sticker-inner jenkins-buttons-row jenkins-buttons-row--equal-width">
|
||||
<d:invokeBody />
|
||||
|
|
|
@ -8,6 +8,10 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--section-padding);
|
||||
|
||||
#bottom-sticker {
|
||||
margin-top: calc(var(--section-padding) * -1);
|
||||
}
|
||||
}
|
||||
|
||||
.item-copy {
|
||||
|
|
|
@ -79,7 +79,7 @@ $semantics: (
|
|||
// App bar
|
||||
--bottom-app-bar-shadow: color-mix(
|
||||
in sRGB,
|
||||
var(--text-color-secondary) 7.5%,
|
||||
var(--text-color-secondary) 8%,
|
||||
transparent
|
||||
);
|
||||
|
||||
|
@ -116,7 +116,7 @@ $semantics: (
|
|||
--jenkins-border-width: 1.5px;
|
||||
--jenkins-border-color: color-mix(
|
||||
in sRGB,
|
||||
var(--text-color-secondary) 15%,
|
||||
var(--text-color-secondary) 17.5%,
|
||||
var(--card-background)
|
||||
);
|
||||
--jenkins-border-color--subtle: color-mix(
|
||||
|
|
|
@ -111,47 +111,38 @@
|
|||
}
|
||||
}
|
||||
|
||||
.bottom-sticker,
|
||||
#bottom-sticker {
|
||||
$bottom-app-bar-padding: 0.875rem;
|
||||
|
||||
.jenkins-bottom-app-bar__shadow {
|
||||
--semi-translucent: color-mix(in sRGB, var(--background) 75%, transparent);
|
||||
|
||||
position: sticky;
|
||||
|
||||
// This has to be set to -1px so that IntersectionObserver can add the
|
||||
// &--stuck class when the element is stuck to the bottom of the screen
|
||||
// https://css-tricks.com/how-to-detect-when-a-sticky-element-gets-pinned/
|
||||
height: calc(
|
||||
2.375rem + ($bottom-app-bar-padding * 2) + 1px + var(--jenkins-border-width)
|
||||
);
|
||||
bottom: -1px;
|
||||
margin-left: calc(var(--section-padding) * -1);
|
||||
width: calc(
|
||||
100% + calc(var(--section-padding) * 2)
|
||||
); /* it needs to occupy the entire width or else the underlying content will see through */
|
||||
|
||||
z-index: 998; /* behind top-sticker */
|
||||
}
|
||||
|
||||
.bottom-sticker-inner {
|
||||
position: relative;
|
||||
padding: 1em var(--section-padding);
|
||||
z-index: 0;
|
||||
|
||||
&::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: var(--background);
|
||||
opacity: 0;
|
||||
z-index: -1;
|
||||
}
|
||||
margin-bottom: calc((2.375rem + $bottom-app-bar-padding) * -1);
|
||||
backdrop-filter: blur(20px);
|
||||
background: linear-gradient(
|
||||
to right,
|
||||
var(--background),
|
||||
var(--semi-translucent) 3rem,
|
||||
var(--semi-translucent) calc(100% - 3rem),
|
||||
var(--background)
|
||||
);
|
||||
border-top: var(--jenkins-border-width) solid var(--jenkins-border-color);
|
||||
z-index: 997;
|
||||
|
||||
&::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: -30px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: linear-gradient(transparent, var(--bottom-app-bar-shadow) 110%);
|
||||
max-width: 100%;
|
||||
height: 30px;
|
||||
opacity: 0;
|
||||
transition: var(--standard-transition);
|
||||
transition: opacity var(--standard-transition);
|
||||
top: calc((2rem + var(--jenkins-border-width)) * -1);
|
||||
height: 2rem;
|
||||
pointer-events: none;
|
||||
background: linear-gradient(transparent, var(--bottom-app-bar-shadow));
|
||||
mask-image: linear-gradient(
|
||||
to right,
|
||||
transparent,
|
||||
|
@ -159,24 +150,24 @@
|
|||
white calc(100% - var(--section-padding)),
|
||||
transparent
|
||||
);
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&--stuck {
|
||||
.bottom-sticker-inner {
|
||||
backdrop-filter: blur(15px);
|
||||
|
||||
&::before {
|
||||
opacity: 0.75 !important;
|
||||
|
||||
@supports not (backdrop-filter: blur(15px)) {
|
||||
opacity: 1 !important;
|
||||
}
|
||||
}
|
||||
|
||||
&::after {
|
||||
opacity: 1 !important;
|
||||
}
|
||||
&::after {
|
||||
opacity: 1 !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bottom-sticker,
|
||||
#bottom-sticker {
|
||||
position: sticky;
|
||||
bottom: 0;
|
||||
z-index: 998;
|
||||
}
|
||||
|
||||
.bottom-sticker-inner {
|
||||
position: relative;
|
||||
padding: $bottom-app-bar-padding 0;
|
||||
}
|
||||
|
|
|
@ -1754,12 +1754,12 @@ function rowvgStartEachRow(recursive, f) {
|
|||
|
||||
window.addEventListener("load", function () {
|
||||
// Add a class to the bottom bar when it's stuck to the bottom of the screen
|
||||
const el = document.querySelector("#bottom-sticker");
|
||||
const el = document.querySelector(".jenkins-bottom-app-bar__shadow");
|
||||
if (el) {
|
||||
const observer = new IntersectionObserver(
|
||||
([e]) =>
|
||||
e.target.classList.toggle(
|
||||
"bottom-sticker-inner--stuck",
|
||||
"jenkins-bottom-app-bar__shadow--stuck",
|
||||
e.intersectionRatio < 1,
|
||||
),
|
||||
{ threshold: [1] },
|
||||
|
|
Loading…
Reference in New Issue