<article class="card card-product">
<a href="" aria-label="Produit pour chat - Versele Laga Senior" title="Produit pour chat - Versele Laga Senior">
<div class="card-product__thumbnail">
<img src="/img/friandise-cheval.png" />
</div>
<div class="card-product__description">
<span>Cheval</span>
<h4 class="alt--font">Reverdy friandises cheval vanille 3,5 kg</h4>
</div>
<button class="card-product__heart js-add-to-current-list">
<svg class="svg-heart" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path class="svg-heart-body" d="M28.083 13.519L16.056 26.006 3.98 13.52c-2.396-2.475-2.895-7.194.48-10.075 3.418-2.925 7.436-.806 8.908.718L16.03 6.92l2.664-2.756c1.447-1.5 5.501-3.626 8.907-.72 3.369 2.876 2.876 7.595.48 10.076z" fill="#F05D61" fill-rule="nonzero"/><path class="svg-heart-shadow" d="M13.567 24.563L25.887 12c1.169-1.19 2-2.524 2.495-4a8.948 8.948 0 0 0 .343-4.469l2.589 3.75-.718 3.907-2.214 4.156-11.696 11.625-3.119-2.407z" fill="#D4484C"/><ellipse class="svg-heart-light" fill="#FFC6C6" cx="6.497" cy="6.655" rx="2.559" ry="4.341"/><path class="svg-heart-border" d="M28.9 1.919c-3.4-2.9-8.484-2.419-11.64.844l-1.229 1.274-1.229-1.268C12.257.13 7.124-1.456 3.162 1.919-.754 5.269-.96 11.28 2.546 14.906l12.07 12.488c.387.4.898.606 1.41.606.511 0 1.023-.2 1.41-.606l12.07-12.488c3.518-3.625 3.312-9.637-.605-12.987zm-.817 11.6L16.056 26.006 3.98 13.52c-2.396-2.475-2.895-7.194.48-10.075 3.418-2.925 7.436-.806 8.908.718L16.03 6.92l2.664-2.756c1.447-1.5 5.501-3.626 8.907-.72 3.369 2.876 2.876 7.595.48 10.076z" fill="#4C4636" fill-rule="nonzero"/>
</g>
</svg>
<span class="visually-hidden">Ajouter le produit à ma liste</span>
<span>272</span>
<span class="visually-hidden">clients ont déjà ajoutés ce produit à leur liste.</span>
</button>
<div class="card-product__tools">
<button class="js-display-list-dropdown">
Ajouter à <span class="visually-hidden">l'une de mes listes.</span>
<ul class="list--products-list">
<span></span>
<form>
<label>Ajouter une liste</label>
<span>
<input type="text" name="Titre de la liste" />
<object><button class="button button--tertiary button--shadow"><i class="icon icon--plus"></i></button></object>
</span>
</form>
</ul>
</button>
<span>Voir <i class="icon icon--chevron-right"></i></span>
</div>
</a>
</article>
<article class="card card-product">
<a href="" aria-label="Produit pour chat - Versele Laga Senior" title="Produit pour chat - Versele Laga Senior">
<div class="card-product__thumbnail">
<img src="/img/friandise-cheval.png" />
</div>
<div class="card-product__description">
<span>Cheval</span>
<h4 class="alt--font">Reverdy friandises cheval vanille 3,5 kg</h4>
</div>
<button class="card-product__heart js-add-to-current-list">
<svg class="svg-heart" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path class="svg-heart-body" d="M28.083 13.519L16.056 26.006 3.98 13.52c-2.396-2.475-2.895-7.194.48-10.075 3.418-2.925 7.436-.806 8.908.718L16.03 6.92l2.664-2.756c1.447-1.5 5.501-3.626 8.907-.72 3.369 2.876 2.876 7.595.48 10.076z" fill="#F05D61" fill-rule="nonzero"/><path class="svg-heart-shadow" d="M13.567 24.563L25.887 12c1.169-1.19 2-2.524 2.495-4a8.948 8.948 0 0 0 .343-4.469l2.589 3.75-.718 3.907-2.214 4.156-11.696 11.625-3.119-2.407z" fill="#D4484C"/><ellipse class="svg-heart-light" fill="#FFC6C6" cx="6.497" cy="6.655" rx="2.559" ry="4.341"/><path class="svg-heart-border" d="M28.9 1.919c-3.4-2.9-8.484-2.419-11.64.844l-1.229 1.274-1.229-1.268C12.257.13 7.124-1.456 3.162 1.919-.754 5.269-.96 11.28 2.546 14.906l12.07 12.488c.387.4.898.606 1.41.606.511 0 1.023-.2 1.41-.606l12.07-12.488c3.518-3.625 3.312-9.637-.605-12.987zm-.817 11.6L16.056 26.006 3.98 13.52c-2.396-2.475-2.895-7.194.48-10.075 3.418-2.925 7.436-.806 8.908.718L16.03 6.92l2.664-2.756c1.447-1.5 5.501-3.626 8.907-.72 3.369 2.876 2.876 7.595.48 10.076z" fill="#4C4636" fill-rule="nonzero"/>
</g>
</svg>
<span class="visually-hidden">Ajouter le produit à ma liste</span>
<span>272</span>
<span class="visually-hidden">clients ont déjà ajoutés ce produit à leur liste.</span>
</button>
<div class="card-product__tools">
<button class="js-display-list-dropdown">
Ajouter à <span class="visually-hidden">l'une de mes listes.</span>
<ul class="list--products-list">
<span></span>
<form>
<label>Ajouter une liste</label>
<span>
<input type="text" name="Titre de la liste" />
<object><button class="button button--tertiary button--shadow"><i class="icon icon--plus"></i></button></object>
</span>
</form>
</ul>
</button>
<span>Voir <i class="icon icon--chevron-right"></i></span>
</div>
</a>
</article>
/* No context defined for this component. */
.card {
position: relative;
margin-bottom: 3rem;
@include mediaWQuery($media-query-l) { margin-bottom: 0 }
> a {
display: block;
text-decoration: none;
border: 3px $c-brown-lighter solid;
border-radius: 5px;
}
img {
width: calc(100% + 6px);
height: auto;
margin: -3px -3px 0;
border-radius: 3px 3px 0 0;
font-size: 0;
}
}
.card-product {
position: relative;
width: 100%;
z-index: 1000;
&:hover { z-index: 99 }
> a {
height: 100%;
&:hover {
.card-product__heart {
opacity: 1;
background-color: rgba($c-white, 1);
}
.card-product__tools {
transform: translateY(calc(50% - 1rem));
opacity: 1;
pointer-events: auto;
}
}
&:focus { border-color: $c-brown-medium }
}
&__thumbnail {
position: relative;
height: 0;
padding-top: 100%;
> img {
position: absolute;
top: 0;
height: 100%!important;
width: 100%!important;
margin: 0;
object-fit: contain;
}
}
&__description {
padding: $margin-m $margin-m 0;
line-height: 1.1;
span {
margin: 0;
font-size: rem(18);
color: $c-red;
}
h4 {
margin: 0;
font-size: rem(21);
color: $c-font-color;
}
}
&__heart {
position: absolute;
top: .5rem;
right: .5rem;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
-webkit-appearance: none;
border: 0;
border-radius: $border-radius-xs;
background-color: rgba($c-white, 0);
padding: .5rem;
color: $c-blue;
font-size: rem(14);
font-family: $font-secondary;
transition: .3s ease;
.svg-heart {
max-width: 40px;
width: 40px;
height: auto;
& > g {
transform: translate(4px, 6px);
}
.svg-heart-body, .svg-heart-light, .svg-heart-shadow {
opacity: 0;
//transform: translate(6px, 0) scale(.7) rotate(38deg);
}
.svg-heart-border { fill: $c-blue; }
}
.svg-heart path { transition: .3s ease }
&:hover, &:focus {
cursor: pointer;
background-color: rgba($c-white, 1)!important;
--animation-duration: 2.2s;
.svg-heart{
opacity: 1;
animation: heart-beat var(--animation-duration) infinite ease-in-out;
&-body { opacity: 1; }
&-light {
opacity: 1;
animation: heart-beat-light var(--animation-duration) infinite ease-in-out;
}
&-shadow{
opacity: 1;
animation: heart-beat-shadow var(--animation-duration) infinite ease-in-out;
}
&-border{
opacity: 1;
fill: $c-brown-dark!important;
}
}
}
}
&__tools {
display: flex;
margin: 0 1rem -1rem;
border: 3px solid $c-brown-lighter;
background: $c-white;
border-radius: $border-radius-l;
box-shadow: 0 10px 30px -15px rgba(0, 0, 0, .2);
transform: translateY(calc(50% - 1rem));
@include mediaWQuery($media-query-l) {
opacity: 0;
pointer-events: none;
transform: translateY(0);
}
transition: .3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
> * {
color: $c-black;
font-family: $font-secondary;
font-size: rem(18);
font-weight: 700;
}
& > button {
//position: relative;
display: flex;
justify-content: space-between;
align-items: center;
flex-grow: 1;
outline: none;
padding: .7rem 1rem;
-webkit-appearance: none;
border: 0;
border-right: 3px solid $c-brown-lighter;
border-radius: $border-radius-l 0 0 $border-radius-l;
background: transparent;
transition: .3s ease;
&::after {
content: '';
display: inline-block;
width: 24px;
height: 24px;
margin-left: .5rem;
background: $c-yellow;
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg aria-hidden='true' data-prefix='fas' data-icon='chevron-down' class='svg-inline--fa fa-chevron-down fa-w-14' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='%23332D2D' d='M207 381.5L12.7 187a24 24 0 010-34l22.7-22.6a24 24 0 0133.9 0l154.7 154 154.7-154a24 24 0 0134 0l22.6 22.7a24 24 0 010 34L241 381.4a24 24 0 01-34 0z'/%3E%3C/svg%3E");
background-size: 13px auto;
background-position: center;
background-repeat: no-repeat;
border-radius: 12px;
}
&:hover, &:focus {
background: $c-brown-lighter;
cursor: pointer;
opacity: 1;
}
> ul {
display: none;
position: absolute;
top: calc(100% - 5px);
right: -10px;
width: calc(100% + 1rem);
z-index: 100000;
@include mediaWQuery($media-query-m) {
width: calc(120% + 1rem);
}
li {
padding: .5rem 1rem;
font-weight: 700;
font-size: rem(18);
transition: .3s ease;
a {
display: block;
color: $c-black;
padding: 0!important;
margin: 0;
}
&:hover, &:focus { background: $c-yellow }
}
&.is-showing {
display: block;
}
}
}
& > button form {
border-top: 1px solid $c-brown-lighter;
padding: $margin-s $margin-m;
> span {
display: flex;
align-items: stretch;
input {
width: auto;
min-width: 0;
padding: .5rem;
}
object {
margin-left: -10px
}
object button {
padding: 0;
width: 47px;
height: 47px;
}
}
}
> span {
border-radius: 0 $border-radius-l $border-radius-l 0;
padding: .7rem;
transition: .2s ease;
> i { margin-top: -7px }
&:hover, &:focus {
background: $c-brown-lighter;
}
}
}
&--favorite {
.svg-heart {
&__body { fill: #F05D61; }
&__fill { fill: #4C4636; }
&__shadow { fill: #D4484C; }
}
}
&--show-tools {
.card-product__tools {
transform: translateY(calc(50% - 1rem));
opacity: 1;
pointer-events: auto;
}
}
}
@keyframes heart-beat{
0% {transform: scale(1);}
15% {transform: scale(1.1);}
30% {transform: scale(1);}
45% {transform: scale(1.1);}
60% {transform: scale(1);}
100%{transform: scale(1);}
}
@keyframes heart-beat-light{
0% {transform: translate(6px, 0) scale(.7) rotate(38deg);}
15% {transform: translate(6px, -1px) scale(.8) rotate(38deg);}
30% {transform: translate(6px, 0) scale(.7) rotate(38deg);}
45% {transform: translate(6px, -1px) scale(.8) rotate(38deg);}
60% {transform: translate(6px, 0) scale(.7) rotate(38deg);}
100%{transform: translate(6px, 0) scale(.7) rotate(38deg);}
}
@keyframes heart-beat-shadow{
0% {opacity: 1;}
15% {opacity: .7;}
30% {opacity: 1;}
45% {opacity: .7;}
60% {opacity: 1;}
100% {opacity: 1;}
}
// FOR DEMO ONLY
sessionStorage.setItem('productLists', JSON.stringify([
{
id: 1,
title: "Théo, Gally & Chloé"
},
{
id: 2,
title: "Bella"
},
{
id: 3,
title: "Les poissons"
}
]));
// end. DEMO
/*
* Add product to the current or first list
* @param
* - productID: int
*
*/
const addProductToCurrentList = () => {
}
// Get all button
let togglesAPTCL = document.getElementsByClassName('js-add-to-current-list');
[].slice.call(togglesAPTCL).forEach(toggle => {
toggle.addEventListener('click', event => {
event.preventDefault();
addProductToCurrentList();
})
})
/*
* Add product to the current or first list
* @param
* - productID: int
*
*/
const displayListDropdown = el => {
// Get listing and clean content
let listProductContainer = el.querySelector('ul');
let listProductContainerSpan = listProductContainer.querySelector('span');
listProductContainerSpan.innerHTML = "";
// Parse sessionStorage productLists
let productLists = JSON.parse(sessionStorage.getItem('productLists'));
//let span = document.createElement('span');
productLists.forEach(productList => {
let li = document.createElement('li');
let a = document.createElement('a');
a.innerHTML = productList.title;
li.appendChild(a);
li.setAttribute('data-list-product-ID', productList.id);
listProductContainerSpan.appendChild(li);
});
// Toggle display the list
listProductContainer.classList.toggle('is-showing');
}
let togglesDLD = document.getElementsByClassName('js-display-list-dropdown');
[].slice.call(togglesDLD).forEach(toggle => {
toggle.addEventListener('click', event => {
event.preventDefault();
displayListDropdown(toggle);
})
})
/*
* Remove active list product when user leave card product
*
*/
let cardsProduct = document.querySelectorAll('.card-product');
[].slice.call(cardsProduct).forEach(cardProduct => {
let cardProductLink = cardProduct.querySelector('a');
cardProductLink.addEventListener('focus', () => {
let activeCard = document.querySelector('.card-product--show-tools');
if(activeCard) activeCard.classList.remove('card-product--show-tools');
cardProduct.classList.add('card-product--show-tools');
})
cardProduct.addEventListener('mouseleave', () => {
let activeList = document.querySelector('.is-showing');
if(activeList)
activeList.classList.remove('is-showing');
cardProduct.classList.remove('card-product--show-tools');
})
// disable close on click input
let cardProductInput = cardProduct.querySelector('input');
cardProductInput.addEventListener('click', event => {
event.stopPropagation();
event.preventDefault();
})
// Add list
let cardProductAddList = cardProduct.querySelector('object button');
cardProductAddList.addEventListener('click', event => {
event.preventDefault();
event.stopPropagation();
})
})
There are no notes for this item.