@import "../../resources/scss/util/variables";
@import "../../resources/scss/util/mixins";
.block-history {
display: grid;
grid-template-columns: repeat(12, 1fr);
column-gap: 24px;
border-bottom: 1px solid $border-grey;
@include bp($lg) {
padding: 0 0 0 80px;
}
&__heading {
grid-column: 1 / 13;
grid-row: 1;
display: block;
padding: 32px 16px;
margin: 0;
font-weight: 400;
@include bp($md) {
display: none;
}
}
&__sidebar {
@include section-sidebar;
background-color: $white;
z-index: 3;
@include bp($md) {
display: flex;
}
.sidebar-inner {
padding-bottom: rem-calc(36);
height: 190px;
}
}
&__images {
@include list-unstyled;
margin: 0;
padding: 0;
grid-row: 2;
grid-column: 1 / 13;
position: relative;
overflow: hidden;
height: 100%;
width: 100%;
// padding-bottom: 75%;
aspect-ratio: 16 / 9;
z-index: 2;
@include bp($md) {
// padding-bottom: 110%;
}
@include bp($lg) {
aspect-ratio: 1/1;
grid-column: 1 / 8;
// padding-bottom: 100%;
grid-row: 1;
}
@include bp($xxl) {
aspect-ratio: 4/3;
// padding-bottom: 80%;
grid-column: span 6;
}
li {
position: absolute;
top: 0;
left: 0;
inset: 0;
// clip-path: inset(0% 0% 0% 0%);
clip-path: polygon(-100% 100%, 100% -100%, 100% 100%, -25% 100%);
transition: clip-path .6s 0s;
&.is-selected {
z-index: 1;
img {
scale: 1;
}
}
&.is-removed {
z-index: 2;
// clip-path: inset(0% 0% 0% 100%);
clip-path: polygon(-100% 200%, 300% 0%, 100% 100%, -25% 100%);
// clip-path: polygon(0% 0, 0% 0, -50% 100%, 0 100%);
img {
scale: 1;
}
}
}
picture {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: auto;
object-fit: cover;
aspect-ratio: 16 / 9;
overflow: hidden;
@include bp($lg) {
height: 100%;
aspect-ratio: auto;
}
}
img {
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
scale: 1.2;
transition: scale 0.6s 0s;
transform-origin: center;
}
}
&__carousel {
grid-column: 1 / 13;
grid-row: 3;
position: relative;
z-index: 0;
opacity: 0;
@include bp($md) {
// grid-row: 2;
}
@include bp($lg) {
grid-column: 8 / 13;
grid-row: 1;
}
@include bp($xl) {
grid-column: span 6;
}
&.flickity-enabled {
opacity: 1;
}
}
&__navigation {
grid-row: 4;
grid-column: 1 / 13;
position: relative;
z-index: 4;
height: 48px;
display: flex;
align-items: center;
justify-content: space-between;
@include bp($md) {
padding-left: 83px;
}
@include bp($lg) {
grid-row: 3;
padding-left: 3px;
}
&:before {
content: "";
width: calc(100% + 160px);
position: absolute;
top: 0;
left: -80px;
height: 1px;
background-color: $border-grey;
}
&:after {
content: "";
position: absolute;
top: 1px;
right: 95px;
width: 80px;
height: 46px;
background: rgb(255,255,255);
background: linear-gradient(270deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 60%);
pointer-events: none;
}
ul {
@include list-unstyled;
margin: 0;
display: flex;
align-items: center;
flex-wrap: nowrap;
overflow-x: auto;
width: 100%;
transition: opacity .2s;
padding-right: 24px;
-ms-overflow-style: none;
scrollbar-width: none;
@include bp($lg) {
padding-right: 40px;
}
&.is-disabled {
pointer-events: none;
opacity: .7;
& + .slider-buttons {
pointer-events: none;
opacity: .7;
}
}
&::-webkit-scrollbar {
display: none;
}
li {
padding: 0 20px;
line-height: 50px;
@include bp($lg) {
padding: 0 30px;
}
button {
@include fluid-type(16, 20, 375, $max-container-size);
@include reset-input;
background: transparent;
border: 0;
font-variant-numeric: tabular-nums;
&.is-selected {
font-weight: 700;
}
}
}
}
.slider-buttons {
@include slider-buttons;
flex-shrink: 0;
transition: opacity .2s;
.slider-button:hover {
background-color: $primary-blue;
}
}
}
.flickity-enabled:focus {
outline: none;
}
.flickity-viewport {
height: 100%;
}
.flickity-slider {
height: 100%;
overflow-y: scroll;
overflow-x: hidden;
.carousel-cell {
display: grid;
grid-template-columns: repeat(6, 1fr);
column-gap: $grid-gutter-width;
width: 100%;
min-height: 100%;
opacity: 0;
filter: blur(5px);
transition: opacity .4s 0s, filter .4s 0s;
padding: 0 16px;
@include bp($lg) {
padding: 0;
}
&.is-selected {
opacity: 1;
filter: blur(0);
transition: opacity .2s 0s;
.carousel-cell {
&__content > div {
transform: translateX(0);
}
}
}
& > * {
grid-column: span 6;
}
&__content {
display: flex;
flex-direction: column;
position: relative;
height: 100%;
@include bp($md) {
padding-left: 96px;
}
@include bp($lg) {
padding-left: 0;
display: grid;
grid-template-columns: repeat(6, 1fr);
column-gap: $grid-gutter-width;
}
& > div {
@include article-wysiwyg;
transform: translateX(calc(-100% - 160px));
&:nth-of-type(1) {
transition: transform .4s cubic-bezier(0.65, 0.05, 0.36, 1);
position: relative;
z-index: 1;
grid-column: 1 / 7;
padding-top: 30px;
order: 2;
@include bp($lg) {
grid-column: 2 / 6;
order: 1;
grid-row: 1;
padding-top: clamp(70px, 6vw, 160px);
}
@include bp($xl) {
grid-column: 2 / 6;
}
}
&:nth-of-type(2) {
transition: transform .45s cubic-bezier(0.65, 0.05, 0.36, 1);
grid-row: 1;
display: flex;
z-index: 0;
@include bp($lg) {
position: absolute;
left: -($grid-gutter-width);
bottom: 0;
align-items: flex-end;
}
& > span {
@include fluid-type(120, 248, 375, $max-container-size);
display: block;
line-height: .7;
font-weight: 600;
color: rgba(0, 174, 239, .1);
}
}
}
}
}
}
}
/* flickity-fade */
.flickity-enabled.is-fade .flickity-slider > * {
pointer-events: none;
z-index: 0;
}
.flickity-enabled.is-fade .flickity-slider > .is-selected {
pointer-events: auto;
z-index: 1;
}
class BlockHistory {
constructor() {
this.blocks = document.querySelectorAll('.block-history')
this.imageTimer
this.navTimer
this.mql = window.matchMedia("(max-width: 992px)")
this.previousBreakpoint = this.mql.matches
this.events()
}
events() {
if (!this.blocks.length) return
let _this = this
this.blocks.forEach(block => {
const carousel = block.querySelector('.js-block-history-carousel')
const images = block.querySelectorAll('.js-block-history-images > li')
const navigation = block.querySelector('.js-block-history-navigation')
const dots = navigation.querySelectorAll('button')
const prevButton = block.querySelector('.js-block-history-prev')
const nextButton = block.querySelector('.js-block-history-next')
if (!carousel) return
let flktyOptions = {
cellAlign: 'left',
contain: true,
prevNextButtons: false,
percentPosition: false,
pageDots: false,
fade: true,
setGallerySize: (this.mql.matches) ? true : false
}
let flkty
initCarousel(carousel, flktyOptions)
dots.forEach(dot => {
dot.addEventListener('click', e => {
dot.classList.add('is-selected')
dots.forEach(dot => {
if (dot != e.currentTarget)
dot.classList.remove('is-selected')
})
flkty.select(dot.dataset.index)
})
})
if (prevButton) {
prevButton.addEventListener('click', () => {
flkty.previous()
})
}
if (nextButton) {
nextButton.addEventListener('click', () => {
flkty.next()
})
}
window.addEventListener('resize', () => {
resize()
})
function initCarousel(f, v) {
flkty = new Flickity(f, v)
images.forEach(image => {
image.classList.remove('is-selected')
})
images[flkty.selectedIndex].classList.add('is-selected')
dots.forEach(dot => {
dot.classList.remove('is-selected')
})
dots[flkty.selectedIndex].classList.add('is-selected')
scrollNavigation(flkty.selectedIndex)
flkty.on('change', function() {
clearTimeout(this.imageTimer)
clearTimeout(this.navTimer)
let currentImage = block.querySelector('.js-block-history-images > li.is-selected')
navigation.classList.add('is-disabled')
currentImage.classList.remove('is-selected')
currentImage.classList.add('is-removed')
images[flkty.selectedIndex].classList.add('is-selected')
this.imageTimer = setTimeout(() => {
block.querySelector('.js-block-history-images > li.is-removed').classList.remove('is-removed')
}, 600)
this.navTimer = setTimeout(() => {
navigation.classList.remove('is-disabled')
}, 850)
dots[flkty.selectedIndex].classList.add('is-selected')
dots.forEach(dot => {
if (dot != dots[flkty.selectedIndex])
dot.classList.remove('is-selected')
})
scrollNavigation(flkty.selectedIndex)
})
}
function scrollNavigation(selectedIndex) {
const selectedDot = dots[selectedIndex]
if (!selectedDot) return
const navigationRect = navigation.getBoundingClientRect()
const dotRect = selectedDot.getBoundingClientRect()
const scrollLeft = navigation.scrollLeft + (dotRect.left - navigationRect.left) - 20
navigation.scrollTo({
left: scrollLeft,
behavior: 'smooth'
})
}
function initOptions() {
if (_this.mql.matches) {
flktyOptions.setGallerySize = true
} else {
flktyOptions.setGallerySize = false
}
}
// resize
function resize() {
const currentBreakpoint = _this.mql.matches
if (currentBreakpoint !== _this.previousBreakpoint) {
initOptions()
flkty.destroy()
initCarousel(carousel, flktyOptions)
_this.previousBreakpoint = currentBreakpoint
}
}
})
}
}
document.addEventListener('DOMContentLoaded', () => {
new BlockHistory();
});
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 2,
"name": "strategiq/history",
"title": "History",
"description": "Example block to be used as a template",
"category": "strategiq",
"icon": "strategiq",
"acf": {
"mode": "preview",
"renderTemplate": "block-history.php"
},
"supports": {
"anchor": true,
"align": false,
"spacing": {
"margin": [
"bottom"
]
}
},
"example": {
"attributes": {
"mode": "preview",
"data": {
"heading_type": "h2",
"heading_text": "Example - Cta Collage",
"content": "This is some example content to represent what the content will look like"
}
}
},
"style": ["file:../../assets/css/history/block-history.css", "flickity-css"],
"viewScript": ["flickity-js", "flickity-fade", "history"]
}
This component is not currently used on any pages.