/*
Copyright 2017 Ziadin Givan
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
https://github.com/givanz/Vvvebjs
*/
Vvveb.ComponentsGroup['Bootstrap 5'] =
["html/container", "html/gridrow", "html/btn", "html/btn-link", "html/buttongroup", "html/buttontoolbar", "html/alert", "html/card", "html/listgroup", "html/badge", "html/progress", "html/navbar", "html/breadcrumbs", "html/pagination"];
Vvveb.Components.extend("_base", "html/container", {
classes: ["container", "container-fluid"],
image: "icons/container.svg",
html: '
',
name: "Container",
properties: [
{
name: "Type",
key: "type",
htmlAttr: "class",
inputtype: SelectInput,
validValues: ["container", "container-fluid"],
data: {
options: [{
value: "container",
text: "Default"
},{
value: "container-fluid",
text: "Fluid"
}]
}
},{
name: "Background",
key: "background",
htmlAttr: "class",
validValues: bgcolorClasses,
inputtype: SelectInput,
data: {
options: bgcolorSelectOptions
}
},{
name: "Background Color",
key: "background-color",
htmlAttr: "style",
inputtype: ColorInput,
},{
name: "Text Color",
key: "color",
htmlAttr: "style",
inputtype: ColorInput,
}],
});
Vvveb.Components.extend("html/link", "html/btn", {
classes: ["btn"],
nodes: null,
name: "Button",
image: "icons/button.svg",
html: 'Primary ',
properties: [{
name: "Background",
key: "background",
htmlAttr: "class",
inputtype: SelectInput,
validValues: ["btn-default", "btn-primary", "btn-info", "btn-success", "btn-warning", "btn-info", "btn-light", "btn-dark", "btn-outline-primary", "btn-outline-info", "btn-outline-success", "btn-outline-warning", "btn-outline-info", "btn-outline-light", "btn-outline-dark", "btn-link"],
data: {
options: [{
value: "btn-default",
text: "Default"
},{
value: "btn-primary",
text: "Primary"
},{
value: "btn btn-info",
text: "Info"
},{
value: "btn-success",
text: "Success"
},{
value: "btn-warning",
text: "Warning"
},{
value: "btn-info",
text: "Info"
},{
value: "btn-light",
text: "Light"
},{
value: "btn-dark",
text: "Dark"
},{
value: "btn-outline-primary",
text: "Primary outline"
},{
value: "btn btn-outline-info",
text: "Info outline"
},{
value: "btn-outline-success",
text: "Success outline"
},{
value: "btn-outline-warning",
text: "Warning outline"
},{
value: "btn-outline-info",
text: "Info outline"
},{
value: "btn-outline-light",
text: "Light outline"
},{
value: "btn-outline-dark",
text: "Dark outline"
},{
value: "btn-link",
text: "Link"
}]
}
},{
name: "Size",
key: "size",
htmlAttr: "class",
inputtype: SelectInput,
validValues: ["btn-lg", "btn-sm"],
data: {
options: [{
value: "",
text: "Default"
},{
value: "btn-lg",
text: "Large"
},{
value: "btn-sm",
text: "Small"
}]
}
},{
name: "Autofocus",
key: "autofocus",
htmlAttr: "autofocus",
inputtype: CheckboxInput,
inline:true,
col:6,
},{
name: "Disabled",
key: "disabled",
htmlAttr: "class",
inline:true,
col:6,
inputtype: ToggleInput,
validValues: ["disabled"],
data: {
on: "disabled",
off: null
}
},{
key: "link_options",
inputtype: SectionInput,
name:false,
data: {header:"Link"},
}]
});
Vvveb.Components.extend("_base", "html/buttongroup", {
classes: ["btn-group"],
name: "Button Group",
image: "icons/button_group.svg",
html: 'Left Middle Right
',
properties: [{
name: "Size",
key: "size",
htmlAttr: "class",
inputtype: SelectInput,
validValues: ["btn-group-lg", "btn-group-sm"],
data: {
options: [{
value: "",
text: "Default"
},{
value: "btn-group-lg",
text: "Large"
},{
value: "btn-group-sm",
text: "Small"
}]
}
},{
name: "Alignment",
key: "alignment",
htmlAttr: "class",
inputtype: SelectInput,
validValues: ["btn-group", "btn-group-vertical"],
data: {
options: [{
value: "",
text: "Default"
},{
value: "btn-group",
text: "Horizontal"
},{
value: "btn-group-vertical",
text: "Vertical"
}]
}
}]
});
Vvveb.Components.extend("_base", "html/buttontoolbar", {
classes: ["btn-toolbar"],
name: "Button Toolbar",
image: "icons/button_toolbar.svg",
html: ''
});
Vvveb.Components.extend("_base","html/alert", {
classes: ["alert"],
name: "Alert",
image: "icons/alert.svg",
html: '\
\
\
\
Holy guacamole! You should check in on some of those fields below.\
',
properties: [{
name: "Type",
key: "type",
htmlAttr: "class",
validValues: ["alert-primary", "alert-secondary", "alert-success", "alert-danger", "alert-warning", "alert-info", "alert-light", "alert-dark"],
inputtype: SelectInput,
data: {
options: [{
value: "alert-primary",
text: "Default"
},{
value: "alert-secondary",
text: "Secondary"
},{
value: "alert-success",
text: "Success"
},{
value: "alert-danger",
text: "Danger"
},{
value: "alert-warning",
text: "Warning"
},{
value: "alert-info",
text: "Info"
},{
value: "alert-light",
text: "Light"
},{
value: "alert-dark",
text: "Dark"
}]
}
}]
});
Vvveb.Components.extend("_base", "html/badge", {
classes: ["badge"],
image: "icons/badge.svg",
name: "Badge",
html: 'Primary badge ',
properties: [{
name: "Color",
key: "color",
htmlAttr: "class",
validValues:["bg-primary", "bg-secondary", "bg-success", "bg-danger", "bg-warning", "bg-info", "bg-body-secondary", "bg-dark"],
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
},{
value: "bg-primary",
text: "Primary"
},{
value: "bg-secondary",
text: "Secondary"
},{
value: "bg-success",
text: "Success"
},{
value: "bg-warning",
text: "Warning"
},{
value: "bg-danger",
text: "Danger"
},{
value: "bg-info",
text: "Info"
},{
value: "bg-body-secondary",
text: "Light"
},{
value: "bg-dark",
text: "Dark"
}]
}
}]
});
Vvveb.Components.extend("_base", "html/card", {
classes: ["card"],
image: "icons/panel.svg",
name: "Card",
html: '\
\
\
Card title \
Some quick example text to build on the card title and make up the bulk of the card\'s content.
\
Go somewhere \
\
'
});
Vvveb.Components.extend("_base", "html/listgroup", {
name: "List Group",
image: "icons/list_group.svg",
classes: ["list-group"],
html: '\n \n 14 \n Cras justo odio\n \n \n 2 \n Dapibus ac facilisis in\n \n \n 1 \n Morbi leo risus\n \n ',
properties: [{
name: "Flush",
key: "flush",
htmlAttr: "class",
validValues: ["", "list-group-flush"],
inputtype: ToggleInput,
data: {
on: "list-group-flush",
off: ""
}
},{
name: "Numbered",
key: "numbered",
htmlAttr: "class",
validValues: ["", "list-group-numbered"],
inputtype: ToggleInput,
data: {
on: "list-group-numbered",
off: ""
}
},{
name: "Horizontal",
key: "horizontal",
htmlAttr: "class",
validValues: ["", "list-group-horizontal"],
inputtype: ToggleInput,
data: {
on: "list-group-horizontal",
off: ""
}
}]
});
Vvveb.Components.extend("_base", "html/listitem", {
name: "List Item",
classes: ["list-group-item"],
html: '14 Cras justo odio ',
properties: [{
name: "Background",
key: "background",
htmlAttr: "class",
validValues:["list-group-item-primary", "list-group-item-secondary", "list-group-item-success", "list-group-item-danger", "list-group-item-warning", "list-group-item-info", "list-group-item-light", "list-group-item-dark"],
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
},{
value: "list-group-item-primary",
text: "Primary"
},{
value: "list-group-item-secondary",
text: "Secondary"
},{
value: "list-group-item-success",
text: "Success"
},{
value: "list-group-item-warning",
text: "Warning"
},{
value: "list-group-item-danger",
text: "Danger"
},{
value: "list-group-item-info",
text: "Info"
},{
value: "list-group-item-light",
text: "Light"
},{
value: "list-group-item-dark",
text: "Dark"
}]
}
}, {
name: "Active",
key: "active",
htmlAttr: "class",
validValues: ["", "active"],
inputtype: ToggleInput,
inline:true,
col:6,
data: {
on: "active",
off: ""
}
},{
name: "Disabled",
key: "disabled",
htmlAttr: "class",
validValues: ["", "disabled"],
inputtype: ToggleInput,
inline:true,
col:6,
data: {
on: "disabled",
off: ""
}
}]
});
Vvveb.Components.extend("_base", "html/breadcrumbs", {
classes: ["breadcrumb"],
name: "Breadcrumbs",
image: "icons/breadcrumbs.svg",
html: `
Home
Library
sBook
`,
properties: [{
name: "Divider",
key: "--bs-breadcrumb-divider",
htmlAttr: "style",
inputtype: TextInput
}]
});
Vvveb.Components.extend("_base", "html/breadcrumbitem", {
classes: ["breadcrumb-item"],
name: "Breadcrumb Item",
html: 'Library ',
properties: [{
name: "Active",
key: "active",
htmlAttr: "class",
validValues: ["", "active"],
inputtype: ToggleInput,
data: {
on: "active",
off: ""
}
}]
});
Vvveb.Components.extend("_base", "html/pagination", {
classes: ["pagination"],
name: "Pagination",
image: "icons/pagination.svg",
html: '\
\
',
properties: [{
name: "Size",
key: "size",
htmlAttr: "class",
inputtype: SelectInput,
validValues: ["pagination-lg", "pagination-sm"],
data: {
options: [{
value: "",
text: "Default"
},{
value: "pagination-lg",
text: "Large"
},{
value: "pagination-sm",
text: "Small"
}]
}
},{
name: "Alignment",
key: "alignment",
htmlAttr: "class",
inputtype: SelectInput,
validValues: ["justify-content-center", "justify-content-end"],
data: {
options: [{
value: "",
text: "Default"
},{
value: "justify-content-center",
text: "Center"
},{
value: "justify-content-end",
text: "Right"
}]
}
}]
});
Vvveb.Components.extend("_base", "html/pageitem", {
classes: ["page-item"],
html: '1 ',
name: "Pagination Item",
properties: [{
name: "Link To",
key: "href",
htmlAttr: "href",
child:".page-link",
inputtype: LinkInput
},{
name: "Active",
key: "active",
htmlAttr: "class",
validValues: ["active"],
inputtype: ToggleInput,
data: {
on: "active",
off: ""
}
},{
name: "Disabled",
key: "disabled",
htmlAttr: "class",
validValues: ["disabled"],
inputtype: ToggleInput,
data: {
on: "disabled",
off: ""
}
}]
});
Vvveb.Components.extend("_base", "html/progress", {
classes: ["progress"],
name: "Progress Bar",
image: "icons/progressbar.svg",
html: '',
properties: [{
name: "Background",
key: "background",
htmlAttr: "class",
validValues: bgcolorClasses,
inputtype: SelectInput,
data: {
options: bgcolorSelectOptions
}
},
{
name: "Progress",
key: "background",
child:".progress-bar",
htmlAttr: "class",
validValues: ["", "w-25", "w-50", "w-75", "w-100"],
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "None"
},{
value: "w-25",
text: "25%"
},{
value: "w-50",
text: "50%"
},{
value: "w-75",
text: "75%"
},{
value: "w-100",
text: "100%"
}]
}
},
{
name: "Progress background",
key: "background",
child:".progress-bar",
htmlAttr: "class",
validValues: bgcolorClasses,
inputtype: SelectInput,
data: {
options: bgcolorSelectOptions
}
},{
name: "Striped",
key: "striped",
child:".progress-bar",
htmlAttr: "class",
validValues: ["", "progress-bar-striped"],
inputtype: ToggleInput,
data: {
on: "progress-bar-striped",
off: "",
}
},{
name: "Animated",
key: "animated",
child:".progress-bar",
htmlAttr: "class",
validValues: ["", "progress-bar-animated"],
inputtype: ToggleInput,
data: {
on: "progress-bar-animated",
off: "",
}
}]
});
Vvveb.Components.extend("_base", "html/navbar", {
classes: ["navbar"],
image: "icons/navbar.svg",
name: "Nav Bar",
html: `
`,
properties: [{
name: "Color theme",
key: "color",
htmlAttr: "class",
validValues: ["navbar-light", "navbar-dark"],
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
},{
value: "navbar-light",
text: "Light"
},{
value: "navbar-dark",
text: "Dark"
}]
}
},{
name: "Background color",
key: "background",
htmlAttr: "class",
validValues: bgcolorClasses,
inputtype: SelectInput,
data: {
options: bgcolorSelectOptions
}
},{
name: "Placement",
key: "placement",
htmlAttr: "class",
validValues: ["fixed-top", "fixed-bottom", "sticky-top"],
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
},{
value: "fixed-top",
text: "Fixed Top"
},{
value: "fixed-bottom",
text: "Fixed Bottom"
},{
value: "sticky-top",
text: "Sticky top"
}]
}
}]
});
Vvveb.Components.extend("_base", "html/tablebody", {
nodes: ["tbody"],
name: "Table Body",
html: "Cell 1 Cell 2 Cell 3 "
});
Vvveb.Components.extend("_base", "html/gridcolumn", {
name: "Grid Column",
image: "icons/grid_column.svg",
classesRegex: ["col-"],
classes: ["col"],
html: '
col-sm-4 ',
properties: [{
name: "Column",
key: "column",
inline:false,
inputtype: GridInput,
data: {hide_remove:true},
beforeInit: function(node) {
_class = node.getAttribute("class");
let reg = /col(-[^-\$ ]*)?-?(\d+)?/g;
let match;
while ((match = reg.exec(_class)) != null) {
let key = "col" + ((match[1] != undefined) ? "_" + match[1].replace('-','') : "");
this.data[key] = match[2] ?? '';
}
},
onChange: function(node, value, input) {
let _class = node.getAttribute("class");
//remove previous breakpoint column size
_class = _class.replace(new RegExp(input.name + '-\\d+?'), '');
//add new column size
if (value) _class += ' ' + input.name + '-' + value;
node.setAttribute("class", _class);
return node;
},
}]
});
Vvveb.Components.extend("_base", "html/gridrow", {
name: "Grid Row",
image: "icons/grid_row.svg",
classes: ["row"],
html: '',
children :[{
name: "html/gridcolumn",
classesRegex: ["col-"],
}],
beforeInit: function (node) {
properties = [];
let i = 0;
let j = 0;
node.querySelectorAll('[class*="col-"],.col').forEach(el => {
_class = el.getAttribute("class");
let reg = /col(-[^-\$ ]*)?-?(\d+)?/g;
let match;
let data = {};
while ((match = reg.exec(_class)) != null) {
let key = "col" + ((match[1] != undefined) ? "_" + match[1].replace('-','') : "");
data[key] = match[2] ?? '';
}
i++;
properties.push({
name: "Column " + i,
key: "column" + i,
//index: i - 1,
columnNode: el,
col:12,
inline:false,
inputtype: GridInput,
data: data,
onChange: function(node, value, input) {
let column = this.columnNode;
//if remove button is clicked remove column and render row properties
if (input.nodeName == 'BUTTON') {
column.remove();
Vvveb.Components.render("html/gridrow");
return node;
}
//if select input then change column class
_class = column.getAttribute("class");
//remove previous breakpoint column size
_class = _class.replace(new RegExp(input.name + '-\\d+?'), '');
//add new column size
if (value) _class += ' ' + input.name + '-' + value;
column.setAttribute("class", _class);
return node;
},
});
});
//remove all column properties
this.properties = this.properties.filter(function(item) {
return item.key.indexOf("column") === -1;
});
//add remaining properties to generated column properties, put first 2 align properties first
this.properties = this.properties.slice(0,4).concat(properties, this.properties.slice(4));
return node;
},
properties: [{
name: "Direction",
key: "direction",
htmlAttr: "class",
inline:false,
validValues: ["", "flex-row", "flex-row-reverse", "flex-column", "flex-column-reverse"],
inputtype: RadioButtonInput,
data: {
extraclass:"btn-group-sm btn-group-fullwidth",
options: [{
value: "",
icon:"la la-times",
//text: "None",
title: "Default",
checked:true,
},{
value: "flex-row",
//text: "Left",
title: "Row - horizontal",
icon:"la la-arrow-right",
checked:false,
},{
value: "flex-column",
//text: "Center",
title: "Column - vertical",
icon:"la la-arrow-down",
checked:false,
},{
value: "flex-row-reverse",
//text: "Right",
title: "Row - reversed",
icon:"la la-arrow-left",
checked:false,
},{
value: "flex-column-reverse",
//text: "Center",
title: "Column - reversed",
icon:"la la-arrow-up",
checked:false,
}],
},
},{
name: "Vertical align",
key: "vertical-align",
htmlAttr: "class",
inline:false,
validValues: ["", "align-items-start", "align-items-center", "align-items-end", "align-items-baseline", "align-items-stretch"],
inputtype: RadioButtonInput,
data: {
extraclass:"btn-group-sm btn-group-fullwidth",
options: [{
value: "",
icon:"la la-times",
//text: "None",
title: "None",
checked:true,
},{
value: "align-items-start",
//text: "Left",
title: "Start",
icon:"la la-align-left",
checked:false,
},{
value: "align-items-center",
//text: "Center",
title: "Center",
icon:"la la-align-center",
checked:false,
},{
value: "align-items-end",
//text: "Right",
title: "End",
icon:"la la-align-right",
checked:false,
},{
value: "align-items-baseline",
title: "Baseline",
icon:"la la-indent",
checked:false,
},{
value: "align-items-stretch",
title: "Stretch",
icon:"la la-align-justify",
checked:false,
}],
},
},{
name: "Horizontal align",
key: "horizontal-align",
htmlAttr: "class",
inline:false,
validValues: ["", "justify-content-start", "justify-content-center", "justify-content-end", "justify-content-around", "justify-content-between", "justify-content-evenly"],
inputtype: RadioButtonInput,
data: {
extraclass:"btn-group-sm btn-group-fullwidth",
options: [{
value: "",
icon:"la la-times",
//text: "None",
title: "None",
checked:true,
},{
value: "justify-content-start",
//text: "Left",
title: "Start",
icon:"la la-align-left",
checked:false,
},{
value: "justify-content-center",
//text: "Center",
title: "Center",
icon:"la la-align-center",
checked:false,
},{
value: "justify-content-end",
//text: "Right",
title: "End",
icon:"la la-align-right",
checked:false
},{
value: "justify-content-around",
//text: "Left",
title: "Around",
icon:"la la-indent",
checked:false,
},{
value: "justify-content-between",
//text: "Center",
title: "Between",
icon:"la la-outdent",
checked:false,
},{
value: "justify-content-evenly",
//text: "Right",
title: "Evenly",
icon:"la la-align-justify",
checked:false,
}],
},
},{
name: "Wrap",
key: "wrap",
htmlAttr: "class",
inline:false,
validValues: ["", "flex-wrap", "flex-nowrap"],
inputtype: RadioButtonInput,
data: {
extraclass:"btn-group-sm btn-group-fullwidth",
options: [{
value: "",
icon:"la la-times",
//text: "None",
title: "None",
checked:true,
},{
value: "flex-wrap",
//text: "Left",
title: "Wrap",
icon:"la la-undo",
checked:false,
},{
value: "flex-nowrap",
//text: "Center",
title: "No wrap",
icon:"la la-arrow-right",
checked:false,
}],
},
},{
name: "Column",
key: "column1",
inputtype: GridInput
},{
name: "Column",
key: "column1",
inline:true,
col:12,
inputtype: GridInput
},{
name: "",
key: "addChild",
inputtype: ButtonInput,
data: {text:"Add column", icon:"la la-plus"},
onChange: function(node)
{
node.append(generateElements('
Col-3 ')[0]);
//render component properties again to include the new column inputs
Vvveb.Components.render("html/gridrow");
return node;
}
}]
});