Compare commits

...

42 Commits

Author SHA1 Message Date
Arnold Daniels
f4705f17fc Rebuild customize.min.js 2014-05-06 05:57:04 +02:00
Arnold Daniels
c12018a0bd Fixed unit test for inputmask 2014-05-06 05:33:31 +02:00
Arnold Daniels
1dfd002bba Fixed jshint 2014-05-06 05:09:07 +02:00
Arnold Daniels
04e4586372 Build new release 2014-05-06 04:58:34 +02:00
Arnold Daniels
c6541bfe45 Merge remote-tracking branch 'origin/master' 2014-05-06 04:58:01 +02:00
Arnold Daniels
73f80614b6 Fixed customizer. Fixes #233
Bump version to 3.1.3
2014-05-06 04:56:26 +02:00
Arnold Daniels
1e90ae4779 Change input mask character for alphanumeric to w.
Change docs for inputmask.
Fixes #237
2014-05-06 03:23:08 +02:00
Arnold Daniels
a088dad1c7 Handle undefined body style in OffCanvas.disableScrolling(). Fixes #214 2014-05-06 03:16:44 +02:00
Arnold Daniels
2712c97e85 Removed mixins.less from jasny-bootstrap.less 2014-05-06 03:06:09 +02:00
Arnold Daniels
d7c2eb8c91 Merge pull request #239 from phaseOne/patch-2
.navmenu height fix
2014-05-05 00:14:20 +02:00
Arnold Daniels
3c3274093a Minor changes 2014-05-04 03:31:02 +02:00
Evan Bovie
662c5e2b3a .navmenu height fix
The `.navmenu` height needs to be set to `auto` in order to allow the `top` and `bottom` values to properly work. The `top` value works fine, but the `bottom` value is rendered inert because the `height: 100%` causes the `.navmenu` to overflow down through the viewport.
2014-05-03 09:34:13 -04:00
Arnold Daniels
e86f72dd03 Merge pull request #232 from phaseOne/patch-2
Scrolling for both navmenu-fixed-left and navmenu-fixed-right
2014-04-23 00:51:06 +02:00
Evan Bovie
46c665f161 Scrolling for both navmenu-fixed-left and navmenu-fixed-right 2014-04-22 18:14:30 -04:00
Arnold Daniels
9fd67af87c Removed import mixins.less. Fixed #231 2014-04-22 15:56:32 +02:00
Arnold Daniels
10b81be776 Fixed incorrect version number specified for required Twitter Bootstrap 2014-04-19 19:05:33 +02:00
Arnold Daniels
e822b1b3bf Build v3.1.2 2014-04-19 18:25:38 +02:00
Arnold Daniels
285689081d Use window.jQuery in transition.js 2014-04-19 16:43:27 +02:00
Arnold Daniels
1001ad214d Fixed broken rowlink caused by check on .rowlink-skip. Fixed #221
Thanks @cervengoc
2014-04-19 16:42:25 +02:00
Arnold Daniels
249cb84f6b Updated npm packages 2014-04-19 16:38:06 +02:00
Arnold Daniels
660e376b96 Replace grunt-sed with grunt-text-replace
Set version to 3.1.2
2014-04-19 16:31:53 +02:00
Arnold Daniels
e919330916 Added transitions support check. Fixes #213
This is required to run Jasny Bootrstap standalone.
2014-04-19 16:09:41 +02:00
Arnold Daniels
24f8bffbaf Offcanvas option disablescrolling (lowercase) as alias of disableScrolling (camel cased). Fixes #219 2014-04-19 15:15:46 +02:00
Arnold Daniels
e5b9930599 Don't trigger fileinput.change when fileinput.clear is called manually. Fixes #216
Insert fileinput <input type="hidden"> right before <input type="file">. Fixes #215
Clean up less and scss comment
2014-04-19 15:10:23 +02:00
Arnold Daniels
8fd9aca993 Updated scss for earlier changes
- Move mixins taken from Twitter Bootstrap to build dir.
 - Removed the transformation for file input altogether.
