/* 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: '
Container
', 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: '
', 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: '', 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 image cap\
\

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: '', 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: ``, properties: [{ name: "Divider", key: "--bs-breadcrumb-divider", htmlAttr: "style", inputtype: TextInput }] }); Vvveb.Components.extend("_base", "html/breadcrumbitem", { classes: ["breadcrumb-item"], name: "Breadcrumb Item", html: '', 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 1Cell 2Cell 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: '

    col-sm-4

    col-sm-4

    col-sm-4

    ', 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; } }] });