<div class="message message--success">
<div class="message__wrapper">
<div class="message__icon message__icon--success">
<svg class="icon-succes" width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="17.5" cy="17.5" r="16.7241" stroke="currentColor" stroke-width="1.55172" />
<path d="M10.5 17.3276L16.0172 22.5L24.9828 12.5" stroke="currentColor" stroke-width="2.58621" />
</svg>
</div>
<div class="message__content">
<p>Great, it was success!</p>
</div>
</div>
<div class="message__close">
<svg class="icon-close" viewBox="0 0 12 14" version="1" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor" d="M6.066 5.492L2.372.931A1 1 0 1 0 .818 2.19l3.848 4.752L.418 11.34a1 1 0 0 0 1.439 1.39v-.001l4.077-4.222 3.694 4.561a1 1 0 1 0 1.554-1.259L7.334 7.059l4.248-4.399a1 1 0 0 0-1.439-1.39v.001L6.066 5.492z" />
</svg>
</div>
</div>
{{!-- Message success --}}
<div class="message message--success">
<div class="message__wrapper">
<div class="message__icon message__icon--success">
{{render '@icon-succes' }}
</div>
<div class="message__content">
<p>{{ text }}</p>
</div>
</div>
<div class="message__close">
{{render '@icon-close' }}
</div>
</div>
type: success
text: Great, it was success!
/**
* Message blocks
* Remove message blocks and optional parent when clicked on the close button.
*/
const MESSAGE = ((w, d, undefined) => {
"use strict";
const classNames = {
wrapper: 'messages',
block: 'message',
close: 'message__close',
};
const autoClear = true;
const autoClearAfter = 5000;
const allowRemove = parentEl => {
if (!parentEl.children.length) {
return true;
} else {
[...parentEl.children, ...[]].forEach(child => {
const childStyles = window.getComputedStyle(child);
if (childStyles.display === 'none') {
child.parentNode.removeChild(child);
}
});
}
return !parentEl.children.length;
};
const addEvents = () => {
[...d.querySelectorAll('.' + classNames.block), ...[]].forEach(messageBlock => {
[...messageBlock.querySelectorAll('.' + classNames.close), ...[]].forEach(closeBtn => {
closeBtn.addEventListener('click', e => {
e.preventDefault();
const parentEl = messageBlock.parentNode;
if (parentEl && messageBlock) {
parentEl.removeChild(messageBlock);
}
if (parentEl && parentEl.classList.contains(classNames.wrapper) && allowRemove(parentEl)) {
parentEl.parentNode.removeChild(parentEl);
}
});
if (autoClear) {
setTimeout(() => { closeBtn.click(); }, autoClearAfter);
}
});
});
};
const newMessage = (content, type) => {
const icons = {
'success': '<svg xmlns="http://www.w3.org/2000/svg" class="icon-succes" fill="none" viewBox="0 0 35 35" width="35" height="35"><circle cx="17.5" cy="17.5" r="16.7241" stroke="currentColor" stroke-width="1.55172"/><path d="M10.5 17.3276L16.0172 22.5L24.9828 12.5" stroke="currentColor" stroke-width="2.58621"/></svg>',
'error': '<svg xmlns="http://www.w3.org/2000/svg" class="icon-error" fill="none" viewBox="0 0 41 35" width="41" height="35"><path stroke="currentColor" stroke-width="1.5" d="m21.722 1.625 17.32 30c.675 1.167-.167 2.625-1.515 2.625H2.887c-1.348 0-2.19-1.458-1.516-2.625l17.32-30c.674-1.167 2.358-1.167 3.031 0Z"/><path fill="currentColor" d="m21.174 12.454-.142 10.455h-1.648l-.142-10.454h1.932Zm-.966 14.66a1.23 1.23 0 0 1-.902-.377 1.23 1.23 0 0 1-.377-.902c0-.35.126-.65.377-.902.25-.25.551-.376.902-.376.35 0 .65.125.902.376.25.251.376.552.376.902 0 .232-.059.445-.177.64-.114.194-.268.35-.462.468-.19.114-.402.17-.64.17Z"/></svg>',
};
type = Object.keys(icons).includes(type) ? type : Object.keys(icons)[0];
const contentBlock = document.createElement('div');
contentBlock.classList.add('message__content');
contentBlock.innerHTML = content;
const iconWrapper = document.createElement('div');
iconWrapper.classList.add('message__icon');
iconWrapper.classList.add('message__icon--' + type);
iconWrapper.innerHTML = icons[type];
const messageWrapper = document.createElement('div');
messageWrapper.classList.add('message__wrapper');
messageWrapper.appendChild(iconWrapper);
messageWrapper.appendChild(contentBlock);
const close = document.createElement('div');
close.classList.add(classNames.close);
close.innerHTML = '<svg class="icon-close" viewBox="0 0 12 14" version="1" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M6.066 5.492L2.372.931A1 1 0 1 0 .818 2.19l3.848 4.752L.418 11.34a1 1 0 0 0 1.439 1.39v-.001l4.077-4.222 3.694 4.561a1 1 0 1 0 1.554-1.259L7.334 7.059l4.248-4.399a1 1 0 0 0-1.439-1.39v.001L6.066 5.492z"></path></svg>';
const block = document.createElement('div');
block.classList.add(classNames.block);
block.classList.add(classNames.block + '--' + type);
block.appendChild(messageWrapper);
block.appendChild(close);
const availableWrapper = document.querySelector('.' + classNames.wrapper);
if (!availableWrapper) {
const wrapper = document.createElement('div');
wrapper.classList.add(classNames.wrapper);
wrapper.appendChild(block);
document.body.appendChild(wrapper);
} else {
availableWrapper.appendChild(block);
}
addEvents();
};
const init = () => {
addEvents();
w.updateMessages = addEvents;
w.newMessage = newMessage;
};
d.addEventListener('DOMContentLoaded', init);
})(window, window.document);
.messages {
position: fixed;
top: 0;
right: 0;
left: 0;
z-index: 999;
display: block;
padding: var(--gap--4);
background-color: rgba(white, .9);
backdrop-filter: blur(2px);
}
.message {
display: flex;
justify-content: center;
position: relative;
margin: 0 auto var(--gap--4) auto;
max-width: var(--section--9);
&:last-child {
margin-bottom: 0;
}
&--error {
background: rgba(#E63F5C, 0.1);
border: 1px solid var(--color--negative);
}
&--success {
background: rgba(#1DBD96, 0.1);
border: 1px solid var(--color--positive);
}
&--info {
background: rgba(#007DE1, 0.1);
border: 1px solid var(--color--action);
}
&--atc {
background-color: var(--color--neutrals-1);
border-radius: var(--gap);
border: none;
}
&__wrapper {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
padding: var(--gap--4);
@media all and (min-width: 750px) {
flex-direction: row;
text-align: left;
max-width: 50%;
}
}
&__content {
color: var(--color--neutrals-10);
padding-top: var(--gap--4);
@media all and (min-width: 750px) {
padding-top: 0;
}
}
&__icon {
@media all and (min-width: 750px) {
margin-right: var(--gap--4);
}
&--error {
color: var(--color--negative);
}
&--success {
color: var(--color--positive);
}
&--info {
color: var(--color--action);
}
&--atc {
width: 75px;
flex-shrink: 0;
}
}
&__close {
position: absolute;
top: 0;
right: 0;
z-index: 1;
display: block;
padding: var(--gap--5);
color: var(--color--neutrals-8);
cursor: pointer;
svg {
display: block;
width: var(--gap--3);
height: var(--gap--3);
}
@media all and (min-width: 750px) {
transition: transform 150ms ease-out;
&:hover {
transform: rotate(90deg);
}
}
}
}
No notes defined.