2014-04-16 14:32:12 +02:00
Arnold Daniels
0038dd8c9f Merge origin/master 2014-04-16 13:37:21 +02:00
Arnold Daniels
27794ba4e3 Removed the transformation for file input al together. Should test of this works correctly for IE and Opera. 2014-04-16 13:37:08 +02:00
Arnold Daniels
9e28a9b2bc Move mixins taken from Twitter Bootstrap to build dir. Fixed #221
Move button-label mixin to button-labels.less.
2014-04-13 16:36:59 +02:00
Arnold Daniels
18116c5cd3 Merge pull request #218 from joshjb84/master
Fix to naming in inputmask.js and added some inputmask tests
2014-04-06 22:10:54 +02:00
joshjb84
2336197e3a Fix to naming in inputmask.js and tests
Changed the name of Input.DEFAULS to Input.DEFAULTS and added unit tests
around how the options are set up.
2014-04-05 19:10:24 +08:00
Arnold Daniels
ee5a80a6c3 Merge pull request #208 from inbep/master
adding scss files
2014-03-30 14:15:56 +02:00
Sergio
4dc46204b4 adding scss files 2014-03-28 12:40:26 -03:00
Arnold Daniels
d5d4c5bd62 Build Bootstrap v3.1.1 2014-03-28 03:46:35 +01:00
Arnold Daniels
626d773366 stop propagation for file input, input element. Fixes #182 2014-03-28 03:25:36 +01:00
Arnold Daniels
a8a87b1958 Use var files instead of setting e.target.files for file input. Fixes #163 (thanks to @ducman) 2014-03-28 02:50:53 +01:00
Arnold Daniels
3769a8a8fc Don't transform .btn-file > input for Firefox and do set width and height to 100%. Fixes #157 2014-03-28 02:39:14 +01:00
Arnold Daniels
1640650604 Only preview gif, png and jpeg images. Fixes #181 2014-03-28 01:04:48 +01:00
Arnold Daniels
4c53740597 Merge origin/master 2014-03-28 00:24:56 +01:00
Arnold Daniels
ca1145ca0b Don't trigger rowlink initiasation when a element within .rowlink-skip is clicked. Fixes #162 2014-03-28 00:22:10 +01:00
Arnold Daniels
d87bea51c2 Added docs task to gruntfile 2014-03-27 22:40:54 +01:00
Arnold Daniels
e9a6df2cbd Merge pull request #206 from wardley/master
allow vertical scroll for navmenu-fixed-left.
2014-03-27 11:32:22 +01:00
Wardley Pogijanto
90b09cb3f8 allow vertical scroll for navmenu-fixed-left.
[jasny/boostrap#202]
2014-03-27 14:01:13 +11:00
46 changed files with 1236 additions and 229 deletions

View File

@@ -1,8 +1,8 @@
/*!
* Bootstrap's Gruntfile
* http://getbootstrap.com
* Copyright 2013-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Jasny Bootstrap's Gruntfile
* http://jasny.github.io/bootstrap
* Copyright 2013-2014 Arnold Daniels.
* Licensed under Apache License 2.0 (https://github.com/jasny/bootstrap/blob/master/LICENSE)
*/
module.exports = function (grunt) {
@@ -98,6 +98,7 @@ module.exports = function (grunt) {
},
bootstrap: {
src: [
'js/transition.js',
'js/offcanvas.js',
'js/rowlink.js',
'js/inputmask.js',
@@ -298,14 +299,14 @@ module.exports = function (grunt) {
}
},
sed: {
replace: {
versionNumber: {
pattern: (function () {
var old = grunt.option('oldver');
return old ? RegExp.quote(old) : old;
})(),
replacement: grunt.option('newver'),
recursive: true
src: ['*.js', '*.md', '*.json', '*.yml', 'js/*.js'],
overwrite: true,
replacements: [{
from: grunt.option('oldver'),
to: grunt.option('newver')
}]
}
},
@@ -371,10 +372,13 @@ module.exports = function (grunt) {
// Default task.
grunt.registerTask('default', ['dist', 'build-customizer']);
// Documentation task.
grunt.registerTask('docs', ['jekyll', 'dist-docs']);
// Version numbering task.
// grunt change-version-number --oldver=A.B.C --newver=X.Y.Z
// This can be overzealous, so its changes should always be manually reviewed!
grunt.registerTask('change-version-number', 'sed');
grunt.registerTask('change-version-number', 'replace');
// task for building customizer
grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']);
@@ -385,6 +389,6 @@ module.exports = function (grunt) {
});
// Task for updating the npm packages used by the Travis build.
grunt.registerTask('update-shrinkwrap', ['exec:npmUpdate', 'exec:npmShrinkWrap', '_update-shrinkwrap']);
grunt.registerTask('_update-shrinkwrap', function () { updateShrinkwrap.call(this, grunt); });
grunt.registerTask('update-shrinkwrap', ['exec:npmUpdate', 'exec:npmShrinkWrap', 'update-shrinkwrap']);
grunt.registerTask('update-shrinkwrap', function () { updateShrinkwrap.call(this, grunt); });
};

View File

@@ -19,13 +19,13 @@ exclude:
- "vendor"
# Custom vars
current_version: 3.1.0
current_version: 3.1.3
repo: https://github.com/jasny/bootstrap
download:
source: https://github.com/jasny/bootstrap/archive/v3.1.0.zip
dist: https://github.com/jasny/bootstrap/releases/download/v3.1.0/jasny-bootstrap-3.1.0-dist.zip
source: https://github.com/jasny/bootstrap/archive/v3.1.3.zip
dist: https://github.com/jasny/bootstrap/releases/download/v3.1.3/jasny-bootstrap-3.1.3-dist.zip
cdn:
css: //cdnjs.cloudflare.com/ajax/libs/jasny-bootstrap/3.1.0/css/jasny-bootstrap.min.css
js: //cdnjs.cloudflare.com/ajax/libs/jasny-bootstrap/3.1.0/js/jasny-bootstrap.min.js
css: //cdnjs.cloudflare.com/ajax/libs/jasny-bootstrap/3.1.3/css/jasny-bootstrap.min.css
js: //cdnjs.cloudflare.com/ajax/libs/jasny-bootstrap/3.1.3/js/jasny-bootstrap.min.js

View File

@@ -1,6 +1,6 @@
{
"name": "jasny-bootstrap",
"version": "3.1.0",
"version": "3.1.3",
"main": [
"./dist/css/jasny-bootstrap.css",
"./dist/js/jasny-bootstrap.js"
@@ -16,6 +16,6 @@
],
"dependencies": {
"jquery": ">= 1.9.0",
"bootstrap": ">= 3.0.0"
"bootstrap": ">= 3.1.0"
}
}

View File

@@ -14,6 +14,6 @@
}
, "license": "Apache-2.0"
, "require": {
"twitter/bootstrap" : ">=3.0.0"
"twitter/bootstrap" : ">=3.1.0"
}
}

View File

@@ -1,12 +1,15 @@
/*!
* Jasny Bootstrap v3.1.0 (http://jasny.github.io/bootstrap)
* Jasny Bootstrap v3.1.3 (http://jasny.github.io/bootstrap)
* Copyright 2012-2014 Arnold Daniels
* Licensed under Apache-2.0 (https://github.com/jasny/bootstrap/blob/master/LICENSE)
*/
.container-smooth {
max-width: 1170px;
}
@media (min-width: 1px) {
.container-smooth {
max-width: 1170px;
width: auto;
}
}
.btn-labeled {
@@ -137,7 +140,7 @@
.navmenu,
.navbar-offcanvas {
width: 300px;
height: 100%;
height: auto;
border-style: solid;
border-width: 1px;
border-radius: 4px;
@@ -147,16 +150,21 @@
.navbar-offcanvas {
position: fixed;
top: 0;
bottom: 0;
z-index: 1030;
overflow-y: auto;
border-radius: 0;
}
.navmenu-fixed-left,
.navbar-offcanvas {
.navbar-offcanvas.navmenu-fixed-left {
right: auto;
left: 0;
border-width: 0 1px 0 0;
}
.navmenu-fixed-right {
.navmenu-fixed-right,
.navbar-offcanvas {
right: 0;
left: auto;
border-width: 0 0 0 1px;
}
.navmenu-nav {
@@ -515,13 +523,13 @@
position: absolute;
top: 0;
right: 0;
width: 100%;
height: 100%;
margin: 0;
font-size: 23px;
cursor: pointer;
filter: alpha(opacity=0);
opacity: 0;
transform: translate(-300px, 0) scale(4);
direction: ltr;
}
@@ -565,13 +573,27 @@
.form-control .fileinput-filename {
vertical-align: bottom;
}
.fileinput.input-group {
display: table;
}
.fileinput.input-group > * {
position: relative;
z-index: 2;
}
.fileinput.input-group > .btn-file {
z-index: 1;
}
.fileinput-new.input-group .btn-file,
.fileinput-new .input-group .btn-file {
border-radius: 0 4px 4px 0;
}
.fileinput-new.input-group .btn-file.btn-xs,
.fileinput-new .input-group .btn-file.btn-xs,
.fileinput-new.input-group .btn-file.btn-sm,
.fileinput-new .input-group .btn-file.btn-sm {
border-radius: 0 3px 3px 0;
}
.fileinput-new.input-group .btn-file.btn-lg,
.fileinput-new .input-group .btn-file.btn-lg {
border-radius: 0 6px 6px 0;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
/*!
* Jasny Bootstrap v3.1.0 (http://jasny.github.io/bootstrap)
* Jasny Bootstrap v3.1.3 (http://jasny.github.io/bootstrap)
* Copyright 2012-2014 Arnold Daniels
* Licensed under Apache-2.0 (https://github.com/jasny/bootstrap/blob/master/LICENSE)
*/
@@ -7,10 +7,59 @@
if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScript requires jQuery') }
/* ========================================================================
* Bootstrap: offcanvas.js v3.1.0
* Bootstrap: transition.js v3.1.3
* http://getbootstrap.com/javascript/#transitions
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
// ============================================================
function transitionEnd() {
var el = document.createElement('bootstrap')
var transEndEventNames = {
WebkitTransition : 'webkitTransitionEnd',
MozTransition : 'transitionend',
OTransition : 'oTransitionEnd otransitionend',
transition : 'transitionend'
}
for (var name in transEndEventNames) {
if (el.style[name] !== undefined) {
return { end: transEndEventNames[name] }
}
}
return false // explicit for ie8 ( ._.)
}
if ($.support.transition !== undefined) return // Prevent conflict with Twitter Bootstrap
// http://blog.alexmaccaw.com/css-transitions
$.fn.emulateTransitionEnd = function (duration) {
var called = false, $el = this
$(this).one($.support.transition.end, function () { called = true })
var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
setTimeout(callback, duration)
return this
}
$(function () {
$.support.transition = transitionEnd()
})
}(window.jQuery);
/* ========================================================================
* Bootstrap: offcanvas.js v3.1.3
* http://jasny.github.io/bootstrap/javascript/#offcanvas
*
* Based on Boostrap collapse.js by Twitter, Inc.
* ========================================================================
* Copyright 2013-2014 Arnold Daniels
*
@@ -36,6 +85,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
this.$element = $(element)
this.options = $.extend({}, OffCanvas.DEFAULTS, options)
this.state = null
this.placement = null
if (this.options.recalc) {
this.calcClone()
@@ -46,17 +96,23 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
$(document).on('click', $.proxy(this.autohide, this))
if (this.options.toggle) this.toggle()
if (this.options.disablescrolling) {
this.options.disableScrolling = this.options.disablescrolling
delete this.options.disablescrolling
}
}
OffCanvas.DEFAULTS = {
toggle: true,
placement: 'left',
placement: 'auto',
autohide: true,
recalc: true
recalc: true,
disableScrolling: true
}
OffCanvas.prototype.offset = function () {
switch (this.options.placement) {
switch (this.placement) {
case 'left':
case 'right': return this.$element.outerWidth()
case 'top':
@@ -65,26 +121,31 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
}
OffCanvas.prototype.calcPlacement = function () {
var horizontal = $(window).width() / this.$element.width(),
vertical = $(window).height() / this.$element.height()
if (this.options.placement !== 'auto') {
this.placement = this.options.placement
return
}
if (!this.$element.hasClass('in')) {
this.$element.css('visiblity', 'hidden !important').addClass('in')
}
var horizontal = $(window).width() / this.$element.width()
var vertical = $(window).height() / this.$element.height()
var element = this.$element
function ab(a, b) {
if (element.css(b) === 'auto') return a
if (element.css(a) === 'auto') return b
var size_a = parseInt(element.css(a), 10),
size_b = parseInt(element.css(b), 10)
var size_a = parseInt(element.css(a), 10)
var size_b = parseInt(element.css(b), 10)
return size_a > size_b ? b : a
}
this.options.placement = horizontal > vertical ? ab('left', 'right') : ab('top', 'bottom')
this.placement = horizontal >= vertical ? ab('left', 'right') : ab('top', 'bottom')
if (this.$element.css('visibility') === 'hidden !important') {
this.$element.removeClass('in').css('visiblity', '')
}
@@ -114,12 +175,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
// Use jQuery animation if CSS transitions aren't supported
if (!$.support.transition) {
var anim = {}
anim[this.options.placement] = "+=" + offset
anim[this.placement] = "+=" + offset
return elements.animate(anim, 350, callback)
}
var placement = this.options.placement,
opposite = this.opposite(placement)
var placement = this.placement
var opposite = this.opposite(placement)
elements.each(function() {
if ($(this).css(placement) !== 'auto')
@@ -136,10 +197,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
OffCanvas.prototype.disableScrolling = function() {
var bodyWidth = $('body').width()
var prop = 'padding-' + this.opposite(this.options.placement)
var prop = 'padding-' + this.opposite(this.placement)
if ($('body').data('offcanvas-style') === undefined) $('body').data('offcanvas-style', $('body').attr('style'))
if ($('body').data('offcanvas-style') === undefined) {
$('body').data('offcanvas-style', $('body').attr('style') || '')
}
$('body').css('overflow', 'hidden')
if ($('body').width() > bodyWidth) {
@@ -158,17 +221,22 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
this.$element.trigger(startEvent)
if (startEvent.isDefaultPrevented()) return
if (this.options.placement === 'auto') this.calcPlacement()
this.state = 'sliding'
this.state = 'slide-in'
this.calcPlacement();
var elements = this.getCanvasElements()
var offset = this.offset(),
placement = this.options.placement,
opposite = this.opposite(placement)
var placement = this.placement
var opposite = this.opposite(placement)
var offset = this.offset()
if (elements.index(this.$element) !== -1) {
$(this.$element).data('offcanvas-style', $(this.$element).attr('style') || '')
this.$element.css(placement, -1 * offset)
this.$element.css(placement); // Workaround: Need to get the CSS property for it to be applied before the next line of code
}
elements.addClass('canvas-sliding').each(function() {
$(this).data('offcanvas-style', $(this).attr('style') || '')
if ($(this).data('offcanvas-style') === undefined) $(this).data('offcanvas-style', $(this).attr('style') || '')
if ($(this).css('position') === 'static') $(this).css('position', 'relative')
if (($(this).css(placement) === 'auto' || $(this).css(placement) === '0px') &&
($(this).css(opposite) === 'auto' || $(this).css(opposite) === '0px')) {
@@ -176,11 +244,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
}
})
if (elements.index(this.$element) !== -1) this.$element.css(placement, -1 * offset)
this.disableScrolling()
if (this.options.disableScrolling) this.disableScrolling()
var complete = function () {
if (this.state != 'slide-in') return
this.state = 'slid'
elements.removeClass('canvas-sliding').addClass('canvas-slid')
@@ -200,18 +268,22 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
this.$element.trigger(startEvent)
if (startEvent.isDefaultPrevented()) return
this.state = 'sliding'
this.state = 'slide-out'
var elements = $('.canvas-slid')
var placement = this.placement
var offset = -1 * this.offset()
var complete = function () {
if (this.state != 'slide-out') return
this.state = null
this.placement = null
this.$element.removeClass('in')
elements.removeClass('canvas-sliding')
elements.add('body').each(function() {
elements.add(this.$element).add('body').each(function() {
$(this).attr('style', $(this).data('offcanvas-style')).removeData('offcanvas-style')
})
@@ -226,7 +298,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
}
OffCanvas.prototype.toggle = function () {
if (this.state === 'sliding') return
if (this.state === 'slide-in' || this.state === 'slide-out') return
this[this.state === 'slid' ? 'hide' : 'show']()
}
@@ -238,17 +310,18 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
}
OffCanvas.prototype.recalc = function () {
if (this.state() !== 'slid' || this.$calcClone.css('display') === 'none') return
if (this.$calcClone.css('display') === 'none' || (this.state !== 'slid' && this.state !== 'slide-in')) return
var offset = -1 * this.offset()
this.state = null
this.placement = null
var elements = this.getCanvasElements()
var placement = this.options.placement
this.getCanvasElements().each(function() {
$(this).css(placement, (parseInt($(this).css(placement), 10) || 0) + offset)
}).removeClass('canvas-slid')
this.$element.removeClass('in')
$('body').css('overflow', '')
this.$element.css(placement, '').removeClass('in canvas-slid')
elements.removeClass('canvas-slid')
elements.add(this.$element).add('body').each(function() {
$(this).attr('style', $(this).data('offcanvas-style')).removeData('offcanvas-style')
})
}
OffCanvas.prototype.autohide = function (e) {
@@ -264,10 +337,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.offcanvas')
var options = $.extend({}, OffCanvas.DEFAULTS, $this.data(), typeof option == 'object' && option)
var options = $.extend({}, OffCanvas.DEFAULTS, $this.data(), typeof option === 'object' && option)
if (!data) $this.data('bs.offcanvas', (data = new OffCanvas(this, options)))
if (typeof option == 'string') data[option]()
if (typeof option === 'string') data[option]()
})
}
@@ -304,7 +377,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
}(window.jQuery);
/* ============================================================
* Bootstrap: rowlink.js v3.1.0
* Bootstrap: rowlink.js v3.1.3
* http://jasny.github.io/bootstrap/javascript/#rowlink
* ============================================================
* Copyright 2012-2014 Arnold Daniels
@@ -359,8 +432,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
$.fn.rowlink = function (options) {
return this.each(function () {
var $this = $(this)
var data = $this.data('rowlink')
if (!data) $this.data('rowlink', (data = new Rowlink(this, options)))
var data = $this.data('bs.rowlink')
if (!data) $this.data('bs.rowlink', (data = new Rowlink(this, options)))
})
}
@@ -380,8 +453,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
// ==================
$(document).on('click.bs.rowlink.data-api', '[data-link="row"]', function (e) {
if ($(e.target).closest('.rowlink-skip').length !== 0) return
var $this = $(this)
if ($this.data('rowlink')) return
if ($this.data('bs.rowlink')) return
$this.rowlink($this.data())
$(e.target).trigger('click.bs.rowlink')
})
@@ -422,7 +497,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
if (isAndroid) return // No support because caret positioning doesn't work on Android
this.$element = $(element)
this.options = $.extend({}, Inputmask.DEFAULS, options)
this.options = $.extend({}, Inputmask.DEFAULTS, options)
this.mask = String(this.options.mask)
this.init()
@@ -431,13 +506,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
this.checkVal() //Perform initial check for existing values
}
Inputmask.DEFAULS = {
Inputmask.DEFAULTS = {
mask: "",
placeholder: "_",
definitions: {
'9': "[0-9]",
'a': "[A-Za-z]",
'?': "[A-Za-z0-9]",
'w': "[A-Za-z0-9]",
'*': "."
}
}
@@ -720,9 +795,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
$.fn.inputmask = function (options) {
return this.each(function () {
var $this = $(this)
var data = $this.data('inputmask')
var data = $this.data('bs.inputmask')
if (!data) $this.data('inputmask', (data = new Inputmask(this, options)))
if (!data) $this.data('bs.inputmask', (data = new Inputmask(this, options)))
})
}
@@ -743,14 +818,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
$(document).on('focus.bs.inputmask.data-api', '[data-mask]', function (e) {
var $this = $(this)
if ($this.data('inputmask')) return
if ($this.data('bs.inputmask')) return
$this.inputmask($this.data())
})
}(window.jQuery);
/* ===========================================================
* Bootstrap: fileinput.js v3.1.0
* Bootstrap: fileinput.js v3.1.3
* http://jasny.github.com/bootstrap/javascript/#fileinput
* ===========================================================
* Copyright 2012-2014 Arnold Daniels
@@ -785,14 +860,15 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
this.$hidden = this.$element.find('input[type=hidden][name="' + this.name + '"]')
if (this.$hidden.length === 0) {
this.$hidden = $('<input type="hidden" />')
this.$element.prepend(this.$hidden)
this.$hidden = $('<input type="hidden">').insertBefore(this.$input)
}
this.$preview = this.$element.find('.fileinput-preview')
var height = this.$preview.css('height')
if (this.$preview.css('display') != 'inline' && height != '0px' && height != 'none') this.$preview.css('line-height', height)
if (this.$preview.css('display') !== 'inline' && height !== '0px' && height !== 'none') {
this.$preview.css('line-height', height)
}
this.original = {
exists: this.$element.hasClass('fileinput-exists'),
preview: this.$preview.html(),
@@ -811,24 +887,30 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
},
Fileinput.prototype.change = function(e) {
if (e.target.files === undefined) e.target.files = e.target && e.target.value ? [ {name: e.target.value.replace(/^.+\\/, '')} ] : []
if (e.target.files.length === 0) return
var files = e.target.files === undefined ? (e.target && e.target.value ? [{ name: e.target.value.replace(/^.+\\/, '')}] : []) : e.target.files
e.stopPropagation()
if (files.length === 0) {
this.clear()
return
}
this.$hidden.val('')
this.$hidden.attr('name', '')
this.$input.attr('name', this.name)
var file = e.target.files[0]
var file = files[0]
if (this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match('image.*') : file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") {
if (this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match(/^image\/(gif|png|jpeg)$/) : file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") {
var reader = new FileReader()
var preview = this.$preview
var element = this.$element
reader.onload = function(re) {
var $img = $('<img>') // .attr('src', re.target.result)
var $img = $('<img>')
$img[0].src = re.target.result
e.target.files[0].result = re.target.result
files[0].result = re.target.result
element.find('.fileinput-filename').text(file.name)
@@ -838,7 +920,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
preview.html($img)
element.addClass('fileinput-exists').removeClass('fileinput-new')
element.trigger('change.bs.fileinput', e.target.files)
element.trigger('change.bs.fileinput', files)
}
reader.readAsDataURL(file)
@@ -873,14 +955,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
this.$element.find('.fileinput-filename').text('')
this.$element.addClass('fileinput-new').removeClass('fileinput-exists')
if (e !== false) {
if (e !== undefined) {
this.$input.trigger('change')
this.$element.trigger('clear.bs.fileinput')
}
},
Fileinput.prototype.reset = function() {
this.clear(false)
this.clear()
this.$hidden.val(this.original.hiddenVal)
this.$preview.html(this.original.preview)
@@ -906,8 +988,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
$.fn.fileinput = function (options) {
return this.each(function () {
var $this = $(this),
data = $this.data('fileinput')
if (!data) $this.data('fileinput', (data = new Fileinput(this, options)))
data = $this.data('bs.fileinput')
if (!data) $this.data('bs.fileinput', (data = new Fileinput(this, options)))
if (typeof options == 'string') data[options]()
})
}
@@ -929,7 +1011,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
$(document).on('click.fileinput.data-api', '[data-provides="fileinput"]', function (e) {
var $this = $(this)
if ($this.data('fileinput')) return
if ($this.data('bs.fileinput')) return
$this.fileinput($this.data())
var $target = $(e.target).closest('[data-dismiss="fileinput"],[data-trigger="fileinput"]');

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -183,9 +183,14 @@ window.onload = function () { // wait for load in a dumb way because B-0
return imports
}
function generateLESS(lessFilename, lessFileIncludes, vars) {
function generateLESS(lessFilename, lessFileIncludes, vars, additionalLessFiles) {
var lessSource = __less[lessFilename]
// Additional imports files, not present in less file, but required to build
$.each(additionalLessFiles || [], function(index, filename) {
lessSource += __less[filename]
})
$.each(includedLessFilenames(lessFilename), function(index, filename) {
var fileInclude = lessFileIncludes[filename]
@@ -197,7 +202,7 @@ window.onload = function () { // wait for load in a dumb way because B-0
// Custom variables are added after Bootstrap variables so the custom
// ones take precedence.
if (('build/default-variables.less' === filename) && vars) lessSource += generateCustomCSS(vars)
if (('variables.less' === filename) && vars) lessSource += generateCustomCSS(vars)
})
lessSource = lessSource.replace(/@import[^\n]*/gi, '') //strip any imports
@@ -206,7 +211,6 @@ window.onload = function () { // wait for load in a dumb way because B-0
function compileLESS(lessSource, baseFilename, intoResult) {
var parser = new less.Parser({
paths: ['build/default-variables.less', 'mixins.less'],
optimization: 0,
filename: baseFilename + '.css'
}).parse(lessSource, function (err, tree) {
@@ -239,7 +243,8 @@ window.onload = function () { // wait for load in a dumb way because B-0
$(this).val() && (vars[$(this).prev().text()] = $(this).val())
})
var bsLessSource = generateLESS('jasny-bootstrap.less', lessFileIncludes, vars)
var bsLessSource = generateLESS('jasny-bootstrap.less', lessFileIncludes, vars,
['build/variables.less', 'build/mixins.less'])
try {
compileLESS(bsLessSource, 'jasny-bootstrap', result)

File diff suppressed because one or more lines are too long

View File

@@ -123,6 +123,12 @@ base_url: "../"
Off canvas
</label>
</div>
<div class="checkbox">
<label>
<input type="checkbox" checked value="transition.js">
Transitions <small>(required for any kind of animation)</small>
</label>
</div>
</div>
</div>

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

View File

@@ -60,7 +60,7 @@ $.fn.bootstrapBtn = bootstrapButton // give $().bootstrapBtn the Boot
<h3 id="js-events">Events</h3>
<p>Bootstrap provides custom events for most plugin's unique actions. Generally, these come in an infinitive and past participle form - where the infinitive (ex. <code>show</code>) is triggered at the start of an event, and its past participle form (ex. <code>shown</code>) is trigger on the completion of an action.</p>
<p>As of 3.0.0, all Bootstrap events are namespaced.</p>
<p>As of 3.1.2, all Bootstrap events are namespaced.</p>
<p>All infinitive events provide <code>preventDefault</code> functionality. This provides the ability to stop the execution of an action before it starts.</p>
{% highlight js %}
$('#myMenu').on('show.bs.offcanvas', function (e) {
@@ -396,8 +396,9 @@ $('.inputmask').inputmask({
<tbody>
<tr><td>9</td><td>Number</td></tr>
<tr><td>a</td><td>Letter</td></tr>
<tr><td>?</td><td>Alphanumeric</td></tr>
<tr><td>w</td><td>Alphanumeric</td></tr>
<tr><td>*</td><td>Any character</td></tr>
<tr><td>?</td><td>Optional - any characters following will become optional</td></tr>
</tbody>
</table>
</div>

View File

@@ -9,16 +9,21 @@
var btoa = require('btoa');
var fs = require('fs');
function getFiles(type) {
function getFiles(type, subdirs, exclude) {
var files = {};
fs.readdirSync(type)
.filter(function (path) {
return new RegExp('\\.' + type + '$').test(path);
})
.forEach(function (path) {
var fullPath = type + (path === 'variables.less' ? '/build/' : '/') + path;
files[path] = fs.readFileSync(fullPath, 'utf8');
});
exclude = exclude || [];
subdirs.forEach(function(subdir) {
var sub = subdir ? subdir + '/' : '';
fs.readdirSync(type + '/' + sub)
.filter(function (path) {
return new RegExp('\\.' + type + '$').test(path) && exclude.indexOf(sub + path) === -1;
})
.forEach(function (path) {
var fullPath = type + '/' + sub + path;
files[sub + path] = fs.readFileSync(fullPath, 'utf8');
});
});
return 'var __' + type + ' = ' + JSON.stringify(files) + '\n';
}
@@ -26,6 +31,6 @@ module.exports = function generateRawFilesJs(banner) {
if (!banner) {
banner = '';
}
var files = banner + getFiles('js') + getFiles('less');
var files = banner + getFiles('js', ['']) + getFiles('less', ['', 'build'], ['build/jasny-bootstrap.less']);
fs.writeFileSync('docs/assets/js/raw-files.min.js', files);
};

View File

@@ -1,5 +1,5 @@
/* ===========================================================
* Bootstrap: fileinput.js v3.1.1
* Bootstrap: fileinput.js v3.1.3
* http://jasny.github.com/bootstrap/javascript/#fileinput
* ===========================================================
* Copyright 2012-2014 Arnold Daniels
@@ -34,14 +34,15 @@
this.$hidden = this.$element.find('input[type=hidden][name="' + this.name + '"]')
if (this.$hidden.length === 0) {
this.$hidden = $('<input type="hidden" />')
this.$element.prepend(this.$hidden)
this.$hidden = $('<input type="hidden">').insertBefore(this.$input)
}
this.$preview = this.$element.find('.fileinput-preview')
var height = this.$preview.css('height')
if (this.$preview.css('display') != 'inline' && height != '0px' && height != 'none') this.$preview.css('line-height', height)
if (this.$preview.css('display') !== 'inline' && height !== '0px' && height !== 'none') {
this.$preview.css('line-height', height)
}
this.original = {
exists: this.$element.hasClass('fileinput-exists'),
preview: this.$preview.html(),
@@ -60,9 +61,11 @@
},
Fileinput.prototype.change = function(e) {
if (e.target.files === undefined) e.target.files = e.target && e.target.value ? [ {name: e.target.value.replace(/^.+\\/, '')} ] : []
var files = e.target.files === undefined ? (e.target && e.target.value ? [{ name: e.target.value.replace(/^.+\\/, '')}] : []) : e.target.files
e.stopPropagation()
if (e.target.files.length === 0) {
if (files.length === 0) {
this.clear()
return
}
@@ -71,17 +74,17 @@
this.$hidden.attr('name', '')
this.$input.attr('name', this.name)
var file = e.target.files[0]
var file = files[0]
if (this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match('image.*') : file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") {
if (this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match(/^image\/(gif|png|jpeg)$/) : file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") {
var reader = new FileReader()
var preview = this.$preview
var element = this.$element
reader.onload = function(re) {
var $img = $('<img>') // .attr('src', re.target.result)
var $img = $('<img>')
$img[0].src = re.target.result
e.target.files[0].result = re.target.result
files[0].result = re.target.result
element.find('.fileinput-filename').text(file.name)
@@ -91,7 +94,7 @@
preview.html($img)
element.addClass('fileinput-exists').removeClass('fileinput-new')
element.trigger('change.bs.fileinput', e.target.files)
element.trigger('change.bs.fileinput', files)
}
reader.readAsDataURL(file)
@@ -126,14 +129,14 @@
this.$element.find('.fileinput-filename').text('')
this.$element.addClass('fileinput-new').removeClass('fileinput-exists')
if (e !== false) {
if (e !== undefined) {
this.$input.trigger('change')
this.$element.trigger('clear.bs.fileinput')
}
},
Fileinput.prototype.reset = function() {
this.clear(false)
this.clear()
this.$hidden.val(this.original.hiddenVal)
this.$preview.html(this.original.preview)
@@ -159,8 +162,8 @@
$.fn.fileinput = function (options) {
return this.each(function () {
var $this = $(this),
data = $this.data('fileinput')
if (!data) $this.data('fileinput', (data = new Fileinput(this, options)))
data = $this.data('bs.fileinput')
if (!data) $this.data('bs.fileinput', (data = new Fileinput(this, options)))
if (typeof options == 'string') data[options]()
})
}
@@ -182,7 +185,7 @@
$(document).on('click.fileinput.data-api', '[data-provides="fileinput"]', function (e) {
var $this = $(this)
if ($this.data('fileinput')) return
if ($this.data('bs.fileinput')) return
$this.fileinput($this.data())
var $target = $(e.target).closest('[data-dismiss="fileinput"],[data-trigger="fileinput"]');

View File

@@ -32,7 +32,7 @@
if (isAndroid) return // No support because caret positioning doesn't work on Android
this.$element = $(element)
this.options = $.extend({}, Inputmask.DEFAULS, options)
this.options = $.extend({}, Inputmask.DEFAULTS, options)
this.mask = String(this.options.mask)
this.init()
@@ -41,13 +41,13 @@
this.checkVal() //Perform initial check for existing values
}
Inputmask.DEFAULS = {
Inputmask.DEFAULTS = {
mask: "",
placeholder: "_",
definitions: {
'9': "[0-9]",
'a': "[A-Za-z]",
'?': "[A-Za-z0-9]",
'w': "[A-Za-z0-9]",
'*': "."
}
}
@@ -330,9 +330,9 @@
$.fn.inputmask = function (options) {
return this.each(function () {
var $this = $(this)
var data = $this.data('inputmask')
var data = $this.data('bs.inputmask')
if (!data) $this.data('inputmask', (data = new Inputmask(this, options)))
if (!data) $this.data('bs.inputmask', (data = new Inputmask(this, options)))
})
}
@@ -353,7 +353,7 @@
$(document).on('focus.bs.inputmask.data-api', '[data-mask]', function (e) {
var $this = $(this)
if ($this.data('inputmask')) return
if ($this.data('bs.inputmask')) return
$this.inputmask($this.data())
})

View File

@@ -1,5 +1,5 @@
/* ========================================================================
* Bootstrap: offcanvas.js v3.1.1
* Bootstrap: offcanvas.js v3.1.3
* http://jasny.github.io/bootstrap/javascript/#offcanvas
* ========================================================================
* Copyright 2013-2014 Arnold Daniels
@@ -37,6 +37,11 @@
$(document).on('click', $.proxy(this.autohide, this))
if (this.options.toggle) this.toggle()
if (this.options.disablescrolling) {
this.options.disableScrolling = this.options.disablescrolling
delete this.options.disablescrolling
}
}
OffCanvas.DEFAULTS = {
@@ -135,8 +140,10 @@
var bodyWidth = $('body').width()
var prop = 'padding-' + this.opposite(this.placement)
if ($('body').data('offcanvas-style') === undefined) $('body').data('offcanvas-style', $('body').attr('style'))
if ($('body').data('offcanvas-style') === undefined) {
$('body').data('offcanvas-style', $('body').attr('style') || '')
}
$('body').css('overflow', 'hidden')
if ($('body').width() > bodyWidth) {

View File

@@ -1,5 +1,5 @@
/* ============================================================
* Bootstrap: rowlink.js v3.1.0
* Bootstrap: rowlink.js v3.1.3
* http://jasny.github.io/bootstrap/javascript/#rowlink
* ============================================================
* Copyright 2012-2014 Arnold Daniels
@@ -54,8 +54,8 @@
$.fn.rowlink = function (options) {
return this.each(function () {
var $this = $(this)
var data = $this.data('rowlink')
if (!data) $this.data('rowlink', (data = new Rowlink(this, options)))
var data = $this.data('bs.rowlink')
if (!data) $this.data('bs.rowlink', (data = new Rowlink(this, options)))
})
}
@@ -75,8 +75,10 @@
// ==================
$(document).on('click.bs.rowlink.data-api', '[data-link="row"]', function (e) {
if ($(e.target).closest('.rowlink-skip').length !== 0) return
var $this = $(this)
if ($this.data('rowlink')) return
if ($this.data('bs.rowlink')) return
$this.rowlink($this.data())
$(e.target).trigger('click.bs.rowlink')
})

View File

@@ -1,6 +1,13 @@
$(function () {
module('inputmask')
var $input;
module('inputmask', {
setup : function() {
$input = $('<input type="text">').appendTo(document.body);
$input.removeData('inputmask');
}
})
test('should provide no conflict', function () {
var inputmask = $.fn.inputmask.noConflict()
@@ -9,12 +16,66 @@ $(function () {
})
test('should be defined on jquery object', function () {
ok($(document.body).inputmask, 'inputmask method is defined')
ok($input.inputmask, 'inputmask method is defined')
})
test('should return element', function () {
ok($(document.body).inputmask()[0] == document.body, 'document.body returned')
ok($input.inputmask()[0] == $input[0], 'input returned')
})
test('should use default mask', function() {
var expected = ""
$.fn.inputmask.Constructor.DEFAULTS.mask = expected
$input.inputmask()
equal(expected, $input.data('bs.inputmask').options.mask)
})
test('should use default placeholder', function() {
var expected = "_"
$.fn.inputmask.Constructor.DEFAULTS.placeholder = expected
$input.inputmask()
equal(expected, $input.data('bs.inputmask').options.placeholder)
})
test('should use default definitions', function() {
var expected = {
'0': "[0-9]",
'A': "[A-Za-z]"
}
$.fn.inputmask.Constructor.DEFAULTS.definitions = expected
$input.inputmask()
deepEqual(expected, $input.data('bs.inputmask').options.definitions)
})
test('should override mask when options.mask provided', function() {
var expected = '99-99';
$input.inputmask({ mask: expected})
equal(expected, $input.data('bs.inputmask').options.mask)
})
test('should override placeholder when options.placeholder provided', function() {
var expected = '-';
$input.inputmask({ placeholder: expected})
equal(expected, $input.data('bs.inputmask').options.placeholder)
})
test('should override definitions when options.definitions provided', function() {
var expected = {
'0': "[0-9]",
'A': "[A-Za-z]"
}
$input.inputmask({definitions: expected})
deepEqual(expected, $input.data('bs.inputmask').options.definitions)
})
// TODO: add inputmask tests
})

50
js/transition.js Normal file
View File

@@ -0,0 +1,50 @@
/* ========================================================================
* Bootstrap: transition.js v3.1.3
* http://getbootstrap.com/javascript/#transitions
* ========================================================================
* Copyright 2011-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
// ============================================================
function transitionEnd() {
var el = document.createElement('bootstrap')
var transEndEventNames = {
WebkitTransition : 'webkitTransitionEnd',
MozTransition : 'transitionend',
OTransition : 'oTransitionEnd otransitionend',
transition : 'transitionend'
}
for (var name in transEndEventNames) {
if (el.style[name] !== undefined) {
return { end: transEndEventNames[name] }
}
}
return false // explicit for ie8 ( ._.)
}
if ($.support.transition !== undefined) return // Prevent conflict with Twitter Bootstrap
// http://blog.alexmaccaw.com/css-transitions
$.fn.emulateTransitionEnd = function (duration) {
var called = false, $el = this
$(this).one($.support.transition.end, function () { called = true })
var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
setTimeout(callback, duration)
return this
}
$(function () {
$.support.transition = transitionEnd()
})
}(window.jQuery);

View File

@@ -1,6 +1,6 @@
// Fixed alerts
//
// Position to the top or bottom.
// ------------------------------------------------
.alert-fixed-top,
.alert-fixed-bottom {

View File

@@ -1,4 +1,5 @@
// Jasny Bootstrap with default variables
@import "variables.less";
@import "mixins.less";
@import "../jasny-bootstrap.less";

61
less/build/mixins.less Normal file
View File

@@ -0,0 +1,61 @@
//
// These mixins are used when Jasny Bootstrap is
// built without importing Twitter Bootstrap.
// --------------------------------------------------
// CSS3 PROPERTIES
// --------------------------------------------------
// Single side border-radius
.border-top-radius(@radius) {
border-top-right-radius: @radius;
border-top-left-radius: @radius;
}
.border-right-radius(@radius) {
border-bottom-right-radius: @radius;
border-top-right-radius: @radius;
}
.border-bottom-radius(@radius) {
border-bottom-right-radius: @radius;
border-bottom-left-radius: @radius;
}
.border-left-radius(@radius) {
border-bottom-left-radius: @radius;
border-top-left-radius: @radius;
}
// Drop shadows
.box-shadow(@shadow) {
-webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
box-shadow: @shadow;
}
.transition(@transition) {
-webkit-transition: @transition;
-o-transition: @transition;
transition: @transition;
}
// Transition
.transition-property(@transition-property) {
-webkit-transition-property: @transition-property;
transition-property: @transition-property;
}
.transition-delay(@transition-delay) {
-webkit-transition-delay: @transition-delay;
transition-delay: @transition-delay;
}
.transition-duration(@transition-duration) {
-webkit-transition-duration: @transition-duration;
transition-duration: @transition-duration;
}
.transition-timing-function(@timing-function) {
-webkit-transition-timing-function: @timing-function;
transition-timing-function: @timing-function;
}
.transition-transform(@transition) {
-webkit-transition: -webkit-transform @transition;
-moz-transition: -moz-transform @transition;
-o-transition: -o-transform @transition;
transition: transform @transition;
}

View File

@@ -1,6 +1,19 @@
// Labels for buttons
// --------------------------------------------------
.button-label-size(@padding-vertical; @padding-horizontal; @border-radius) {
padding: @padding-vertical @padding-horizontal;
left: (-1 * @padding-horizontal);
border-radius: (@border-radius - 1px) 0 0 (@border-radius - 1px);
&.btn-label-right {
left: auto;
right: (-1 * @padding-horizontal);
border-radius: 0 (@border-radius - 1px) (@border-radius - 1px) 0;
}
}
.btn-labeled {
padding-top: 0;
padding-bottom: 0;

View File

@@ -13,10 +13,9 @@
margin: 0;
opacity: 0;
filter: alpha(opacity=0);
transform: translate(-300px, 0) scale(4);
-webkit-transform: translate(-300px, 0) scale(4);
font-size: 23px;
height: 100%;
width: 100%;
direction: ltr;
cursor: pointer;
}
@@ -66,6 +65,14 @@
.fileinput.input-group {
display: table;
> * {
position: relative;
z-index: 2;
}
> .btn-file {
z-index: 1;
}
}
// Not 100% correct, but helps in typical use case

View File

@@ -2,7 +2,6 @@
// Core variables and mixins
@import "variables.less";
@import "mixins.less";
// Core CSS
@import "grid-container-smooth.less";

View File

@@ -1,47 +0,0 @@
//
// Mixins
// --------------------------------------------------
// CSS3 PROPERTIES
// --------------------------------------------------
// Single side border-radius
.border-top-radius(@radius) {
border-top-right-radius: @radius;
border-top-left-radius: @radius;
}
.border-right-radius(@radius) {
border-bottom-right-radius: @radius;
border-top-right-radius: @radius;
}
.border-bottom-radius(@radius) {
border-bottom-right-radius: @radius;
border-bottom-left-radius: @radius;
}
.border-left-radius(@radius) {
border-bottom-left-radius: @radius;
border-top-left-radius: @radius;
}
// Drop shadows
.box-shadow(@shadow) {
-webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
box-shadow: @shadow;
}
// BUTTONS
// --------------------------------------------------
.button-label-size(@padding-vertical; @padding-horizontal; @border-radius) {
padding: @padding-vertical @padding-horizontal;
left: (-1 * @padding-horizontal);
border-radius: (@border-radius - 1px) 0 0 (@border-radius - 1px);
&.btn-label-right {
left: auto;
right: (-1 * @padding-horizontal);
border-radius: 0 (@border-radius - 1px) (@border-radius - 1px) 0;
}
}

View File

@@ -1,4 +1,3 @@
//
// Navmenu and offcanvas navbar
// --------------------------------------------------
@@ -11,7 +10,7 @@
.navmenu,
.navbar-offcanvas {
width: @navmenu-width;
height: 100%;
height: auto;
border-width: 1px;
border-style: solid;
border-radius: @border-radius-base;
@@ -23,6 +22,8 @@
position: fixed;
z-index: @zindex-navmenu-fixed;
top: 0;
bottom: 0;
overflow-y: auto;
border-radius: 0;
}
.navmenu-fixed-left,

View File

@@ -1,4 +1,3 @@
//
// Off canvas navigation
// --------------------------------------------------

View File

@@ -1,4 +1,3 @@
//
// Rowlink
// --------------------------------------------------

View File

@@ -1,7 +1,7 @@
{
"name": "jasny-bootstrap",
"description": "Additional features and components for Bootstrap",
"version": "3.1.1",
"version": "3.1.3",
"keywords": [
"bootstrap",
"css"
@@ -30,24 +30,24 @@
"grunt": "~0.4.2",
"grunt-banner": "~0.2.0",
"grunt-contrib-clean": "~0.5.0",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-concat": "~0.4.0",
"grunt-contrib-connect": "~0.7.0",
"grunt-contrib-copy": "~0.5.0",
"grunt-contrib-csslint": "~0.2.0",
"grunt-contrib-cssmin": "~0.9.0",
"grunt-contrib-jade": "~0.11.0",
"grunt-contrib-jshint": "~0.8.0",
"grunt-contrib-less": "~0.10.0",
"grunt-contrib-jshint": "~0.10.0",
"grunt-contrib-less": "~0.11.0",
"grunt-contrib-qunit": "~0.4.0",
"grunt-contrib-uglify": "~0.4.0",
"grunt-contrib-watch": "~0.5.3",
"grunt-contrib-watch": "~0.6.0",
"grunt-csscomb": "~2.0.1",
"grunt-exec": "~0.4.2",
"grunt-html-validation": "~0.1.13",
"grunt-jekyll": "~0.4.1",
"grunt-jscs-checker": "~0.4.0",
"grunt-saucelabs": "~5.0.0",
"grunt-sed": "~0.1.1",
"grunt-saucelabs": "~5.1.0",
"grunt-text-replace": "~0.3.0",
"load-grunt-tasks": "~0.4.0",
"markdown": "~0.5.0"
},

39
scss/_alerts-fixed.scss Normal file
View File

@@ -0,0 +1,39 @@
// Fixed alerts
// Position to the top or bottom.
// ------------------------------------------------
.alert-fixed-top,
.alert-fixed-bottom {
position: fixed;
width: 100%;
z-index: $zindex-alert-fixed;
border-radius: 0;
margin: 0;
left: 0;
@media (min-width: $alert-fixed-width) {
width: $alert-fixed-width;
left: 50%;
margin-left: (-1 * ($alert-fixed-width / 2));
}
}
.alert-fixed-top {
top: 0;
border-width: 0 0 1px 0;
@media (min-width: $alert-fixed-width) {
@include border-bottom-radius($alert-border-radius);
border-width: 0 1px 1px 1px;
}
}
.alert-fixed-bottom {
bottom: 0;
border-width: 1px 0 0 0;
@media (min-width: $alert-fixed-width) {
@include border-top-radius($alert-border-radius);
border-width: 1px 1px 0 1px;
}
}

38
scss/_button-labels.scss Normal file
View File

@@ -0,0 +1,38 @@
// Labels for buttons
// --------------------------------------------------
@mixin button-label-size($padding-vertical, $padding-horizontal, $border-radius) {
padding: $padding-vertical $padding-horizontal;
left: (-1 * $padding-horizontal);
border-radius: ($border-radius - 1px) 0 0 ($border-radius - 1px);
&.btn-label-right {
left: auto;
right: (-1 * $padding-horizontal);
border-radius: 0 ($border-radius - 1px) ($border-radius - 1px) 0;
}
}
.btn-labeled {
padding-top: 0;
padding-bottom: 0;
}
.btn-label {
position: relative;
background: transparent;
background: rgba(0, 0, 0, 0.15);
display: inline-block;
@include button-label-size($padding-base-vertical, $padding-base-horizontal, $border-radius-base);
}
.btn-lg .btn-label {
@include button-label-size($padding-large-vertical, $padding-large-horizontal, $border-radius-large);
}
.btn-sm .btn-label {
@include button-label-size($padding-small-vertical, $padding-small-horizontal, $border-radius-small);
}
.btn-xs .btn-label {
@include button-label-size(1px, 5px, $border-radius-small);
}

114
scss/_fileinput.scss Normal file
View File

@@ -0,0 +1,114 @@
// Fileinput
// CSS for file upload button and fileinput widget
// ------------------------------------------------
.btn-file {
overflow: hidden;
position: relative;
vertical-align: middle;
> input {
position: absolute;
top: 0;
right: 0;
margin: 0;
opacity: 0;
filter: alpha(opacity=0);
font-size: 23px;
height: 100%;
width: 100%;
direction: ltr;
cursor: pointer;
}
}
.fileinput {
margin-bottom: 9px;
display: inline-block;
.form-control {
padding-top: 7px;
padding-bottom: 5px;
display: inline-block;
margin-bottom: 0px;
vertical-align: middle;
cursor: text;
}
.thumbnail {
overflow: hidden;
display: inline-block;
margin-bottom: 5px;
vertical-align: middle;
text-align: center;
> img {
max-height: 100%;
}
}
.btn {
vertical-align: middle;
}
}
.fileinput-exists .fileinput-new,
.fileinput-new .fileinput-exists {
display: none;
}
.fileinput-inline .fileinput-controls {
display: inline;
}
.fileinput-filename {
vertical-align: middle;
display: inline-block;
overflow: hidden;
}
.form-control .fileinput-filename {
vertical-align: bottom;
}
.fileinput.input-group {
display: table;
}
// Not 100% correct, but helps in typical use case
.fileinput-new.input-group .btn-file,
.fileinput-new .input-group .btn-file {
border-radius: 0 $border-radius-base $border-radius-base 0;
&.btn-xs,
&.btn-sm {
border-radius: 0 $border-radius-small $border-radius-small 0;
}
&.btn-lg {
border-radius: 0 $border-radius-large $border-radius-large 0;
}
}
.form-group.has-warning .fileinput {
.fileinput-preview {
color: $state-warning-text;
}
.thumbnail {
border-color: $state-warning-border;
}
}
.form-group.has-error .fileinput {
.fileinput-preview {
color: $state-danger-text;
}
.thumbnail {
border-color: $state-danger-border;
}
}
.form-group.has-success .fileinput {
.fileinput-preview {
color: $state-success-text;
}
.thumbnail {
border-color: $state-success-border;
}
}
// Input group fixes
.input-group-addon:not(:first-child) {
border-left: 0;
}

View File

@@ -0,0 +1,10 @@
// Smooth sizing container
// -------------------------
.container-smooth {
max-width: $container-lg;
@media (min-width: 1px) {
width: auto;
}
}

View File

@@ -0,0 +1,97 @@
// Alignment options
// -------------------------
// bottom
.nav-tabs-bottom {
border-bottom: 0;
border-top: 1px solid $nav-tabs-border-color;
> li {
margin-bottom: 0;
margin-top: -1px;
> a {
border-radius: 0 0 $border-radius-base $border-radius-base;
}
> a:hover,
> a:focus,
&.active > a,
&.active > a:hover,
&.active > a:focus {
border: 1px solid $nav-tabs-active-link-hover-border-color;
border-top-color: transparent;
}
}
}
// left
.nav-tabs-left {
border-bottom: 0;
border-right: 1px solid $nav-tabs-border-color;
> li {
margin-bottom: 0;
margin-right: -1px;
float: none;
> a {
border-radius: $border-radius-base 0 0 $border-radius-base;
margin-right: 0;
margin-bottom: 2px;
}
> a:hover,
> a:focus,
&.active > a,
&.active > a:hover,
&.active > a:focus {
border: 1px solid $nav-tabs-active-link-hover-border-color;
border-right-color: transparent;
}
}
.row > & {
padding-right: 0;
padding-left: ($grid-gutter-width / 2);
margin-right: -1px;
position: relative;
z-index: 1;
& + .tab-content {
border-left: 1px solid $nav-tabs-active-link-hover-border-color;
}
}
}
// right
.nav-tabs-right {
border-bottom: 0;
border-left: 1px solid $nav-tabs-border-color;
> li {
margin-bottom: 0;
margin-left: -1px;
float: none;
> a {
border-radius: 0 $border-radius-base $border-radius-base 0;
margin-left: 0;
margin-bottom: 2px;
}
> a:hover,
> a:focus,
&.active > a,
&.active > a:hover,
&.active > a:focus {
border: 1px solid $nav-tabs-active-link-hover-border-color;
border-left-color: transparent;
}
}
.row > & {
padding-left: 0;
padding-right: ($grid-gutter-width / 2);
}
}

273
scss/_navmenu.scss Normal file
View File

@@ -0,0 +1,273 @@
// Navmenu and offcanvas navbar
// --------------------------------------------------
// Wrapper and base class
//
// Provide a static navmenu from which we expand to create the fixed navmenu
// variations.
.navmenu,
.navbar-offcanvas {
width: $navmenu-width;
height: 100%;
border-width: 1px;
border-style: solid;
border-radius: $border-radius-base;
}
.navmenu-fixed-left,
.navmenu-fixed-right,
.navbar-offcanvas {
position: fixed;
z-index: $zindex-navmenu-fixed;
top: 0;
border-radius: 0;
}
.navmenu-fixed-left,
.navbar-offcanvas.navmenu-fixed-left {
left: 0;
right: auto;
border-width: 0 1px 0 0;
bottom: 0;
overflow-y: auto;
}
.navmenu-fixed-right,
.navbar-offcanvas {
left: auto;
right: 0;
border-width: 0 0 0 1px;
}
.navmenu-nav {
margin-bottom: $navmenu-margin-vertical;
&.dropdown-menu {
position: static;
margin: 0;
padding-top: 0;
float: none;
border: none;
@include box-shadow(none);
border-radius: 0;
}
}
.navbar-offcanvas {
.navbar-nav {
margin: 0;
}
@media (min-width: $grid-float-breakpoint) {
width: auto;
border-top: 0;
box-shadow: none;
&.offcanvas {
position: static;
display: block !important;
height: auto !important;
padding-bottom: 0; // Override default setting
overflow: visible !important;
}
// Account for first and last children spacing
.navbar-nav.navbar-left:first-child {
margin-left: -$navbar-padding-horizontal;
}
.navbar-nav.navbar-right:last-child {
margin-right: -$navbar-padding-horizontal;
}
.navmenu-brand {
display: none;
}
}
}
// Brand/project name
.navmenu-brand {
display: block;
font-size: $font-size-large;
line-height: $line-height-computed;
padding: $nav-link-padding;
&:hover,
&:focus {
text-decoration: none;
}
margin: $navmenu-margin-vertical 0;
}
// Alternate navmenus
// --------------------------------------------------
// Default navmenu
.navmenu-default,
.navbar-default .navbar-offcanvas {
background-color: $navmenu-default-bg;
border-color: $navmenu-default-border;
.navmenu-brand {
color: $navmenu-default-brand-color;
&:hover,
&:focus {
color: $navmenu-default-brand-hover-color;
background-color: $navmenu-default-brand-hover-bg;
}
}
.navmenu-text {
color: $navmenu-default-color;
}
.navmenu-nav {
// Caret should match text color on hover
> .dropdown > a:hover .caret,
> .dropdown > a:focus .caret {
border-top-color: $navmenu-default-link-hover-color;
border-bottom-color: $navmenu-default-link-hover-color;
}
// Remove background color from open dropdown
> .open > a {
&,
&:hover,
&:focus {
background-color: $navmenu-default-link-active-bg;
color: $navmenu-default-link-active-color;
.caret {
border-top-color: $navmenu-default-link-active-color;
border-bottom-color: $navmenu-default-link-active-color;
}
}
}
> .dropdown > a .caret {
border-top-color: $navmenu-default-link-color;
border-bottom-color: $navmenu-default-link-color;
}
&.dropdown-menu {
background-color: $navmenu-default-link-active-bg;
& > .divider {
background-color: $navmenu-default-bg;
}
> .active > a {
&,
&:hover,
&:focus {
background-color: darken($navmenu-default-link-active-bg, 6.5%);
}
}
}
> li > a {
color: $navmenu-default-link-color;
&:hover,
&:focus {
color: $navmenu-default-link-hover-color;
background-color: $navmenu-default-link-hover-bg;
}
}
> .active > a {
&,
&:hover,
&:focus {
color: $navmenu-default-link-active-color;
background-color: $navmenu-default-link-active-bg;
}
}
> .disabled > a {
&,
&:hover,
&:focus {
color: $navmenu-default-link-disabled-color;
background-color: $navmenu-default-link-disabled-bg;
}
}
}
}
// Inverse navmenu
.navmenu-inverse,
.navbar-inverse .navbar-offcanvas {
background-color: $navmenu-inverse-bg;
border-color: $navmenu-inverse-border;
.navmenu-brand {
color: $navmenu-inverse-brand-color;
&:hover,
&:focus {
color: $navmenu-inverse-brand-hover-color;
background-color: $navmenu-inverse-brand-hover-bg;
}
}
.navmenu-text {
color: $navmenu-inverse-color;
}
.navmenu-nav {
// Caret should match text color on hover
> .dropdown > a:hover .caret,
> .dropdown > a:focus .caret {
border-top-color: $navmenu-inverse-link-hover-color;
border-bottom-color: $navmenu-inverse-link-hover-color;
}
// Remove background color from open dropdown
> .open > a {
&,
&:hover,
&:focus {
background-color: $navmenu-inverse-link-active-bg;
color: $navmenu-inverse-link-active-color;
.caret {
border-top-color: $navmenu-inverse-link-active-color;
border-bottom-color: $navmenu-inverse-link-active-color;
}
}
}
> .dropdown > a .caret {
border-top-color: $navmenu-inverse-link-color;
border-bottom-color: $navmenu-inverse-link-color;
}
&.dropdown-menu {
background-color: $navmenu-inverse-link-active-bg;
& > .divider {
background-color: $navmenu-inverse-bg;
}
> .active > a {
&,
&:hover,
&:focus {
background-color: darken($navmenu-inverse-link-active-bg, 6.5%);
}
}
}
> li > a {
color: $navmenu-inverse-link-color;
&:hover,
&:focus {
color: $navmenu-inverse-link-hover-color;
background-color: $navmenu-inverse-link-hover-bg;
}
}
> .active > a {
&,
&:hover,
&:focus {
color: $navmenu-inverse-link-active-color;
background-color: $navmenu-inverse-link-active-bg;
}
}
> .disabled > a {
&,
&:hover,
&:focus {
color: $navmenu-inverse-link-disabled-color;
background-color: $navmenu-inverse-link-disabled-bg;
}
}
}
}

48
scss/_offcanvas.scss Normal file
View File

@@ -0,0 +1,48 @@
// Off canvas navigation
// --------------------------------------------------
@mixin offcanvas {
display: none;
&.in {
display: block;
}
}
@media (max-width: $screen-xs-max) {
.offcanvas-xs {
@include offcanvas;
}
}
@media (max-width: $screen-sm-max) {
.offcanvas-sm {
@include offcanvas;
}
}
@media (max-width: $screen-md-max) {
.offcanvas-md {
@include offcanvas;
}
}
.offcanvas-lg {
@include offcanvas;
}
.canvas-sliding {
-webkit-transition: top 0.35s, left 0.35s, bottom 0.35s, right 0.35s;
transition: top 0.35s, left 0.35s, bottom 0.35s, right 0.35s;
}
.offcanvas-clone {
height: 0px !important;
width: 0px !important;
overflow: hidden !important;
border: none !important;
margin: 0px !important;
padding: 0px !important;
position: absolute !important;
top: auto !important;
left: auto !important;
bottom: 0px !important;
right: 0px !important;
opacity: 0 !important;
}

22
scss/_rowlink.scss Normal file
View File

@@ -0,0 +1,22 @@
// Rowlink
// --------------------------------------------------
.table.rowlink,
.table .rowlink {
td:not(.rowlink-skip) {
cursor: pointer;
a {
color: inherit;
font: inherit;
text-decoration: inherit;
}
}
}
.table-hover.rowlink,
.table-hover .rowlink {
tr:hover td {
background-color: darken($table-bg-hover, 15%);
}
}

66
scss/_variables.scss Normal file
View File

@@ -0,0 +1,66 @@
//
// Variables
//
// Either Twitter Bootstrap's "variables.less" or this package's
// "default-variables.less" should be loaded before this file.
// -------------------------------------------------------------
$zindex-navmenu-fixed: 1030 !default;
$zindex-alert-fixed: 1035 !default;
$container-smooth: $container-lg !default;
$alert-fixed-width: $screen-md-min !default;
//== Navmenu
// Basics of a navmenu
$navmenu-width: 300px !default;
$navmenu-margin-vertical: (0.5 * $line-height-computed) !default;
$navmenu-default-color: #777 !default;
$navmenu-default-bg: #f8f8f8 !default;
$navmenu-default-border: darken($navmenu-default-bg, 6.5%) !default;
// Navmenu links
$navmenu-default-link-color: #777 !default;
$navmenu-default-link-hover-color: #333 !default;
$navmenu-default-link-hover-bg: transparent !default;
$navmenu-default-link-active-color: #555 !default;
$navmenu-default-link-active-bg: darken($navmenu-default-bg, 6.5%) !default;
$navmenu-default-link-disabled-color: #ccc !default;
$navmenu-default-link-disabled-bg: transparent !default;
// Navmenu brand label
$navmenu-default-brand-color: $navmenu-default-link-color !default;
$navmenu-default-brand-hover-color: darken($navmenu-default-link-color, 10%) !default;
$navmenu-default-brand-hover-bg: transparent !default;
// Inverted navmenu
//
// Reset inverted navmenu basics
$navmenu-inverse-color: $gray-light !default;
$navmenu-inverse-bg: #222 !default;
$navmenu-inverse-border: darken($navmenu-inverse-bg, 10%) !default;
// Inverted navmenu links
$navmenu-inverse-link-color: $gray-light !default;
$navmenu-inverse-link-hover-color: #fff !default;
$navmenu-inverse-link-hover-bg: transparent !default;
$navmenu-inverse-link-active-color: $navmenu-inverse-link-hover-color !default;
$navmenu-inverse-link-active-bg: darken($navmenu-inverse-bg, 10%) !default;
$navmenu-inverse-link-disabled-color: #444 !default;
$navmenu-inverse-link-disabled-bg: transparent !default;
// Inverted navmenu brand label
$navmenu-inverse-brand-color: $navmenu-inverse-link-color !default;
$navmenu-inverse-brand-hover-color: #fff !default;
$navmenu-inverse-brand-hover-bg: transparent !default;
// Inverted navmenu search
// Normal navmenu needs no special styles or vars
$navmenu-inverse-search-bg: lighten($navmenu-inverse-bg, 25%) !default;
$navmenu-inverse-search-bg-focus: #fff !default;
$navmenu-inverse-search-border: $navmenu-inverse-bg !default;
$navmenu-inverse-search-placeholder-color: #ccc !default;

19
scss/jasny-bootstrap.scss Normal file
View File

@@ -0,0 +1,19 @@
// Twitter Bootstrap's "variables.scss" should already be imported
// Core variables and mixins
@import "variables";
@import "mixins";
// Core CSS
@import "grid-container-smooth";
@import "button-labels";
// Components
@import "nav-tab-alignment";
@import "navmenu";
@import "alerts-fixed";
// Components w/ JavaScript
@import "offcanvas";
@import "rowlink";
@import "fileinput";

File diff suppressed because one or more lines are too long