背景图像生成 | CSS Background and Borders: Border-image generator
CSS Background and Borders: Border-image generator
这个工具可以用来生成CSS3 border-image
值。
边框图像生成器
HTML内容
<div id="container">
<div id="gallery">
<div id="image-gallery">
<img class="image" src="https://mdn.mozillademos.org/files/6007/border-image-1.png" data-stateID="border1"/>
<img class="image" src="https://mdn.mozillademos.org/files/6009/border-image-2.png" data-stateID="border2"/>
<img class="image" src="https://mdn.mozillademos.org/files/6011/border-image-3.png" data-stateID="border3"/>
<img class="image" src="https://mdn.mozillademos.org/files/6013/border-image-4.png" data-stateID="border4"/>
<img class="image" src="https://mdn.mozillademos.org/files/6015/border-image-5.png" data-stateID="border5"/>
<img class="image" src="https://mdn.mozillademos.org/files/6017/border-image-6.svg" data-stateID="border6"/>
</div>
</div>
<div id="load-actions" class="group section">
<div id="toggle-gallery" data-action="hide"> </div>
<div id="load-image" class="button"> Upload image </div>
<input id="remote-url" type="text" placeholder="Load an image from URL"/>
<div id="load-remote" class="button"> </div>
</div>
<div id="general-controls" class="group section">
<div class="name"> Control Box </div>
<div class="separator"></div>
<div class="property">
<div class="name">scale</div>
<div class="ui-input-slider" data-topic="scale"
data-unit="%" data-max="300" data-sensivity="10">
</div>
</div>
<div class="separator"></div>
<div class="property">
<div class="name">draggable</div>
<div class="ui-checkbox" data-topic='drag-subject'></div>
</div>
<div class="property right">
<div class="name">section height</div>
<div class="ui-input-slider" data-topic="preview-area-height"
data-min="400" data-max="1000">
</div>
</div>
</div>
<div id="preview_section" class="group section">
<div id="subject">
<div class="guideline" data-axis="Y" data-topic="slice-top"></div>
<div class="guideline" data-axis="X" data-topic="slice-right"></div>
<div class="guideline" data-axis="Y" data-topic="slice-bottom"></div>
<div class="guideline" data-axis="X" data-topic="slice-left"></div>
</div>
<div id="preview"> </div>
</div>
<!-- controls -->
<div id="controls" class="group section">
<!-- border-image-slice -->
<div id="border-slice-control" class="category">
<div class="title"> border-image-slice </div>
<div class="property">
<div class="name">fill</div>
<div class="ui-checkbox" data-topic='slice-fill'></div>
</div>
</div>
<!-- border-image-width -->
<div id="border-width-control" class="category">
<div class="title"> border-image-width </div>
</div>
<!-- border-image-outset -->
<div id="border-outset-control" class="category">
<div class="title"> border-image-outset </div>
</div>
<!-- other-settings -->
<div id="aditional-properties" class="category">
<div class="title"> aditional-properties </div>
<div class="property">
<div class="name"> repeat-x </div>
<div class="ui-dropdown border-repeat" data-topic="image-repeat-X" data-selected="2">
<div data-value="0">repeat</div>
<div data-value="0">stretch</div>
<div data-value="0">round</div>
</div>
</div>
<div class="property">
<div class="name"> repeat-y </div>
<div class="ui-dropdown border-repeat" data-topic="image-repeat-Y" data-selected="2">
<div data-value="1">repeat</div>
<div data-value="1">stretch</div>
<div data-value="1">round</div>
</div>
</div>
<div class="property">
<div class="ui-input-slider" data-topic="font-size" data-info="em size"
data-unit="px" data-value="12" data-sensivity="3">
</div>
</div>
<div class="property">
<div class="ui-input-slider" data-topic="preview-width" data-info="width"
data-unit=" px" data-min="10" data-max="10000" data-sensivity="3"></div>
</div>
<div class="property">
<div class="ui-input-slider" data-topic="preview-height" data-info="height"
data-unit=" px" data-min="10" data-max="10000" data-sensivity="3">
</div>
</div>
</div>
<div id="output" class="category">
<div class="title"> CSS Code </div>
<div class="css-property">
<span class="name"> border-image-slice: </span>
<span id="out-border-slice" class="value"> </span>
</div>
<div class="css-property">
<span class="name"> border-image-width: </span>
<span id="out-border-width" class="value"> </span>
</div>
<div class="css-property">
<span class="name"> border-image-outset: </span>
<span id="out-border-outset" class="value"> </span>
</div>
<div class="css-property">
<span class="name"> border-image-repeat: </span>
<span id="out-border-repeat" class="value"> </span>
</div>
<div class="css-property">
<span class="name"> border-image-source: </span>
<span id="out-border-source" class="value"> </span>
</div>
</div>
</div>
</div>
CSS内容
/* GRID OF TWELVE
* ========================================================================== */
.span_12 {
width: 100%;
}
.span_11 {
width: 91.46%;
}
.span_10 {
width: 83%;
}
.span_9 {
width: 74.54%;
}
.span_8 {
width: 66.08%;
}
.span_7 {
width: 57.62%;
}
.span_6 {
width: 49.16%;
}
.span_5 {
width: 40.7%;
}
.span_4 {
width: 32.24%;
}
.span_3 {
width: 23.78%;
}
.span_2 {
width: 15.32%;
}
.span_1 {
width: 6.86%;
}
/* SECTIONS
* ========================================================================== */
.section {
clear: both;
padding: 0px;
margin: 0px;
}
/* GROUPING
* ========================================================================== */
.group:before, .group:after {
content: "";
display: table;
}
.group:after {
clear:both;
}
.group {
zoom: 1; /* For IE 6/7 (trigger hasLayout) */
}
/* GRID COLUMN SETUP
* ========================================================================== */
.col {
display: block;
float:left;
margin: 1% 0 1% 1.6%;
}
.col:first-child {
margin-left: 0;
} /* all browsers except IE6 and lower */
/*
* UI Component
*/
.ui-input-slider {
height: 20px;
font-family: "Segoe UI", Arial, Helvetica, sans-serif;
-moz-user-select: none;
user-select: none;
}
.ui-input-slider * {
float: left;
height: 100%;
line-height: 100%;
}
/* Input Slider */
.ui-input-slider > input {
margin: 0;
padding: 0;
width: 50px;
text-align: center;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.ui-input-slider-info {
width: 90px;
padding: 0px 10px 0px 0px;
text-align: right;
text-transform: lowercase;
}
.ui-input-slider-left, .ui-input-slider-right {
width: 16px;
cursor: pointer;
background: url("https://mdn.mozillademos.org/files/5679/arrows.png") center left no-repeat;
}
.ui-input-slider-right {
background: url("https://mdn.mozillademos.org/files/5679/arrows.png") center right no-repeat;
}
.ui-input-slider-name {
width: 90px;
padding: 0 10px 0 0;
text-align: right;
text-transform: lowercase;
}
.ui-input-slider-btn-set {
width: 25px;
background-color: #2C9FC9;
border-radius: 5px;
color: #FFF;
font-weight: bold;
line-height: 14px;
text-align: center;
}
.ui-input-slider-btn-set:hover {
background-color: #379B4A;
cursor: pointer;
}
/*************************************************************************************/
/*************************************************************************************/
/*
* UI DropDown
*/
/* Dropdown */
.ui-dropdown {
height: 2em;
width: 120px;
font-family: "Segoe UI", Arial, Helvetica, sans-serif;
font-size: 12px;
background-image: url("https://mdn.mozillademos.org/files/6037/drop_arrow_icon.png"
background-position: right center;
background-repeat: no-repeat;
background-color: #359740;
position: relative;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
.ui-dropdown:hover {
cursor: pointer;
background-color: #208B20;
}
/* Dropdown Select Button */
.ui-dropdown-select {
height: inherit;
padding: 0 0.75em;
color: #FFF;
line-height: 2em;
}
/* Dropdown List */
.ui-dropdown-list {
width: 100%;
height: 150px;
max-height: 150px;
margin: 0;
padding: 0 0.3em;
border: 3px solid #3490D2;
border-color: #208B20;
background: #666;
background-color: #EEF1F5;
color: #000;
position: absolute;
top: 2em;
left: 0;
z-index: 100;
overflow: hidden;
transition: all 0.3s;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.ui-dropdown-list:hover {
overflow: auto;
}
.ui-dropdown-list[data-hidden='true'] {
height: 0 !important;
opacity: 0;
visibility: hidden;
}
.ui-dropdown[data-position='left'] .ui-dropdown-list {
left: -100%;
top: 0;
}
.ui-dropdown[data-position='right'] .ui-dropdown-list {
left: 100%;
top: 0;
}
.ui-dropdown-list > div {
width: 100%;
height: 1.6em;
margin: 0.3em 0;
padding: 0.3em;
line-height: 1em;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.ui-dropdown-list > div:hover {
background: #3490D2;
color:#FFF;
border-radius: 2px;
cursor: pointer;
}
/*************************************************************************************/
/*************************************************************************************/
/*
* UI Button
*/
/* Checkbox */
.ui-checkbox {
text-align: center;
font-size: 16px;
font-family: "Segoe UI", Arial, Helvetica, sans-serif;
line-height: 1.5em;
color: #FFF;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
.ui-checkbox > input {
display: none;
}
.ui-checkbox > label {
font-size: 12px;
padding: 0.333em 1.666em 0.5em;
height: 1em;
line-height: 1em;
background-color: #888;
background-image: url("https://mdn.mozillademos.org/files/5683/disabled.png"
background-position: center center;
background-repeat: no-repeat;
color: #FFF;
border-radius: 2px;
font-weight: bold;
float: left;
}
.ui-checkbox .text {
padding-left: 34px;
background-position: center left 10px;
}
.ui-checkbox .left {
padding-right: 34px;
padding-left: 1.666em;
background-position: center right 10px;
}
.ui-checkbox > label:hover {
cursor: pointer;
}
.ui-checkbox > input:checked + label {
background-image: url("https://mdn.mozillademos.org/files/5681/checked.png"
background-color: #379B4A;
}
/*************************************************************************************/
/*************************************************************************************/
/*
* BORDER IMAGE GENERATOR TOOL
*/
body {
width: 100%;
margin: 0 auto;
padding: 0 0 20px 0;
font-family: "Segoe UI", Arial, Helvetica, sans-serif;
/*background: url("https://mdn.mozillademos.org/files/6025/grain.png"*/
border: 1px solid #EEE;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
body[data-move='X'] {
cursor: w-resize !important;
}
body[data-move='Y'] {
cursor: s-resize !important;
}
#container {
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
[data-draggable='true']:hover {
cursor: move;
}
[data-draggable='true']:hover > * {
cursor: default;
}
/******************************************************************************/
/******************************************************************************/
/*
* Border Image Picker
*/
#gallery {
box-shadow: 0 0 3px 0 #BABABA;
}
#image-gallery {
width: 600px;
height: 100px;
margin: 0 auto;
transition: margin 0.4s;
}
#image-gallery .image {
height: 80px;
float: left;
margin: 10px;
opacity: 0.5;
background-color: #FFF;
box-shadow: 0px 0px 3px 1px #BABABA;
}
#image-gallery .image[selected="true"] {
box-shadow: 0px 0px 3px 1px #3BBA52;
opacity: 1;
}
#image-gallery .image:hover {
cursor: pointer;
box-shadow: 0px 0px 3px 1px #30ACE5;
opacity: 1;
}
#image-gallery[data-collapsed='true'] {
margin-top: -100px;
}
/* Load Menu */
#load-actions {
margin: 10px 0;
}
#toggle-gallery {
width: 30px;
height: 25px;
margin: 10px;
color: #FFF;
background-image: url('https://mdn.mozillademos.org/files/6005/arrow-up-white.png'
background-repeat: no-repeat;
background-position: top 4px center;
background-color: #888888 !important;
border-radius: 2px;
float: left;
}
#toggle-gallery:hover {
cursor: pointer;
}
#toggle-gallery[data-action='show'] {
background-image: url('https://mdn.mozillademos.org/files/6001/arrow-down-white.png'
background-color: #888888 !important;
}
#toggle-gallery[data-action='hide'] {
background-image: url('https://mdn.mozillademos.org/files/6005/arrow-up-white.png'
}
.button {
width: 100px;
height: 25px;
margin: 10px;
color: #FFF;
text-align: center;
font-size: 12px;
line-height: 25px;
background-color: #379B4A;
border-radius: 2px;
float: left;
}
.button:hover {
cursor: pointer;
background-color: #3380C4;
}
#load-image {
float: left;
}
#load-remote {
width: 30px;
background-image: url('https://mdn.mozillademos.org/files/6003/arrow-right-white.png'
background-repeat: no-repeat;
background-position: center center;
}
#remote-url {
width: 200px;
height: 23px;
margin: 10px;
padding: 0 5px;
border: 1px solid #379B4A;
border-radius: 2px;
float: left;
transition: width 0.5s;
}
#remote-url:focus {
box-shadow: 0px 0px 3px -1px #379B4A; /*#68ACE8; */
border-color: rgba(55, 155, 74, 0.5
width: 450px;
}
/*
* Visible Area
*/
#preview_section {
position: relative;
min-height: 400px;
}
/* Image Control */
#subject {
width: 300px;
height: 300px;
background-repeat: no-repeat;
background-size: 100%;
background-color: #FFF;
border: 1px solid #CCC;
position: absolute;
z-index: 10;
top: 15%;
left: 10%;
box-shadow: 0 0 3px 0 #BABABA;
transition-property: width, height;
transition-duration: 0.1s;
}
#subject .guideline {
background-color: rgba(255, 255, 255, 0.7
border: 1px solid rgba(0, 0, 0, 0.3
position: absolute;
}
#subject .guideline:hover {
background-color: #F00;
}
#subject .guideline[data-active] {
background-color: #F00;
z-index: 10;
}
#subject .guideline[data-axis='X'] {
width: 1px;
height: 100%;
top: -1px;
}
#subject .guideline[data-axis='Y'] {
width: 100%;
height: 1px;
left: -1px;
}
#subject .guideline[data-axis='X']:hover {
cursor: w-resize;
}
#subject .guideline[data-axis='Y']:hover {
cursor: s-resize;
}
#subject .relative {
position: relative;
font-size: 12px;
}
#subject .tooltip, #subject .tooltip2 {
width: 40px;
height: 20px;
line-height: 20px;
font-size: 12px;
text-align: center;
position: absolute;
opacity: 0.5;
transition: opacity 0.25s;
}
#subject .tooltip {
background: #EEE;
border-radius: 2px;
border: 1px solid #CCC;
}
#subject .tooltip2{
color: #555;
}
#subject [data-active] > * {
opacity: 1;
}
#subject .tooltip[data-info='top'] {
top: -10px;
right: -50px;
}
#subject .tooltip[data-info='right'] {
bottom: -30px;
right: -20px;
}
#subject .tooltip[data-info='bottom'] {
top: -10px;
left: -50px;
}
#subject .tooltip[data-info='left'] {
top: -30px;
right: -20px;
}
#subject .tooltip2[data-info='top'] {
top: -10px;
left: -50px;
}
#subject .tooltip2[data-info='right'] {
top: -30px;
right: -20px;
}
#subject .tooltip2[data-info='bottom'] {
top: -10px;
right: -50px;
}
#subject .tooltip2[data-info='left'] {
bottom: -30px;
right: -20px;
}
/* Preview */
#preview {
width: 30%;
height: 50%;
background-color: #FFF;
text-align: center;
overflow: hidden;
position: absolute;
z-index: 10;
left: 60%;
top: 15%;
border-radius: 2px;
border-image-width: 20px;
border-image-repeat: round;
box-shadow: 0 0 3px 0 #BABABA;
}
#preview .resize-handle {
width: 10px;
height: 10px;
background: url("https://mdn.mozillademos.org/files/6027/resize.png") center center no-repeat;
position: absolute;
bottom: 0;
right: 0;
}
#preview .resize-handle:hover {
cursor: nw-resize;
}
/*
* General controls MENU
*/
#general-controls {
padding: 10px 30px;
background-color: #FFF;
opacity: 0.95;
color: #888;
/*border-radius: 2px;*/
box-shadow: 0 0 3px 0 #BABABA;
}
#general-controls .property {
width: 130px;
float: left;
}
#general-controls .name {
height: 20px;
margin: 0 10px 0 0;
line-height: 100%;
text-align: right;
float: left;
}
#general-controls .right {
width: 200px;
float: right;
}
#general-controls .ui-checkbox label {
height: 10px;
}
#general-controls .separator {
height: 40px;
width: 1px;
margin: -10px 15px;
background-color: #EEE;
float: left;
}
/*
* Controls
*/
#controls {
color: #444;
margin: 10px 0 0 0;
}
#controls .category {
height: 190px;
min-width: 260px;
margin: 10px;
padding: 10px;
border: 1px solid #CCC;
border-radius: 3px;
float: left;
box-shadow: 0 0 3px 0 #BABABA;
transition: all 0.25s;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
@media (min-width: 880px) {
#controls .category {
width: 30%;
margin-left: 1.66%;
margin-right: 1.66%;
}
}
@media (max-width: 879px) {
#controls .category {
width: 37%;
margin-left: 6.5%;
margin-right: 6.5%;
}
}
#controls .category .title {
width: 100%;
height: 30px;
margin: 0 0 10px 0;
line-height: 25px;
text-align: center;
color: #AAA;
}
#controls .category:hover .title {
color: #777;
}
#controls .category > .group {
border: 1px solid #CCC;
border-radius: 2px;
}
/* property */
#controls .property {
width: 250px;
height: 20px;
margin: 5px auto;
}
#controls .property .ui-input-slider {
margin: 0;
float: left;
}
#controls .property .ui-input-slider-info {
width: 60px;
}
#controls .property .ui-input-slider-left {
transition: opacity 0.15s;
opacity: 0;
}
#controls .property .ui-input-slider-right {
transition: opacity 0.15s;
opacity: 0;
}
#controls .property .name {
width: 60px;
height: 20px;
padding: 0px 10px 0px 0px;
text-align: right;
line-height: 100%;
float: left;
}
#controls .property .config {
width: 20px;
height: 20px;
float: left;
background: url("https://mdn.mozillademos.org/files/6021/config.png") center center no-repeat;
opacity: 0.5;
}
#controls .property .config:hover {
cursor: pointer;
opacity: 1;
}
#controls .ui-input-slider:hover .ui-input-slider-right {
opacity: 1;
}
#controls .ui-input-slider:hover .ui-input-slider-left {
opacity: 1;
}
#controls .property .ui-dropdown {
margin: 0 10px;
float: left;
}
#controls .property .ui-checkbox {
margin: 0 0 0 16px;
float: left;
}
#controls .property .ui-checkbox label {
height: 0.85em;
width: 10px;
}
/* dropdowns */
#controls .ui-dropdown {
width: 50px;
height: 1.7em;
border-radius: 2px;
}
#controls .ui-dropdown-select {
line-height: 1.6em;
}
#controls .ui-dropdown-list {
top: 20px;
}
#controls .ui-dropdown-list {
border-width: 1px;
text-align: center;
}
#controls .ui-dropdown-list:hover {
overflow: hidden;
}
#controls .border-repeat {
margin: 0 0 0 16px !important;
width: 80px;
}
#controls .border-repeat .ui-dropdown-list {
height: 6.2em;
border-width: 1px;
text-align: center;
}
/* border-image-slice */
#border-slice-control .ui-dropdown-list {
height: 4.3em;
}
/* border-image-width */
#border-width-control .ui-dropdown-list {
height: 6.2em;
}
/* border-image-outset */
#border-outset-control .ui-dropdown-list {
height: 4.3em;
}
#aditional-properties .property {
width: 200px;
}
#aditional-properties .ui-input-slider > input {
width: 80px !important;
}
/* unit settings panel */
#unit-settings {
padding: 10px;
position: absolute;
background: #FFF;
font-size: 12px;
border-radius: 3px;
border: 1px solid #CCC;
text-align: center;
color: #555;
position: absolute;
z-index: 1000;
box-shadow: 0 0 3px 0 #BABABA;
transition: all 0.25s;
}
#unit-settings .title {
width: 100%;
margin: -5px auto 0;
color: #666;
font-size: 14px;
font-weight: bold;
line-height: 25px;
border-bottom: 1px solid #E5E5E5;
}
#unit-settings .ui-input-slider {
margin: 10px 0 0 0;
}
#unit-settings .ui-input-slider-info {
width: 50px;
line-height: 1.5em;
}
#unit-settings input {
font-size: 12px;
width: 40px !important;
}
#unit-settings .close {
width: 16px;
height: 16px;
background: url('https://mdn.mozillademos.org/files/6019/close.png') no-repeat center center;
background-size: 75%;
position: absolute;
top: 4px;
right: 4px;
opacity: 0.5;
}
#unit-settings .close:hover {
cursor: pointer;
opacity: 1;
}
#unit-settings[data-active='true'] {
opacity: 1;
}
#unit-settings[data-active='false'] {
opacity: 0;
top: -100px !important;
}
/*
* CSS Output Code
*/
#output {
padding: 10px;
border: 2px dashed #888 !important;
box-shadow: none !important;
border-radius: 3px;
overflow: hidden;
-moz-user-select: text;
-webkit-user-select: text;
-ms-user-select: text;
user-select: text;
}
@media (min-width: 880px) {
#output {
width: 63.33% !important;
}
}
@media (max-width: 879px) {
#output {
width: 87% !important;
}
}
#output .title {
width: 100%;
height: 30px;
margin: 0 0 10px 0;
line-height: 25px;
text-align: center;
color: #AAA;
}
#output .css-property {
width: 100%;
margin: 0;
color: #555;
font-size: 14px;
line-height: 18px;
float: left;
}
#output .css-property .name {
width: 30%;
font-weight: bold;
text-align: right;
float: left;
}
#output .css-property .value {
width: 65%;
padding: 0 2.5%;
word-break: break-all;
float: left;
}
JavaScript内容
'use strict';
/**
* UI-SlidersManager
*/
var InputSliderManager = (function InputSliderManager() {
var subscribers = {};
var sliders = [];
var InputComponent = function InputComponent(obj) {
var input = document.createElement('input'
input.setAttribute('type', 'text'
input.style.width = 50 + obj.precision * 10 + 'px';
input.addEventListener('click', function(e) {
this.select(
}
input.addEventListener('change', function(e) {
var value = parseFloat(e.target.value
if (isNaN(value) === true)
setValue(obj.topic, obj.value
else
setValue(obj.topic, value
}
return input;
};
var SliderComponent = function SliderComponent(obj, sign) {
var slider = document.createElement('div'
var startX = null;
var start_value = 0;
slider.addEventListener("click", function(e) {
document.removeEventListener("mousemove", sliderMotion
setValue(obj.topic, obj.value + obj.step * sign
}
slider.addEventListener("mousedown", function(e) {
startX = e.clientX;
start_value = obj.value;
document.body.style.cursor = "e-resize";
document.addEventListener("mouseup", slideEnd
document.addEventListener("mousemove", sliderMotion
}
var slideEnd = function slideEnd(e) {
document.removeEventListener("mousemove", sliderMotion
document.body.style.cursor = "auto";
slider.style.cursor = "pointer";
};
var sliderMotion = function sliderMotion(e) {
slider.style.cursor = "e-resize";
var delta = (e.clientX - startX) / obj.sensivity | 0;
var value = delta * obj.step + start_value;
setValue(obj.topic, value
};
return slider;
};
var InputSlider = function(node) {
var min = parseFloat(node.getAttribute('data-min')
var max = parseFloat(node.getAttribute('data-max')
var step = parseFloat(node.getAttribute('data-step')
var value = parseFloat(node.getAttribute('data-value')
var topic = node.getAttribute('data-topic'
var unit = node.getAttribute('data-unit'
var name = node.getAttribute('data-info'
var sensivity = node.getAttribute('data-sensivity') | 0;
var precision = node.getAttribute('data-precision') | 0;
this.min = isNaN(min) ? 0 : min;
this.max = isNaN(max) ? 100 : max;
this.precision = precision >= 0 ? precision : 0;
this.step = step < 0 || isNaN(step) ? 1 : step.toFixed(precision
this.topic = topic;
this.node = node;
this.unit = unit === null ? '' : unit;
this.sensivity = sensivity > 0 ? sensivity : 5;
value = isNaN(value) ? this.min : value;
var input = new InputComponent(this
var slider_left = new SliderComponent(this, -1
var slider_right = new SliderComponent(this, 1
slider_left.className = 'ui-input-slider-left';
slider_right.className = 'ui-input-slider-right';
if (name) {
var info = document.createElement('span'
info.className = 'ui-input-slider-info';
info.textContent = name;
node.appendChild(info
}
node.appendChild(slider_left
node.appendChild(input
node.appendChild(slider_right
this.input = input;
sliders[topic] = this;
setValue(topic, value
};
InputSlider.prototype.setInputValue = function setInputValue() {
this.input.value = this.value.toFixed(this.precision) + this.unit;
};
var setValue = function setValue(topic, value, send_notify) {
var slider = sliders[topic];
if (slider === undefined)
return;
value = parseFloat(value.toFixed(slider.precision)
if (value > slider.max) value = slider.max;
if (value < slider.min) value = slider.min;
slider.value = value;
slider.node.setAttribute('data-value', value
slider.setInputValue(
if (send_notify === false)
return;
notify.call(slider
};
var setMax = function setMax(topic, value) {
var slider = sliders[topic];
if (slider === undefined)
return;
slider.max = value;
setValue(topic, slider.value
};
var setMin = function setMin(topic, value) {
var slider = sliders[topic];
if (slider === undefined)
return;
slider.min = value;
setValue(topic, slider.value
};
var setUnit = function setUnit(topic, unit) {
var slider = sliders[topic];
if (slider === undefined)
return;
slider.unit = unit;
setValue(topic, slider.value
};
var setStep = function setStep(topic, value) {
var slider = sliders[topic];
if (slider === undefined)
return;
slider.step = parseFloat(value
setValue(topic, slider.value
};
var setPrecision = function setPrecision(topic, value) {
var slider = sliders[topic];
if (slider === undefined)
return;
value = value | 0;
slider.precision = value;
var step = parseFloat(slider.step.toFixed(value)
if (step === 0)
slider.step = 1 / Math.pow(10, value
setValue(topic, slider.value
};
var setSensivity = function setSensivity(topic, value) {
var slider = sliders[topic];
if (slider === undefined)
return;
value = value | 0;
slider.sensivity = value > 0 ? value : 5;
};
var getNode = function getNode(topic) {
return sliders[topic].node;
};
var getPrecision = function getPrecision(topic) {
return sliders[topic].precision;
};
var getStep = function getStep(topic) {
return sliders[topic].step;
};
var subscribe = function subscribe(topic, callback) {
if (subscribers[topic] === undefined)
subscribers[topic] = [];
subscribers[topic].push(callback
};
var unsubscribe = function unsubscribe(topic, callback) {
subscribers[topic].indexOf(callback
subscribers[topic].splice(index, 1
};
var notify = function notify() {
if (subscribers[this.topic] === undefined)
return;
for (var i = 0; i < subscribers[this.topic].length; i++)
subscribers[this.topic][i](this.value
};
var createSlider = function createSlider(topic, label) {
var slider = document.createElement('div'
slider.className = 'ui-input-slider';
slider.setAttribute('data-topic', topic
if (label !== undefined)
slider.setAttribute('data-info', label
new InputSlider(slider
return slider;
};
var init = function init() {
var elem = document.querySelectorAll('.ui-input-slider'
var size = elem.length;
for (var i = 0; i < size; i++)
new InputSlider(elem[i]
};
return {
init : init,
setMax : setMax,
setMin : setMin,
setUnit : setUnit,
setStep : setStep,
getNode : getNode,
getStep : getStep,
setValue : setValue,
subscribe : subscribe,
unsubscribe : unsubscribe,
setPrecision : setPrecision,
setSensivity : setSensivity,
getPrecision : getPrecision,
createSlider : createSlider,
};
})(
/**
* UI-DropDown Select
*/
var DropDownManager = (function DropdownManager() {
var subscribers = {};
var dropdowns = [];
var active = null;
var visbility = ["hidden", "visible"];
var DropDown = function DropDown(node) {
var topic = node.getAttribute('data-topic'
var label = node.getAttribute('data-label'
var selected = node.getAttribute('data-selected') | 0;
var select = document.createElement('div'
var list = document.createElement('div'
var uval = 0;
var option = null;
var option_value = null;
list.className = 'ui-dropdown-list';
select.className = 'ui-dropdown-select';
while (node.firstElementChild !== null) {
option = node.firstElementChild;
option_value = option.getAttribute('data-value'
if (option_value === null)
option.setAttribute('data-value', uval
list.appendChild(node.firstElementChild
uval++;
}
node.appendChild(select
node.appendChild(list
select.onclick = this.toggle.bind(this
list.onclick = this.updateValue.bind(this
document.addEventListener('click', clickOut
this.state = 0;
this.time = 0;
this.dropmenu = list;
this.select = select;
this.toggle(false
this.value = {};
this.topic = topic;
if (label)
select.textContent = label;
else
this.setNodeValue(list.children[selected]
dropdowns[topic] = this;
};
DropDown.prototype.toggle = function toggle(state) {
if (typeof(state) === 'boolean')
this.state = state === false ? 0 : 1;
else
this.state = 1 ^ this.state;
if (active !== this) {
if (active)
active.toggle(false
active = this;
}
if (this.state === 0)
this.dropmenu.setAttribute('data-hidden', 'true'
else
this.dropmenu.removeAttribute('data-hidden'
};
var clickOut = function clickOut(e) {
if (active.state === 0 ||
e.target === active.dropmenu ||
e.target === active.select)
return;
active.toggle(false
};
DropDown.prototype.updateValue = function updateValue(e) {
if (Date.now() - this.time < 500)
return;
if (e.target.className !== "ui-dropdown-list") {
this.setNodeValue(e.target
this.toggle(false
}
this.time = Date.now(
};
DropDown.prototype.setNodeValue = function setNodeValue(node) {
this.value['name'] = node.textContent;
this.value['value'] = node.getAttribute('data-value'
this.select.textContent = node.textContent;
this.select.setAttribute('data-value', this.value['value']
notify.call(this
};
var createDropDown = function createDropDown(topic, options) {
var dropdown = document.createElement('div'
dropdown.setAttribute('data-topic', topic
dropdown.className = 'ui-dropdown';
for (var i in options) {
var x = document.createElement('div'
x.setAttribute('data-value', i
x.textContent = options[i];
dropdown.appendChild(x
}
new DropDown(dropdown
return dropdown;
};
var setValue = function setValue(topic, index) {
if (dropdowns[topic] === undefined ||
index >= dropdowns[topic].dropmenu.children.length)
return;
dropdowns[topic].setNodeValue(dropdowns[topic].dropmenu.children[index]
};
var subscribe = function subscribe(topic, callback) {
if (subscribers[topic] === undefined)
subscribers[topic] = [];
subscribers[topic].push(callback
};
var unsubscribe = function unsubscribe(topic, callback) {
var index = subscribers[topic].indexOf(callback
subscribers[topic].splice(index, 1
};
var notify = function notify() {
if (subscribers[this.topic] === undefined)
return;
for (var i in subscribers[this.topic]) {
subscribers[this.topic][i](this.value
}
};
var init = function init() {
var elem, size;
elem = document.querySelectorAll('.ui-dropdown'
size = elem.length;
for (var i = 0; i < size; i++)
new DropDown(elem[i]
};
return {
init : init,
setValue : setValue,
subscribe : subscribe,
unsubscribe : unsubscribe,
createDropDown : createDropDown
};
})(
/**
* UI-ButtonManager
*/
var ButtonManager = (function CheckBoxManager() {
var subscribers = [];
var buttons = [];
var CheckBox = function CheckBox(node) {
var topic = node.getAttribute('data-topic'
var state = node.getAttribute('data-state'
var name = node.getAttribute('data-label'
var align = node.getAttribute('data-text-on'
state = (state === "true"
var checkbox = document.createElement("input"
var label = document.createElement("label"
var id = 'checkbox-' + topic;
checkbox.id = id;
checkbox.setAttribute('type', 'checkbox'
checkbox.checked = state;
label.setAttribute('for', id
if (name) {
label.className = 'text';
if (align)
label.className += ' ' + align;
label.textContent = name;
}
node.appendChild(checkbox
node.appendChild(label
this.node = node;
this.topic = topic;
this.checkbox = checkbox;
checkbox.addEventListener('change', function(e) {
notify.call(this
}.bind(this)
buttons[topic] = this;
};
var getNode = function getNode(topic) {
return buttons[topic].node;
};
var setValue = function setValue(topic, value) {
var obj = buttons[topic];
if (obj === undefined)
return;
obj.checkbox.checked = value;
notify.call(obj
};
var subscribe = function subscribe(topic, callback) {
if (subscribers[topic] === undefined)
subscribers[topic] = [];
subscribers[topic].push(callback
};
var unsubscribe = function unsubscribe(topic, callback) {
subscribers[topic].indexOf(callback
subscribers[topic].splice(index, 1
};
var notify = function notify() {
if (subscribers[this.topic] === undefined)
return;
for (var i = 0; i < subscribers[this.topic].length; i++)
subscribers[this.topic][i](this.checkbox.checked
};
var init = function init() {
var elem = document.querySelectorAll('.ui-checkbox'
var size = elem.length;
for (var i = 0; i < size; i++)
new CheckBox(elem[i]
};
return {
init : init,
setValue : setValue,
subscribe : subscribe,
unsubscribe : unsubscribe
};
})(
window.addEventListener("load", function() {
BorderImage.init(
}
var BorderImage = (function BorderImage() {
var getElemById = document.getElementById.bind(document
var subject;
var preview;
var guidelines = [];
var positions = ['top', 'right', 'bottom', 'left'];
var makeDraggable = function makeDraggable(elem) {
var offsetTop;
var offsetLeft;
elem.setAttribute('data-draggable', 'true'
var dragStart = function dragStart(e) {
if (e.target.getAttribute('data-draggable') !== 'true' ||
e.target !== elem || e.button !== 0)
return;
offsetLeft = e.clientX - elem.offsetLeft;
offsetTop = e.clientY - elem.offsetTop;
document.addEventListener('mousemove', mouseDrag
document.addEventListener('mouseup', dragEnd
};
var dragEnd = function dragEnd(e) {
if (e.button !== 0)
return;
document.removeEventListener('mousemove', mouseDrag
document.removeEventListener('mouseup', dragEnd
};
var mouseDrag = function mouseDrag(e) {
elem.style.left = e.clientX - offsetLeft + 'px';
elem.style.top = e.clientY - offsetTop + 'px';
};
elem.addEventListener('mousedown', dragStart, false
};
var PreviewControl = function PreviewControl() {
var dragging = false;
var valueX = null;
var valueY = null;
var dragStart = function dragStart(e) {
if (e.button !== 0)
return;
valueX = e.clientX - preview.clientWidth;
valueY = e.clientY - preview.clientHeight;
dragging = true;
document.addEventListener('mousemove', mouseDrag
};
var dragEnd = function dragEnd(e) {
if (e.button !== 0 || dragging === false)
return;
document.removeEventListener('mousemove', mouseDrag
dragging = false;
};
var mouseDrag = function mouseDrag(e) {
InputSliderManager.setValue('preview-width', e.clientX - valueX
InputSliderManager.setValue('preview-height', e.clientY - valueY
};
var init = function init() {
makeDraggable(preview
makeDraggable(subject
var handle = document.createElement('div'
handle.className = 'resize-handle';
handle.addEventListener('mousedown', dragStart
document.addEventListener('mouseup', dragEnd
preview.appendChild(handle
};
return {
init: init
};
}(
var ImageReader = (function ImageReader() {
var fReader = new FileReader(
var browse = document.createElement('input'
var loadImage = function loadImage(e) {
if (browse.files.length === 0)
return;
var file = browse.files[0];
if (file.type.slice(0, 5) !== 'image')
return;
fReader.readAsDataURL(file
return false;
};
fReader.onload = function(e) {
ImageControl.loadRemoteImage(e.target.result
};
var load = function load() {
browse.click(
};
browse.setAttribute('type', 'file'
browse.style.display = 'none';
browse.onchange = loadImage;
return {
load: load
};
})(
var ImageControl = (function ImageControl() {
var scale = 0.5;
var imgSource = new Image(
var imgState = null;
var selected = null;
var topics = ['slice', 'width', 'outset'];
var properties = {};
properties['border1'] = {
fill : false,
slice_values : [27, 27, 27, 27],
width_values : [20, 20, 20, 20],
outset_values : [0, 0, 0, 0],
slice_units : [0, 0, 0, 0],
width_units : [0, 0, 0, 0],
outset_units : [0, 0, 0, 0],
repeat : [1, 1],
size : [300, 200],
preview_area : 400
};
properties['border2'] = {
fill : false,
slice_values : [33, 33, 33, 33],
width_values : [1.5, 1.5, 1.5, 1.5],
outset_values : [0, 0, 0, 0],
slice_units : [1, 1, 1, 1],
width_units : [2, 2, 2, 2],
outset_units : [0, 0, 0, 0],
repeat : [2, 2],
size : [300, 200],
preview_area : 400
};
properties['border3'] = {
fill : true,
slice_values : [15, 15, 15, 15],
width_values : [10, 10, 10, 10],
outset_values : [0, 0, 0, 0],
slice_units : [0, 0, 0, 0],
width_units : [0, 0, 0, 0],
outset_units : [0, 0, 0, 0],
repeat : [2, 2],
size : [300, 200],
preview_area : 400
};
properties['border4'] = {
fill : false,
slice_values : [13, 13, 13, 13],
width_values : [13, 13, 13, 13],
outset_values : [13, 13, 13, 13],
slice_units : [0, 0, 0, 0],
width_units : [0, 0, 0, 0],
outset_units : [0, 0, 0, 0],
repeat : [0, 0],
size : [300, 200],
preview_area : 400
};
properties['border5'] = {
fill : false,
slice_values : [0, 12, 0, 12],
width_values : [0, 12, 0, 12],
outset_values : [0, 0, 0, 0],
slice_units : [0, 0, 0, 0],
width_units : [0, 0, 0, 0],
outset_units : [0, 0, 0, 0],
repeat : [0, 0],
size : [300, 200],
preview_area : 400,
};
properties['border6'] = {
fill : false,
slice_values : [42, 42, 42, 42],
width_values : [42, 42, 42, 42],
outset_values : [0, 0, 0, 0],
slice_units : [0, 0, 0, 0],
width_units : [0, 0, 0, 0],
outset_units : [0, 0, 0, 0],
repeat : [2, 2],
size : [350, 350],
preview_area : 500,
};
var loadLocalImage = function loadLocalImage(source) {
var location = "images/" + source;
imgSource.src = location;
};
var loadRemoteImage = function loadRemoteImage(source) {
imgSource.src = source;
if (selected)
selected.removeAttribute('selected'
Tool.setOutputCSS('source', 'url("' + source + '")'
};
var pickImage = function pickImage(e) {
if (e.target.className === 'image') {
selected = e.target;
selected.setAttribute('selected', 'true'
loadRemoteImage(e.target.src
imgState = e.target.getAttribute('data-stateID'
}
};
var loadImageState = function loadImageState(stateID) {
if (properties[stateID] === undefined)
return;
var prop = properties[stateID];
var topic;
var unit_array;
var value_array;
for (var i in topics) {
for (var j=0; j<4; j++) {
topic = topics[i] + '-' + positions[j];
unit_array = topics[i] + '_units';
value_array = topics[i] + '_values';
InputSliderManager.setValue(topic, prop[value_array][j]
DropDownManager.setValue(topic, prop[unit_array][j]
}
}
ButtonManager.setValue('slice-fill', prop['fill']
DropDownManager.setValue('image-repeat-X', prop['repeat'][0]
DropDownManager.setValue('image-repeat-Y', prop['repeat'][1]
InputSliderManager.setValue('preview-width', prop['size'][0]
InputSliderManager.setValue('preview-height', prop['size'][1]
InputSliderManager.setValue('preview-area-height', prop['preview_area']
};
var update = function update() {
scale = Math.min(300, (30000 / this.width) | 0
setScale(scale
InputSliderManager.setValue('scale', scale, false
subject.style.backgroundImage = 'url("' + this.src + '")';
preview.style.borderImageSource = 'url("' + this.src + '")';
guidelines['slice-top'].setMax(this.height
guidelines['slice-right'].setMax(this.width
guidelines['slice-bottom'].setMax(this.height
guidelines['slice-left'].setMax(this.width
if (imgState)
loadImageState(imgState
};
var setScale = function setScale(value) {
scale = value;
var w = imgSource.width * scale / 100 | 0;
var h = imgSource.height * scale / 100 | 0;
subject.style.width = w + 'px';
subject.style.height = h + 'px';
for (var i = 0; i < positions.length; i++)
guidelines['slice-' + positions[i]].updateGuidelinePos(
};
var getScale = function getScale() {
return scale/100;
};
var toggleGallery = function toggleGallery() {
var gallery = getElemById('image-gallery'
var button = getElemById('toggle-gallery'
var state = 1;
button.addEventListener('click', function() {
state = 1 ^ state;
if (state === 0) {
gallery.setAttribute('data-collapsed', 'true'
button.setAttribute('data-action', 'show'
}
else {
gallery.removeAttribute('data-collapsed'
button.setAttribute('data-action', 'hide'
}
}
};
var init = function init() {
var gallery = getElemById('image-gallery'
var browse = getElemById('load-image'
var remote = getElemById('remote-url'
var load_remote = getElemById('load-remote'
remote.addEventListener('change', function(){
loadRemoteImage(this.value
}
load_remote.addEventListener('click', function(){
loadRemoteImage(remote.value
}
browse.addEventListener('click', ImageReader.load
gallery.addEventListener('click', pickImage
imgSource.addEventListener('load', update
InputSliderManager.subscribe('scale', setScale
InputSliderManager.setValue('scale', scale
imgState = 'border1';
loadRemoteImage('https://mdn.mozillademos.org/files/6007/border-image-1.png'
toggleGallery(
};
return {
init: init,
getScale : getScale,
loadRemoteImage: loadRemoteImage
};
})(
var GuideLine = function GuideLine(node) {
var topic = node.getAttribute('data-topic'
var axis = node.getAttribute('data-axis'
this.node = node;
this.topic = topic;
this.axis = axis;
this.info = topic.split('-')[1];
this.position = 0;
this.value = 0;
this.unit = 0;
this.max = 0;
this.pos = positions.indexOf(this.info
guidelines[topic] = this;
var relative_container = document.createElement('div'
var tooltip = document.createElement('div'
var tooltip2 = document.createElement('div'
tooltip.className = 'tooltip';
tooltip.setAttribute('data-info', this.info
tooltip2.className = 'tooltip2';
tooltip2.textContent = this.info;
tooltip2.setAttribute('data-info', this.info
this.tooltip = tooltip;
relative_container.appendChild(tooltip
relative_container.appendChild(tooltip2
node.appendChild(relative_container
var startX = 0;
var startY = 0;
var start = 0;
var startDrag = function startDrag(e) {
startX = e.clientX;
startY = e.clientY;
start = guidelines[topic].position;
document.body.setAttribute('data-move', axis
relative_container.setAttribute('data-active', ''
node.setAttribute('data-active', ''
document.addEventListener('mousemove', updateGuideline
document.addEventListener('mouseup', endDrag
};
var endDrag = function endDrag() {
document.body.removeAttribute('data-move'
relative_container.removeAttribute('data-active'
node.removeAttribute('data-active'
document.removeEventListener('mousemove', updateGuideline
};
var updateGuideline = function updateGuideline(e) {
var value;
if (topic === 'slice-top')
value = e.clientY - startY + start;
if (topic === 'slice-right')
value = startX - e.clientX + start;
if (topic === 'slice-bottom')
value = startY - e.clientY + start;
if (topic === 'slice-left')
value = e.clientX - startX + start;
if (this.unit === 0)
InputSliderManager.setValue(topic, value * 1 / ImageControl.getScale() | 0
else {
InputSliderManager.setValue(topic, (value * 100 / (this.max * ImageControl.getScale())) | 0
}
}.bind(this
node.addEventListener("mousedown", startDrag
InputSliderManager.subscribe(topic, this.setPosition.bind(this)
InputSliderManager.setValue(topic, this.position
};
GuideLine.prototype.updateGuidelinePos = function updateGuidelinePos() {
if (this.unit === 0)
this.position = this.value * ImageControl.getScale() | 0;
else
this.position = this.value * this.max * ImageControl.getScale() / 100 | 0;
this.node.style[this.info] = this.position + 'px';
};
GuideLine.prototype.setPosition = function setPosition(value) {
this.value = value;
this.tooltip.textContent = value;
this.updateGuidelinePos(
Tool.setBorderSlice(this.pos, value
};
GuideLine.prototype.setMax = function setMax(max) {
this.max = max;
this.updateLimit(
};
GuideLine.prototype.updateLimit = function updateLimit() {
if (this.unit === 1)
InputSliderManager.setMax(this.topic, 100
else
InputSliderManager.setMax(this.topic, this.max
};
GuideLine.prototype.setUnit = function setUnit(type) {
if (type === '%') this.unit = 1;
if (type === '') this.unit = 0;
this.updateLimit(
};
/*
* Unit panel
*/
var UnitPanel = (function UnitPanel () {
var panel;
var title;
var precision;
var step;
var unit_topic = null; // settings are made for this topic
var step_option = [1, 0.1, 0.01];
var updatePrecision = function updatePrecision(value) {
InputSliderManager.setPrecision('unit-step', value
InputSliderManager.setStep('unit-step', step_option[value]
InputSliderManager.setMin('unit-step', step_option[value]
if (unit_topic)
InputSliderManager.setPrecision(unit_topic, value
};
var updateUnitSettings = function updateUnitSettings(value) {
if (unit_topic)
InputSliderManager.setStep(unit_topic, value
};
var show = function show(e) {
var topic = e.target.getAttribute('data-topic'
var precision = InputSliderManager.getPrecision(topic
var step = InputSliderManager.getStep(topic
unit_topic = topic;
title.textContent = topic;
panel.setAttribute('data-active', 'true'
panel.style.top = e.target.offsetTop - 40 + 'px';
panel.style.left = e.target.offsetLeft + 30 + 'px';
InputSliderManager.setValue('unit-precision', precision
InputSliderManager.setValue('unit-step', step
};
var init = function init() {
panel = document.createElement('div'
title = document.createElement('div'
var close = document.createElement('div'
step = InputSliderManager.createSlider('unit-step', 'step'
precision = InputSliderManager.createSlider('unit-precision', 'precision'
InputSliderManager.setStep('unit-precision', 1
InputSliderManager.setMax('unit-precision', 2
InputSliderManager.setValue('unit-precision', 2
InputSliderManager.setSensivity('unit-precision', 20
InputSliderManager.setValue('unit-step', 1
InputSliderManager.setStep('unit-step', 0.01
InputSliderManager.setPrecision('unit-step', 2
InputSliderManager.subscribe('unit-precision', updatePrecision
InputSliderManager.subscribe('unit-step', updateUnitSettings
close.addEventListener('click', function () {
panel.setAttribute('data-active', 'false'
}
title.textContent = 'Properties';
title.className = 'title';
close.className = 'close';
panel.id = 'unit-settings';
panel.setAttribute('data-active', 'false'
panel.appendChild(title
panel.appendChild(precision
panel.appendChild(step
panel.appendChild(close
document.body.appendChild(panel
};
return {
init : init,
show : show
};
})(
/**
* Tool Manager
*/
var Tool = (function Tool() {
var preview_area;
var dropdown_unit_options = [
{ '' : '--', '%' : '%'},
{ 'px' : 'px', '%' : '%', 'em' : 'em'},
{ 'px' : 'px', 'em' : 'em'},
];
var border_slice = [];
var border_width = [];
var border_outset = [];
var border_slice_values = [];
var border_width_values = [];
var border_outset_values = [];
var border_slice_units = ['', '', '', ''];
var border_width_units = ['px', 'px', 'px', 'px'];
var border_outset_units = ['px', 'px', 'px', 'px'];
var border_fill = false;
var border_repeat = ['round', 'round'];
var CSS_code = {
'source' : null,
'slice' : null,
'width' : null,
'outset' : null,
'repeat' : null
};
var setBorderSlice = function setBorderSlice(positionID, value) {
border_slice[positionID] = value + border_slice_units[positionID];
updateBorderSlice(
};
var updateBorderSlice = function updateBorderSlice() {
var value = border_slice.join(' '
if (border_fill === true)
value += ' fill';
preview.style.borderImageSlice = value;
setOutputCSS('slice', value
};
var setBorderFill = function setBorderFill(value) {
border_fill = value;
var bimgslice = border_slice.join(' ';
if (value === true)
bimgslice += ' fill';
preview.style.borderImageSlice = bimgslice;
};
var updateBorderWidth = function updateBorderWidth() {
var value = border_width.join(' '
preview.style.borderImageWidth = value;
setOutputCSS('width', value
};
var updateBorderOutset = function updateBorderOutset() {
var value = border_outset.join(' '
preview.style.borderImageOutset = border_outset.join(' '
setOutputCSS('outset', value
};
var setBorderRepeat = function setBorderRepeat(obj) {
border_repeat[obj.value] = obj.name;
var value = border_repeat.join(' '
preview.style.borderImageRepeat = value;
setOutputCSS('repeat', value
};
var setOutputCSS = function setOutputCSS(topic, value) {
CSS_code[topic].textContent = value + ';';
};
var setPreviewFontSize = function setPreviewFontSize(value) {
preview.style.fontSize = value + 'px';
};
var setPreviewWidth = function setPreviewWidth(value) {
preview.style.width = value + 'px';
};
var setPreviewHeight = function setPreviewHeight(value) {
preview.style.height = value + 'px';
};
var setPreviewAreaHeight = function setPreviewAreaHeight(value) {
preview_area.style.height = value + 'px';
};
var updateDragOption = function updateDragOption(value) {
if (value === true)
subject.setAttribute('data-draggable', 'true'
else
subject.removeAttribute('data-draggable'
};
var createProperty = function createProperty(topic, labelID, optionsID) {
var slider = InputSliderManager.createSlider(topic, positions[labelID]
var dropdown = DropDownManager.createDropDown(topic, dropdown_unit_options[optionsID]
InputSliderManager.setSensivity(topic, 3
InputSliderManager.setPrecision(topic, 1
var property = document.createElement('div'
var config = document.createElement('div'
property.className = 'property';
config.className = 'config';
config.setAttribute('data-topic', topic
config.addEventListener('click', UnitPanel.show
property.appendChild(slider
property.appendChild(dropdown
property.appendChild(config
return property;
};
var initBorderSliceControls = function initBorderSliceControls() {
var container = getElemById('border-slice-control'
var listenForChanges = function listenForChanges(topic, id) {
InputSliderManager.subscribe(topic, function(value) {
border_slice_values[id] = value;
border_slice[id] = value + border_slice_units[id];
updateBorderSlice(
}
DropDownManager.subscribe(topic, function(obj) {
guidelines[topic].setUnit(obj.value
border_slice_units[id] = obj.value;
border_slice[id] = border_slice_values[id] + obj.value;
updateBorderSlice(
}
};
for (var i = 0; i < positions.length; i++) {
var topic = 'slice-' + positions[i];
var property = createProperty(topic, i, 0
listenForChanges(topic, i
container.appendChild(property
}
container.appendChild(container.children[1]
};
var initBorderWidthControls = function initBorderWidthControls() {
var container = getElemById('border-width-control'
var listenForChanges = function listenForChanges(topic, id) {
InputSliderManager.subscribe(topic, function(value) {
border_width_values[id] = value;
border_width[id] = value + border_width_units[id];
updateBorderWidth(
}
DropDownManager.subscribe(topic, function(obj) {
if (obj.value === '%')
InputSliderManager.setMax(topic, 100
else
InputSliderManager.setMax(topic, 1000
border_width_units[id] = obj.value;
border_width[id] = border_width_values[id] + obj.value;
updateBorderWidth(
}
};
for (var i = 0; i < positions.length; i++) {
var topic = 'width-' + positions[i];
var property = createProperty(topic, i, 1
InputSliderManager.setMax(topic, 1000
listenForChanges(topic, i
container.appendChild(property
}
};
var initBorderOutsetControls = function initBorderOutsetControls() {
var container = getElemById('border-outset-control'
var listenForChanges = function listenForChanges(topic, id) {
InputSliderManager.subscribe(topic, function(value) {
border_outset_values[id] = value;
border_outset[id] = value + border_outset_units[id];
updateBorderOutset(
}
DropDownManager.subscribe(topic, function(obj) {
border_outset_units[id] = obj.value;
border_outset[id] = border_outset_values[id] + obj.value;
updateBorderOutset(
}
};
for (var i = 0; i < positions.length; i++) {
var topic = 'outset-' + positions[i];
var property = createProperty(topic, i, 2
InputSliderManager.setMax(topic, 1000
listenForChanges(topic, i
container.appendChild(property
}
};
var init = function init() {
var gallery =
subject = getElemById('subject'
preview = getElemById("preview"
preview_area = getElemById("preview_section"
CSS_code['source'] = getElemById("out-border-source"
CSS_code['slice'] = getElemById("out-border-slice"
CSS_code['width'] = getElemById("out-border-width"
CSS_code['outset'] = getElemById("out-border-outset"
CSS_code['repeat'] = getElemById("out-border-repeat"
initBorderSliceControls(
initBorderWidthControls(
initBorderOutsetControls(
var elem = document.querySelectorAll('.guideline'
var size = elem.length;
for (var i = 0; i < size; i++)
new GuideLine(elem[i]
PreviewControl.init(
ButtonManager.subscribe('slice-fill',setBorderFill
ButtonManager.subscribe('drag-subject', updateDragOption
ButtonManager.setValue('drag-subject', false
DropDownManager.subscribe('image-repeat-X', setBorderRepeat
DropDownManager.subscribe('image-repeat-Y', setBorderRepeat
InputSliderManager.subscribe('preview-area-height', setPreviewAreaHeight
InputSliderManager.subscribe('preview-width', setPreviewWidth
InputSliderManager.subscribe('preview-height', setPreviewHeight
InputSliderManager.subscribe('font-size', setPreviewFontSize
InputSliderManager.setValue('preview-width', 300
InputSliderManager.setValue('preview-height', 200
};
return {
init: init,
setOutputCSS: setOutputCSS,
setBorderSlice: setBorderSlice
};
})(
/**
* Init Tool
*/
var init = function init() {
InputSliderManager.init(
DropDownManager.init(
ButtonManager.init(
UnitPanel.init(
Tool.init(
ImageControl.init(
};
return {
init : init
};
})(