Files
tabler/core/scss/ui/_hover-gallery.scss

119 lines
2.9 KiB
SCSS

@use '../config' as *;
// Every item is an equal, invisible column; hovering a column shows its image over the whole gallery
.hover-gallery {
// scss-docs-start hover-gallery-css-vars
--hover-gallery-aspect-ratio: #{$hover-gallery-aspect-ratio};
--hover-gallery-indicator-size: #{$hover-gallery-indicator-size};
--hover-gallery-indicator-gap: #{$hover-gallery-indicator-gap};
--hover-gallery-indicator-padding: #{$hover-gallery-indicator-padding};
--hover-gallery-indicator-color: #{$hover-gallery-indicator-color};
--hover-gallery-indicator-scrim-height: #{$hover-gallery-indicator-scrim-height};
--hover-gallery-indicator-scrim-bg: #{$hover-gallery-indicator-scrim-bg};
--hover-gallery-indicator-inactive-opacity: #{$hover-gallery-indicator-inactive-opacity};
// scss-docs-end hover-gallery-css-vars
position: relative;
display: flex;
aspect-ratio: var(--hover-gallery-aspect-ratio);
overflow: hidden;
}
.hover-gallery-item {
flex: 1;
img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
pointer-events: none;
object-fit: cover;
opacity: 0;
}
&:first-child img,
&:hover img {
opacity: 1;
}
&:hover img {
z-index: 1;
}
}
// One bar per item at the bottom edge, lit for the image on display
.hover-gallery-indicators {
gap: var(--hover-gallery-indicator-gap);
padding: var(--hover-gallery-indicator-padding);
// Darkens the bottom edge so the bars stay visible on any image
&::after {
position: absolute;
inset: auto 0 0;
z-index: 1;
height: var(--hover-gallery-indicator-scrim-height);
pointer-events: none;
content: '';
background: var(--hover-gallery-indicator-scrim-bg);
}
.hover-gallery-item {
display: flex;
align-items: flex-end;
// The gap between columns must not drop the hover, so the item reaches over it
padding-inline: calc(var(--hover-gallery-indicator-gap) * 0.5);
margin-inline: calc(var(--hover-gallery-indicator-gap) * -0.5);
&::after {
position: relative;
z-index: 2;
flex: 1;
height: var(--hover-gallery-indicator-size);
content: '';
background: var(--hover-gallery-indicator-color);
opacity: var(--hover-gallery-indicator-inactive-opacity);
@include border-radius(var(--hover-gallery-indicator-size));
}
&:hover::after {
opacity: 1;
}
}
&:not(:hover) .hover-gallery-item:first-child::after {
opacity: 1;
}
}
// Without hover the same markup becomes a swipeable strip
@media (hover: none) {
.hover-gallery {
gap: 0;
padding: 0;
overflow-x: auto;
scroll-snap-type: x mandatory;
scrollbar-width: none;
}
.hover-gallery::after {
display: none;
}
.hover-gallery .hover-gallery-item {
flex: 0 0 100%;
padding: 0;
margin: 0;
scroll-snap-align: start;
img {
position: static;
opacity: 1;
}
&::after {
display: none;
}
}
}