Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corporis perferendis rem accusantium ducimus animi nesciunt expedita omnis aut quas molestias!
Mauris viverra cursus ante laoreet eleifend. Donec vel fringilla ante. Aenean finibus velit id urna vehicula, nec maximus est sollicitudin
Quisque sagittis non ex eget vestibulum
`,
afterDrop: function(node) {
//set unique accordion parent id, this is a bootstrap accordion limitation
let parentId = Math.ceil(Math.random() * 1000);
node.id = 'tabs-' + parentId;
node.innerHTML = node.innerHTML.replaceAll('parentId', parentId);
return node;
},
properties: [{
//name: "List",
key: "list",
component: "elements/tab",
children :[{
component: "elements/tab",
name: "html/gridcolumn",
classesRegex: ["col-"],
}],
inline:false,
inputtype: ListInput,
data: {
selector:"> .nav-link",
container:"nav > .nav-tabs",
prefix:"Tab ",
name: "text",
removeElement: false,//handle manually to delete pane also
//"newElement": ``
},
onChange: function(node, value, input, component, event) {
let element = node;
let tabsId = element.id.replace('tabs-','');
let nav = node.querySelector("nav .nav-tabs");
let content = node.querySelector(".tab-content");
if (event.action) {
if (event.action == "add") {
let random = Math.floor(Math.random() * 100) + 1;
let index = nav.childElementCount + 1;
nav.append(generateElements(``)[0]);
content.append(generateElements(`
Never think of results, just do!
`)[0]);
//temporary solution to better update list
Vvveb.Components.render("elements/tabs");
}
let index = event.index + 1;
if (event.action == "remove") {
nav.querySelector("button:nth-child(" + index + ")").remove();
content.querySelector(".tab-pane:nth-child(" + index + ")").remove();
} else if (event.action == "select") {
let tab = nav.querySelector("button:nth-child(" + index + ")");
Vvveb.Builder.iframe.contentWindow.bootstrap.Tab.getOrCreateInstance(tab).show();
}
}
return node;
},
}
]
});
//Accordion
Vvveb.Components.add("elements/accordion", {
classes: ["accordion"],
name: "Accordeon",
image: "icons/accordion.svg",
html: `
Mauris viverra cursus ante laoreet eleifend. Donec vel fringilla ante. Aenean finibus velit id urna vehicula, nec maximus est sollicitudin
Mauris viverra cursus ante laoreet eleifend. Donec vel fringilla ante. Aenean finibus velit id urna vehicula, nec maximus est sollicitudin
Mauris viverra cursus ante laoreet eleifend. Donec vel fringilla ante. Aenean finibus velit id urna vehicula, nec maximus est sollicitudin
`,
afterDrop: function(node) {
//set unique accordion id
let parentId = Math.ceil(Math.random() * 1000);
//node.outerHTML = node.outerHTML.replaceAll('parentId', parentId);
node.id = 'accordion-' + parentId;
node.innerHTML = node.innerHTML.replaceAll('parentId', parentId);
return node;
},
properties: [{
//name: "List",
key: "list",
component: "elements/tab",
inline:false,
inputtype: ListInput,
data: {
selector:":scope > .accordion-item",
container:"",
prefix:"Item ",
name: "text",
nameElement: ".accordion-button",
removeElement: false,//handle manually
//"newElement": ``
},
onChange: function(node, value, input, component, event) {
let element = node;
let accordionId = element.id.replace('accordion-','');
if (event.action) {
if (event.action == "add") {
let random = Math.floor(Math.random() * 100) + 1;
let index = element.childElementCount + 1;
node.append(generateElements(`
Begin with the possible; begin with one step.
`)[0]);
//temporary solution to better update list
Vvveb.Components.render("elements/accordion");
}
let index = (event.index + 1);
if (event.action == "remove") {
node.querySelector(":scope > .accordion-item:nth-child(" + index + ")").remove();
} else if (event.action == "select") {
let el = node.querySelector(":scope > .accordion-item:nth-child(" + index + ")");
let btn= el.querySelector(".accordion-button");
let collapse = el.querySelector(" .collapse");
node.querySelectorAll(":scope > .accordion-item .collapse").forEach(e => e.classList.remove("show"));
node.querySelectorAll(":scope > .accordion-item .accordion-button").forEach(btn => btn.classList.add("collapsed"));
collapse.classList.add("show");
btn.classList.remove("collapsed");
//el[0].click();
//Vvveb.Builder.iframe.contentWindow.bootstrap.Collapse.getOrCreateInstance(el[0]).toggle();
}
}
return node;
},
},{
name: "Flush",
key: "flush",
htmlAttr: "class",
validValues: ["accordion-flush"],
inputtype: ToggleInput,
data: {
on: "accordion-flush",
off: ""
}
},
]
});
Vvveb.Components.add("elements/flip-box", {
classes: ["flip-box"],
name: "Flip box",
image: "icons/flipbox.svg",
html: `
Card title
Some quick example text to build on the card title and make up the bulk of the card's content.
Today I shall be meeting with interference, ingratitude, insolence, disloyalty, ill-will, and selfishness all of them due to the offenders' ignorance of what is good or evil.
`)[0]);
//temporary solution to better update list
Vvveb.Components.render("elements/social-icons");
}
if (event.action == "remove") {
node.querySelector(":scope > li:nth-child(" + event.index + ")").remove();
} else if (event.action == "select") {
let el = node.querySelector(":scope > li:nth-child(" + event.index + ")");
//el[0].click();
//Vvveb.Builder.iframe.contentWindow.bootstrap.Collapse.getOrCreateInstance(el[0]).toggle();
}
}
return node;
},
},{
name: "Inline",
key: "list-inline",
htmlAttr: "class",
validValues: ["list-inline"],
inputtype: ToggleInput,
data: {
on: "list-inline",
off: ""
}
},{
name: "Unstyled",
key: "list-unstyled",
htmlAttr: "class",
validValues: ["list-unstyled"],
inputtype: ToggleInput,
data: {
on: "list-unstyled",
off: ""
}
}]
});
function carouselAfterDrop(node) {
//check if swiper js is included and if not add it when drag starts to allow the script to load
body = Vvveb.Builder.frameBody;
if (!body.querySelector("#swiper-js")) {
let link = document.createElement('link');
let lib = document.createElement('script');
let code = document.createElement('script');
link.href = '../../libs/swiper/swiper-bundle.min.css';
link.id = 'swiper-css';
link.rel = 'stylesheet';
lib.id = 'swiper-js';
lib.type = 'text/javascript';
lib.src = '../../libs/swiper/swiper-bundle.min.js';
code.type = 'text/javascript';
code.text = `
let swiper = [];
function initSwiper(onlyNew = false) {
if (typeof Swiper == "undefined") return;
let list = document.querySelectorAll('.swiper' + (onlyNew ? ":not(.swiper-initialized)" : "") );
list.forEach(el => {
let params = {
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
pagination: {
el: ".swiper-pagination",
},
};
for (i in el.dataset) {
let param = el.dataset[i];
if (param[0] = '{') {
param = JSON.parse(param);
}
params[i] = param;
}
swiper.push(new Swiper(el, params))
//swiper.push(new Swiper(el, { ...{autoplay:{delay: 500}}, ...el.dataset}))
});
}
if (document.readyState !== 'loading') {
initSwiper();
} else {
document.addEventListener('DOMContentLoaded', initSwiper);
}`;
body.appendChild(link);
body.appendChild(lib);
body.appendChild(code);
lib.addEventListener('load', function() {
Vvveb.Builder.iframe.contentWindow.initSwiper();
});
} else {
Vvveb.Builder.iframe.contentWindow.initSwiper(true);
}
return node;
};
Vvveb.Components.add("elements/carousel", {
name: "Carousel",
image: "icons/carousel.svg",
classes: ["swiper"],
html: `
Slide 1
Slide 2
Slide 3
Slide 4
`,
afterDrop: carouselAfterDrop,
onChange: function (node, property, value) {
let element = node;
if (property.key == "autoplay" && value == true) {
value = {"waitForTransition":true,"enabled":value,"delay":element.dataset.delay};
}
element.swiper.params[property.key] = value;
element.swiper.originalParams[property.key] = value;
element.swiper.update();
return node;
},
properties: [{
name: "Slides",
key: "slidesPerView",
inputtype: ListInput,
htmlAttr:"data-slides-per-view",
inline:true,
data: {
selector:".swiper-slide",
container:".swiper-wrapper",
prefix:"Slide ",
removeElement: false,//handle manually with removeSlide
//"newElement": `
Slide 1
`
},
onChange: function(node, value, input, component, event) {
let element = node;
let dataset = {};
for (i in element.dataset) {
dataset[i] = element.dataset[i];
};
if (event.action) {
if (event.action == "add") {
let random = Math.floor(Math.random() * 6) + 1;
let index = element.swiper.slides.length + 1;
element.swiper.appendSlide(generateElements(`