55 changed files with 45860 additions and 2 deletions
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
@ -0,0 +1,47 @@ |
|||
/* |
|||
* DOM element rendering detection |
|||
* https://davidwalsh.name/detect-node-insertion |
|||
*/ |
|||
@keyframes chartjs-render-animation { |
|||
from { opacity: 0.99; } |
|||
to { opacity: 1; } |
|||
} |
|||
|
|||
.chartjs-render-monitor { |
|||
animation: chartjs-render-animation 0.001s; |
|||
} |
|||
|
|||
/* |
|||
* DOM element resizing detection |
|||
* https://github.com/marcj/css-element-queries |
|||
*/ |
|||
.chartjs-size-monitor, |
|||
.chartjs-size-monitor-expand, |
|||
.chartjs-size-monitor-shrink { |
|||
position: absolute; |
|||
direction: ltr; |
|||
left: 0; |
|||
top: 0; |
|||
right: 0; |
|||
bottom: 0; |
|||
overflow: hidden; |
|||
pointer-events: none; |
|||
visibility: hidden; |
|||
z-index: -1; |
|||
} |
|||
|
|||
.chartjs-size-monitor-expand > div { |
|||
position: absolute; |
|||
width: 1000000px; |
|||
height: 1000000px; |
|||
left: 0; |
|||
top: 0; |
|||
} |
|||
|
|||
.chartjs-size-monitor-shrink > div { |
|||
position: absolute; |
|||
width: 200%; |
|||
height: 200%; |
|||
left: 0; |
|||
top: 0; |
|||
} |
File diff suppressed because it is too large
@ -0,0 +1 @@ |
|||
@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,37 @@ |
|||
module.exports = function(grunt) { |
|||
'use strict'; |
|||
|
|||
grunt.initConfig({ |
|||
clean: ['dist'], |
|||
uglify: { |
|||
options: { |
|||
preserveComments: 'some', |
|||
sourceMap: true |
|||
}, |
|||
build: { |
|||
expand: true, |
|||
cwd: 'js', |
|||
src: ['**/*.js', ['!**/*.min.js']], |
|||
dest: 'js', |
|||
ext: '.min.js', |
|||
} |
|||
}, |
|||
cssmin: { |
|||
options: { |
|||
keepBreaks: true |
|||
}, |
|||
build: { |
|||
expand: true, |
|||
cwd: 'css', |
|||
src: ['**/*.css', ['!**/*.min.css']], |
|||
dest: 'css', |
|||
ext: '.min.css', |
|||
} |
|||
} |
|||
}); |
|||
grunt.loadNpmTasks('grunt-contrib-clean'); |
|||
grunt.loadNpmTasks('grunt-contrib-uglify'); |
|||
grunt.loadNpmTasks('grunt-contrib-cssmin'); |
|||
grunt.registerTask('default', ['clean', 'uglify', 'cssmin']); |
|||
|
|||
}; |
@ -0,0 +1,21 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2011-2014 Min Hur, The New York Times Company |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
@ -0,0 +1,175 @@ |
|||
# Bootstrap Toggle |
|||
Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles. |
|||
|
|||
Visit http://www.bootstraptoggle.com for demos. |
|||
|
|||
## Getting Started |
|||
|
|||
### Installation |
|||
You can [download](https://github.com/minhur/bootstrap-toggle/archive/master.zip) the latest version of Bootstrap Toggle or use CDN to load the library. |
|||
|
|||
`Warning` If you are using Bootstrap v2.3.2, use `bootstrap2-toggle.min.js` and `bootstrap2-toggle.min.css` instead. |
|||
|
|||
```html |
|||
<link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet"> |
|||
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script> |
|||
``` |
|||
|
|||
### Bower Install |
|||
```bash |
|||
bower install bootstrap-toggle |
|||
``` |
|||
|
|||
## Usage |
|||
|
|||
### Basic example |
|||
Simply add `data-toggle="toggle"` to convert checkboxes into toggles. |
|||
|
|||
```html |
|||
<input type="checkbox" checked data-toggle="toggle"> |
|||
``` |
|||
|
|||
### Stacked checkboxes |
|||
Refer to Bootstrap Form Controls documentation to create stacked checkboxes. Simply add `data-toggle="toggle"` to convert checkboxes into toggles. |
|||
|
|||
```html |
|||
<div class="checkbox"> |
|||
<label> |
|||
<input type="checkbox" data-toggle="toggle"> |
|||
Option one is enabled |
|||
</label> |
|||
</div> |
|||
<div class="checkbox disabled"> |
|||
<label> |
|||
<input type="checkbox" disabled data-toggle="toggle"> |
|||
Option two is disabled |
|||
</label> |
|||
</div> |
|||
``` |
|||
|
|||
### Inline Checkboxes |
|||
Refer to Bootstrap Form Controls documentation to create inline checkboxes. Simply add `data-toggle="toggle"` to a convert checkboxes into toggles. |
|||
|
|||
```html |
|||
<label class="checkbox-inline"> |
|||
<input type="checkbox" checked data-toggle="toggle"> First |
|||
</label> |
|||
<label class="checkbox-inline"> |
|||
<input type="checkbox" data-toggle="toggle"> Second |
|||
</label> |
|||
<label class="checkbox-inline"> |
|||
<input type="checkbox" data-toggle="toggle"> Third |
|||
</label> |
|||
``` |
|||
|
|||
## API |
|||
|
|||
### Initialize by JavaScript |
|||
Initialize toggles with id `toggle-one` with a single line of JavaScript. |
|||
|
|||
```html |
|||
<input id="toggle-one" checked type="checkbox"> |
|||
<script> |
|||
$(function() { |
|||
$('#toggle-one').bootstrapToggle(); |
|||
}) |
|||
</script> |
|||
``` |
|||
|
|||
### Options |
|||
Options can be passed via data attributes or JavaScript. For data attributes, append the option name to `data-`, as in `data-on="Enabled"`. |
|||
|
|||
```html |
|||
<input type="checkbox" data-toggle="toggle" data-on="Enabled" data-off="Disabled"> |
|||
<input type="checkbox" id="toggle-two"> |
|||
<script> |
|||
$(function() { |
|||
$('#toggle-two').bootstrapToggle({ |
|||
on: 'Enabled', |
|||
off: 'Disabled' |
|||
}); |
|||
}) |
|||
</script> |
|||
``` |
|||
|
|||
Name|Type|Default|Description| |
|||
---|---|---|--- |
|||
on|string/html|"On"|Text of the on toggle |
|||
off|string/html|"Off"|Text of the off toggle |
|||
size|string|"normal"|Size of the toggle. Possible values are `large`, `normal`, `small`, `mini`. |
|||
onstyle|string|"primary"|Style of the on toggle. Possible values are `default`, `primary`, `success`, `info`, `warning`, `danger` |
|||
offstyle|string|"default"|Style of the off toggle. Possible values are `default`, `primary`, `success`, `info`, `warning`, `danger` |
|||
style|string| |Appends the value to the class attribute of the toggle. This can be used to apply custom styles. Refer to Custom Styles for reference. |
|||
width|integer|*null*|Sets the width of the toggle. if set to *null*, width will be calculated. |
|||
height|integer|*null*|Sets the height of the toggle. if set to *null*, height will be calculated. |
|||
|
|||
### Methods |
|||
Methods can be used to control toggles directly. |
|||
|
|||
```html |
|||
<input id="toggle-demo" type="checkbox" data-toggle="toggle"> |
|||
``` |
|||
|
|||
Method|Example|Description |
|||
---|---|--- |
|||
initialize|$('#toggle-demo').bootstrapToggle()|Initializes the toggle plugin with options |
|||
destroy|$('#toggle-demo').bootstrapToggle('destroy')|Destroys the toggle |
|||
on|$('#toggle-demo').bootstrapToggle('on')|Sets the toggle to 'On' state |
|||
off|$('#toggle-demo').bootstrapToggle('off')|Sets the toggle to 'Off' state |
|||
toggle|$('#toggle-demo').bootstrapToggle('toggle')|Toggles the state of the toggle |
|||
enable|$('#toggle-demo').bootstrapToggle('enable')|Enables the toggle |
|||
disable|$('#toggle-demo').bootstrapToggle('disable')|Disables the toggle |
|||
|
|||
## Events |
|||
|
|||
### Event Propagation |
|||
Note All events are propagated to and from input element to the toggle. |
|||
|
|||
You should listen to events from the `<input type="checkbox">` directly rather than look for custom events. |
|||
|
|||
```html |
|||
<input id="toggle-event" type="checkbox" data-toggle="toggle"> |
|||
<div id="console-event"></div> |
|||
<script> |
|||
$(function() { |
|||
$('#toggle-event').change(function() { |
|||
$('#console-event').html('Toggle: ' + $(this).prop('checked')) |
|||
}) |
|||
}) |
|||
</script> |
|||
``` |
|||
|
|||
### API vs Input |
|||
This also means that using the API or Input to trigger events will work both ways. |
|||
|
|||
```html |
|||
<input id="toggle-trigger" type="checkbox" data-toggle="toggle"> |
|||
<button class="btn btn-success" onclick="toggleOn()">On by API</button> |
|||
<button class="btn btn-danger" onclick="toggleOff()">Off by API</button> |
|||
<button class="btn btn-success" onclick="toggleOnByInput()">On by Input</button> |
|||
<button class="btn btn-danger" onclick="toggleOffByInput()">Off by Input</button> |
|||
<script> |
|||
function toggleOn() { |
|||
$('#toggle-trigger').bootstrapToggle('on') |
|||
} |
|||
function toggleOff() { |
|||
$('#toggle-trigger').bootstrapToggle('off') |
|||
} |
|||
function toggleOnByInput() { |
|||
$('#toggle-trigger').prop('checked', true).change() |
|||
} |
|||
function toggleOffByInput() { |
|||
$('#toggle-trigger').prop('checked', false).change() |
|||
} |
|||
</script> |
|||
``` |
|||
|
|||
### Integration |
|||
|
|||
#### [KnockoutJS](http://knockoutjs.com) |
|||
|
|||
A binding for knockout is available here: [aAXEe/knockout-bootstrap-toggle](https://github.com/aAXEe/knockout-bootstrap-toggle) |
|||
|
|||
## Demos |
|||
|
|||
Visit http://www.bootstraptoggle.com for demos. |
@ -0,0 +1,2 @@ |
|||
.DS_Store |
|||
node_modules |
@ -0,0 +1,32 @@ |
|||
{ |
|||
"name": "bootstrap-toggle", |
|||
"description": "Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles", |
|||
"version": "2.2.1", |
|||
"keywords": [ |
|||
"bootstrap", |
|||
"toggle", |
|||
"bootstrap-toggle", |
|||
"switch", |
|||
"bootstrap-switch" |
|||
], |
|||
"homepage": "http://www.bootstraptoggle.com", |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "https://github.com/minhur/bootstrap-toggle.git" |
|||
}, |
|||
"license": "MIT", |
|||
"authors": [ |
|||
"Min Hur <min.hur@gmail.com>" |
|||
], |
|||
"main": [ |
|||
"./js/bootstrap-toggle.min.js", |
|||
"./css/bootstrap-toggle.min.css" |
|||
], |
|||
"ignore": [ |
|||
"**/.*", |
|||
"node_modules", |
|||
"bower_components", |
|||
"test", |
|||
"tests" |
|||
] |
|||
} |
@ -0,0 +1,83 @@ |
|||
/*! ======================================================================== |
|||
* Bootstrap Toggle: bootstrap-toggle.css v2.2.0 |
|||
* http://www.bootstraptoggle.com |
|||
* ======================================================================== |
|||
* Copyright 2014 Min Hur, The New York Times Company |
|||
* Licensed under MIT |
|||
* ======================================================================== */ |
|||
|
|||
|
|||
.checkbox label .toggle, |
|||
.checkbox-inline .toggle { |
|||
margin-left: -20px; |
|||
margin-right: 5px; |
|||
} |
|||
|
|||
.toggle { |
|||
position: relative; |
|||
overflow: hidden; |
|||
} |
|||
.toggle input[type="checkbox"] { |
|||
display: none; |
|||
} |
|||
.toggle-group { |
|||
position: absolute; |
|||
width: 200%; |
|||
top: 0; |
|||
bottom: 0; |
|||
left: 0; |
|||
transition: left 0.35s; |
|||
-webkit-transition: left 0.35s; |
|||
-moz-user-select: none; |
|||
-webkit-user-select: none; |
|||
} |
|||
.toggle.off .toggle-group { |
|||
left: -100%; |
|||
} |
|||
.toggle-on { |
|||
position: absolute; |
|||
top: 0; |
|||
bottom: 0; |
|||
left: 0; |
|||
right: 50%; |
|||
margin: 0; |
|||
border: 0; |
|||
border-radius: 0; |
|||
} |
|||
.toggle-off { |
|||
position: absolute; |
|||
top: 0; |
|||
bottom: 0; |
|||
left: 50%; |
|||
right: 0; |
|||
margin: 0; |
|||
border: 0; |
|||
border-radius: 0; |
|||
} |
|||
.toggle-handle { |
|||
position: relative; |
|||
margin: 0 auto; |
|||
padding-top: 0px; |
|||
padding-bottom: 0px; |
|||
height: 100%; |
|||
width: 0px; |
|||
border-width: 0 1px; |
|||
} |
|||
|
|||
.toggle.btn { min-width: 59px; min-height: 34px; } |
|||
.toggle-on.btn { padding-right: 24px; } |
|||
.toggle-off.btn { padding-left: 24px; } |
|||
|
|||
.toggle.btn-lg { min-width: 79px; min-height: 45px; } |
|||
.toggle-on.btn-lg { padding-right: 31px; } |
|||
.toggle-off.btn-lg { padding-left: 31px; } |
|||
.toggle-handle.btn-lg { width: 40px; } |
|||
|
|||
.toggle.btn-sm { min-width: 50px; min-height: 30px;} |
|||
.toggle-on.btn-sm { padding-right: 20px; } |
|||
.toggle-off.btn-sm { padding-left: 20px; } |
|||
|
|||
.toggle.btn-xs { min-width: 35px; min-height: 22px;} |
|||
.toggle-on.btn-xs { padding-right: 12px; } |
|||
.toggle-off.btn-xs { padding-left: 12px; } |
|||
|
@ -0,0 +1,28 @@ |
|||
/*! ======================================================================== |
|||
* Bootstrap Toggle: bootstrap-toggle.css v2.2.0 |
|||
* http://www.bootstraptoggle.com |
|||
* ======================================================================== |
|||
* Copyright 2014 Min Hur, The New York Times Company |
|||
* Licensed under MIT |
|||
* ======================================================================== */ |
|||
.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px} |
|||
.toggle{position:relative;overflow:hidden} |
|||
.toggle input[type=checkbox]{display:none} |
|||
.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none} |
|||
.toggle.off .toggle-group{left:-100%} |
|||
.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0} |
|||
.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0} |
|||
.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px} |
|||
.toggle.btn{min-width:59px;min-height:34px} |
|||
.toggle-on.btn{padding-right:24px} |
|||
.toggle-off.btn{padding-left:24px} |
|||
.toggle.btn-lg{min-width:79px;min-height:45px} |
|||
.toggle-on.btn-lg{padding-right:31px} |
|||
.toggle-off.btn-lg{padding-left:31px} |
|||
.toggle-handle.btn-lg{width:40px} |
|||
.toggle.btn-sm{min-width:50px;min-height:30px} |
|||
.toggle-on.btn-sm{padding-right:20px} |
|||
.toggle-off.btn-sm{padding-left:20px} |
|||
.toggle.btn-xs{min-width:35px;min-height:22px} |
|||
.toggle-on.btn-xs{padding-right:12px} |
|||
.toggle-off.btn-xs{padding-left:12px} |
@ -0,0 +1,85 @@ |
|||
/*! ======================================================================== |
|||
* Bootstrap Toggle: bootstrap2-toggle.css v2.2.0 |
|||
* http://www.bootstraptoggle.com |
|||
* ======================================================================== |
|||
* Copyright 2014 Min Hur, The New York Times Company |
|||
* Licensed under MIT |
|||
* ======================================================================== */ |
|||
|
|||
|
|||
label.checkbox .toggle, |
|||
label.checkbox.inline .toggle { |
|||
margin-left: -20px; |
|||
margin-right: 5px; |
|||
} |
|||
.toggle { |
|||
min-width: 40px; |
|||
height: 20px; |
|||
position: relative; |
|||
overflow: hidden; |
|||
} |
|||
.toggle input[type="checkbox"] { |
|||
display: none; |
|||
} |
|||
.toggle-group { |
|||
position: absolute; |
|||
width: 200%; |
|||
top: 0; |
|||
bottom: 0; |
|||
left: 0; |
|||
transition: left 0.35s; |
|||
-webkit-transition: left 0.35s; |
|||
-moz-user-select: none; |
|||
-webkit-user-select: none; |
|||
} |
|||
.toggle.off .toggle-group { |
|||
left: -100%; |
|||
} |
|||
.toggle-on { |
|||
position: absolute; |
|||
top: 0; |
|||
bottom: 0; |
|||
left: 0; |
|||
right: 50%; |
|||
margin: 0; |
|||
border: 0; |
|||
border-radius: 0; |
|||
} |
|||
.toggle-off { |
|||
position: absolute; |
|||
top: 0; |
|||
bottom: 0; |
|||
left: 50%; |
|||
right: 0; |
|||
margin: 0; |
|||
border: 0; |
|||
border-radius: 0; |
|||
} |
|||
.toggle-handle { |
|||
position: relative; |
|||
margin: 0 auto; |
|||
padding-top: 0px; |
|||
padding-bottom: 0px; |
|||
height: 100%; |
|||
width: 0px; |
|||
border-width: 0 1px; |
|||
} |
|||
.toggle-handle.btn-mini { |
|||
top: -1px; |
|||
} |
|||
.toggle.btn { min-width: 30px; } |
|||
.toggle-on.btn { padding-right: 24px; } |
|||
.toggle-off.btn { padding-left: 24px; } |
|||
|
|||
.toggle.btn-large { min-width: 40px; } |
|||
.toggle-on.btn-large { padding-right: 35px; } |
|||
.toggle-off.btn-large { padding-left: 35px; } |
|||
|
|||
.toggle.btn-small { min-width: 25px; } |
|||
.toggle-on.btn-small { padding-right: 20px; } |
|||
.toggle-off.btn-small { padding-left: 20px; } |
|||
|
|||
.toggle.btn-mini { min-width: 20px; } |
|||
.toggle-on.btn-mini { padding-right: 12px; } |
|||
.toggle-off.btn-mini { padding-left: 12px; } |
|||
|
@ -0,0 +1,28 @@ |
|||
/*! ======================================================================== |
|||
* Bootstrap Toggle: bootstrap2-toggle.css v2.2.0 |
|||
* http://www.bootstraptoggle.com |
|||
* ======================================================================== |
|||
* Copyright 2014 Min Hur, The New York Times Company |
|||
* Licensed under MIT |
|||
* ======================================================================== */ |
|||
label.checkbox .toggle,label.checkbox.inline .toggle{margin-left:-20px;margin-right:5px} |
|||
.toggle{min-width:40px;height:20px;position:relative;overflow:hidden} |
|||
.toggle input[type=checkbox]{display:none} |
|||
.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none} |
|||
.toggle.off .toggle-group{left:-100%} |
|||
.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0} |
|||
.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0} |
|||
.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px} |
|||
.toggle-handle.btn-mini{top:-1px} |
|||
.toggle.btn{min-width:30px} |
|||
.toggle-on.btn{padding-right:24px} |
|||
.toggle-off.btn{padding-left:24px} |
|||
.toggle.btn-large{min-width:40px} |
|||
.toggle-on.btn-large{padding-right:35px} |
|||
.toggle-off.btn-large{padding-left:35px} |
|||
.toggle.btn-small{min-width:25px} |
|||
.toggle-on.btn-small{padding-right:20px} |
|||
.toggle-off.btn-small{padding-left:20px} |
|||
.toggle.btn-mini{min-width:20px} |
|||
.toggle-on.btn-mini{padding-right:12px} |
|||
.toggle-off.btn-mini{padding-left:12px} |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 20 KiB |
@ -0,0 +1,49 @@ |
|||
+function ($) { |
|||
'use strict'; |
|||
|
|||
$('.example:not(.skip)').each(function() { |
|||
// fetch & encode html
|
|||
var html = $('<div>').text($(this).html()).html() |
|||
// find number of space/tabs on first line (minus line break)
|
|||
var count = html.match(/^(\s+)/)[0].length - 1 |
|||
// replace tabs/spaces on each lines with
|
|||
var regex = new RegExp('\\n\\s{'+count+'}', 'g') |
|||
var code = html.replace(regex, '\n').replace(/\t/g, ' ').trim() |
|||
// other cleanup
|
|||
code = code.replace(/=""/g,'') |
|||
// add code block to dom
|
|||
$(this).after( $('<code class="highlight html">').html(code) ) |
|||
}); |
|||
|
|||
$('code.highlight').each(function() { |
|||
hljs.highlightBlock(this) |
|||
}); |
|||
|
|||
}(jQuery); |
|||
|
|||
var Demo = function () {} |
|||
|
|||
Demo.prototype.init = function(selector) { |
|||
$(selector).bootstrapToggle(selector) |
|||
} |
|||
Demo.prototype.destroy = function(selector) { |
|||
$(selector).bootstrapToggle('destroy') |
|||
} |
|||
Demo.prototype.on = function(selector) { |
|||
$(selector).bootstrapToggle('on') |
|||
} |
|||
Demo.prototype.off = function(selector) { |
|||
$(selector).bootstrapToggle('off') |
|||
} |
|||
Demo.prototype.toggle = function(selector) { |
|||
$(selector).bootstrapToggle('toggle') |
|||
} |
|||
Demo.prototype.enable = function(selector) { |
|||
$(selector).bootstrapToggle('enable') |
|||
} |
|||
Demo.prototype.disable = function(selector) { |
|||
$(selector).bootstrapToggle('disable') |
|||
} |
|||
|
|||
|
|||
demo = new Demo() |
@ -0,0 +1,112 @@ |
|||
header, footer { |
|||
padding: 20px; |
|||
background-image: url('header.png'); |
|||
background-size: 256px 256px; |
|||
} |
|||
footer { |
|||
color: #fff; |
|||
text-align: center; |
|||
} |
|||
.nyt-logo { |
|||
max-height: 40px; |
|||
margin-top: 5px; |
|||
margin-right: 5px; |
|||
} |
|||
|
|||
nav.navbar { |
|||
margin-bottom: 10px; |
|||
background-color: #fff; |
|||
border: 0px; |
|||
border-radius: 2px; |
|||
} |
|||
#navbar { |
|||
margin: 0px; |
|||
} |
|||
#navbar .navbar-nav li iframe { |
|||
margin-top: 15px; |
|||
} |
|||
#navbar .navbar-nav li:last-child iframe { |
|||
margin-right: 15px; |
|||
} |
|||
|
|||
@media screen and (max-width: 767px) { |
|||
#navbar .navbar-nav li iframe { |
|||
display: none; |
|||
} |
|||
} |
|||
|
|||
.mast-head { |
|||
margin: 10px 0; |
|||
} |
|||
.mast-head h1 { |
|||
margin-bottom: 15px; |
|||
color: #fff; |
|||
} |
|||
.mast-head p { |
|||
color: #fff; |
|||
} |
|||
|
|||
.mast-links { |
|||
padding-top: 10px; |
|||
} |
|||
|
|||
.mast-links > * { |
|||
vertical-align: middle; |
|||
margin-bottom: 10px; |
|||
} |
|||
|
|||
.mast-links > .btn { |
|||
margin-right: 30px; |
|||
} |
|||
main { |
|||
margin: 10px 20px; |
|||
} |
|||
main .container { |
|||
margin-bottom: 40px; |
|||
} |
|||
|
|||
code.hljs { |
|||
border: 1px solid #ccc; |
|||
padding: 1em; |
|||
white-space: pre; |
|||
margin-bottom: 10px; |
|||
} |
|||
|
|||
.example { |
|||
position: relative; |
|||
border: 1px solid #ccc; |
|||
padding: 1em 1em 0.5em 1em; |
|||
border-radius: 4px 4px 0 0; |
|||
} |
|||
|
|||
.example:after { |
|||
content: "Example"; |
|||
position: absolute; |
|||
top: 0px; |
|||
right: 0px; |
|||
padding: 3px 7px; |
|||
font-size: 12px; |
|||
font-weight: bold; |
|||
background-color: #f5f5f5; |
|||
border: 1px solid #ccc; |
|||
color: #9da0a4; |
|||
border-radius: 0px 4px 0px 4px; |
|||
border-width: 0px 0px 1px 1px; |
|||
} |
|||
|
|||
.example + code.hljs { |
|||
border-top: 0; |
|||
border-radius: 0px 0px 4px 4px; |
|||
} |
|||
|
|||
.example > * { |
|||
margin-bottom: 10px; |
|||
} |
|||
|
|||
.example > div.toggle { |
|||
margin-right: 10px; |
|||
} |
|||
|
|||
.table-striped code { |
|||
background-color: inherit; |
|||
} |
@ -0,0 +1,449 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<script> if (window.location.href.indexOf('minhur.github.io') > 0) window.location.replace('http://www.bootstraptoggle.com') </script> |
|||
<meta charset="UTF-8"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|||
<meta name="msvalidate.01" content="3638AEFC99423BA5CB586805286C39AA" /> |
|||
<meta name="description" content="Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles." /> |
|||
<meta name="keywords" content="bootstrap, toggle, switch, bootstrap-toggle, bootstrap-switch" /> |
|||
<meta name="author" content="metatags generator"> |
|||
<meta name="robots" content="index, follow"> |
|||
<meta name="revisit-after" content="1 month"> |
|||
<title>Bootstrap Toggle</title> |
|||
<link rel="canonical" href="http://www.bootstraptoggle.com"> |
|||
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/github.min.css" rel="stylesheet" > |
|||
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet"> |
|||
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet"> |
|||
<link href="css/bootstrap-toggle.css" rel="stylesheet"> |
|||
<link href="doc/stylesheet.css" rel="stylesheet"> |
|||
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> |
|||
</head> |
|||
<body> |
|||
<header> |
|||
<nav class="navbar navbar-default container" role="navigation"> |
|||
<div class="container"> |
|||
<div class="navbar-header"> |
|||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"> |
|||
<span class="sr-only">Toggle navigation</span> |
|||
<span class="icon-bar"></span> |
|||
<span class="icon-bar"></span> |
|||
<span class="icon-bar"></span> |
|||
</button> |
|||
<a class="navbar-brand" href="#">Bootstrap Toggle</a> |
|||
</div> |
|||
<div id="navbar" class="collapse navbar-collapse"> |
|||
<ul class="nav navbar-nav navbar-right"> |
|||
<li><a href="#usage">Usage</a></li> |
|||
<li><a href="#api">API</a></li> |
|||
<li><a href="#events">Events</a></li> |
|||
<li><a href="#demos">Demos</a></li> |
|||
<li><a href="https://github.com/minhur/bootstrap-toggle/issues">Issues</a></li> |
|||
<li><a href="https://github.com/minhur/bootstrap-toggle/archive/master.zip">Download</a></li> |
|||
<li> |
|||
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=watch" allowtransparency="true" frameborder="0" scrolling="0" width="62" height="20"></iframe> |
|||
</li> |
|||
<li> |
|||
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=fork" allowtransparency="true" frameborder="0" scrolling="0" width="53" height="20"></iframe> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
</nav> |
|||
<div class="mast-head"> |
|||
<div class="container"> |
|||
<h1>Bootstrap Toggle</h1> |
|||
<p>Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles</p> |
|||
<div class="mast-links"> |
|||
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=watch&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="150" height="30"></iframe> |
|||
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=fork&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="150" height="30"></iframe> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</header> |
|||
|
|||
<main> |
|||
<div class="container"> |
|||
<h2>Getting Started</h2> |
|||
<hr> |
|||
<h3>Installation</h3> |
|||
<p>You can <a href="https://github.com/minhur/bootstrap-toggle/archive/master.zip">download</a> the latest version of Bootstrap Toggle or use CDN to load the library.</p> |
|||
<p><span class="label label-warning">Warning</span> If you are using Bootstrap v2.3.2, use <code>bootstrap2-toggle.min.js</code> and <code>bootstrap2-toggle.min.css</code> instead.</p> |
|||
<code class="highlight"><link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet"> |
|||
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script></code> |
|||
|
|||
<h3>Bower Install</h3> |
|||
<p></p> |
|||
<code class="highlight bash">bower install bootstrap-toggle</code> |
|||
</div> |
|||
<div id="usage" class="container"> |
|||
<h2>Usage</h2> |
|||
<hr> |
|||
|
|||
<h3>Basic example</h3> |
|||
<p>Simply add <code>data-toggle="toggle"</code> to convert checkboxes into toggles.</p> |
|||
<div class="example"> |
|||
<input type="checkbox" checked data-toggle="toggle"> |
|||
</div> |
|||
|
|||
<h3>Stacked checkboxes</h3> |
|||
<p>Refer to Bootstrap <a href="http://getbootstrap.com/css/#forms-controls" target="_blank">Form Controls</a> documentation to create stacked checkboxes. Simply add <code>data-toggle="toggle"</code> to convert checkboxes into toggles.</p> |
|||
<div class="example"> |
|||
<div class="checkbox"> |
|||
<label> |
|||
<input type="checkbox" data-toggle="toggle"> |
|||
Option one is enabled |
|||
</label> |
|||
</div> |
|||
<div class="checkbox disabled"> |
|||
<label> |
|||
<input type="checkbox" disabled data-toggle="toggle"> |
|||
Option two is disabled |
|||
</label> |
|||
</div> |
|||
</div> |
|||
|
|||
<h3>Inline Checkboxes</h3> |
|||
<p>Refer to Bootstrap <a href="http://getbootstrap.com/css/#forms-controls" target="_blank">Form Controls</a> documentation to create inline checkboxes. Simply add <code>data-toggle="toggle"</code> to a convert checkboxes into toggles.</p> |
|||
<div class="example"> |
|||
<label class="checkbox-inline"> |
|||
<input type="checkbox" checked data-toggle="toggle"> First |
|||
</label> |
|||
<label class="checkbox-inline"> |
|||
<input type="checkbox" data-toggle="toggle"> Second |
|||
</label> |
|||
<label class="checkbox-inline"> |
|||
<input type="checkbox" data-toggle="toggle"> Third |
|||
</label> |
|||
</div> |
|||
</div> |
|||
|
|||
<div id="api" class="container"> |
|||
<h2>API</h2> |
|||
<hr> |
|||
|
|||
<h3>Initialize by JavaScript</h3> |
|||
<p>Initialize toggles with id <code>toggle-one</code> with a single line of JavaScript.</p> |
|||
<div class="example"> |
|||
<input id="toggle-one" checked type="checkbox"> |
|||
<script> |
|||
$(function() { |
|||
$('#toggle-one').bootstrapToggle(); |
|||
}) |
|||
</script> |
|||
</div> |
|||
|
|||
<h3>Options</h3> |
|||
<p>Options can be passed via data attributes or JavaScript. For data attributes, append the option name to <code>data-</code>, as in <code>data-on="Enabled"</code>.</p> |
|||
<div class="example"> |
|||
<input type="checkbox" data-toggle="toggle" data-on="Enabled" data-off="Disabled"> |
|||
<input type="checkbox" id="toggle-two"> |
|||
<script> |
|||
$(function() { |
|||
$('#toggle-two').bootstrapToggle({ |
|||
on: 'Enabled', |
|||
off: 'Disabled' |
|||
}); |
|||
}) |
|||
</script> |
|||
</div> |
|||
<div class="table-responsive"> |
|||
<table class="table table-striped table-condensed"> |
|||
<thead> |
|||
<tr> |
|||
<th>Name</th> |
|||
<th>Type</th> |
|||
<th>Default</th> |
|||
<th>Description</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr> |
|||
<td>on</td> |
|||
<td>string | html</td> |
|||
<td><code>"On"</code></td> |
|||
<td>Text of the <em>on</em> toggle</td> |
|||
</tr> |
|||
<tr> |
|||
<td>off</td> |
|||
<td>string | html</td> |
|||
<td><code>"Off"</code></td> |
|||
<td>Text of the <em>off</em> toggle</td> |
|||
</tr> |
|||
<tr> |
|||
<td>size</td> |
|||
<td>string</td> |
|||
<td><code>"normal"</code></td> |
|||
<td> |
|||
Size of the toggle. Possible values are:<code>large</code>,<code>normal</code>,<code>small</code>,<code>mini</code><br> |
|||
Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-sizes" target="_blank">Button Sizes</a> documentation for more information. |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<td>onstyle</td> |
|||
<td>string</td> |
|||
<td><code>"primary"</code></td> |
|||
<td> |
|||
Style of the <em>on</em> toggle.<br>Possible values are:<code>default</code>,<code>primary</code>,<code>success</code>,<code>info</code>,<code>warning</code>,<code>danger</code><br> |
|||
Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-options" target="_blank">Button Options</a> documentation for more information. |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<td>offstyle</td> |
|||
<td>string</td> |
|||
<td><code>"default"</code></td> |
|||
<td> |
|||
Style of the <em>off</em> toggle.<br>Possible values are:<code>default</code>,<code>primary</code>,<code>success</code>,<code>info</code>,<code>warning</code>,<code>danger</code><br> |
|||
Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-options" target="_blank">Button Options</a> documentation for more information. |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<td>style</td> |
|||
<td>string</td> |
|||
<td></td> |
|||
<td> |
|||
Appends the value to the class attribute of the toggle. This can be used to apply custom styles. Refer to Custom Styles for reference. |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<td>width</td> |
|||
<td>integer</td> |
|||
<td><em>null</em></td> |
|||
<td> |
|||
Sets the width of the toggle. if set to <em>null</em>, width will be calculated. |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<td>height</td> |
|||
<td>integer</td> |
|||
<td><em>null</em></td> |
|||
<td> |
|||
Sets the height of the toggle. if set to <em>null</em>, height will be calculated. |
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
|
|||
<h3>Methods</h3> |
|||
<p>Methods can be used to control toggles directly.</p> |
|||
<div class="example"> |
|||
<input id="toggle-demo" type="checkbox" data-toggle="toggle"> |
|||
</div> |
|||
<div class="table-responsive"> |
|||
<table class="table table-striped table-condensed"> |
|||
<thead> |
|||
<tr> |
|||
<th>Method</th> |
|||
<th>Example</th> |
|||
<th>Description</th> |
|||
<th>Demo</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr> |
|||
<td><em>initialize</em></td> |
|||
<td><code>$('#toggle-demo').bootstrapToggle()</code></td> |
|||
<td>Initializes the toggle plugin with options</td> |
|||
<td><button class="btn btn-default btn-xs" onclick="demo.init('#toggle-demo')">Initialize</button></td> |
|||
</tr> |
|||
<tr> |
|||
<td>destroy</td> |
|||
<td><code>$('#toggle-demo').bootstrapToggle('destroy')</code></td> |
|||
<td>Destroys the toggle</td> |
|||
<td><button class="btn btn-default btn-xs" onclick="demo.destroy('#toggle-demo')">Destroy</button></td> |
|||
</tr> |
|||
<tr> |
|||
<td>on</td> |
|||
<td><code>$('#toggle-demo').bootstrapToggle('on')</code></td> |
|||
<td>Sets the toggle to 'On' state</td> |
|||
<td><button class="btn btn-default btn-xs" onclick="demo.on('#toggle-demo')">On</button></td> |
|||
</tr> |
|||
<tr> |
|||
<td>off</td> |
|||
<td><code>$('#toggle-demo').bootstrapToggle('off')</code></td> |
|||
<td>Sets the toggle to 'Off' state</td> |
|||
<td><button class="btn btn-default btn-xs" onclick="demo.off('#toggle-demo')">Off</button></td> |
|||
</tr> |
|||
<tr> |
|||
<td>toggle</td> |
|||
<td><code>$('#toggle-demo').bootstrapToggle('toggle')</code></td> |
|||
<td>Toggles the state of the toggle</td> |
|||
<td><button class="btn btn-default btn-xs" onclick="demo.toggle('#toggle-demo')">Toggle</button></td> |
|||
</tr> |
|||
<tr> |
|||
<td>enable</td> |
|||
<td><code>$('#toggle-demo').bootstrapToggle('enable')</code></td> |
|||
<td>Enables the toggle</td> |
|||
<td><button class="btn btn-default btn-xs" onclick="demo.enable('#toggle-demo')">Enable</button></td> |
|||
</tr> |
|||
<tr> |
|||
<td>disable</td> |
|||
<td><code>$('#toggle-demo').bootstrapToggle('disable')</code></td> |
|||
<td>Disables the toggle</td> |
|||
<td><button class="btn btn-default btn-xs" onclick="demo.disable('#toggle-demo')">Disable</button></td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
<div id="events" class="container"> |
|||
<h2>Events</h2> |
|||
<hr> |
|||
|
|||
<h3>Event Propagation</h3> |
|||
<p><span class="label label-primary">Note</span> All events are propagated to and from input element to the toggle. </p> |
|||
<p>You should listen to events from the <code><input type="checkbox"></code> directly rather than look for custom events.</p> |
|||
<div class="example"> |
|||
<input id="toggle-event" type="checkbox" data-toggle="toggle"> |
|||
<div id="console-event"></div> |
|||
<script> |
|||
$(function() { |
|||
$('#toggle-event').change(function() { |
|||
$('#console-event').html('Toggle: ' + $(this).prop('checked')) |
|||
}) |
|||
}) |
|||
</script> |
|||
</div> |
|||
|
|||
<h3>API vs Input</h3> |
|||
<p>This also means that using the API or Input to trigger events will work both ways.</p> |
|||
<div class="example"> |
|||
<input id="toggle-trigger" type="checkbox" data-toggle="toggle"> |
|||
<button class="btn btn-success" onclick="toggleOn()">On by API</button> |
|||
<button class="btn btn-danger" onclick="toggleOff()">Off by API</button> |
|||
<button class="btn btn-success" onclick="toggleOnByInput()">On by Input</button> |
|||
<button class="btn btn-danger" onclick="toggleOffByInput()">Off by Input</button> |
|||
<script> |
|||
function toggleOn() { |
|||
$('#toggle-trigger').bootstrapToggle('on') |
|||
} |
|||
function toggleOff() { |
|||
$('#toggle-trigger').bootstrapToggle('off') |
|||
} |
|||
function toggleOnByInput() { |
|||
$('#toggle-trigger').prop('checked', true).change() |
|||
} |
|||
function toggleOffByInput() { |
|||
$('#toggle-trigger').prop('checked', false).change() |
|||
} |
|||
</script> |
|||
</div> |
|||
</div> |
|||
|
|||
<div id="demos" class="container"> |
|||
<h2>Demos</h2> |
|||
<hr> |
|||
|
|||
<h3>Sizes</h3> |
|||
<p>Bootstrap toggle is available in different sizes. Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-sizes" target="_blank">Button Sizes</a> documentation for more information.</p> |
|||
<div class="example"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-size="large"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-size="normal"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-size="small"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-size="mini"> |
|||
</div> |
|||
|
|||
<h3>Custom Sizes</h3> |
|||
<p>Bootstrap toggle can handle custom sizes by <code>data-width</code> and <code>data-height</code> options.</p> |
|||
<div class="example"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-width="100" data-height="75"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-height="75"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-width="100"> |
|||
</div> |
|||
|
|||
<h3>Colors</h3> |
|||
<p>Bootstrap Toggle supports various colors. Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-options" target="_blank">Button Options</a> documentation for more information.</p> |
|||
<div class="example"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-onstyle="primary"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-onstyle="success"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-onstyle="info"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-onstyle="warning"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-onstyle="danger"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-onstyle="default"> |
|||
</div> |
|||
|
|||
<h3>Colors Mix</h3> |
|||
<p>You can style on state as well as the off state.</p> |
|||
<div class="example"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-onstyle="success" data-offstyle="danger"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-onstyle="warning" data-offstyle="info"> |
|||
</div> |
|||
|
|||
<h3>Custom Style</h3> |
|||
<p>Customized styles can be applied as easily.</p> |
|||
<div class="example"> |
|||
<style> |
|||
.toggle.ios, .toggle-on.ios, .toggle-off.ios { border-radius: 20px; } |
|||
.toggle.ios .toggle-handle { border-radius: 20px; } |
|||
</style> |
|||
<input type="checkbox" checked data-toggle="toggle" data-style="ios"> |
|||
<style> |
|||
.toggle.android { border-radius: 0px;} |
|||
.toggle.android .toggle-handle { border-radius: 0px; } |
|||
</style> |
|||
<input type="checkbox" checked data-toggle="toggle" data-style="android" data-onstyle="info"> |
|||
</div> |
|||
|
|||
<h3>Custom Text</h3> |
|||
<p>The text can be changed easily with attributes or options.</p> |
|||
<div class="example"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-on="Ready" data-off="Not Ready" data-onstyle="success" data-offstyle="danger"> |
|||
</div> |
|||
|
|||
<h3>Icons/Html Text</h3> |
|||
<p>You can easily add icons or images since html is supported for on/off text.</p> |
|||
<div class="example"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-on="<i class='fa fa-play'></i> Play" data-off="<i class='fa fa-pause'></i> Pause"> |
|||
</div> |
|||
|
|||
<h3>Multiple Lines of Text</h3> |
|||
<p>Toggles with multiple lines will adjust its heights.</p> |
|||
<div class="example"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-on="Hello<br>World" data-off="Goodbye<br>World"> |
|||
</div> |
|||
|
|||
<h3>Animation Speed</h3> |
|||
<p>Transition speed can be easily controlled with css <code>transition</code> property on <code>.toggle-group</code>. You can also turn animation off completely.</p> |
|||
<div class="example"> |
|||
<style> |
|||
.slow .toggle-group { transition: left 0.7s; -webkit-transition: left 0.7s; } |
|||
.fast .toggle-group { transition: left 0.1s; -webkit-transition: left 0.1s; } |
|||
.quick .toggle-group { transition: none; -webkit-transition: none; } |
|||
</style> |
|||
<input type="checkbox" checked data-toggle="toggle" data-style="slow"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-class="fast"> |
|||
<input type="checkbox" checked data-toggle="toggle" data-style="quick"> |
|||
</div> |
|||
<div> |
|||
</main> |
|||
<footer> |
|||
<div class="container"> |
|||
<p> |
|||
<img class="nyt-logo" src="doc/nyt.png"> |
|||
<img class="nyt-logo" src="doc/nytdev.svg"> |
|||
</p> |
|||
<p>Designed and built by <a href="https://github.com/minhur" target="_blank">Min Hur</a> for <a href="http://developers.nytimes.com" target="_blank">The New York Times Company</a></p> |
|||
<p>Latest Version: 2.2.0 | Code licensed under MIT</p> |
|||
<p> |
|||
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="110" height="20"></iframe> |
|||
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=fork&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="95" height="20"></iframe> |
|||
</p> |
|||
</div> |
|||
</footer> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script> |
|||
<script src="doc/script.js"></script> |
|||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> |
|||
<script src="js/bootstrap-toggle.js"></script> |
|||
<script> |
|||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ |
|||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), |
|||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) |
|||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); |
|||
ga('create', 'UA-55669452-1', 'auto'); |
|||
ga('send', 'pageview'); |
|||
</script> |
|||
</body> |
|||
</html> |
@ -0,0 +1,180 @@ |
|||
/*! ======================================================================== |
|||
* Bootstrap Toggle: bootstrap-toggle.js v2.2.0 |
|||
* http://www.bootstraptoggle.com
|
|||
* ======================================================================== |
|||
* Copyright 2014 Min Hur, The New York Times Company |
|||
* Licensed under MIT |
|||
* ======================================================================== */ |
|||
|
|||
|
|||
+function ($) { |
|||
'use strict'; |
|||
|
|||
// TOGGLE PUBLIC CLASS DEFINITION
|
|||
// ==============================
|
|||
|
|||
var Toggle = function (element, options) { |
|||
this.$element = $(element) |
|||
this.options = $.extend({}, this.defaults(), options) |
|||
this.render() |
|||
} |
|||
|
|||
Toggle.VERSION = '2.2.0' |
|||
|
|||
Toggle.DEFAULTS = { |
|||
on: 'On', |
|||
off: 'Off', |
|||
onstyle: 'primary', |
|||
offstyle: 'default', |
|||
size: 'normal', |
|||
style: '', |
|||
width: null, |
|||
height: null |
|||
} |
|||
|
|||
Toggle.prototype.defaults = function() { |
|||
return { |
|||
on: this.$element.attr('data-on') || Toggle.DEFAULTS.on, |
|||
off: this.$element.attr('data-off') || Toggle.DEFAULTS.off, |
|||
onstyle: this.$element.attr('data-onstyle') || Toggle.DEFAULTS.onstyle, |
|||
offstyle: this.$element.attr('data-offstyle') || Toggle.DEFAULTS.offstyle, |
|||
size: this.$element.attr('data-size') || Toggle.DEFAULTS.size, |
|||
style: this.$element.attr('data-style') || Toggle.DEFAULTS.style, |
|||
width: this.$element.attr('data-width') || Toggle.DEFAULTS.width, |
|||
height: this.$element.attr('data-height') || Toggle.DEFAULTS.height |
|||
} |
|||
} |
|||
|
|||
Toggle.prototype.render = function () { |
|||
this._onstyle = 'btn-' + this.options.onstyle |
|||
this._offstyle = 'btn-' + this.options.offstyle |
|||
var size = this.options.size === 'large' ? 'btn-lg' |
|||
: this.options.size === 'small' ? 'btn-sm' |
|||
: this.options.size === 'mini' ? 'btn-xs' |
|||
: '' |
|||
var $toggleOn = $('<label class="btn">').html(this.options.on) |
|||
.addClass(this._onstyle + ' ' + size) |
|||
var $toggleOff = $('<label class="btn">').html(this.options.off) |
|||
.addClass(this._offstyle + ' ' + size + ' active') |
|||
var $toggleHandle = $('<span class="toggle-handle btn btn-default">') |
|||
.addClass(size) |
|||
var $toggleGroup = $('<div class="toggle-group">') |
|||
.append($toggleOn, $toggleOff, $toggleHandle) |
|||
var $toggle = $('<div class="toggle btn" data-toggle="toggle">') |
|||
.addClass( this.$element.prop('checked') ? this._onstyle : this._offstyle+' off' ) |
|||
.addClass(size).addClass(this.options.style) |
|||
|
|||
this.$element.wrap($toggle) |
|||
$.extend(this, { |
|||
$toggle: this.$element.parent(), |
|||
$toggleOn: $toggleOn, |
|||
$toggleOff: $toggleOff, |
|||
$toggleGroup: $toggleGroup |
|||
}) |
|||
this.$toggle.append($toggleGroup) |
|||
|
|||
var width = this.options.width || Math.max($toggleOn.outerWidth(), $toggleOff.outerWidth())+($toggleHandle.outerWidth()/2) |
|||
var height = this.options.height || Math.max($toggleOn.outerHeight(), $toggleOff.outerHeight()) |
|||
$toggleOn.addClass('toggle-on') |
|||
$toggleOff.addClass('toggle-off') |
|||
this.$toggle.css({ width: width, height: height }) |
|||
if (this.options.height) { |
|||
$toggleOn.css('line-height', $toggleOn.height() + 'px') |
|||
$toggleOff.css('line-height', $toggleOff.height() + 'px') |
|||
} |
|||
this.update(true) |
|||
this.trigger(true) |
|||
} |
|||
|
|||
Toggle.prototype.toggle = function () { |
|||
if (this.$element.prop('checked')) this.off() |
|||
else this.on() |
|||
} |
|||
|
|||
Toggle.prototype.on = function (silent) { |
|||
if (this.$element.prop('disabled')) return false |
|||
this.$toggle.removeClass(this._offstyle + ' off').addClass(this._onstyle) |
|||
this.$element.prop('checked', true) |
|||
if (!silent) this.trigger() |
|||
} |
|||
|
|||
Toggle.prototype.off = function (silent) { |
|||
if (this.$element.prop('disabled')) return false |
|||
this.$toggle.removeClass(this._onstyle).addClass(this._offstyle + ' off') |
|||
this.$element.prop('checked', false) |
|||
if (!silent) this.trigger() |
|||
} |
|||
|
|||
Toggle.prototype.enable = function () { |
|||
this.$toggle.removeAttr('disabled') |
|||
this.$element.prop('disabled', false) |
|||
} |
|||
|
|||
Toggle.prototype.disable = function () { |
|||
this.$toggle.attr('disabled', 'disabled') |
|||
this.$element.prop('disabled', true) |
|||
} |
|||
|
|||
Toggle.prototype.update = function (silent) { |
|||
if (this.$element.prop('disabled')) this.disable() |
|||
else this.enable() |
|||
if (this.$element.prop('checked')) this.on(silent) |
|||
else this.off(silent) |
|||
} |
|||
|
|||
Toggle.prototype.trigger = function (silent) { |
|||
this.$element.off('change.bs.toggle') |
|||
if (!silent) this.$element.change() |
|||
this.$element.on('change.bs.toggle', $.proxy(function() { |
|||
this.update() |
|||
}, this)) |
|||
} |
|||
|
|||
Toggle.prototype.destroy = function() { |
|||
this.$element.off('change.bs.toggle') |
|||
this.$toggleGroup.remove() |
|||
this.$element.removeData('bs.toggle') |
|||
this.$element.unwrap() |
|||
} |
|||
|
|||
// TOGGLE PLUGIN DEFINITION
|
|||
// ========================
|
|||
|
|||
function Plugin(option) { |
|||
return this.each(function () { |
|||
var $this = $(this) |
|||
var data = $this.data('bs.toggle') |
|||
var options = typeof option == 'object' && option |
|||
|
|||
if (!data) $this.data('bs.toggle', (data = new Toggle(this, options))) |
|||
if (typeof option == 'string' && data[option]) data[option]() |
|||
}) |
|||
} |
|||
|
|||
var old = $.fn.bootstrapToggle |
|||
|
|||
$.fn.bootstrapToggle = Plugin |
|||
$.fn.bootstrapToggle.Constructor = Toggle |
|||
|
|||
// TOGGLE NO CONFLICT
|
|||
// ==================
|
|||
|
|||
$.fn.toggle.noConflict = function () { |
|||
$.fn.bootstrapToggle = old |
|||
return this |
|||
} |
|||
|
|||
// TOGGLE DATA-API
|
|||
// ===============
|
|||
|
|||
$(function() { |
|||
$('input[type=checkbox][data-toggle^=toggle]').bootstrapToggle() |
|||
}) |
|||
|
|||
$(document).on('click.bs.toggle', 'div[data-toggle^=toggle]', function(e) { |
|||
var $checkbox = $(this).find('input[type=checkbox]') |
|||
$checkbox.bootstrapToggle('toggle') |
|||
e.preventDefault() |
|||
}) |
|||
|
|||
}(jQuery); |
@ -0,0 +1,9 @@ |
|||
/*! ======================================================================== |
|||
* Bootstrap Toggle: bootstrap-toggle.js v2.2.0 |
|||
* http://www.bootstraptoggle.com
|
|||
* ======================================================================== |
|||
* Copyright 2014 Min Hur, The New York Times Company |
|||
* Licensed under MIT |
|||
* ======================================================================== */ |
|||
+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",c=a('<label class="btn">').html(this.options.on).addClass(this._onstyle+" "+b),d=a('<label class="btn">').html(this.options.off).addClass(this._offstyle+" "+b+" active"),e=a('<span class="toggle-handle btn btn-default">').addClass(b),f=a('<div class="toggle-group">').append(c,d,e),g=a('<div class="toggle btn" data-toggle="toggle">').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(b).addClass(this.options.style);this.$element.wrap(g),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:c,$toggleOff:d,$toggleGroup:f}),this.$toggle.append(f);var h=this.options.width||Math.max(c.outerWidth(),d.outerWidth())+e.outerWidth()/2,i=this.options.height||Math.max(c.outerHeight(),d.outerHeight());c.addClass("toggle-on"),d.addClass("toggle-off"),this.$toggle.css({width:h,height:i}),this.options.height&&(c.css("line-height",c.height()+"px"),d.css("line-height",d.height()+"px")),this.update(!0),this.trigger(!0)},c.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},c.prototype.on=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),void(a||this.trigger()))},c.prototype.off=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),void(a||this.trigger()))},c.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},c.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},c.prototype.update=function(a){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(a):this.off(a)},c.prototype.trigger=function(b){this.$element.off("change.bs.toggle"),b||this.$element.change(),this.$element.on("change.bs.toggle",a.proxy(function(){this.update()},this))},c.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var d=a.fn.bootstrapToggle;a.fn.bootstrapToggle=b,a.fn.bootstrapToggle.Constructor=c,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=d,this},a(function(){a("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),a(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(b){var c=a(this).find("input[type=checkbox]");c.bootstrapToggle("toggle"),b.preventDefault()})}(jQuery); |
|||
//# sourceMappingURL=bootstrap-toggle.min.js.map
|
@ -0,0 +1 @@ |
|||
{"version":3,"file":"bootstrap-toggle.min.js","sources":["bootstrap-toggle.js"],"names":["$","Plugin","option","this","each","$this","data","options","Toggle","element","$element","extend","defaults","render","VERSION","DEFAULTS","on","off","onstyle","offstyle","size","style","width","height","prototype","attr","_onstyle","_offstyle","$toggleOn","html","addClass","$toggleOff","$toggleHandle","$toggleGroup","append","$toggle","prop","wrap","parent","Math","max","outerWidth","outerHeight","css","update","trigger","toggle","silent","removeClass","enable","removeAttr","disable","change","proxy","destroy","remove","removeData","unwrap","old","fn","bootstrapToggle","Constructor","noConflict","document","e","$checkbox","find","preventDefault","jQuery"],"mappings":"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"} |
@ -0,0 +1,180 @@ |
|||
/*! ======================================================================== |
|||
* Bootstrap Toggle: bootstrap2-toggle.js v2.2.0 |
|||
* http://www.bootstraptoggle.com
|
|||
* ======================================================================== |
|||
* Copyright 2014 Min Hur, The New York Times Company |
|||
* Licensed under MIT |
|||
* ======================================================================== */ |
|||
|
|||
|
|||
+function ($) { |
|||
'use strict'; |
|||
|
|||
// TOGGLE PUBLIC CLASS DEFINITION
|
|||
// ==============================
|
|||
|
|||
var Toggle = function (element, options) { |
|||
this.$element = $(element) |
|||
this.options = $.extend({}, this.defaults(), options) |
|||
this.render() |
|||
} |
|||
|
|||
Toggle.VERSION = '2.2.0' |
|||
|
|||
Toggle.DEFAULTS = { |
|||
on: 'On', |
|||
off: 'Off', |
|||
onstyle: 'primary', |
|||
offstyle: 'default', |
|||
size: 'normal', |
|||
style: '', |
|||
width: null, |
|||
height: null |
|||
} |
|||
|
|||
Toggle.prototype.defaults = function() { |
|||
return { |
|||
on: this.$element.attr('data-on') || Toggle.DEFAULTS.on, |
|||
off: this.$element.attr('data-off') || Toggle.DEFAULTS.off, |
|||
onstyle: this.$element.attr('data-onstyle') || Toggle.DEFAULTS.onstyle, |
|||
offstyle: this.$element.attr('data-offstyle') || Toggle.DEFAULTS.offstyle, |
|||
size: this.$element.attr('data-size') || Toggle.DEFAULTS.size, |
|||
style: this.$element.attr('data-style') || Toggle.DEFAULTS.style, |
|||
width: this.$element.attr('data-width') || Toggle.DEFAULTS.width, |
|||
height: this.$element.attr('data-height') || Toggle.DEFAULTS.height |
|||
} |
|||
} |
|||
|
|||
Toggle.prototype.render = function () { |
|||
this._onstyle = 'btn-' + this.options.onstyle |
|||
this._offstyle = 'btn-' + this.options.offstyle |
|||
var size = this.options.size === 'large' ? 'btn-large' |
|||
: this.options.size === 'small' ? 'btn-small' |
|||
: this.options.size === 'mini' ? 'btn-mini' |
|||
: '' |
|||
var $toggleOn = $('<label class="btn">').html(this.options.on) |
|||
.addClass(this._onstyle + ' ' + size) |
|||
var $toggleOff = $('<label class="btn">').html(this.options.off) |
|||
.addClass(this._offstyle + ' ' + size + ' active') |
|||
var $toggleHandle = $('<span class="toggle-handle btn btn-default">') |
|||
.addClass(size) |
|||
var $toggleGroup = $('<div class="toggle-group">') |
|||
.append($toggleOn, $toggleOff, $toggleHandle) |
|||
var $toggle = $('<div class="toggle btn" data-toggle="toggle">') |
|||
.addClass( this.$element.prop('checked') ? this._onstyle : this._offstyle+' off' ) |
|||
.addClass(size).addClass(this.options.style) |
|||
|
|||
this.$element.wrap($toggle) |
|||
$.extend(this, { |
|||
$toggle: this.$element.parent(), |
|||
$toggleOn: $toggleOn, |
|||
$toggleOff: $toggleOff, |
|||
$toggleGroup: $toggleGroup |
|||
}) |
|||
this.$toggle.append($toggleGroup) |
|||
|
|||
var width = this.options.width || Math.max($toggleOn.width(), $toggleOff.width())+($toggleHandle.outerWidth()/2) |
|||
var height = this.options.height || Math.max($toggleOn.height(), $toggleOff.height()) |
|||
$toggleOn.addClass('toggle-on') |
|||
$toggleOff.addClass('toggle-off') |
|||
this.$toggle.css({ width: width, height: height }) |
|||
if (this.options.height) { |
|||
$toggleOn.css('line-height', $toggleOn.height() + 'px') |
|||
$toggleOff.css('line-height', $toggleOff.height() + 'px') |
|||
} |
|||
this.update(true) |
|||
this.trigger(true) |
|||
} |
|||
|
|||
Toggle.prototype.toggle = function () { |
|||
if (this.$element.prop('checked')) this.off() |
|||
else this.on() |
|||
} |
|||
|
|||
Toggle.prototype.on = function (silent) { |
|||
if (this.$element.prop('disabled')) return false |
|||
this.$toggle.removeClass(this._offstyle + ' off').addClass(this._onstyle) |
|||
this.$element.prop('checked', true) |
|||
if (!silent) this.trigger() |
|||
} |
|||
|
|||
Toggle.prototype.off = function (silent) { |
|||
if (this.$element.prop('disabled')) return false |
|||
this.$toggle.removeClass(this._onstyle).addClass(this._offstyle + ' off') |
|||
this.$element.prop('checked', false) |
|||
if (!silent) this.trigger() |
|||
} |
|||
|
|||
Toggle.prototype.enable = function () { |
|||
this.$toggle.removeAttr('disabled') |
|||
this.$element.prop('disabled', false) |
|||
} |
|||
|
|||
Toggle.prototype.disable = function () { |
|||
this.$toggle.attr('disabled', 'disabled') |
|||
this.$element.prop('disabled', true) |
|||
} |
|||
|
|||
Toggle.prototype.update = function (silent) { |
|||
if (this.$element.prop('disabled')) this.disable() |
|||
else this.enable() |
|||
if (this.$element.prop('checked')) this.on(silent) |
|||
else this.off(silent) |
|||
} |
|||
|
|||
Toggle.prototype.trigger = function (silent) { |
|||
this.$element.off('change.bs.toggle') |
|||
if (!silent) this.$element.change() |
|||
this.$element.on('change.bs.toggle', $.proxy(function() { |
|||
this.update() |
|||
}, this)) |
|||
} |
|||
|
|||
Toggle.prototype.destroy = function() { |
|||
this.$element.off('change.bs.toggle') |
|||
this.$toggleGroup.remove() |
|||
this.$element.removeData('bs.toggle') |
|||
this.$element.unwrap() |
|||
} |
|||
|
|||
// TOGGLE PLUGIN DEFINITION
|
|||
// ========================
|
|||
|
|||
function Plugin(option) { |
|||
return this.each(function () { |
|||
var $this = $(this) |
|||
var data = $this.data('bs.toggle') |
|||
var options = typeof option == 'object' && option |
|||
|
|||
if (!data) $this.data('bs.toggle', (data = new Toggle(this, options))) |
|||
if (typeof option == 'string' && data[option]) data[option]() |
|||
}) |
|||
} |
|||
|
|||
var old = $.fn.bootstrapToggle |
|||
|
|||
$.fn.bootstrapToggle = Plugin |
|||
$.fn.bootstrapToggle.Constructor = Toggle |
|||
|
|||
// TOGGLE NO CONFLICT
|
|||
// ==================
|
|||
|
|||
$.fn.toggle.noConflict = function () { |
|||
$.fn.bootstrapToggle = old |
|||
return this |
|||
} |
|||
|
|||
// TOGGLE DATA-API
|
|||
// ===============
|
|||
|
|||
$(function() { |
|||
$('input[type=checkbox][data-toggle^=toggle]').bootstrapToggle() |
|||
}) |
|||
|
|||
$(document).on('click.bs.toggle', 'div[data-toggle^=toggle]', function(e) { |
|||
var $checkbox = $(this).find('input[type=checkbox]') |
|||
$checkbox.bootstrapToggle('toggle') |
|||
e.preventDefault() |
|||
}) |
|||
|
|||
}(jQuery); |
@ -0,0 +1,9 @@ |
|||
/*! ======================================================================== |
|||
* Bootstrap Toggle: bootstrap2-toggle.js v2.2.0 |
|||
* http://www.bootstraptoggle.com
|
|||
* ======================================================================== |
|||
* Copyright 2014 Min Hur, The New York Times Company |
|||
* Licensed under MIT |
|||
* ======================================================================== */ |
|||
+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-large":"small"===this.options.size?"btn-small":"mini"===this.options.size?"btn-mini":"",c=a('<label class="btn">').html(this.options.on).addClass(this._onstyle+" "+b),d=a('<label class="btn">').html(this.options.off).addClass(this._offstyle+" "+b+" active"),e=a('<span class="toggle-handle btn btn-default">').addClass(b),f=a('<div class="toggle-group">').append(c,d,e),g=a('<div class="toggle btn" data-toggle="toggle">').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(b).addClass(this.options.style);this.$element.wrap(g),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:c,$toggleOff:d,$toggleGroup:f}),this.$toggle.append(f);var h=this.options.width||Math.max(c.width(),d.width())+e.outerWidth()/2,i=this.options.height||Math.max(c.height(),d.height());c.addClass("toggle-on"),d.addClass("toggle-off"),this.$toggle.css({width:h,height:i}),this.options.height&&(c.css("line-height",c.height()+"px"),d.css("line-height",d.height()+"px")),this.update(!0),this.trigger(!0)},c.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},c.prototype.on=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),void(a||this.trigger()))},c.prototype.off=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),void(a||this.trigger()))},c.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},c.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},c.prototype.update=function(a){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(a):this.off(a)},c.prototype.trigger=function(b){this.$element.off("change.bs.toggle"),b||this.$element.change(),this.$element.on("change.bs.toggle",a.proxy(function(){this.update()},this))},c.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var d=a.fn.bootstrapToggle;a.fn.bootstrapToggle=b,a.fn.bootstrapToggle.Constructor=c,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=d,this},a(function(){a("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),a(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(b){var c=a(this).find("input[type=checkbox]");c.bootstrapToggle("toggle"),b.preventDefault()})}(jQuery); |
|||
//# sourceMappingURL=bootstrap2-toggle.min.js.map
|
@ -0,0 +1 @@ |
|||
{"version":3,"file":"bootstrap2-toggle.min.js","sources":["bootstrap2-toggle.js"],"names":["$","Plugin","option","this","each","$this","data","options","Toggle","element","$element","extend","defaults","render","VERSION","DEFAULTS","on","off","onstyle","offstyle","size","style","width","height","prototype","attr","_onstyle","_offstyle","$toggleOn","html","addClass","$toggleOff","$toggleHandle","$toggleGroup","append","$toggle","prop","wrap","parent","Math","max","outerWidth","css","update","trigger","toggle","silent","removeClass","enable","removeAttr","disable","change","proxy","destroy","remove","removeData","unwrap","old","fn","bootstrapToggle","Constructor","noConflict","document","e","$checkbox","find","preventDefault","jQuery"],"mappings":"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"} |
@ -0,0 +1,28 @@ |
|||
{ |
|||
"name": "bootstrap-toggle", |
|||
"description": "Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles", |
|||
"version": "2.2.2", |
|||
"main": "js/bootstrap-toggle.js", |
|||
"keywords": [ |
|||
"bootstrap", |
|||
"toggle", |
|||
"bootstrap-toggle", |
|||
"switch", |
|||
"bootstrap-switch" |
|||
], |
|||
"homepage": "http://www.bootstraptoggle.com", |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "https://github.com/minhur/bootstrap-toggle.git" |
|||
}, |
|||
"license": "MIT", |
|||
"author": "Min Hur <min.hur@gmail.com>", |
|||
"bugs": { |
|||
"url": "https://github.com/minhur/bootstrap-toggle/issues" |
|||
}, |
|||
"devDependencies": { |
|||
"grunt-contrib-clean": "^0.6.0", |
|||
"grunt-contrib-cssmin": "^0.10.0", |
|||
"grunt-contrib-uglify": "^0.6.0" |
|||
} |
|||
} |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,21 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2017, loading.io |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
@ -0,0 +1,49 @@ |
|||
loading-Bar |
|||
============= |
|||
|
|||
loading-Bar is a highly flexible, open sourced progress bar library based on SVG. For demo and documentation, check out the official website: [https://loading.io/progress/](https://loading.io/progress/) |
|||
|
|||
|
|||
|
|||
Example |
|||
============= |
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
Usage |
|||
============= |
|||
|
|||
download and include the required [JS](https://raw.githubusercontent.com/loadingio/loading-bar/master/dist/loading-bar.js) and [CSS](https://raw.githubusercontent.com/loadingio/loading-bar/master/dist/loading-bar.css) files: |
|||
|
|||
<link rel="stylesheet" type="text/css" href="loading-bar.css"/> |
|||
<script type="text/javascript" src="loading-bar.js"></script> |
|||
<div class="ldBar"></div> |
|||
|
|||
|
|||
Building |
|||
============= |
|||
|
|||
### Install prerequisites |
|||
|
|||
``` |
|||
sudo npm install -g gulp |
|||
``` |
|||
|
|||
### Build |
|||
|
|||
``` |
|||
git clone https://github.com/loadingio/loading-bar |
|||
cd loading-bar |
|||
npm install |
|||
gulp |
|||
``` |
|||
|
|||
Built files will be written into `./build` directory |
|||
|
|||
|
|||
LICENSE |
|||
============= |
|||
|
|||
MIT License |
@ -0,0 +1,3 @@ |
|||
build |
|||
.*.swp |
|||
node_modules |
@ -0,0 +1,24 @@ |
|||
#!/usr/bin/env bash |
|||
mkdir -p dist |
|||
echo "build src/loading-bar.ls ..." |
|||
./node_modules/.bin/lsc -cbp src/loading-bar.ls > dist/loading-bar-raw.js |
|||
echo "build src/presets.ls ..." |
|||
./node_modules/.bin/lsc -cbp src/presets.ls > dist/presets.js |
|||
echo "build src/loading-bar.styl -> dist/loading-bar.css ..." |
|||
./node_modules/.bin/stylus -p src/loading-bar.styl > dist/loading-bar.css |
|||
echo "bundle loading-bar ..." |
|||
./node_modules/.bin/browserify dist/loading-bar-raw.js > dist/loading-bar.js |
|||
rm -f dist/loading-bar-raw.js |
|||
rm -f dist/presets.js |
|||
|
|||
echo "minifying loading-bar.js ..." |
|||
./node_modules/.bin/uglifyjs dist/loading-bar.js > dist/loading-bar.min.js |
|||
echo "minifying loading-bar.css ..." |
|||
./node_modules/.bin/uglifycss dist/loading-bar.css > dist/loading-bar.min.css |
|||
|
|||
echo "zip loading-bar.js and loading-bar.css ..." |
|||
rm -f dist/loading-bar.zip |
|||
zip -r dist/loading-bar.zip dist/loading-bar.js dist/loading-bar.css dist/loading-bar.min.js dist/loading-bar.min.css |
|||
|
|||
echo "done." |
|||
|
@ -0,0 +1,148 @@ |
|||
argv = require 'yargs' .argv |
|||
only-compile = false |
|||
|
|||
|
|||
require! <[ watchify gulp browserify glob path fs globby touch gulp-livescript]> |
|||
require! 'prelude-ls': {union, join, keys, map, unique} |
|||
require! 'vinyl-source-stream': source |
|||
require! 'vinyl-buffer': buffer |
|||
require! 'gulp-watch': watch |
|||
require! 'gulp-pug': pug |
|||
require! 'gulp-stylus': stylus |
|||
require! 'node-notifier': notifier |
|||
require! 'gulp-concat': cat |
|||
require! 'gulp-uglify': uglify |
|||
require! 'gulp-flatten': flatten |
|||
require! 'gulp-tap': tap |
|||
require! 'gulp-cached': cache |
|||
require! 'gulp-sourcemaps': sourcemaps |
|||
require! 'browserify-livescript' |
|||
require! 'run-sequence' |
|||
require! 'through2':through |
|||
require! 'optimize-js' |
|||
require! 'gulp-if-else': if-else |
|||
require! 'gulp-rename': rename |
|||
require! 'gulp-zip': zip |
|||
require! 'gulp-remove-files': remove-files |
|||
|
|||
# Build Settings |
|||
notification-enabled = yes |
|||
|
|||
# Project Folder Structure |
|||
src-path = "#{__dirname}/src" |
|||
build-path = "#{__dirname}/build" |
|||
out-dir = argv.out-dir or build-path |
|||
|
|||
on-error = (source, msg) -> |
|||
msg = try |
|||
msg.to-string! |
|||
catch |
|||
"unknown message: #{e}" |
|||
console-msg = "GULP ERROR: #{source} : #{msg}" |
|||
console.log console-msg |
|||
|
|||
log-info = (source, msg) -> |
|||
msg = try |
|||
msg.to-string! |
|||
catch |
|||
"unknown message: #{e}" |
|||
console-msg = "GULP INFO: #{source} : #{msg}" |
|||
console.log console-msg |
|||
|
|||
ls-entry-file = "#{src-path}/loading-bar.ls" |
|||
|
|||
for-browserify = |
|||
"#{src-path}/*.ls" |
|||
... |
|||
|
|||
|
|||
# Organize Tasks |
|||
gulp.task \default, -> |
|||
do function run-all |
|||
gulp.start do |
|||
\lib |
|||
\browserify |
|||
\css |
|||
\zip |
|||
\compressjs |
|||
... |
|||
|
|||
watch for-browserify, -> |
|||
gulp.start \browserify |
|||
watch ["#{src-path}/*.styl"], -> |
|||
gulp.start \css |
|||
watch ["#{src-path}/*.ls"], -> |
|||
gulp.start \lib |
|||
watch ["#{out-dir}/*.js", "#{out-dir}/*.css"], -> |
|||
gulp.start \zip |
|||
watch ["#{out-dir}/loading-bar.js"], -> |
|||
gulp.start \compressjs |
|||
|
|||
|
|||
browserify-cache = {} |
|||
bundler = browserify do |
|||
entries: ls-entry-file |
|||
debug: true |
|||
paths: |
|||
src-path |
|||
... |
|||
extensions: <[ .ls ]> |
|||
cache: browserify-cache |
|||
package-cache: {} |
|||
plugin: |
|||
watchify unless only-compile |
|||
... |
|||
|
|||
bundler.transform browserify-livescript |
|||
|
|||
first-browserify-done = no |
|||
|
|||
function bundle |
|||
bundler |
|||
.bundle! |
|||
.on \error, (err) -> |
|||
msg = try |
|||
err.message |
|||
catch |
|||
err |
|||
on-error \browserify, msg |
|||
@emit \end |
|||
.pipe source "loading-bar.js" |
|||
.pipe buffer! |
|||
#.pipe sourcemaps.init {+load-maps, +large-files} |
|||
.pipe if-else only-compile, uglify |
|||
#.pipe rename basename: 'app' |
|||
#.pipe sourcemaps.write '.' |
|||
.pipe gulp.dest out-dir |
|||
.pipe tap (file) -> |
|||
log-info \browserify, "Browserify finished #{if out-dir isnt build-path then "out-dir: #{out-dir}"}" |
|||
console.log "------------------------------------------" |
|||
first-browserify-done := yes |
|||
|
|||
gulp.task \browserify, -> |
|||
bundle! |
|||
|
|||
gulp.task \lib, -> |
|||
gulp.src \src/*.ls |
|||
.pipe gulp-livescript bare: true |
|||
.pipe gulp.dest 'lib' |
|||
|
|||
gulp.task \css, -> |
|||
gulp.src \src/loading-bar.styl |
|||
.pipe stylus({compress: true}) |
|||
.pipe gulp.dest out-dir |
|||
.pipe tap (file) -> |
|||
log-info \css, "Stylus -> CSS finished #{if out-dir isnt build-path then "out-dir: #{out-dir}"}" |
|||
console.log "------------------------------------------" |
|||
|
|||
gulp.task \zip, -> |
|||
gulp.src ["#out-dir/*.js","#out-dir/*.css", "!build/*.min.*"] |
|||
.pipe zip("loading-bar.zip") |
|||
.pipe gulp.dest out-dir |
|||
|
|||
|
|||
gulp.task \compressjs, -> |
|||
gulp.src ["#out-dir/*.js", "!build/*.min.*"] |
|||
.pipe uglify! |
|||
.pipe rename suffix: \.min |
|||
.pipe gulp.dest out-dir |
After Width: | Height: | Size: 331 KiB |
@ -0,0 +1 @@ |
|||
loading bar |
@ -0,0 +1,22 @@ |
|||
var x$; |
|||
x$ = angular.module('loadingio', []); |
|||
x$.directive('ldbar', ['$compile', '$timeout'].concat(function($compile, $timeout){ |
|||
return { |
|||
restrict: 'A', |
|||
scope: { |
|||
model: '=ngModel', |
|||
config: '=config' |
|||
}, |
|||
link: function(s, e, a, c){ |
|||
var bar; |
|||
if (e[0]) { |
|||
bar = !e[0].ldBar |
|||
? new ldBar(e[0], s.config || {}) |
|||
: e[0].ldBar; |
|||
} |
|||
return s.$watch('model', function(n, o){ |
|||
return bar.set(n); |
|||
}); |
|||
} |
|||
}; |
|||
})); |
@ -0,0 +1,5 @@ |
|||
export = ldBar; |
|||
declare class ldBar { |
|||
constructor(element: any, options: object); |
|||
set(value: number): void; |
|||
} |
@ -0,0 +1,712 @@ |
|||
var presets, simpleStr, wrap, slice$ = [].slice, toString$ = {}.toString; |
|||
presets = require('./presets').presets; |
|||
simpleStr = function(arr){ |
|||
return arr.join(''); |
|||
}; |
|||
wrap = function(content){ |
|||
return "data:image/svg+xml;base64," + btoa(content); |
|||
}; |
|||
(function(){ |
|||
var make, handler, ldBar; |
|||
make = { |
|||
head: function(viewBox){ |
|||
return "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"" + viewBox + "\">"; |
|||
}, |
|||
gradient: function(dir, dur){ |
|||
var colors, ret, len, gx, gy, x, y, i$, i, idx; |
|||
dir == null && (dir = 45); |
|||
dur == null && (dur = 1); |
|||
colors = slice$.call(arguments, 2); |
|||
ret = [this.head("0 0 100 100")]; |
|||
len = colors.length * 4 + 1; |
|||
dir = dir * Math.PI / 180; |
|||
gx = Math.pow(Math.cos(dir), 2); |
|||
gy = Math.sqrt(gx - Math.pow(gx, 2)); |
|||
if (dir > Math.PI * 0.25) { |
|||
gy = Math.pow(Math.sin(dir), 2); |
|||
gx = Math.sqrt(gy - Math.pow(gy, 2)); |
|||
} |
|||
x = gx * 100; |
|||
y = gy * 100; |
|||
ret.push("<defs><linearGradient id=\"gradient\" x1=\"0\" x2=\"" + gx + "\" y1=\"0\" y2=\"" + gy + "\">"); |
|||
for (i$ = 0; i$ < len; ++i$) { |
|||
i = i$; |
|||
idx = i * 100 / (len - 1); |
|||
ret.push("<stop offset=\"" + idx + "%\" stop-color=\"" + colors[i % colors.length] + "\"/>"); |
|||
} |
|||
ret.push("</linearGradient></defs>\n<rect x=\"0\" y=\"0\" width=\"400\" height=\"400\" fill=\"url(#gradient)\">\n<animateTransform attributeName=\"transform\" type=\"translate\" from=\"-" + x + ",-" + y + "\"\nto=\"0,0\" dur=\"" + dur + "s\" repeatCount=\"indefinite\"/></rect></svg>"); |
|||
return wrap(ret.join("")); |
|||
}, |
|||
stripe: function(c1, c2, dur){ |
|||
var ret, i; |
|||
c1 == null && (c1 = '#b4b4b4'); |
|||
c2 == null && (c2 = '#e6e6e6'); |
|||
dur == null && (dur = 1); |
|||
ret = [this.head("0 0 100 100")]; |
|||
ret = ret.concat([ |
|||
"<rect fill=\"" + c2 + "\" width=\"100\" height=\"100\"/>", "<g><g>", (function(){ |
|||
var i$, results$ = []; |
|||
for (i$ = 0; i$ < 13; ++i$) { |
|||
i = i$; |
|||
results$.push(("<polygon fill=\"" + c1 + "\" ") + ("points=\"" + (-90 + i * 20) + ",100 " + (-100 + i * 20) + ",") + ("100 " + (-60 + i * 20) + ",0 " + (-50 + i * 20) + ",0 \"/>")); |
|||
} |
|||
return results$; |
|||
}()).join(""), "</g><animateTransform attributeName=\"transform\" type=\"translate\" ", "from=\"0,0\" to=\"20,0\" dur=\"" + dur + "s\" repeatCount=\"indefinite\"/></g></svg>" |
|||
].join("")); |
|||
return wrap(ret); |
|||
}, |
|||
bubble: function(c1, c2, count, dur, size, sw){ |
|||
var ret, i$, i, idx, x, r, d; |
|||
c1 == null && (c1 = '#39d'); |
|||
c2 == null && (c2 = '#9cf'); |
|||
count == null && (count = 15); |
|||
dur == null && (dur = 1); |
|||
size == null && (size = 6); |
|||
sw == null && (sw = 1); |
|||
ret = [this.head("0 0 200 200"), "<rect x=\"0\" y=\"0\" width=\"200\" height=\"200\" fill=\"" + c1 + "\"/>"]; |
|||
for (i$ = 0; i$ < count; ++i$) { |
|||
i = i$; |
|||
idx = -(i / count) * dur; |
|||
x = Math.random() * 184 + 8; |
|||
r = (Math.random() * 0.7 + 0.3) * size; |
|||
d = dur * (1 + Math.random() * 0.5); |
|||
ret.push(["<circle cx=\"" + x + "\" cy=\"0\" r=\"" + r + "\" fill=\"none\" stroke=\"" + c2 + "\" stroke-width=\"" + sw + "\">", "<animate attributeName=\"cy\" values=\"190;-10\" times=\"0;1\" ", "dur=\"" + d + "s\" begin=\"" + idx + "s\" repeatCount=\"indefinite\"/>", "</circle>", "<circle cx=\"" + x + "\" cy=\"0\" r=\"" + r + "\" fill=\"none\" stroke=\"" + c2 + "\" stroke-width=\"" + sw + "\">", "<animate attributeName=\"cy\" values=\"390;190\" times=\"0;1\" ", "dur=\"" + d + "s\" begin=\"" + idx + "s\" repeatCount=\"indefinite\"/>", "</circle>"].join("")); |
|||
} |
|||
return wrap(ret.join("") + "</svg>"); |
|||
} |
|||
}; |
|||
handler = { |
|||
queue: {}, |
|||
running: false, |
|||
main: function(timestamp){ |
|||
var keepon, removed, k, ref$, func, ret, this$ = this; |
|||
keepon = false; |
|||
removed = []; |
|||
for (k in ref$ = this.queue) { |
|||
func = ref$[k]; |
|||
ret = func(timestamp); |
|||
if (!ret) { |
|||
removed.push(func); |
|||
} |
|||
keepon = keepon || ret; |
|||
} |
|||
for (k in ref$ = this.queue) { |
|||
func = ref$[k]; |
|||
if (removed.indexOf(func) >= 0) { |
|||
delete this.queue[k]; |
|||
} |
|||
} |
|||
if (keepon) { |
|||
return requestAnimationFrame(function(it){ |
|||
return this$.main(it); |
|||
}); |
|||
} else { |
|||
return this.running = false; |
|||
} |
|||
}, |
|||
add: function(key, f){ |
|||
var this$ = this; |
|||
if (!this.queue[key]) { |
|||
this.queue[key] = f; |
|||
} |
|||
if (!this.running) { |
|||
this.running = true; |
|||
return requestAnimationFrame(function(it){ |
|||
return this$.main(it); |
|||
}); |
|||
} |
|||
} |
|||
}; |
|||
window.ldBar = ldBar = function(selector, option){ |
|||
var xmlns, root, cls, idPrefix, id, domTree, newNode, x$, config, attr, that, isStroke, parseRes, dom, svg, text, group, length, path0, path1, patimg, img, ret, size, this$ = this; |
|||
option == null && (option = {}); |
|||
xmlns = { |
|||
xlink: "http://www.w3.org/1999/xlink" |
|||
}; |
|||
root = toString$.call(selector).slice(8, -1) === 'String' ? document.querySelector(selector) : selector; |
|||
if (!root.ldBar) { |
|||
root.ldBar = this; |
|||
} else { |
|||
return root.ldBar; |
|||
} |
|||
cls = root.getAttribute('class') || ''; |
|||
if (!~cls.indexOf('ldBar')) { |
|||
root.setAttribute('class', cls + " ldBar"); |
|||
} |
|||
idPrefix = "ldBar-" + Math.random().toString(16).substring(2); |
|||
id = { |
|||
key: idPrefix, |
|||
clip: idPrefix + "-clip", |
|||
filter: idPrefix + "-filter", |
|||
pattern: idPrefix + "-pattern", |
|||
mask: idPrefix + "-mask", |
|||
maskPath: idPrefix + "-mask-path" |
|||
}; |
|||
domTree = function(n, o){ |
|||
var k, v; |
|||
n = newNode(n); |
|||
for (k in o) { |
|||
v = o[k]; |
|||
if (k !== 'attr') { |
|||
n.appendChild(domTree(k, v || {})); |
|||
} |
|||
} |
|||
n.attrs(o.attr || {}); |
|||
return n; |
|||
}; |
|||
newNode = function(n){ |
|||
return document.createElementNS("http://www.w3.org/2000/svg", n); |
|||
}; |
|||
x$ = document.body.__proto__.__proto__.__proto__; |
|||
x$.text = function(t){ |
|||
return this.appendChild(document.createTextNode(t)); |
|||
}; |
|||
x$.attrs = function(o){ |
|||
var k, v, ret, results$ = []; |
|||
for (k in o) { |
|||
v = o[k]; |
|||
ret = /([^:]+):([^:]+)/.exec(k); |
|||
if (!ret || !xmlns[ret[1]]) { |
|||
results$.push(this.setAttribute(k, v)); |
|||
} else { |
|||
results$.push(this.setAttributeNS(xmlns[ret[1]], k, v)); |
|||
} |
|||
} |
|||
return results$; |
|||
}; |
|||
x$.styles = function(o){ |
|||
var k, v, results$ = []; |
|||
for (k in o) { |
|||
v = o[k]; |
|||
results$.push(this.style[k] = v); |
|||
} |
|||
return results$; |
|||
}; |
|||
x$.append = function(n){ |
|||
var r; |
|||
return this.appendChild(r = document.createElementNS("http://www.w3.og/2000/svg", n)); |
|||
}; |
|||
x$.attr = function(n, v){ |
|||
if (v != null) { |
|||
return this.setAttribute(n, v); |
|||
} else { |
|||
return this.getAttribute(n); |
|||
} |
|||
}; |
|||
config = { |
|||
"type": 'stroke', |
|||
"img": '', |
|||
"path": 'M10 10L90 10M90 8M90 12', |
|||
"fill-dir": 'btt', |
|||
"fill": '#25b', |
|||
"fill-background": '#ddd', |
|||
"fill-background-extrude": 3, |
|||
"pattern-size": null, |
|||
"stroke-dir": 'normal', |
|||
"stroke": '#25b', |
|||
"stroke-width": '3', |
|||
"stroke-trail": '#ddd', |
|||
"stroke-trail-width": 0.5, |
|||
"duration": 1, |
|||
"easing": 'linear', |
|||
"value": 0, |
|||
"img-size": null, |
|||
"bbox": null, |
|||
"set-dim": true, |
|||
"aspect-ratio": "xMidYMid", |
|||
"transition-in": false, |
|||
"min": 0, |
|||
"max": 100, |
|||
"precision": 0, |
|||
"padding": undefined |
|||
}; |
|||
config["preset"] = root.attr("data-preset") || option["preset"]; |
|||
if (config.preset != null) { |
|||
import$(config, presets[config.preset]); |
|||
} |
|||
for (attr in config) { |
|||
if (that = that = root.attr("data-" + attr)) { |
|||
config[attr] = that; |
|||
} |
|||
} |
|||
import$(config, option); |
|||
if (config.img) { |
|||
config.path = null; |
|||
} |
|||
isStroke = config.type === 'stroke'; |
|||
parseRes = function(v){ |
|||
var parser, ret; |
|||
parser = /data:ldbar\/res,([^()]+)\(([^)]+)\)/; |
|||
ret = parser.exec(v); |
|||
if (!ret) { |
|||
return v; |
|||
} |
|||
return ret = make[ret[1]].apply(make, ret[2].split(',')); |
|||
}; |
|||
config.fill = parseRes(config.fill); |
|||
config.stroke = parseRes(config.stroke); |
|||
if (config["set-dim"] === 'false') { |
|||
config["set-dim"] = false; |
|||
} |
|||
dom = { |
|||
attr: { |
|||
"xmlns:xlink": 'http://www.w3.org/1999/xlink', |
|||
preserveAspectRatio: config["aspect-ratio"], |
|||
width: "100%", |
|||
height: "100%" |
|||
}, |
|||
defs: { |
|||
filter: { |
|||
attr: { |
|||
id: id.filter, |
|||
x: -1, |
|||
y: -1, |
|||
width: 3, |
|||
height: 3 |
|||
}, |
|||
feMorphology: { |
|||
attr: { |
|||
operator: +config["fill-background-extrude"] >= 0 ? 'dilate' : 'erode', |
|||
radius: Math.abs(+config["fill-background-extrude"]) |
|||
} |
|||
}, |
|||
feColorMatrix: { |
|||
attr: { |
|||
values: '0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0', |
|||
result: "cm" |
|||
} |
|||
} |
|||
}, |
|||
mask: { |
|||
attr: { |
|||
id: id.mask |
|||
}, |
|||
image: { |
|||
attr: { |
|||
"xlink:href": config.img, |
|||
filter: "url(#" + id.filter + ")", |
|||
x: 0, |
|||
y: 0, |
|||
width: 100, |
|||
height: 100, |
|||
preserveAspectRatio: config["aspect-ratio"] |
|||
} |
|||
} |
|||
}, |
|||
g: { |
|||
mask: { |
|||
attr: { |
|||
id: id.maskPath |
|||
}, |
|||
path: { |
|||
attr: { |
|||
d: config.path || "", |
|||
fill: '#fff', |
|||
stroke: '#fff', |
|||
filter: "url(#" + id.filter + ")" |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
clipPath: { |
|||
attr: { |
|||
id: id.clip |
|||
}, |
|||
rect: { |
|||
attr: { |
|||
'class': 'mask', |
|||
fill: '#000' |
|||
} |
|||
} |
|||
}, |
|||
pattern: { |
|||
attr: { |
|||
id: id.pattern, |
|||
patternUnits: 'userSpaceOnUse', |
|||
x: 0, |
|||
y: 0, |
|||
width: 300, |
|||
height: 300 |
|||
}, |
|||
image: { |
|||
attr: { |
|||
x: 0, |
|||
y: 0, |
|||
width: 300, |
|||
height: 300 |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
svg = domTree('svg', dom); |
|||
text = document.createElement('div'); |
|||
text.setAttribute('class', 'ldBar-label'); |
|||
root.appendChild(svg); |
|||
root.appendChild(text); |
|||
group = [0, 0]; |
|||
length = 0; |
|||
this.fit = function(){ |
|||
var that, box, d, rect; |
|||
if (that = config["bbox"]) { |
|||
box = that.split(' ').map(function(it){ |
|||
return +it.trim(); |
|||
}); |
|||
box = { |
|||
x: box[0], |
|||
y: box[1], |
|||
width: box[2], |
|||
height: box[3] |
|||
}; |
|||
} else { |
|||
box = group[1].getBBox(); |
|||
} |
|||
if (!box || box.width === 0 || box.height === 0) { |
|||
box = { |
|||
x: 0, |
|||
y: 0, |
|||
width: 100, |
|||
height: 100 |
|||
}; |
|||
} |
|||
d = Math.max.apply(null, ['stroke-width', 'stroke-trail-width', 'fill-background-extrude'].map(function(it){ |
|||
return config[it]; |
|||
})) * 1.5; |
|||
if (config["padding"] != null) { |
|||
d = +config["padding"]; |
|||
} |
|||
svg.attrs({ |
|||
viewBox: [box.x - d, box.y - d, box.width + d * 2, box.height + d * 2].join(" ") |
|||
}); |
|||
if (config["set-dim"]) { |
|||
['width', 'height'].map(function(it){ |
|||
if (!root.style[it] || this$.fit[it]) { |
|||
root.style[it] = (box[it] + d * 2) + "px"; |
|||
return this$.fit[it] = true; |
|||
} |
|||
}); |
|||
} |
|||
rect = group[0].querySelector('rect'); |
|||
if (rect) { |
|||
return rect.attrs({ |
|||
x: box.x - d, |
|||
y: box.y - d, |
|||
width: box.width + d * 2, |
|||
height: box.height + d * 2 |
|||
}); |
|||
} |
|||
}; |
|||
if (config.path) { |
|||
if (isStroke) { |
|||
group[0] = domTree('g', { |
|||
path: { |
|||
attr: { |
|||
d: config.path, |
|||
fill: 'none', |
|||
'class': 'baseline' |
|||
} |
|||
} |
|||
}); |
|||
} else { |
|||
group[0] = domTree('g', { |
|||
rect: { |
|||
attr: { |
|||
x: 0, |
|||
y: 0, |
|||
width: 100, |
|||
height: 100, |
|||
mask: "url(#" + id.maskPath + ")", |
|||
fill: config["fill-background"], |
|||
'class': 'frame' |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
svg.appendChild(group[0]); |
|||
group[1] = domTree('g', { |
|||
path: { |
|||
attr: { |
|||
d: config.path, |
|||
'class': isStroke ? 'mainline' : 'solid', |
|||
"clip-path": config.type === 'fill' ? "url(#" + id.clip + ")" : '' |
|||
} |
|||
} |
|||
}); |
|||
svg.appendChild(group[1]); |
|||
path0 = group[0].querySelector(isStroke ? 'path' : 'rect'); |
|||
path1 = group[1].querySelector('path'); |
|||
if (isStroke) { |
|||
path1.attrs({ |
|||
fill: 'none' |
|||
}); |
|||
} |
|||
patimg = svg.querySelector('pattern image'); |
|||
img = new Image(); |
|||
img.addEventListener('load', function(){ |
|||
var box, that; |
|||
box = (that = config["pattern-size"]) |
|||
? { |
|||
width: +that, |
|||
height: +that |
|||
} |
|||
: img.width && img.height |
|||
? { |
|||
width: img.width, |
|||
height: img.height |
|||
} |
|||
: { |
|||
width: 300, |
|||
height: 300 |
|||
}; |
|||
svg.querySelector('pattern').attrs({ |
|||
width: box.width, |
|||
height: box.height |
|||
}); |
|||
return patimg.attrs({ |
|||
width: box.width, |
|||
height: box.height |
|||
}); |
|||
}); |
|||
if (/.+\..+|^data:/.exec(!isStroke |
|||
? config.fill |
|||
: config.stroke)) { |
|||
img.src = !isStroke |
|||
? config.fill |
|||
: config.stroke; |
|||
patimg.attrs({ |
|||
"xlink:href": img.src |
|||
}); |
|||
} |
|||
if (isStroke) { |
|||
path0.attrs({ |
|||
stroke: config["stroke-trail"], |
|||
"stroke-width": config["stroke-trail-width"] |
|||
}); |
|||
path1.attrs({ |
|||
"stroke-width": config["stroke-width"], |
|||
stroke: /.+\..+|^data:/.exec(config.stroke) |
|||
? "url(#" + id.pattern + ")" |
|||
: config.stroke |
|||
}); |
|||
} |
|||
if (config.fill && !isStroke) { |
|||
path1.attrs({ |
|||
fill: /.+\..+|^data:/.exec(config.fill) |
|||
? "url(#" + id.pattern + ")" |
|||
: config.fill |
|||
}); |
|||
} |
|||
length = path1.getTotalLength(); |
|||
this.fit(); |
|||
this.inited = true; |
|||
} else if (config.img) { |
|||
if (config["img-size"]) { |
|||
ret = config["img-size"].split(','); |
|||
size = { |
|||
width: +ret[0], |
|||
height: +ret[1] |
|||
}; |
|||
} else { |
|||
size = { |
|||
width: 100, |
|||
height: 100 |
|||
}; |
|||
} |
|||
group[0] = domTree('g', { |
|||
rect: { |
|||
attr: { |
|||
x: 0, |
|||
y: 0, |
|||
width: 100, |
|||
height: 100, |
|||
mask: "url(#" + id.mask + ")", |
|||
fill: config["fill-background"] |
|||
} |
|||
} |
|||
}); |
|||
svg.querySelector('mask image').attrs({ |
|||
width: size.width, |
|||
height: size.height |
|||
}); |
|||
group[1] = domTree('g', { |
|||
image: { |
|||
attr: { |
|||
width: size.width, |
|||
height: size.height, |
|||
x: 0, |
|||
y: 0, |
|||
preserveAspectRatio: config["aspect-ratio"], |
|||
"clip-path": config.type === 'fill' ? "url(#" + id.clip + ")" : '', |
|||
"xlink:href": config.img, |
|||
'class': 'solid' |
|||
} |
|||
} |
|||
}); |
|||
img = new Image(); |
|||
img.addEventListener('load', function(){ |
|||
var ret, size; |
|||
if (config["img-size"]) { |
|||
ret = config["img-size"].split(','); |
|||
size = { |
|||
width: +ret[0], |
|||
height: +ret[1] |
|||
}; |
|||
} else if (img.width && img.height) { |
|||
size = { |
|||
width: img.width, |
|||
height: img.height |
|||
}; |
|||
} else { |
|||
size = { |
|||
width: 100, |
|||
height: 100 |
|||
}; |
|||
} |
|||
svg.querySelector('mask image').attrs({ |
|||
width: size.width, |
|||
height: size.height |
|||
}); |
|||
group[1].querySelector('image').attrs({ |
|||
width: size.width, |
|||
height: size.height |
|||
}); |
|||
this$.fit(); |
|||
this$.set(undefined, false); |
|||
return this$.inited = true; |
|||
}); |
|||
img.src = config.img; |
|||
svg.appendChild(group[0]); |
|||
svg.appendChild(group[1]); |
|||
} |
|||
svg.attrs({ |
|||
width: '100%', |
|||
height: '100%' |
|||
}); |
|||
this.transition = { |
|||
value: { |
|||
src: 0, |
|||
des: 0 |
|||
}, |
|||
time: {}, |
|||
ease: function(t, b, c, d){ |
|||
t = t / (d * 0.5); |
|||
if (t < 1) { |
|||
return c * 0.5 * t * t + b; |
|||
} |
|||
t = t - 1; |
|||
return -c * 0.5 * (t * (t - 2) - 1) + b; |
|||
}, |
|||
handler: function(time, doTransition){ |
|||
var ref$, min, max, prec, dv, dt, dur, v, p, node, style, box, dir; |
|||
doTransition == null && (doTransition = true); |
|||
if (this.time.src == null) { |
|||
this.time.src = time; |
|||
} |
|||
ref$ = [config["min"], config["max"], 1 / config["precision"]], min = ref$[0], max = ref$[1], prec = ref$[2]; |
|||
ref$ = [this.value.des - this.value.src, (time - this.time.src) * 0.001, +config["duration"] || 1], dv = ref$[0], dt = ref$[1], dur = ref$[2]; |
|||
v = doTransition |
|||
? this.ease(dt, this.value.src, dv, dur) |
|||
: this.value.des; |
|||
if (config.precision) { |
|||
v = Math.round(v * prec) / prec; |
|||
} else if (doTransition) { |
|||
v = Math.round(v); |
|||
} |
|||
v >= min || (v = min); |
|||
v <= max || (v = max); |
|||
text.textContent = v; |
|||
p = 100.0 * (v - min) / (max - min); |
|||
if (isStroke) { |
|||
node = path1; |
|||
style = { |
|||
"stroke-dasharray": config["stroke-dir"] === 'reverse' |
|||
? "0 " + length * (100 - p) * 0.01 + " " + length * p * 0.01 + " 0" |
|||
: p * 0.01 * length + " " + ((100 - p) * 0.01 * length + 1) |
|||
}; |
|||
} else { |
|||
box = group[1].getBBox(); |
|||
dir = config["fill-dir"]; |
|||
style = dir === 'btt' || !dir |
|||
? { |
|||
y: box.y + box.height * (100 - p) * 0.01, |
|||
height: box.height * p * 0.01, |
|||
x: box.x, |
|||
width: box.width |
|||
} |
|||
: dir === 'ttb' |
|||
? { |
|||
y: box.y, |
|||
height: box.height * p * 0.01, |
|||
x: box.x, |
|||
width: box.width |
|||
} |
|||
: dir === 'ltr' |
|||
? { |
|||
y: box.y, |
|||
height: box.height, |
|||
x: box.x, |
|||
width: box.width * p * 0.01 |
|||
} |
|||
: dir === 'rtl' ? { |
|||
y: box.y, |
|||
height: box.height, |
|||
x: box.x + box.width * (100 - p) * 0.01, |
|||
width: box.width * p * 0.01 |
|||
} : void 8; |
|||
node = svg.querySelector('rect'); |
|||
} |
|||
node.attrs(style); |
|||
if (dt >= dur) { |
|||
delete this.time.src; |
|||
return false; |
|||
} |
|||
return true; |
|||
}, |
|||
start: function(src, des, doTransition){ |
|||
var ref$, this$ = this; |
|||
ref$ = this.value; |
|||
ref$.src = src; |
|||
ref$.des = des; |
|||
!!(root.offsetWidth || root.offsetHeight || root.getClientRects().length); |
|||
if (!doTransition || !(root.offsetWidth || root.offsetHeight || root.getClientRects().length)) { |
|||
this.time.src = 0; |
|||
this.handler(1000, false); |
|||
return; |
|||
} |
|||
return handler.add(id.key, function(time){ |
|||
return this$.handler(time); |
|||
}); |
|||
} |
|||
}; |
|||
this.set = function(v, doTransition){ |
|||
var src, des; |
|||
doTransition == null && (doTransition = true); |
|||
src = this.value || 0; |
|||
if (v != null) { |
|||
this.value = v; |
|||
} else { |
|||
v = this.value; |
|||
} |
|||
des = this.value; |
|||
return this.transition.start(src, des, doTransition); |
|||
}; |
|||
this.set(+config.value || 0, config["transition-in"]) || false; |
|||
return this; |
|||
}; |
|||
return window.addEventListener('load', function(){ |
|||
var i$, ref$, len$, node, results$ = []; |
|||
for (i$ = 0, len$ = (ref$ = document.querySelectorAll('.ldBar')).length; i$ < len$; ++i$) { |
|||
node = ref$[i$]; |
|||
if (!node.ldBar) { |
|||
results$.push(node.ldBar = new ldBar(node)); |
|||
} |
|||
} |
|||
return results$; |
|||
}, false); |
|||
})(); |
|||
module.exports = ldBar; |
|||
function import$(obj, src){ |
|||
var own = {}.hasOwnProperty; |
|||
for (var key in src) if (own.call(src, key)) obj[key] = src[key]; |
|||
return obj; |
|||
} |
@ -0,0 +1,90 @@ |
|||
var presets, out$ = typeof exports != 'undefined' && exports || this; |
|||
out$.presets = presets = { |
|||
rainbow: { |
|||
"type": 'stroke', |
|||
"path": 'M10 10L90 10', |
|||
"stroke": 'data:ldbar/res,gradient(0,1,#a551df,#fd51ad,#ff7f82,#ffb874,#ffeb90)', |
|||
"bbox": "10 10 80 10" |
|||
}, |
|||
energy: { |
|||
"type": 'fill', |
|||
"path": 'M15 5L85 5A5 5 0 0 1 85 15L15 15A5 5 0 0 1 15 5', |
|||
"stroke": '#f00', |
|||
"fill": 'data:ldbar/res,gradient(45,2,#4e9,#8fb,#4e9)', |
|||
"fill-dir": "ltr", |
|||
"fill-background": '#444', |
|||
"fill-background-extrude": 1, |
|||
"bbox": "10 5 80 10" |
|||
}, |
|||
stripe: { |
|||
"type": 'fill', |
|||
"path": 'M15 5L85 5A5 5 0 0 1 85 15L15 15A5 5 0 0 1 15 5', |
|||
"stroke": '#f00', |
|||
"fill": 'data:ldbar/res,stripe(#25b,#58e,1)', |
|||
"fill-dir": "ltr", |
|||
"fill-background": '#ddd', |
|||
"fill-background-extrude": 1, |
|||
"bbox": "10 5 80 10" |
|||
}, |
|||
text: { |
|||
"type": 'fill', |
|||
"img": "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"70\" height=\"20\" viewBox=\"0 0 70 20\"><text x=\"35\" y=\"10\" text-anchor=\"middle\" dominant-baseline=\"central\" font-family=\"arial\">LOADING</text></svg>", |
|||
"fill-background-extrude": 1.3, |
|||
"pattern-size": 100, |
|||
"fill-dir": "ltr", |
|||
"img-size": "70,20", |
|||
"bbox": "0 0 70 20" |
|||
}, |
|||
line: { |
|||
"type": 'stroke', |
|||
"path": 'M10 10L90 10', |
|||
"stroke": '#25b', |
|||
"stroke-width": 3, |
|||
"stroke-trail": '#ddd', |
|||
"stroke-trail-width": 1, |
|||
"bbox": "10 10 80 10" |
|||
}, |
|||
fan: { |
|||
"type": 'stroke', |
|||
"path": 'M10 90A40 40 0 0 1 90 90', |
|||
"fill-dir": 'btt', |
|||
"fill": '#25b', |
|||
"fill-background": '#ddd', |
|||
"fill-background-extrude": 3, |
|||
"stroke-dir": 'normal', |
|||
"stroke": '#25b', |
|||
"stroke-width": '3', |
|||
"stroke-trail": '#ddd', |
|||
"stroke-trail-width": 0.5, |
|||
"bbox": "10 50 80 40" |
|||
}, |
|||
circle: { |
|||
"type": 'stroke', |
|||
"path": 'M50 10A40 40 0 0 1 50 90A40 40 0 0 1 50 10', |
|||
"fill-dir": 'btt', |
|||
"fill": '#25b', |
|||
"fill-background": '#ddd', |
|||
"fill-background-extrude": 3, |
|||
"stroke-dir": 'normal', |
|||
"stroke": '#25b', |
|||
"stroke-width": '3', |
|||
"stroke-trail": '#ddd', |
|||
"stroke-trail-width": 0.5, |
|||
"bbox": "10 10 80 80" |
|||
}, |
|||
bubble: { |
|||
"type": 'fill', |
|||
"path": 'M50 10A40 40 0 0 1 50 90A40 40 0 0 1 50 10', |
|||
"fill-dir": 'btt', |
|||
"fill": 'data:ldbar/res,bubble(#39d,#cef)', |
|||
"pattern-size": "150", |
|||
"fill-background": '#ddd', |
|||
"fill-background-extrude": 2, |
|||
"stroke-dir": 'normal', |
|||
"stroke": '#25b', |
|||
"stroke-width": '3', |
|||
"stroke-trail": '#ddd', |
|||
"stroke-trail-width": 0.5, |
|||
"bbox": "10 10 80 80" |
|||
} |
|||
}; |
File diff suppressed because it is too large
@ -0,0 +1,54 @@ |
|||
{ |
|||
"name": "@loadingio/loading-bar", |
|||
"version": "0.1.1", |
|||
"description": " ====== Progress Bar Library by loading.io ====== ", |
|||
"main": "lib/loading-bar.js", |
|||
"scripts": { |
|||
"test": "echo \"Error: no test specified\" && exit 1" |
|||
}, |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "git+https://github.com/loadingio/loading-bar.git" |
|||
}, |
|||
"keywords": [ |
|||
"progress-bar" |
|||
], |
|||
"author": "tkirby", |
|||
"license": "MIT", |
|||
"bugs": { |
|||
"url": "https://github.com/loadingio/loading-bar/issues" |
|||
}, |
|||
"devDependencies": { |
|||
"LiveScript": ">=1.2.0", |
|||
"browserify": "^13.1.1", |
|||
"browserify-livescript": "git+https://github.com/ceremcem/browserify-livescript.git", |
|||
"globby": "^6.1.0", |
|||
"gulp": "^3.9.1", |
|||
"gulp-cached": "^1.1.1", |
|||
"gulp-concat": "^2.6.1", |
|||
"gulp-flatten": "^0.3.1", |
|||
"gulp-if-else": "^1.0.3", |
|||
"gulp-pug": "^3.3.0", |
|||
"gulp-stylus": "^2.6.0", |
|||
"gulp-rename": "^1.2.2", |
|||
"gulp-sourcemaps": "^2.6.1", |
|||
"gulp-tap": "^1.0.1", |
|||
"gulp-uglify": "^3.0.0", |
|||
"gulp-watch": "^4.3.11", |
|||
"node-notifier": "^5.1.2", |
|||
"optimize-js": "^1.0.3", |
|||
"run-sequence": "^2.1.0", |
|||
"touch": "^3.1.0", |
|||
"vinyl-buffer": "^1.0.0", |
|||
"vinyl-source-stream": "^1.1.0", |
|||
"gulp-livescript": "^3.0.1", |
|||
"gulp-zip": "^4.0.0", |
|||
"uglify-js": "=3.2.0", |
|||
"uglifycss": "0.0.29", |
|||
"watchify": "^3.9.0" |
|||
}, |
|||
"homepage": "https://github.com/loadingio/loading-bar#readme", |
|||
"dependencies": { |
|||
"gulp-remove-files": "0.0.3" |
|||
} |
|||
} |
@ -0,0 +1,10 @@ |
|||
angular.module \loadingio, [] |
|||
..directive \ldbar, <[$compile $timeout]> ++ ($compile, $timeout) -> do |
|||
restrict: \A |
|||
scope: do |
|||
model: \=ngModel |
|||
config: \=config |
|||
link: (s,e,a,c) -> |
|||
if e.0 => bar = if !e.0.ldBar => new ldBar(e.0, s.config or {}) else e.0.ldBar |
|||
s.$watch 'model', (n,o) -> bar.set n |
|||
|
@ -0,0 +1,400 @@ |
|||
require! "./presets": {presets} |
|||
|
|||
simple-str = (arr) -> arr.join '' |
|||
wrap = (content) -> "data:image/svg+xml;base64," + btoa(content) |
|||
|
|||
do -> |
|||
make = |
|||
head: (viewBox) -> """ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="#viewBox"> |
|||
""" |
|||
|
|||
gradient: (dir = 45, dur = 1, ...colors) -> |
|||
ret = [@head "0 0 100 100"] |
|||
len = colors.length * 4 + 1 |
|||
dir = dir * Math.PI / 180 |
|||
gx = Math.cos(dir) ** 2 |
|||
gy = Math.sqrt(gx - gx ** 2) |
|||
if dir > Math.PI * 0.25 => |
|||
gy = Math.sin(dir) ** 2 |
|||
gx = Math.sqrt(gy - gy ** 2) |
|||
x = gx * 100 |
|||
y = gy * 100 |
|||
ret.push """<defs><linearGradient id="gradient" x1="0" x2="#gx" y1="0" y2="#gy">""" |
|||
for i from 0 til len => |
|||
idx = i * 100 / (len - 1) |
|||
ret.push """<stop offset="#{idx}%" stop-color="#{colors[i % colors.length]}"/>""" |
|||
ret.push """ |
|||
</linearGradient></defs> |
|||
<rect x="0" y="0" width="400" height="400" fill="url(\#gradient)"> |
|||
<animateTransform attributeName="transform" type="translate" from="-#x,-#y" |
|||
to="0,0" dur="#{dur}s" repeatCount="indefinite"/></rect></svg> |
|||
""" |
|||
wrap ret.join("") |
|||
|
|||
stripe: (c1=\#b4b4b4, c2=\#e6e6e6, dur = 1) -> |
|||
ret = [@head "0 0 100 100"] |
|||
ret ++= [ |
|||
"""<rect fill="#c2" width="100" height="100"/>""" |
|||
"""<g><g>""" |
|||
["""<polygon fill="#c1" """ + |
|||
"""points="#{-90 + i * 20},100 #{-100 + i * 20},""" + |
|||
"""100 #{-60 + i * 20},0 #{-50 + i * 20},0 "/>""" for i from 0 til 13].join("") |
|||
"""</g><animateTransform attributeName="transform" type="translate" """ |
|||
"""from="0,0" to="20,0" dur="#{dur}s" repeatCount="indefinite"/></g></svg>""" |
|||
].join("") |
|||
wrap ret |
|||
|
|||
bubble: (c1 = \#39d, c2 = \#9cf, count = 15, dur = 1, size = 6, sw=1) -> |
|||
ret = [@head("0 0 200 200"), """<rect x="0" y="0" width="200" height="200" fill="#c1"/>"""] |
|||
for i from 0 til count => |
|||
idx = -(i / count) * dur |
|||
x = Math.random! * 184 + 8 |
|||
r = ( Math.random! * 0.7 + 0.3 ) * size |
|||
d = dur * (1 + Math.random! * 0.5) |
|||
ret.push [ |
|||
"""<circle cx="#x" cy="0" r="#r" fill="none" stroke="#c2" stroke-width="#sw">""" |
|||
"""<animate attributeName="cy" values="190;-10" times="0;1" """ |
|||
"""dur="#{d}s" begin="#{idx}s" repeatCount="indefinite"/>""" |
|||
"""</circle>""" |
|||
"""<circle cx="#x" cy="0" r="#r" fill="none" stroke="#c2" stroke-width="#sw">""" |
|||
"""<animate attributeName="cy" values="390;190" times="0;1" """ |
|||
"""dur="#{d}s" begin="#{idx}s" repeatCount="indefinite"/>""" |
|||
"""</circle>""" |
|||
].join("") |
|||
wrap(ret.join("") + "</svg>") |
|||
|
|||
handler = |
|||
queue: {} |
|||
running: false |
|||
main: (timestamp) -> |
|||
keepon = false |
|||
removed = [] |
|||
for k,func of @queue => |
|||
ret = func timestamp |
|||
if !ret => removed.push func |
|||
keepon = keepon or ret |
|||
for k,func of @queue => if removed.indexOf(func) >= 0 => delete @queue[k] |
|||
if keepon => requestAnimationFrame (~> @main it) |
|||
else @running = false |
|||
add: (key, f) -> |
|||
if !@queue[key] => @queue[key] = f |
|||
if !@running => |
|||
@running = true |
|||
requestAnimationFrame (~> @main it) |
|||
|
|||
|
|||
window.ldBar = ldBar = (selector, option = {}) -> |
|||
xmlns = xlink: "http://www.w3.org/1999/xlink" |
|||
root = if typeof! selector is \String |
|||
document.querySelector selector |
|||
else |
|||
selector |
|||
|
|||
if !root.ldBar => root.ldBar = @ |
|||
else return root.ldBar |
|||
|
|||
cls = root.getAttribute(\class) or '' |
|||
if !~cls.indexOf('ldBar') => root.setAttribute \class, "#cls ldBar" |
|||
id-prefix = "ldBar-#{Math.random!toString 16 .substring 2}" |
|||
id = |
|||
key: id-prefix |
|||
clip: "#{id-prefix}-clip" |
|||
filter: "#{id-prefix}-filter" |
|||
pattern: "#{id-prefix}-pattern" |
|||
mask: "#{id-prefix}-mask" |
|||
mask-path: "#{id-prefix}-mask-path" |
|||
domTree = (n,o) -> |
|||
n = newNode n |
|||
for k,v of o => if k != \attr => n.appendChild domTree(k, v or {}) |
|||
n.attrs(o.attr or {}) |
|||
n |
|||
newNode = (n) -> document.createElementNS "http://www.w3.org/2000/svg", n |
|||
document.body.__proto__.__proto__.__proto__ |
|||
..text = (t) -> @appendChild document.createTextNode(t) |
|||
..attrs = (o) -> for k,v of o => |
|||
ret = /([^:]+):([^:]+)/.exec(k) |
|||
if !ret or !xmlns[ret.1] => @setAttribute k, v |
|||
else @setAttributeNS xmlns[ret.1], k, v |
|||
..styles = (o) -> for k,v of o => @style[k] = v |
|||
..append = (n) -> @appendChild r = document.createElementNS "http://www.w3.og/2000/svg", n |
|||
..attr = (n,v) -> if v? => @setAttribute n, v else @getAttribute n |
|||
config = |
|||
"type": 'stroke' |
|||
"img": '' |
|||
"path": 'M10 10L90 10M90 8M90 12' |
|||
"fill-dir": \btt |
|||
"fill": \#25b |
|||
"fill-background": \#ddd |
|||
"fill-background-extrude": 3 |
|||
"pattern-size": null |
|||
"stroke-dir": \normal |
|||
"stroke": \#25b |
|||
"stroke-width": \3 |
|||
"stroke-trail": \#ddd |
|||
"stroke-trail-width": 0.5 |
|||
"duration": 1 |
|||
"easing": \linear |
|||
"value": 0 |
|||
"img-size": null |
|||
"bbox": null |
|||
"set-dim": true |
|||
"aspect-ratio": "xMidYMid" |
|||
"transition-in": false |
|||
"min": 0 |
|||
"max": 100 |
|||
"precision": 0 |
|||
"padding": undefined |
|||
|
|||
config["preset"] = root.attr("data-preset") or option["preset"] |
|||
|
|||
if config.preset? |
|||
# use the default preset |
|||
config <<< presets[config.preset] |
|||
|
|||
# overwrite if there are arguments passed via data-* attributes |
|||
for attr of config |
|||
if that = root.attr "data-#{attr}" |
|||
config[attr] = that |
|||
|
|||
config <<< option |
|||
if config.img => config.path = null |
|||
|
|||
is-stroke = config.type == \stroke |
|||
parse-res = (v) -> |
|||
parser = /data:ldbar\/res,([^()]+)\(([^)]+)\)/ |
|||
ret = parser.exec(v) |
|||
if !ret => return v |
|||
ret = make[ret.1].apply make, ret.2.split(\,) |
|||
config.fill = parse-res config.fill |
|||
config.stroke = parse-res config.stroke |
|||
if config["set-dim"] == \false => config["set-dim"] = false |
|||
|
|||
dom = |
|||
attr: |
|||
"xmlns:xlink": \http://www.w3.org/1999/xlink |
|||
preserveAspectRatio: config["aspect-ratio"] |
|||
width: "100%", height: "100%" |
|||
defs: |
|||
filter: |
|||
attr: id: id.filter, x: -1, y: -1, width: 3, height: 3 |
|||
feMorphology: attr: |
|||
operator: (if +config["fill-background-extrude"]>=0 => \dilate else \erode) |
|||
radius: Math.abs(+config["fill-background-extrude"]) |
|||
feColorMatrix: attr: {values: '0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0', result: "cm"} |
|||
mask: |
|||
attr: id: id.mask |
|||
image: attr: |
|||
"xlink:href": config.img |
|||
filter: "url(\##{id.filter})" |
|||
x: 0, y: 0, width: 100, height: 100, preserveAspectRatio: config["aspect-ratio"] |
|||
|
|||
g: |
|||
mask: |
|||
attr: id: id.mask-path |
|||
path: attr: |
|||
d: config.path or "" |
|||
fill: \#fff |
|||
stroke: \#fff |
|||
filter: "url(\##{id.filter})" |
|||
|
|||
clipPath: |
|||
attr: id: id.clip |
|||
rect: {attr: class: \mask, fill: \#000} |
|||
pattern: |
|||
attr: |
|||
id: id.pattern, patternUnits: \userSpaceOnUse |
|||
x:0, y: 0, width: 300, height: 300 |
|||
image: attr: x: 0, y: 0, width: 300, height: 300 |
|||
|
|||
svg = domTree \svg, dom |
|||
text = document.createElement \div |
|||
text.setAttribute \class, \ldBar-label |
|||
root.appendChild svg |
|||
root.appendChild text |
|||
|
|||
group = [0,0] |
|||
length = 0 |
|||
|
|||
@fit = ~> |
|||
if config["bbox"] => |
|||
box = that.split(' ').map(->+(it.trim!)) |
|||
box = {x: box.0, y: box.1, width: box.2, height: box.3} |
|||
else box = group.1.getBBox! |
|||
if !box or box.width == 0 or box.height == 0 => box = {x: 0, y: 0, width: 100, height: 100} |
|||
d = (Math.max.apply( |
|||
null, <[stroke-width stroke-trail-width fill-background-extrude]>.map(->config[it])) |
|||
) * 1.5 |
|||
if config["padding"]? => d = +config["padding"] |
|||
|
|||
svg.attrs viewBox: [box.x - d, box.y - d, box.width + d * 2, box.height + d * 2].join(" ") |
|||
if config["set-dim"] => <[width height]>.map ~> if !root.style[it] or @fit[it] => |
|||
root.style[it] = "#{box[it] + d * 2}px" |
|||
@fit[it] = true |
|||
|
|||
rect = group.0.querySelector \rect |
|||
if rect => rect.attrs do |
|||
x: box.x - d, y: box.y - d, width: box.width + d * 2, height: box.height + d * 2 |
|||
|
|||
if config.path => |
|||
if is-stroke => |
|||
group.0 = domTree \g, path: attr: |
|||
d: config.path |
|||
fill: \none |
|||
class: \baseline |
|||
else |
|||
group.0 = domTree \g, rect: attr: |
|||
x: 0, y: 0, width: 100, height: 100 |
|||
mask: "url(\##{id.mask-path})", fill: config["fill-background"] |
|||
class: \frame |
|||
|
|||
svg.appendChild group.0 |
|||
group.1 = domTree \g, path: attr: |
|||
d: config.path, class: if is-stroke => \mainline else \solid |
|||
"clip-path": if config.type == \fill => "url(\##{id.clip})" else '' |
|||
svg.appendChild group.1 |
|||
path0 = group.0.querySelector (if is-stroke => \path else \rect) |
|||
path1 = group.1.querySelector \path |
|||
if is-stroke => path1.attrs fill: \none |
|||
|
|||
patimg = svg.querySelector 'pattern image' |
|||
img = new Image! |
|||
img.addEventListener \load, -> |
|||
box = if config["pattern-size"] => {width: +that, height: +that} |
|||
else if img.width and img.height => {width: img.width, height: img.height} |
|||
else {width: 300, height: 300} |
|||
svg.querySelector \pattern .attrs {width: box.width, height: box.height} |
|||
patimg.attrs {width: box.width, height: box.height} |
|||
if /.+\..+|^data:/.exec(if !is-stroke => config.fill else config.stroke) => |
|||
img.src = if !is-stroke => config.fill else config.stroke |
|||
patimg.attrs "xlink:href": img.src #if !is-stroke => config.fill else config.stroke |
|||
|
|||
if is-stroke => |
|||
path0.attrs stroke: config["stroke-trail"], "stroke-width": config["stroke-trail-width"] |
|||
path1.attrs do |
|||
"stroke-width": config["stroke-width"] |
|||
stroke: if /.+\..+|^data:/.exec(config.stroke) => "url(\##{id.pattern})" else config.stroke |
|||
if config.fill and !is-stroke => |
|||
path1.attrs do |
|||
fill: if /.+\..+|^data:/.exec(config.fill) => "url(\##{id.pattern})" else config.fill |
|||
|
|||
length = path1.getTotalLength! |
|||
@fit! |
|||
@inited = true |
|||
else if config.img => |
|||
if config["img-size"] => |
|||
ret = config["img-size"].split(\,) |
|||
size = {width: +ret.0, height: +ret.1} |
|||
else size = {width: 100, height: 100} |
|||
|
|||
group.0 = domTree \g, rect: attr: |
|||
x: 0, y: 0, width: 100, height: 100, mask: "url(\##{id.mask})", fill: config["fill-background"] |
|||
svg.querySelector 'mask image' .attrs do |
|||
width: size.width, height: size.height |
|||
group.1 = domTree \g, image: attr: |
|||
width: size.width, height: size.height, x: 0, y: 0, preserveAspectRatio: config["aspect-ratio"] |
|||
#width: 100, height: 100, x: 0, y: 0, preserveAspectRatio: "xMidYMid" |
|||
"clip-path": if config.type == \fill => "url(\##{id.clip})" else '' |
|||
"xlink:href": config.img, class: \solid |
|||
img = new Image! |
|||
img.addEventListener \load, ~> |
|||
if config["img-size"] => |
|||
ret = config["img-size"].split(\,) |
|||
size = {width: +ret.0, height: +ret.1} |
|||
else if img.width and img.height => size = {width: img.width, height: img.height} |
|||
else size = {width: 100, height: 100} |
|||
svg.querySelector 'mask image' .attrs do |
|||
width: size.width, height: size.height |
|||
group.1.querySelector 'image' .attrs do |
|||
width: size.width, height: size.height |
|||
|
|||
@fit! |
|||
|
|||
# image is load, so we set value again. |
|||
# if we need transition - we have to clean value so it will be treated as 0. |
|||
v = @value |
|||
@value = undefined |
|||
@set v, true |
|||
@inited = true |
|||
img.src = config.img |
|||
svg.appendChild group.0 |
|||
svg.appendChild group.1 |
|||
svg.attrs width: \100%, height: \100% #, viewBox: '0 0 100 100' |
|||
|
|||
@transition = |
|||
value: |
|||
src: 0 |
|||
des: 0 |
|||
time: {} |
|||
|
|||
ease: (t,b,c,d) -> |
|||
t = t / (d * 0.5) |
|||
if t < 1 => return c * 0.5 * t * t + b |
|||
t = t - 1 |
|||
return -c * 0.5 * (t*(t - 2) - 1) + b |
|||
|
|||
handler: (time, doTransition = true) -> |
|||
if !@time.src? => @time.src = time |
|||
[min,max,prec] = [config["min"], config["max"],1/config["precision"]] |
|||
[dv, dt, dur] = [@value.des - @value.src, (time - @time.src) * 0.001, +config["duration"] or 1] |
|||
v = if doTransition => @ease(dt, @value.src, dv, dur) else @value.des |
|||
if config.precision => v = Math.round(v * prec) / prec |
|||
else if doTransition => v = Math.round(v) |
|||
v >?= min |
|||
v <?= max |
|||
text.textContent = v |
|||
p = 100.0 * (v - min ) / ( max - min ) |
|||
if is-stroke => |
|||
node = path1 |
|||
style = |
|||
"stroke-dasharray": ( |
|||
if config["stroke-dir"] == \reverse => |
|||
"0 #{length * (100 - p) * 0.01} #{length * p * 0.01} 0" |
|||
else => "#{p * 0.01 * length} #{(100 - p) * 0.01 * length + 1}" |
|||
) |
|||
else |
|||
box = group.1.getBBox! |
|||
dir = config["fill-dir"] |
|||
style = if dir == \btt or !dir => do |
|||
y: box.y + box.height * (100 - p) * 0.01 |
|||
height: box.height * p * 0.01 |
|||
x: box.x, width: box.width |
|||
else if dir == \ttb => do |
|||
y: box.y, height: box.height * p * 0.01 |
|||
x: box.x, width: box.width |
|||
else if dir == \ltr => do |
|||
y: box.y, height: box.height |
|||
x: box.x, width: box.width * p * 0.01 |
|||
else if dir == \rtl => do |
|||
y: box.y, height: box.height |
|||
x: box.x + box.width * (100 - p) * 0.01 |
|||
width: box.width * p * 0.01 |
|||
node = svg.querySelector \rect |
|||
node.attrs style |
|||
if dt >= dur => delete @time.src; return false |
|||
return true |
|||
start: (src, des, doTransition) -> |
|||
@value <<< {src, des} |
|||
!!( root.offsetWidth || root.offsetHeight || root.getClientRects!length ) |
|||
if !doTransition or !( root.offsetWidth || root.offsetHeight || root.getClientRects!length ) => |
|||
@time.src = 0 |
|||
@handler 1000, false |
|||
return |
|||
handler.add id.key, (time) ~> return @handler time |
|||
|
|||
@set = (v,doTransition = true) -> |
|||
src = @value or 0 |
|||
if v? => @value = v else v = @value |
|||
des = @value |
|||
@transition.start src, des, doTransition |
|||
|
|||
@set (+config.value or 0), config["transition-in"] or false |
|||
@ |
|||
|
|||
window.addEventListener \load, (-> |
|||
for node in document.querySelectorAll(\.ldBar) => |
|||
if !node.ldBar => node.ldBar = new ldBar node |
|||
), false |
|||
|
|||
module.exports = ldBar |
@ -0,0 +1,19 @@ |
|||
|
|||
transform() |
|||
-webkit-transform arguments |
|||
transform arguments |
|||
|
|||
.ldBar |
|||
position: relative |
|||
&.label-center > .ldBar-label |
|||
position: absolute |
|||
top: 50% |
|||
left: 50% |
|||
transform(translate(-50%,-50%)) |
|||
text-shadow: 0 0 3px rgba(255,255,255,1) |
|||
.ldBar-label:after |
|||
content: "%" |
|||
display: inline |
|||
.ldBar.no-percent |
|||
.ldBar-label:after |
|||
content: "" |
@ -0,0 +1,80 @@ |
|||
export presets = |
|||
rainbow: |
|||
"type": 'stroke' |
|||
"path": 'M10 10L90 10' |
|||
"stroke": 'data:ldbar/res,gradient(0,1,#a551df,#fd51ad,#ff7f82,#ffb874,#ffeb90)' |
|||
"bbox": "10 10 80 10" |
|||
energy: |
|||
"type": 'fill' |
|||
"path": 'M15 5L85 5A5 5 0 0 1 85 15L15 15A5 5 0 0 1 15 5' |
|||
"stroke": \#f00 |
|||
"fill": 'data:ldbar/res,gradient(45,2,#4e9,#8fb,#4e9)' |
|||
"fill-dir": "ltr" |
|||
"fill-background": \#444 |
|||
"fill-background-extrude": 1 |
|||
"bbox": "10 5 80 10" |
|||
stripe: |
|||
"type": 'fill' |
|||
"path": 'M15 5L85 5A5 5 0 0 1 85 15L15 15A5 5 0 0 1 15 5' |
|||
"stroke": \#f00 |
|||
"fill": 'data:ldbar/res,stripe(#25b,#58e,1)' |
|||
"fill-dir": "ltr" |
|||
"fill-background": \#ddd |
|||
"fill-background-extrude": 1 |
|||
"bbox": "10 5 80 10" |
|||
text: |
|||
"type": 'fill' |
|||
"img": """data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="70" height="20" viewBox="0 0 70 20"><text x="35" y="10" text-anchor="middle" dominant-baseline="central" font-family="arial">LOADING</text></svg>""" |
|||
"fill-background-extrude": 1.3 |
|||
"pattern-size": 100 |
|||
"fill-dir": "ltr" |
|||
"img-size": "70,20" |
|||
"bbox": "0 0 70 20" |
|||
line: |
|||
"type": 'stroke' |
|||
"path": 'M10 10L90 10' |
|||
"stroke": \#25b |
|||
"stroke-width": 3 |
|||
"stroke-trail": \#ddd |
|||
"stroke-trail-width": 1 |
|||
"bbox": "10 10 80 10" |
|||
fan: |
|||
"type": 'stroke' |
|||
"path": 'M10 90A40 40 0 0 1 90 90' |
|||
"fill-dir": \btt |
|||
"fill": \#25b |
|||
"fill-background": \#ddd |
|||
"fill-background-extrude": 3 |
|||
"stroke-dir": \normal |
|||
"stroke": \#25b |
|||
"stroke-width": \3 |
|||
"stroke-trail": \#ddd |
|||
"stroke-trail-width": 0.5 |
|||
"bbox": "10 50 80 40" |
|||
circle: |
|||
"type": 'stroke' |
|||
"path": 'M50 10A40 40 0 0 1 50 90A40 40 0 0 1 50 10' |
|||
"fill-dir": \btt |
|||
"fill": \#25b |
|||
"fill-background": \#ddd |
|||
"fill-background-extrude": 3 |
|||
"stroke-dir": \normal |
|||
"stroke": \#25b |
|||
"stroke-width": \3 |
|||
"stroke-trail": \#ddd |
|||
"stroke-trail-width": 0.5 |
|||
"bbox": "10 10 80 80" |
|||
bubble: |
|||
"type": 'fill' |
|||
"path": 'M50 10A40 40 0 0 1 50 90A40 40 0 0 1 50 10' |
|||
"fill-dir": \btt |
|||
"fill": 'data:ldbar/res,bubble(#39d,#cef)' |
|||
"pattern-size": "150" |
|||
"fill-background": \#ddd |
|||
"fill-background-extrude": 2 |
|||
"stroke-dir": \normal |
|||
"stroke": \#25b |
|||
"stroke-width": \3 |
|||
"stroke-trail": \#ddd |
|||
"stroke-trail-width": 0.5 |
|||
"bbox": "10 10 80 80" |
Loading…
Reference in new issue