@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; } } }