/*
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
*/
bgcolorClasses = ["bg-primary", "bg-secondary", "bg-success", "bg-danger", "bg-warning", "bg-info", "bg-light", "bg-dark", "bg-white"]
bgcolorSelectOptions =
[{
value: "Default",
text: ""
},
{
value: "bg-primary",
text: "Primary"
}, {
value: "bg-secondary",
text: "Secondary"
}, {
value: "bg-success",
text: "Success"
}, {
value: "bg-danger",
text: "Danger"
}, {
value: "bg-warning",
text: "Warning"
}, {
value: "bg-info",
text: "Info"
}, {
value: "bg-light",
text: "Light"
}, {
value: "bg-dark",
text: "Dark"
}, {
value: "bg-white",
text: "White"
}];
function changeNodeName(node, newNodeName)
{
var newNode;
newNode = document.createElement(newNodeName);
attributes = node.get(0).attributes;
for (i = 0, len = attributes.length; i < len; i++) {
newNode.setAttribute(attributes[i].nodeName, attributes[i].nodeValue);
}
$(newNode).append($(node).contents());
$(node).replaceWith(newNode);
return newNode;
}
var base_sort = 100;//start sorting for base component from 100 to allow extended properties to be first
var style_section = 'style';
var advanced_section = 'advanced';
Vvveb.Components.add("_base", {
name: "元素",
properties: [
{
key: "element_header",
inputtype: SectionInput,
name:false,
sort:base_sort++,
data: {header:"一般属性"},
}, {
name: "Id",
key: "id",
htmlAttr: "id",
sort: base_sort++,
inline:false,
col:6,
inputtype: TextInput
}, {
name: "Class",
key: "class",
htmlAttr: "class",
sort: base_sort++,
inline:false,
col:6,
inputtype: TextInput
}
]
});
//display
Vvveb.Components.extend("_base", "_base", {
properties: [
{
key: "display_header",
inputtype: SectionInput,
name:false,
sort: base_sort++,
section: style_section,
data: {header:"Display"},
}, {
//linked styles notice message
name:"",
key: "linked_styles_check",
sort: base_sort++,
section: style_section,
inline:false,
col:12,
inputtype: NoticeInput,
data: {
type:'warning',
title:'Linked styles',
text:'This element shares styles with other 4 elements, to apply styles only for this element enter a unique id eg: marketing-heading in in
Content > General > Id.
',
},
afterInit:function(node, inputElement) {
var selector = Vvveb.StyleManager.getSelectorForElement(node);
var elements = $(selector, window.FrameDocument);
if (elements.length <= 1) {
inputElement.hide();
} else {
$(".elements-count", inputElement).html(elements.length);
$(".text-muted", inputElement).html(selector);
$(".id-input", inputElement).click(function (){
$(".content-tab a").each(function() {
this.click();
});
setTimeout(function () { $("[name=id]").trigger("focus") }, 700);;
});
$(".linked-elements-hover", inputElement).
on("mouseenter", function (){
elements.css("outline","2px dotted blue");
}).
on("mouseleave", function (){
elements.css("outline","");
});
}
},
}, {
name: "Display",
key: "display",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: SelectInput,
validValues: ["block", "inline", "inline-block", "none"],
data: {
options: [{
value: "block",
text: "Block"
}, {
value: "inline",
text: "Inline"
}, {
value: "inline-block",
text: "Inline Block"
}, {
value: "inline-block",
text: "Inline Block"
}, {
value: "flex",
text: "Flex"
}, {
value: "inline-flex",
text: "Inline Flex"
}, {
value: "grid",
text: "Grid"
}, {
value: "inline-grid",
text: "Inline grid"
}, {
value: "table",
text: "Table"
}, {
value: "table-row",
text: "Table Row"
}, {
value: "list-item",
text: "List Item"
}, {
value: "inherit",
text: "Inherit"
}, {
value: "initial",
text: "Initial"
}, {
value: "none",
text: "none"
}]
}
}, {
name: "Position",
key: "position",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: SelectInput,
validValues: ["static", "fixed", "relative", "absolute"],
data: {
options: [{
value: "static",
text: "Static"
}, {
value: "fixed",
text: "Fixed"
}, {
value: "relative",
text: "Relative"
}, {
value: "absolute",
text: "Absolute"
}]
}
}, {
name: "指针事件",
key: "pointer-events",
htmlAttr: "data-pointer-events",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: SelectInput,
onChange: function(node, value) {
if (value === 'auto') {
$(node).children().css('pointer-events', 'auto');
$(node).css('pointer-events', 'auto');
} else {
$(node).css('pointer-events', 'none');
}
return node;
},
validValues: ["none", "auto"],
data: {
options: [{
value: "none",
text: "禁止"
}, {
value: "auto",
text: "启用"
}]
}
}, {
name: "Top",
key: "top",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
parent:"",
inputtype: CssUnitInput
}, {
name: "Left",
key: "left",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
parent:"",
inputtype: CssUnitInput
}, {
name: "Bottom",
key: "bottom",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
parent:"",
inputtype: CssUnitInput
}, {
name: "Right",
key: "right",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
parent:"",
inputtype: CssUnitInput
},{
name: "Float",
key: "float",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:12,
inline:false,
inputtype: RadioButtonInput,
data: {
extraclass:"btn-group-sm btn-group-fullwidth",
options: [{
value: "none",
icon:"la la-times",
//text: "None",
title: "None",
checked:true,
}, {
value: "left",
//text: "Left",
title: "Left",
icon:"la la-align-left",
checked:false,
}, {
value: "right",
//text: "Right",
title: "Right",
icon:"la la-align-right",
checked:false,
}],
}
}, {
name: "Opacity",
key: "opacity",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:12,
inline:false,
parent:"",
inputtype: RangeInput,
data:{
max: 1, //max zoom level
min:0,
step:0.1
},
}, {
name: "Background Color",
key: "background-color",
sort: base_sort++,
section: style_section,
col:6,
inline:true,
htmlAttr: "style",
inputtype: ColorInput,
}, {
name: "Text Color",
key: "color",
sort: base_sort++,
section: style_section,
col:6,
inline:true,
htmlAttr: "style",
inputtype: ColorInput,
}]
});
//Typography
var ComponentBaseTypography = {
properties: [
{
key: "typography_header",
inputtype: SectionInput,
name:false,
sort: base_sort++,
section: style_section,
data: {header:"Typography"},
}, {
name: "Font size",
key: "font-size",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Font weight",
key: "font-weight",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
}, {
value: "100",
text: "Thin"
}, {
value: "200",
text: "Extra-Light"
}, {
value: "300",
text: "Light"
}, {
value: "400",
text: "Normal"
}, {
value: "500",
text: "Medium"
}, {
value: "600",
text: "Semi-Bold"
}, {
value: "700",
text: "Bold"
}, {
value: "800",
text: "Extra-Bold"
}, {
value: "900",
text: "Ultra-Bold"
}],
}
}, {
name: "Font family",
key: "font-family",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:12,
inline:false,
inputtype: SelectInput,
data: {
options: fontList
}
}, {
name: "Text align",
key: "text-align",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:12,
inline:false,
inputtype: RadioButtonInput,
data: {
extraclass:"btn-group-sm btn-group-fullwidth",
options: [{
value: "",
icon:"la la-times",
//text: "None",
title: "None",
checked:true,
}, {
value: "left",
//text: "Left",
title: "Left",
icon:"la la-align-left",
checked:false,
}, {
value: "center",
//text: "Center",
title: "Center",
icon:"la la-align-center",
checked:false,
}, {
value: "right",
//text: "Right",
title: "Right",
icon:"la la-align-right",
checked:false,
}, {
value: "justify",
//text: "justify",
title: "Justify",
icon:"la la-align-justify",
checked:false,
}],
},
}, {
name: "Line height",
key: "line-height",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Letter spacing",
key: "letter-spacing",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Text decoration",
key: "text-decoration-line",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:12,
inline:false,
inputtype: RadioButtonInput,
data: {
extraclass:"btn-group-sm btn-group-fullwidth",
options: [{
value: "none",
icon:"la la-times",
//text: "None",
title: "None",
checked:true,
}, {
value: "underline",
//text: "Left",
title: "underline",
icon:"la la-long-arrow-alt-down",
checked:false,
}, {
value: "overline",
//text: "Right",
title: "overline",
icon:"la la-long-arrow-alt-up",
checked:false,
}, {
value: "line-through",
//text: "Right",
title: "Line Through",
icon:"la la-strikethrough",
checked:false,
}, {
value: "underline overline",
//text: "justify",
title: "Underline Overline",
icon:"la la-arrows-alt-v",
checked:false,
}],
},
}, {
name: "Decoration Color",
key: "text-decoration-color",
sort: base_sort++,
section: style_section,
col:6,
inline:true,
htmlAttr: "style",
inputtype: ColorInput,
}, {
name: "Decoration style",
key: "text-decoration-style",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:true,
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
}, {
value: "solid",
text: "Solid"
}, {
value: "wavy",
text: "Wavy"
}, {
value: "dotted",
text: "Dotted"
}, {
value: "dashed",
text: "Dashed"
}, {
value: "double",
text: "Double"
}],
}
}]
}
Vvveb.Components.extend("_base", "_base", ComponentBaseTypography);
//Size
var ComponentBaseSize = {
properties: [{
key: "size_header",
inputtype: SectionInput,
name:false,
sort: base_sort++,
section: style_section,
data: {header:"Size", expanded:false},
}, {
name: "Width",
key: "width",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Height",
key: "height",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Min Width",
key: "min-width",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Min Height",
key: "min-height",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Max Width",
key: "max-width",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Max Height",
key: "max-height",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}]
}
Vvveb.Components.extend("_base", "_base", ComponentBaseSize);
//Margin
var ComponentBaseMargin = {
properties: [{
key: "margins_header",
inputtype: SectionInput,
name:false,
sort: base_sort++,
section: style_section,
data: {header:"Margin", expanded:false},
}, {
name: "Top",
key: "margin-top",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Right",
key: "margin-right",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Bottom",
key: "margin-bottom",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Left",
key: "margin-left",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}]
}
Vvveb.Components.extend("_base", "_base", ComponentBaseMargin);
//Padding
var ComponentBasePadding = {
properties: [{
key: "paddings_header",
inputtype: SectionInput,
name:false,
sort: base_sort++,
section: style_section,
data: {header:"Padding", expanded:false},
}, {
name: "Top",
key: "padding-top",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Right",
key: "padding-right",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Bottom",
key: "padding-bottom",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Left",
key: "padding-left",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}]
}
Vvveb.Components.extend("_base", "_base", ComponentBasePadding);
//Border
Vvveb.Components.extend("_base", "_base", {
properties: [{
key: "border_header",
inputtype: SectionInput,
name:false,
sort: base_sort++,
section: style_section,
data: {header:"Border", expanded:false},
}, {
name: "Style",
key: "border-style",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:12,
inline:false,
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
}, {
value: "solid",
text: "Solid"
}, {
value: "dotted",
text: "Dotted"
}, {
value: "dashed",
text: "Dashed"
}],
}
}, {
name: "Width",
key: "border-width",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Color",
key: "border-color",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
htmlAttr: "style",
inputtype: ColorInput,
}]
});
//Border radius
Vvveb.Components.extend("_base", "_base", {
properties: [{
key: "border_radius_header",
inputtype: SectionInput,
name:false,
sort: base_sort++,
section: style_section,
data: {header:"Border radius", expanded:false},
}, {
name: "Top Left",
key: "border-top-left-radius",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Top Right",
key: "border-top-right-radius",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Bottom Left",
key: "border-bottom-left-radius",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}, {
name: "Bottom Right",
key: "border-bottom-right-radius",
htmlAttr: "style",
sort: base_sort++,
section: style_section,
col:6,
inline:false,
inputtype: CssUnitInput
}]
});
//Background image
Vvveb.Components.extend("_base", "_base", {
properties: [{
key: "background_image_header",
inputtype: SectionInput,
name:false,
sort: base_sort++,
section: style_section,
data: {header:"Background Image", expanded:false},
},{
name: "Image",
key: "Image",
sort: base_sort++,
section: style_section,
//htmlAttr: "style",
inputtype: ImageInput,
init: function(node) {
var image = $(node).css("background-image").replace(/url\(['"]?([^"\)$]+?)['"]?\).*/, '$1');
return image;
},
onChange: function(node, value) {
$(node).css('background-image', 'url(' + value + ')');
return node;
}
}, {
name: "Repeat",
key: "background-repeat",
sort: base_sort++,
section: style_section,
htmlAttr: "style",
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
}, {
value: "repeat-x",
text: "repeat-x"
}, {
value: "repeat-y",
text: "repeat-y"
}, {
value: "no-repeat",
text: "no-repeat"
}],
}
}, {
name: "Size",
key: "background-size",
sort: base_sort++,
section: style_section,
htmlAttr: "style",
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
}, {
value: "contain",
text: "contain"
}, {
value: "cover",
text: "cover"
}],
}
}, {
name: "Position x",
key: "background-position-x",
sort: base_sort++,
section: style_section,
htmlAttr: "style",
col:6,
inline:true,
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
}, {
value: "center",
text: "center"
}, {
value: "right",
text: "right"
}, {
value: "left",
text: "left"
}],
}
}, {
name: "Position y",
key: "background-position-y",
sort: base_sort++,
section: style_section,
htmlAttr: "style",
col:6,
inline:true,
inputtype: SelectInput,
data: {
options: [{
value: "",
text: "Default"
}, {
value: "center",
text: "center"
}, {
value: "top",
text: "top"
}, {
value: "bottom",
text: "bottom"
}],
}
}]
});
//Device visibility
var ComponentDeviceVisibility = {
properties: [{
key: "visibility_header",
inputtype: SectionInput,
name:false,
sort: base_sort++,
section: advanced_section,
data: {header:"Hide based on device screen width"},
}, {
name: "Extra small devices",
key: "hidexs",
col:6,
inline:true,
sort: base_sort++,
section: advanced_section,
htmlAttr: "class",
validValues: ["d-xs-none"],
inputtype: ToggleInput,
data: {
on: "d-xs-none",
off: ""
}
}, {
name: "Small devices",
key: "hidesm",
col:6,
inline:true,
sort: base_sort++,
section: advanced_section,
htmlAttr: "class",
validValues: ["d-sm-none"],
inputtype: ToggleInput,
data: {
on: "d-sm-none",
off: ""
}
}, {
name: "Medium devices",
key: "hidemd",
col:6,
inline:true,
sort: base_sort++,
section: advanced_section,
htmlAttr: "class",
validValues: ["d-md-none"],
inputtype: ToggleInput,
data: {
on: "d-md-none",
off: ""
}
}, {
name: "Large devices",
key: "hidelg",
col:6,
inline:true,
sort: base_sort++,
section: advanced_section,
htmlAttr: "class",
validValues: ["d-lg-none"],
inputtype: ToggleInput,
data: {
on: "d-lg-none",
off: ""
}
}, {
name: "Xl devices",
key: "hidexl",
col:6,
inline:true,
sort: base_sort++,
section: advanced_section,
htmlAttr: "class",
validValues: ["d-xl-none"],
inputtype: ToggleInput,
data: {
on: "d-xl-none",
off: ""
}
}, {
name: "Xxl devices",
key: "hidexxl",
col:6,
inline:true,
sort: base_sort++,
section: advanced_section,
htmlAttr: "class",
validValues: ["d-xxl-none"],
inputtype: ToggleInput,
data: {
on: "d-xxl-none",
off: ""
}
}]
};
Vvveb.Components.extend("_base", "_base", ComponentDeviceVisibility);
Vvveb.Components.add("config/bootstrap", {
name: "Bootstrap Variables",
beforeInit: function (node) {
properties = [];
var i = 0;
var j = 0;
let cssVars = Vvveb.ColorPaletteManager.getAllCSSVariableNames(window.FrameDocument.styleSheets, ":root");
for (type in cssVars) {
properties.push({
key: "cssVars" + type,
inputtype: SectionInput,
name:type,
sort: base_sort++,
data: {header:type[0].toUpperCase() + type.slice(1)},
});
for (selector in cssVars[type]) {
let friendlyName = selector.replaceAll(/--bs-/g,"").replaceAll("-", " ").trim();
friendlyName = friendlyName[0].toUpperCase() + friendlyName.slice(1);
let value = cssVars[type][selector];
let input;
data = {selector, type:value.type, step:"any"};
if (value.type == "color") {
input = ColorInput;
} else if (value.type == "font") {
input = SelectInput;
data.options = fontList;
} else if (value.type == "dimensions") {
input = CssUnitInput;
}
i++;
properties.push({
name: friendlyName,
key: "cssvar" + i,
defaultValue: value.value,
//index: i - 1,
columnNode: this,
col:(value.type == "font" || value.type == "dimensions") ? 12 : 4,
inline:true,
section: advanced_section,
inputtype: input,
data: data,
onChange: function(node, value, input) {
if (this.data.type == "font") {
let option = input.options[input.selectedIndex];
Vvveb.FontsManager.addFont(option.dataset.provider, value, node[0]);
}
Vvveb.StyleManager.setStyle(":root", this.data.selector, value);
return node;
},
});
}
}
this.properties = properties;
return node;
},
properties: [],
});