$gallery: ".wc-block-product-gallery"; $large-image: "#{$gallery}-large-image"; $thumbnails: "#{$gallery}-thumbnails"; $next-previous: "#{$large-image}-next-previous"; $next-previous-left-off: "#{$next-previous}-left--off"; $next-previous-right-off: "#{$next-previous}-right--off"; $gallery-next-previous-outside-image: "#{$gallery}[data-next-previous-buttons-position='outsideTheImage']:not(.is-single-product-gallery-image)"; $gallery-next-previous-inside-image: "#{$gallery}:not([data-next-previous-buttons-position='outsideTheImage']:not(.is-single-product-gallery-image))"; $outside-image-offset: 30px; $outside-image-max-width: calc(100% - (2 * $outside-image-offset)); $thumbnails-gap: 15px; $default-number-of-thumbnails: 3; $dialog-header-height: 29px; $dialog-header-padding-top: calc(30px / 2); $dialog-padding: 16px; $admin-bar-desktop-height: 32px; $admin-bar-mobile-height: 46px; // Product Gallery #{$gallery} { dialog { &.wc-block-product-gallery--dialog-open { display: flex; } flex-direction: column; position: fixed; border: none; top: 0; z-index: 9999; padding: $dialog-padding; height: 100vh; width: calc(100vw - 2 * ($dialog-padding)); .admin-bar & { margin-top: $admin-bar-desktop-height; height: calc(100vh - $admin-bar-desktop-height); } @media screen and (max-width: 782px) { .admin-bar & { margin-top: $admin-bar-mobile-height; height: calc(100vh - $admin-bar-mobile-height); } } .wc-block-product-gallery-dialog__header { padding-top: $dialog-header-padding-top; } .wc-block-product-gallery-dialog__body { align-self: center; } .wc-block-product-galler-dialog__header-right { display: flex; justify-content: flex-end; .wc-block-product-gallery-dialog__close { border: none; background-color: transparent; outline: none; cursor: pointer; } } #{$large-image} { height: calc(100vh - $dialog-header-height - $dialog-header-padding-top); .admin-bar & { height: calc(100vh - $admin-bar-desktop-height - $dialog-header-height - $dialog-header-padding-top); } @media screen and (max-width: 782px) { .admin-bar & { height: calc(100vh - $admin-bar-mobile-height - $dialog-header-height - $dialog-header-padding-top); } } img { object-fit: unset; aspect-ratio: unset; max-height: calc(100vh - (2 * $dialog-header-height) - $dialog-header-padding-top); width: auto; .admin-bar & { max-height: calc(100vh - $admin-bar-desktop-height - (2 * $dialog-header-height) - $dialog-header-padding-top); } @media screen and (max-width: 782px) { .admin-bar & { max-height: calc(100vh - $admin-bar-mobile-height - (2 * $dialog-header-height) - $dialog-header-padding-top); } } } .wc-block-product-gallery-large-image__wrapper { align-items: center; aspect-ratio: unset; } .wc-block-product-gallery-large-image__container { height: calc(100vh - (2 * $dialog-header-height) - $dialog-header-padding-top); overflow: hidden; .admin-bar & { height: calc(100vh - $admin-bar-desktop-height - (2 * $dialog-header-height) - $dialog-header-padding-top); } @media screen and (max-width: 782px) { .admin-bar & { height: calc(100vh - $admin-bar-mobile-height - (2 * $dialog-header-height) - $dialog-header-padding-top); } } } } #{$next-previous} { height: calc(100vh - $dialog-header-height - $dialog-header-padding-top); .admin-bar & { height: calc(100vh - $admin-bar-desktop-height - $dialog-header-height - $dialog-header-padding-top); } @media screen and (max-width: 782px) { .admin-bar & { height: calc(100vh - $admin-bar-mobile-height - $dialog-header-height - $dialog-header-padding-top); } } } } } // Large Image #{$large-image} { width: 100%; height: fit-content; position: relative; overflow: hidden; flex-grow: 1; // Restrict the width of the Large Image when the Next/Previous buttons are outside the image. #{$gallery-next-previous-outside-image} & .wc-block-product-gallery-large-image__image-element { overflow: hidden; margin-right: auto; margin-left: auto; max-width: $outside-image-max-width; padding: 5px; } .wc-block-product-gallery-large-image__container { display: flex; overflow-x: hidden; scroll-snap-type: x mandatory; scroll-behavior: auto; width: fit-content; height: fit-content; align-items: center; margin: 0; padding: 0; } .wc-block-product-gallery-large-image__wrapper { aspect-ratio: 1 / 1; flex-shrink: 0; max-width: 100%; overflow: hidden; width: 100%; display: flex; align-items: center; scroll-snap-align: none center; } #{$gallery-next-previous-inside-image} & .wc-block-product-gallery-large-image__image-element { width: fit-content; overflow: hidden; margin-right: auto; margin-left: auto; padding: 5px; } img { display: block; position: relative; margin: 0 auto; z-index: 1; transition: all 0.1s linear; aspect-ratio: 1 / 1; object-fit: contain; // Keep the order in this way. The hoverZoom class should override the full-screen-on-click class when both are applied. &.wc-block-woocommerce-product-gallery-large-image__image--full-screen-on-click { cursor: pointer; } &.wc-block-woocommerce-product-gallery-large-image__image--hoverZoom { cursor: zoom-in; } } .wc-block-product-gallery-large-image__inner-blocks { display: flex; flex-direction: column; position: absolute; width: calc(100% - 10px); height: calc(100% - 10px); top: 5px; left: 5px; // Reset the margin of the inner blocks when the Next/Previous buttons are outside the image. #{$gallery-next-previous-outside-image} & > * { margin-left: $outside-image-offset; margin-right: $outside-image-offset; } // Unset the margin of the inner blocks when the Next/Previous buttons are inside the image. #{$gallery-next-previous-inside-image} & > * { margin-left: unset; margin-right: unset; } } } // Next/Previous Buttons #{$next-previous} { display: flex; position: absolute; flex-direction: row; justify-content: space-between; width: 100%; height: 100%; button { cursor: pointer; z-index: 3; pointer-events: all; padding: 0; border: none; background: none; } .is-vertically-aligned-top { align-items: flex-start; } .is-vertically-aligned-center { align-items: center; } .is-vertically-aligned-bottom { align-items: flex-end; } } // Next/Previous Buttons Settings .wc-block-product-gallery-large-image-next-previous-settings { width: 100%; } // Next/Previous Buttons Off Setting #{$next-previous-left-off}, #{$next-previous-right-off} { display: none; } // Next/Previous Buttons Inside the Image Settings .wc-block-product-gallery-large-image-next-previous-left--inside-image { margin-left: 15px; } .wc-block-product-gallery-large-image-next-previous-right--inside-image { margin-right: 15px; } // Next/Previous Buttons Outside the Image Settings #{$gallery-next-previous-outside-image} .wc-block-product-gallery-large-image-next-previous-left--outside-image { bottom: 0; left: 0; position: absolute; } #{$gallery-next-previous-outside-image} .wc-block-product-gallery-large-image-next-previous-right--outside-image { bottom: 0; right: 0; position: absolute; } #{$gallery-next-previous-outside-image} #{$large-image} #{$next-previous} { margin-right: 0; margin-left: 0; } .wc-block-product-gallery-large-image-next-previous-container { display: flex; flex-direction: row; justify-content: space-between; position: absolute; width: 100%; &.wc-block-product-gallery-large-image-next-previous--inside-image { margin-top: 15px; margin-bottom: 15px; } } // Pager .wc-block-product-gallery-pager__pager { display: flex; justify-content: center; list-style: none; gap: $gap-small; margin-top: 0; margin-bottom: 0; padding: 0; button { border: none; background: none; color: inherit; font-size: inherit; font-weight: inherit; padding: 0; cursor: pointer; } } .wc-block-product-gallery-pager__pager-item { @include font-size(regular); color: $gray-600; cursor: pointer; } .wc-block-product-gallery-pager__pager-item--is-active { font-weight: bold; color: $black; } // Thumbnails #{$thumbnails} { display: flex; img { cursor: pointer; height: auto; width: auto; max-width: 100%; } #{$gallery}[data-thumbnails-position='bottom'] & { flex-direction: row; gap: 0 15px; } #{$gallery}:not([data-thumbnails-position='bottom']) & { flex-direction: column; gap: 15px 0; // Calculate the total width occupied by the gaps between thumbnails. $gap-width: $thumbnails-gap * ($default-number-of-thumbnails - 1); // Calculate the border width, which is multiplied by 2 to account for both sides of each thumbnail. $border-width: #{$default-number-of-thumbnails * 1px * 2}; // Calculate the width of each thumbnail by accounting for the gap, border, and additional space. flex-basis: calc((100% - #{$gap-width} - #{$border-width} - 4px) / #{$default-number-of-thumbnails}); } @for $i from 3 through 8 { #{$gallery}[data-thumbnails-number-of-thumbnails='#{$i}']:not([data-thumbnails-position='bottom']) & { // Calculate the total width occupied by the gaps between thumbnails. $gap-width: $thumbnails-gap * ($i - 1); // Calculate the border width, which is multiplied by 2 to account for both sides of each thumbnail. $border-width: $i * 1px * 2; flex-basis: calc((100% - #{$gap-width} - #{$border-width}) / $i); } } .wc-block-product-gallery-thumbnails__thumbnail { border: 1px solid rgba($color: #000, $alpha: 0.1); height: auto; width: auto; display: flex; justify-content: center; align-items: center; aspect-ratio: 1 / 1; position: relative; flex-basis: 0; flex-grow: 1; img { aspect-ratio: 1 / 1; object-fit: contain; } &::before { content: ""; display: block; padding-top: 100%; } @for $i from 3 through 8 { #{$gallery}[data-thumbnails-number-of-thumbnails='#{$i}'][data-thumbnails-position="bottom"] & { // Calculate the total width occupied by the gaps between thumbnails. $gap-width: $thumbnails-gap * ($i - 1); // Calculate the border width, which is multiplied by 2 to account for both sides of each thumbnail. $border-width: $i * 1px * 2; $thumbnail-width: calc((100% - #{$gap-width} - #{$border-width}) / $i); flex: 0 0 $thumbnail-width; } } } .wc-block-product-gallery-thumbnails__thumbnail__overlay { container-type: inline-size; cursor: pointer; display: flex; flex-direction: column; align-items: center; justify-content: center; position: absolute; background-color: rgba(0, 0, 0, 0.4); top: 0; width: 100%; height: 100%; line-height: 1.5; .wc-block-product-gallery-thumbnails__thumbnail__remaining-thumbnails-count { font-size: 1.2rem; font-weight: 700; } .wc-block-product-gallery-thumbnails__thumbnail__view-all { text-decoration: underline; } .wc-block-product-gallery-thumbnails__thumbnail__remaining-thumbnails-count, .wc-block-product-gallery-thumbnails__thumbnail__view-all { color: #fff; } @container (width < 70px) { .wc-block-product-gallery-thumbnails__thumbnail__view-all { display: none; } .wc-block-product-gallery-thumbnails__thumbnail__remaining-thumbnails-count { font-size: 1rem; } .wc-block-product-gallery-thumbnails__thumbnail__view-all { font-size: 0.6rem; } } @container (width > 70px) { .wc-block-product-gallery-thumbnails__thumbnail__remaining-thumbnails-count { font-size: 1.2rem; } .wc-block-product-gallery-thumbnails__thumbnail__view-all { font-size: 0.8rem; } } @container (width > 100px) { .wc-block-product-gallery-thumbnails__thumbnail__remaining-thumbnails-count { font-size: 1.4rem; } .wc-block-product-gallery-thumbnails__thumbnail__view-all { font-size: 1rem; } } } }