@import "../../resources/scss/util/variables";
@import "../../resources/scss/util/mixins";
.block-content-carousel {
padding-top: $grid-gutter-width;
@include bp($md) {
padding-top: 0;
}
.single-firm & {
padding-top: rem-calc(50);
@include bp($md) {
padding-top: rem-calc(100);
}
}
&__wrapper {
padding-left: 1rem;
border-top: 1px solid $border-grey;
.single-firm & {
border-top: 1px solid $border-grey;
}
@include bp($md) {
border-top: 0;
padding-left: 0;
}
}
&__slide {
display: flex;
flex-direction: column;
height: calc(100% - 60px);
padding: rem-calc(30) $grid-gutter-width;
text-decoration: none;
&:hover {
background-color: #ace6ff40;
}
&-heading {
@include responsive-font($heading-8, $heading-4);
font-weight: 400;
text-overflow: ellipsis;
overflow: hidden;
margin-top: 0;
margin-bottom: 0;
line-height: 1.3;
}
&-excerpt {
margin-bottom: 0;
flex-grow: 1;
}
&-image {
width: 100%;
margin-bottom: rem-calc(24);
picture {
width: 100%;
}
}
&-icon {
min-height: 206px;
margin-bottom: rem-calc(24);
svg {
max-height: 110px;
}
}
&-content {
font-size: $body-default;
display: flex;
flex-direction: column;
justify-content: space-between;
flex-grow: 1;
gap: rem-calc(24);
&--icon {
display: flex;
flex-direction: column;
height: 100%;
.block-content-carousel__slide-heading {
margin-bottom: 0;
}
.block-content-carousel__slide-excerpt {
min-height: 100px;
// margin-top: rem-calc(48);
}
}
&--person {
display: flex;
flex-direction: column;
justify-content: space-between;
flex: 1 0 auto;
h3 {
font-size: $heading-8;
}
span {
display: block;
}
&-header {
min-height: 140px;
}
.person-job-title, .person-firm {
font-size: $body-medium;
}
.person-job-title {
font-weight: 600;
}
.person-email {
margin-top: 1rem;
}
.person-location {
font-size: 12px;
color: #BEBEBE;
}
}
}
}
.swiper {
border-left: 1px solid $border-grey;
margin-left: 0;
@include bp($md) {
margin-left: $container-spacing-desktop;
border-left: 1px solid $border-grey;
}
}
.swiper-slide {
height: auto;
border-right: 1px solid $border-grey;
width: 334px; //Fallback for JS disabled
&__inner {
min-height: 300px;
position: relative;
}
}
@include slider-navigation;
.slider-navigation {
margin-top: 0;
padding: 0 rem-calc(24);
}
.slider-navigation {
.slider-button {
&:hover {
background-color: $indigo;
}
}
}
&--landscape {
.swiper {
border-left: 0;
}
.swiper-slide {
width: 100%;
padding: 1rem;
@include bp($md) {
width: 50%;
}
@include bp($lg) {
padding: rem-calc(130) rem-calc(50);
}
}
.swiper-wrapper {
flex-direction: column;
@include bp($md) {
flex-direction: row;
}
}
.block-content-carousel__slide {
display: flex;
flex-direction: column;
align-items: center;
border-right: 0;
@include bp($xl) {
flex-direction: row;
}
&-content {
padding-left: 0;
@include bp($md) {
padding-left: rem-calc(45);
}
}
&-icon {
display: flex;
align-items: center;
min-height: auto;
@include bp($md) {
min-height: 206px;
}
}
&-content, &-image {
width: 100%;
@include bp($lg) {
width: auto;
}
}
&-image {
width: 100%;
@include bp($lg) {
width: auto;
}
}
}
.slider-navigation {
display: none;
}
}
&--location {
.block-content-carousel__wrapper {
padding-left: 0;
}
.block-content-carousel__slide {
border-left: 0;
}
}
&__slide-heading {
transition: height 0.3s ease;
overflow: hidden;
}
.swiper {
border-left: 1px solid $border-grey;
@include bp($md) {
border-left: 0;
}
}
&.has-light-blue-background-color {
.block-content-carousel__slide-content--person {
.person-location {
color: var(--text-color);
}
}
}
}
.block-section-wrap {
&:has(.block-content-carousel) {
.block-content-carousel {
.section-name {
display: none;
}
}
}
}
class ContentCarousel {
block;
resizeObserver;
headingHeightTimeout;
constructor(block) {
this.block = block;
this.init();
}
equalizeHeadingHeights() {
if (this.headingHeightTimeout) {
clearTimeout(this.headingHeightTimeout);
}
this.headingHeightTimeout = setTimeout(() => {
const slideHeadings = this.block.querySelectorAll('.block-content-carousel__slide-heading');
let maxHeight = 0;
// First pass: find the maximum height
slideHeadings.forEach(heading => {
// Temporarily remove fixed height to get natural height
heading.style.height = 'auto';
const height = heading.offsetHeight;
maxHeight = Math.max(maxHeight, height);
});
// Second pass: apply the maximum height
slideHeadings.forEach(heading => {
heading.style.height = `${maxHeight}px`;
});
}, 100); // Debounce time of 100ms
}
init() {
this.swiperElem = this.block.querySelector('.swiper');
this.paginationElem = this.block.querySelector('.slider-pagination');
this.prevBtnElem = this.block.querySelector('.slider-button--prev');
this.nextBtnElem = this.block.querySelector('.slider-button--next');
this.swiper = new Swiper(this.swiperElem, {
pagination: {
el: this.paginationElem,
type: "custom",
renderCustom: function (swiper, current, total) {
return current + ' ' + total;
}
},
navigation: {
nextEl: this.nextBtnElem,
prevEl: this.prevBtnElem
},
slidesPerView: 1.25,
spaceBetween: 0,
breakpoints: {
541: {
slidesPerView: 2.5,
},
1025: {
slidesPerView: 4.5,
},
1601: {
slidesPerView: 5.5,
},
},
on: {
init: () => this.equalizeHeadingHeights(),
slideChange: () => this.equalizeHeadingHeights(),
resize: () => this.equalizeHeadingHeights()
}
});
// Initialize ResizeObserver to handle responsive changes
this.resizeObserver = new ResizeObserver(() => this.equalizeHeadingHeights());
this.resizeObserver.observe(this.block);
// Initial equalization
this.equalizeHeadingHeights();
}
}
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.block-content-carousel--portrait').forEach((block) => {
new ContentCarousel(block);
})
});
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 2,
"name": "strategiq/content-carousel",
"title": "Content Carousel",
"description": "Example block to be used as a template",
"category": "strategiq",
"icon": "strategiq",
"acf": {
"mode": "preview",
"renderTemplate": "block-content-carousel.php"
},
"supports": {
"anchor": true,
"align": false,
"color": {
"background": true,
"text": false,
"gradients": false
},
"spacing": {
"padding": [
"top",
"bottom"
],
"margin": [
"top",
"bottom"
]
}
},
"example": {
"attributes": {
"mode": "preview",
"data": {
"heading_type": "h2",
"heading_text": "Example - Content Carousel",
"content": "This is some example content to represent what the content will look like"
}
}
},
"style": ["file:../../assets/css/content-carousel/block-content-carousel.css", "swiper-css"],
"viewScript": ["swiper-js", "content-carousel"]
}