mirror of
https://github.com/jasny/bootstrap.git
synced 2026-04-24 03:00:49 -04:00
Compare commits
126 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b2f72ebb89 | ||
|
|
9b943de3f4 | ||
|
|
57ddc36d3e | ||
|
|
ade9f4826b | ||
|
|
4e27c63ca4 | ||
|
|
92f54b29d6 | ||
|
|
c3e9a12870 | ||
|
|
e9505f2909 | ||
|
|
2dc9cb4917 | ||
|
|
1684271a76 | ||
|
|
a0c9b1591d | ||
|
|
b5bd1b1714 | ||
|
|
bafef3dcd9 | ||
|
|
1c2fde09a0 | ||
|
|
71f8cbce12 | ||
|
|
20aabdde44 | ||
|
|
12c88aaa00 | ||
|
|
5779e70db7 | ||
|
|
4408405009 | ||
|
|
51f8c89ac8 | ||
|
|
61c769a626 | ||
|
|
e8b4cca929 | ||
|
|
0efdeef8d4 | ||
|
|
8a3ffced0b | ||
|
|
843c8241e7 | ||
|
|
49a7ece11e | ||
|
|
b02b71c0e6 | ||
|
|
dd49087566 | ||
|
|
95da80b103 | ||
|
|
a79b8f14d3 | ||
|
|
c8523caf13 | ||
|
|
7e5ab5d7f5 | ||
|
|
0628cee6d7 | ||
|
|
cb97fb59be | ||
|
|
ff935c396c | ||
|
|
283e237cee | ||
|
|
3e0aefdf90 | ||
|
|
f96d55965a | ||
|
|
7b28b14c80 | ||
|
|
75b0c88693 | ||
|
|
1a2bb62b5f | ||
|
|
d79f5c17bc | ||
|
|
5925040bf2 | ||
|
|
30b22685cd | ||
|
|
828bdbf4d2 | ||
|
|
f37278b371 | ||
|
|
02c281bbf0 | ||
|
|
9dc14167d1 | ||
|
|
72d948a8eb | ||
|
|
6c47ebecf6 | ||
|
|
9e1d6be08e | ||
|
|
1dc7d44daf | ||
|
|
54a950138d | ||
|
|
45fbc321e9 | ||
|
|
c5a39941e0 | ||
|
|
31c575c568 | ||
|
|
071b04b16f | ||
|
|
758d5f2a06 | ||
|
|
1d5a7589b8 | ||
|
|
ca19e02b17 | ||
|
|
b000850500 | ||
|
|
2bc3e6f3dc | ||
|
|
574034791d | ||
|
|
dded81671a | ||
|
|
473a741ede | ||
|
|
02d43b36d0 | ||
|
|
fe25e85e40 | ||
|
|
0b812a49f8 | ||
|
|
ea757e46e9 | ||
|
|
a5fd93a7e2 | ||
|
|
fb643bdb6f | ||
|
|
912f10f1cf | ||
|
|
27f6a5b3f9 | ||
|
|
c3948a744b | ||
|
|
f4705f17fc | ||
|
|
c12018a0bd | ||
|
|
1dfd002bba | ||
|
|
04e4586372 | ||
|
|
c6541bfe45 | ||
|
|
73f80614b6 | ||
|
|
1e90ae4779 | ||
|
|
a088dad1c7 | ||
|
|
2712c97e85 | ||
|
|
d7c2eb8c91 | ||
|
|
3c3274093a | ||
|
|
662c5e2b3a | ||
|
|
e86f72dd03 | ||
|
|
46c665f161 | ||
|
|
9fd67af87c | ||
|
|
10b81be776 | ||
|
|
e822b1b3bf | ||
|
|
285689081d | ||
|
|
1001ad214d | ||
|
|
249cb84f6b | ||
|
|
660e376b96 | ||
|
|
e919330916 | ||
|
|
24f8bffbaf | ||
|
|
e5b9930599 | ||
|
|
8fd9aca993 | ||
|
|
0038dd8c9f | ||
|
|
27794ba4e3 | ||
|
|
9e28a9b2bc | ||
|
|
18116c5cd3 | ||
|
|
2336197e3a | ||
|
|
ee5a80a6c3 | ||
|
|
4dc46204b4 | ||
|
|
d5d4c5bd62 | ||
|
|
626d773366 | ||
|
|
a8a87b1958 | ||
|
|
3769a8a8fc | ||
|
|
1640650604 | ||
|
|
4c53740597 | ||
|
|
ca1145ca0b | ||
|
|
d87bea51c2 | ||
|
|
e9a6df2cbd | ||
|
|
90b09cb3f8 | ||
|
|
ec797fb799 | ||
|
|
36613f1655 | ||
|
|
2ac056ab82 | ||
|
|
523965b3d5 | ||
|
|
59aef49163 | ||
|
|
ac9e37fc64 | ||
|
|
00a5a2d55b | ||
|
|
9b5357120e | ||
|
|
a43e720494 | ||
|
|
32a5370467 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -38,4 +38,5 @@ validation-status.json
|
||||
validation-report.json
|
||||
|
||||
# Folders to ignore
|
||||
bower_components
|
||||
node_modules
|
||||
|
||||
19
.travis.yml
19
.travis.yml
@@ -2,27 +2,16 @@ language: node_js
|
||||
node_js:
|
||||
- "0.10"
|
||||
before_install:
|
||||
- time sudo pip install --use-mirrors -r test-infra/requirements.txt
|
||||
- sudo pip install --use-mirrors -r test-infra/requirements.txt
|
||||
- rvm use 1.9.3 --fuzzy
|
||||
- if [ "$TWBS_TEST" = validate-html ]; then echo "ruby=$(basename $(rvm gemdir)) jekyll=$JEKYLL_VERSION" > pseudo_Gemfile.lock; fi
|
||||
install:
|
||||
- time npm install -g grunt-cli
|
||||
- time ./test-infra/s3_cache.py download 'npm packages' test-infra/npm-shrinkwrap.canonical.json ./node_modules || time ./test-infra/uncached-npm-install.sh
|
||||
- if [ "$TWBS_TEST" = validate-html ]; then time ./test-infra/s3_cache.py download rubygems pseudo_Gemfile.lock $(rvm gemdir) || gem install -N jekyll -v $JEKYLL_VERSION; fi
|
||||
after_script:
|
||||
- if [ "$TWBS_TEST" = core ]; then time ./test-infra/s3_cache.py upload 'npm packages' test-infra/npm-shrinkwrap.canonical.json ./node_modules; fi
|
||||
- if [ "$TWBS_TEST" = validate-html ]; then time ./test-infra/s3_cache.py upload rubygems pseudo_Gemfile.lock $(rvm gemdir); fi
|
||||
- npm install -g grunt-cli
|
||||
- npm install
|
||||
env:
|
||||
global:
|
||||
- JEKYLL_VERSION: 1.4.1
|
||||
- SAUCE_USERNAME: bootstrap
|
||||
- secure: "pJkBwnuae9dKU5tEcCqccfS1QQw7/meEcfz63fM7ba7QJNjoA6BaXj08L5Z3Vb5vBmVPwBawxo5Hp0jC0r/Z/O0hGnAmz/Cz09L+cy7dSAZ9x4hvZePSja/UAusaB5ogMoO8l2b773MzgQeSmrLbExr9BWLeqEfjC2hFgdgHLaQ="
|
||||
- secure: "gqjqISbxBJK6byFbsmr1AyP1qoWH+rap06A2gI7v72+Tn2PU2nYkIMUkCvhZw6K889jv+LhQ/ybcBxDOXHpNCExCnSgB4dcnmYp+9oeNZb37jSP0rQ+Ib4OTLjzc3/FawE/fUq5kukZTC7porzc/k0qJNLAZRx3YLALmK1GIdUY="
|
||||
- secure: "Gghh/e3Gsbj1+4RR9Lh2aR/xJl35HWiHqlPIeSUqE9D7uDCVTAwNce/dGL3Ew7uJPfJ6Pgr70wD3zgu3stw0Zmzayax0hiDtGwcQCxVIER08wqGANK9C2Q7PYJkNTNtiTo6ehKWbdV4Z+/U+TEYyQfpQTDbAFYk/vVpsdjp0Lmc="
|
||||
- secure: "RTbRdx4G/2OTLfrZtP1VbRljxEmd6A1F3GqXboeQTldsnAlwpsES65es5CE3ub/rmixLApOY9ot7OPmNixFgC2Y8xOsV7lNCC62QVpmqQEDyGFFQKb3yO6/dmwQxdsCqGfzf9Np6Wh5V22QFvr50ZLKLd7Uhd9oXMDIk/z1MJ3o="
|
||||
matrix:
|
||||
- TWBS_TEST=core
|
||||
- TWBS_TEST=validate-html
|
||||
- TWBS_TEST=sauce-js-unit
|
||||
matrix:
|
||||
fast_finish: true
|
||||
|
||||
|
||||
46
Gruntfile.js
46
Gruntfile.js
@@ -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) {
|
||||
@@ -64,7 +64,7 @@ module.exports = function (grunt) {
|
||||
|
||||
jscs: {
|
||||
options: {
|
||||
config: 'js/.jscs.json',
|
||||
config: 'js/.jscsrc'
|
||||
},
|
||||
grunt: {
|
||||
src: ['Gruntfile.js', 'grunt/*.js']
|
||||
@@ -98,6 +98,7 @@ module.exports = function (grunt) {
|
||||
},
|
||||
bootstrap: {
|
||||
src: [
|
||||
'js/transition.js',
|
||||
'js/offcanvas.js',
|
||||
'js/rowlink.js',
|
||||
'js/inputmask.js',
|
||||
@@ -255,9 +256,9 @@ module.exports = function (grunt) {
|
||||
pretty: true,
|
||||
data: function () {
|
||||
var filePath = path.join(__dirname, 'less/build/variables.less');
|
||||
var fileContent = fs.readFileSync(filePath, {encoding: 'utf8'});
|
||||
var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' });
|
||||
var parser = new BsLessdocParser(fileContent);
|
||||
return {sections: parser.parseFile()};
|
||||
return { sections: parser.parseFile() };
|
||||
}
|
||||
},
|
||||
files: {
|
||||
@@ -275,7 +276,9 @@ module.exports = function (grunt) {
|
||||
reset: true,
|
||||
relaxerror: [
|
||||
'Bad value X-UA-Compatible for attribute http-equiv on element meta.',
|
||||
'Element img is missing required attribute src.'
|
||||
'Element img is missing required attribute src.',
|
||||
'This interface to HTML5 document checking is deprecated.',
|
||||
'\\& did not start a character reference. \\(\\& probably should have been escaped as \\&.\\)'
|
||||
]
|
||||
},
|
||||
files: {
|
||||
@@ -298,14 +301,16 @@ 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')
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
@@ -332,7 +337,7 @@ module.exports = function (grunt) {
|
||||
|
||||
|
||||
// These plugins provide necessary tasks.
|
||||
require('load-grunt-tasks')(grunt, {scope: 'devDependencies'});
|
||||
require('load-grunt-tasks')(grunt, { scope: 'devDependencies' });
|
||||
|
||||
// Docs HTML validation task
|
||||
grunt.registerTask('validate-html', ['jekyll', 'validation']);
|
||||
@@ -371,10 +376,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 +393,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); });
|
||||
};
|
||||
|
||||
80
README.md
80
README.md
@@ -1,6 +1,6 @@
|
||||
# [Jasny Bootstrap](http://jasny.github.io/bootstrap/) [](http://travis-ci.org/jasny/bootstrap)[](https://david-dm.org/jasny/bootstrap#info=devDependencies)
|
||||
# [Jasny Bootstrap](http://jasny.github.io/bootstrap/)  [](http://travis-ci.org/jasny/bootstrap) [](https://gitter.im/jasny/bootstrap?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
Jasny Bootstrap is a fork of the famous [Twitter Bootstrap](http://getbootstrap.com/) with added components.
|
||||
Jasny Bootstrap is an extension of the famous [Bootstrap](http://getbootstrap.com/), adding the following components:
|
||||
|
||||
* [Button labels](http://jasny.github.io/bootstrap/css/#buttons-labels)
|
||||
* [Off canvas navmenu](http://jasny.github.io/bootstrap/components/#navmenu)
|
||||
@@ -14,11 +14,13 @@ To get started, check out <http://jasny.github.io/bootstrap>!
|
||||
|
||||
## Quick start
|
||||
|
||||
Three quick start options are available:
|
||||
Four quick start options are available:
|
||||
|
||||
* [Download the latest release](https://github.com/jasny/bootstrap/releases/tag/v3.0.0-p7).
|
||||
* [Download the latest release](https://github.com/jasny/bootstrap/releases/download/v3.1.3/jasny-bootstrap-3.1.3-dist.zip).
|
||||
* Clone the repo: `git clone git://github.com/jasny/bootstrap.git`.
|
||||
* Install with [Bower](http://bower.io): `bower install bootstrap=jasny/bootstrap`. To install Jasny Bootstrap next to Twitter Bootstrap use `bower install jasny-bootstrap=jasny/bootstrap`.
|
||||
* Install with [Bower](http://bower.io): `bower install jasny-bootstrap`.
|
||||
* Use [cdnjs](http://cdnjs.com/libraries/jasny-bootstrap).
|
||||
* Install with [Meteor](https://meteor.com): `meteor add jasny:bootstrap`.
|
||||
|
||||
Read the [Getting Started page](http://jasny.github.io/bootstrap/getting-started/) for information on the framework contents, templates and examples, and more.
|
||||
|
||||
@@ -27,28 +29,7 @@ Read the [Getting Started page](http://jasny.github.io/bootstrap/getting-started
|
||||
Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this:
|
||||
|
||||
```
|
||||
bootstrap/
|
||||
├── css/
|
||||
│ ├── bootstrap.css
|
||||
│ ├── bootstrap.min.css
|
||||
│ ├── bootstrap-theme.css
|
||||
│ └── bootstrap-theme.min.css
|
||||
├── js/
|
||||
│ ├── bootstrap.js
|
||||
│ └── bootstrap.min.js
|
||||
└── fonts/
|
||||
├── glyphicons-halflings-regular.eot
|
||||
├── glyphicons-halflings-regular.svg
|
||||
├── glyphicons-halflings-regular.ttf
|
||||
└── glyphicons-halflings-regular.woff
|
||||
```
|
||||
|
||||
We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). Fonts from Glyphicons are included, as is the optional Bootstrap theme.
|
||||
|
||||
Alternatively you can extend Twitter Bootstrap by downloading <code>jasny-bootstrap.*</code> files from the extension package, in conjunction with the original Twitter Bootstrap files or a custom build of Bootstrap. The structure of (the compiled) Jasny Bootstrap extension package is:
|
||||
|
||||
```
|
||||
extend/
|
||||
jasny-bootstrap/
|
||||
├── css/
|
||||
│ ├── jasny-bootstrap.css
|
||||
│ ├── jasny-bootstrap.min.css
|
||||
@@ -57,17 +38,22 @@ extend/
|
||||
└── jasny-bootstrap.min.js
|
||||
```
|
||||
|
||||
We provide compiled CSS and JS (`jasny-bootstrap.*`), as well as compiled and minified CSS and JS (`jasny-bootstrap.min.*`).
|
||||
|
||||
Jasny Bootstrap should be loaded after vanilla Bootstrap.
|
||||
|
||||
|
||||
## Bugs and feature requests
|
||||
|
||||
Have a bug or a feature request? [Please open a new issue](https://github.com/jasny/bootstrap/issues). Before opening any issue, please search for existing issues and read the [Issue Guidelines](https://github.com/necolas/issue-guidelines), written by [Nicolas Gallagher](https://github.com/necolas/).
|
||||
|
||||
You may use [this JS Bin](http://jsbin.com/iKumuWo/1/edit) as a template for your bug reports.
|
||||
You may use [this JSFiddle](http://jsfiddle.net/jasny/k9K5d/) as a template for your bug reports.
|
||||
|
||||
|
||||
|
||||
## Documentation
|
||||
|
||||
Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at <http://jasny.github.io/bootstrap>. The docs may also be run locally.
|
||||
Jasny Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at <http://jasny.github.io/bootstrap>. The docs may also be run locally.
|
||||
|
||||
### Running documentation locally
|
||||
|
||||
@@ -80,7 +66,7 @@ Learn more about using Jekyll by reading its [documentation](http://jekyllrb.com
|
||||
|
||||
### Documentation for previous releases
|
||||
|
||||
Documentation for v2.3.2 has been made available for the time being at <http://jasny.github.io/bootstrap/2.3.2/> while folks transition to Bootstrap 3.
|
||||
Documentation for v2.3.1 has been made available for the time being at <http://jasny.github.io/bootstrap/2.3.1/> while folks transition to Bootstrap 3.
|
||||
|
||||
[Previous releases](https://github.com/jasny/bootstrap/releases) and their documentation are also available for download.
|
||||
|
||||
@@ -123,15 +109,12 @@ Should you encounter problems with installing dependencies or running Grunt comm
|
||||
|
||||
## Contributing
|
||||
|
||||
Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
|
||||
Please read through our [contributing guidelines](https://github.com/jasny/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
|
||||
|
||||
More over, if your pull request contains JavaScript patches or features, you must include relevant unit tests. All HTML and CSS should conform to the [Code Guide](http://github.com/mdo/code-guide), maintained by [Mark Otto](http://github.com/mdo).
|
||||
|
||||
Editor preferences are available in the [editor config](.editorconfig) for easy use in common text editors. Read more and download plugins at <http://editorconfig.org>.
|
||||
|
||||
With v3.1, we're moving from the Apache 2 to the MIT license for the Bootstrap code (not the docs). Please see the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md) for more information.
|
||||
|
||||
|
||||
## Community
|
||||
|
||||
Keep track of development and community news.
|
||||
@@ -141,28 +124,28 @@ Keep track of development and community news.
|
||||
|
||||
|
||||
|
||||
|
||||
## Versioning
|
||||
|
||||
Jasny Bootstrap follows the version of Twitter Bootstrap added with a custom patch number.
|
||||
For transparency into our release cycle and in striving to maintain backward compatibility, Jasny Bootstrap is maintained under the Semantic Versioning guidelines. Sometimes we screw up, but we'll adhere to these rules whenever possible.
|
||||
|
||||
`<major>.<minor>.<patch>-p<jasny patch>`
|
||||
Releases will be numbered with the following format:
|
||||
|
||||
`<major>.<minor>.<patch>`
|
||||
|
||||
And constructed with the following guidelines:
|
||||
|
||||
- Breaking backward compatibility **bumps the major** while resetting minor and patch
|
||||
- New additions without breaking backward compatibility **bumps the minor** while resetting the patch
|
||||
- Bug fixes and misc changes **bumps only the patch**
|
||||
|
||||
For more information on SemVer, please visit <http://semver.org/>.
|
||||
|
||||
__The major version will follow Bootstrap's major version. This means backward compatibility will only be broken if Bootstrap does so.__
|
||||
|
||||
Backwards compatibility is only broken if Twitter Bootstrap also does so, in which case the major is incremented.
|
||||
|
||||
|
||||
## Authors
|
||||
|
||||
**Mark Otto**
|
||||
|
||||
+ <http://twitter.com/mdo>
|
||||
+ <http://github.com/mdo>
|
||||
|
||||
**Jacob Thornton**
|
||||
|
||||
+ <http://twitter.com/fat>
|
||||
+ <http://github.com/fat>
|
||||
|
||||
**Arnold Daniels**
|
||||
|
||||
+ [http://twitter.com/ArnoldDaniels](http://twitter.com/ArnoldDaniels)
|
||||
@@ -172,5 +155,4 @@ Backwards compatibility is only broken if Twitter Bootstrap also does so, in whi
|
||||
|
||||
## Copyright and license
|
||||
|
||||
Copyright 2013 Twitter, Inc under [the Apache 2.0 license](LICENSE).
|
||||
Copyright 2013 Jasny BV under [the Apache 2.0 license](LICENSE).
|
||||
|
||||
10
_config.yml
10
_config.yml
@@ -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/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
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"name": "jasny-bootstrap",
|
||||
"version": "3.1.0",
|
||||
"main": [
|
||||
"./dist/css/jasny-bootstrap.css",
|
||||
"./dist/js/jasny-bootstrap.js"
|
||||
@@ -14,8 +13,8 @@
|
||||
"docs",
|
||||
"js/tests"
|
||||
],
|
||||
"dependencies": {
|
||||
"jquery": ">= 1.9.0",
|
||||
"bootstrap": ">= 3.0.0"
|
||||
"dependencies": { },
|
||||
"devDependencies": {
|
||||
"bootstrap": ">= 3.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,32 @@
|
||||
{
|
||||
"name": "jasny/bootstrap"
|
||||
, "description": "The missing bootstrap components"
|
||||
, "keywords": ["bootstrap", "css"]
|
||||
, "homepage": "http://jasny.github.io/bootstrap"
|
||||
, "authors": [
|
||||
"name": "jasny/bootstrap",
|
||||
"description": "The missing bootstrap components",
|
||||
"type": "component",
|
||||
"keywords": ["bootstrap", "css"],
|
||||
"homepage": "http://jasny.github.io/bootstrap",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Arnold Daniels",
|
||||
"email": "arnold@jasny.net"
|
||||
}
|
||||
]
|
||||
, "support": {
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/jasny/bootstrap/issues"
|
||||
}
|
||||
, "license": "Apache-2.0"
|
||||
, "require": {
|
||||
"twitter/bootstrap" : ">=3.0.0"
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"require": {
|
||||
"twbs/bootstrap" : ">=3.1.0"
|
||||
},
|
||||
"extra": {
|
||||
"component": {
|
||||
"scripts": [
|
||||
"dist/js/jasny-bootstrap.js",
|
||||
"dist/js/jasny-bootstrap.min.js"
|
||||
],
|
||||
"styles": [
|
||||
"dist/css/jasny-bootstrap.css",
|
||||
"dist/css/jasny-bootstrap.min.css"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
43
dist/css/jasny-bootstrap.css
vendored
43
dist/css/jasny-bootstrap.css
vendored
@@ -1,12 +1,15 @@
|
||||
/*!
|
||||
* Jasny Bootstrap v3.1.0 (http://jasny.github.io/bootstrap)
|
||||
* Copyright 2012-2014 Arnold Daniels
|
||||
* Jasny Bootstrap v3.1.3 (http://jasny.github.io/bootstrap)
|
||||
* Copyright 2012-2015 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 {
|
||||
@@ -57,6 +60,11 @@
|
||||
left: auto;
|
||||
border-radius: 0 2px 2px 0;
|
||||
}
|
||||
.btn-group > .btn:last-child:not(:first-child) .btn-label,
|
||||
.btn-group > .dropdown-toggle:not(:first-child) .btn-label {
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
.nav-tabs-bottom {
|
||||
border-top: 1px solid #ddd;
|
||||
border-bottom: 0;
|
||||
@@ -137,7 +145,7 @@
|
||||
.navmenu,
|
||||
.navbar-offcanvas {
|
||||
width: 300px;
|
||||
height: 100%;
|
||||
height: auto;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-radius: 4px;
|
||||
@@ -147,16 +155,21 @@
|
||||
.navbar-offcanvas {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
z-index: 1030;
|
||||
bottom: 0;
|
||||
z-index: 1050;
|
||||
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 +528,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 +578,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;
|
||||
}
|
||||
|
||||
2
dist/css/jasny-bootstrap.css.map
vendored
2
dist/css/jasny-bootstrap.css.map
vendored
File diff suppressed because one or more lines are too long
6
dist/css/jasny-bootstrap.min.css
vendored
6
dist/css/jasny-bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
305
dist/js/jasny-bootstrap.js
vendored
305
dist/js/jasny-bootstrap.js
vendored
@@ -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,12 +7,61 @@
|
||||
if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScript requires jQuery') }
|
||||
|
||||
/* ========================================================================
|
||||
* Bootstrap: offcanvas.js v3.0.3-p7
|
||||
* http://jasny.github.io/bootstrap/javascript.html#offcanvas
|
||||
*
|
||||
* Based on Boostrap collapse.js by Twitter, Inc.
|
||||
* Bootstrap: transition.js v3.1.3
|
||||
* http://getbootstrap.com/javascript/#transitions
|
||||
* ========================================================================
|
||||
* Copyright 2013 Jasny, BV.
|
||||
* 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
|
||||
* ========================================================================
|
||||
* Copyright 2013-2014 Arnold Daniels
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License")
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -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,24 @@ 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,
|
||||
modal: false
|
||||
}
|
||||
|
||||
OffCanvas.prototype.offset = function () {
|
||||
switch (this.options.placement) {
|
||||
switch (this.placement) {
|
||||
case 'left':
|
||||
case 'right': return this.$element.outerWidth()
|
||||
case 'top':
|
||||
@@ -65,26 +122,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 +176,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 +198,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) {
|
||||
@@ -149,6 +213,14 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
|
||||
$('body').css(prop, padding)
|
||||
}, 1)
|
||||
}
|
||||
//disable scrolling on mobiles (they ignore overflow:hidden)
|
||||
$('body').on('touchmove.bs', function(e) {
|
||||
e.preventDefault();
|
||||
});
|
||||
}
|
||||
|
||||
OffCanvas.prototype.enableScrolling = function() {
|
||||
$('body').off('touchmove.bs');
|
||||
}
|
||||
|
||||
OffCanvas.prototype.show = function () {
|
||||
@@ -158,17 +230,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 +253,12 @@ 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()
|
||||
if (this.options.modal) this.toggleBackdrop()
|
||||
|
||||
var complete = function () {
|
||||
if (this.state != 'slide-in') return
|
||||
|
||||
this.state = 'slid'
|
||||
|
||||
elements.removeClass('canvas-sliding').addClass('canvas-slid')
|
||||
@@ -200,24 +278,31 @@ 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')
|
||||
})
|
||||
|
||||
this.$element.trigger('hidden.bs.offcanvas')
|
||||
}
|
||||
|
||||
if (this.options.disableScrolling) this.enableScrolling()
|
||||
if (this.options.modal) this.toggleBackdrop()
|
||||
|
||||
elements.removeClass('canvas-slid').addClass('canvas-sliding')
|
||||
|
||||
setTimeout($.proxy(function() {
|
||||
@@ -226,10 +311,49 @@ 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']()
|
||||
}
|
||||
|
||||
OffCanvas.prototype.toggleBackdrop = function (callback) {
|
||||
callback = callback || $.noop;
|
||||
if (this.state == 'slide-in') {
|
||||
var doAnimate = $.support.transition;
|
||||
|
||||
this.$backdrop = $('<div class="modal-backdrop fade" />')
|
||||
.insertAfter(this.$element);
|
||||
|
||||
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
|
||||
|
||||
this.$backdrop.addClass('in')
|
||||
|
||||
doAnimate ?
|
||||
this.$backdrop
|
||||
.one($.support.transition.end, callback)
|
||||
.emulateTransitionEnd(150) :
|
||||
callback()
|
||||
} else if (this.state == 'slide-out' && this.$backdrop) {
|
||||
this.$backdrop.removeClass('in');
|
||||
$('body').off('touchmove.bs');
|
||||
var self = this;
|
||||
if ($.support.transition) {
|
||||
this.$backdrop
|
||||
.one($.support.transition.end, function() {
|
||||
self.$backdrop.remove();
|
||||
callback()
|
||||
self.$backdrop = null;
|
||||
})
|
||||
.emulateTransitionEnd(150);
|
||||
} else {
|
||||
this.$backdrop.remove();
|
||||
this.$backdrop = null;
|
||||
callback();
|
||||
}
|
||||
} else if (callback) {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
|
||||
OffCanvas.prototype.calcClone = function() {
|
||||
this.$calcClone = this.$element.clone()
|
||||
.html('')
|
||||
@@ -238,17 +362,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 +389,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,10 +429,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
|
||||
}(window.jQuery);
|
||||
|
||||
/* ============================================================
|
||||
* Bootstrap: rowlink.js v3.0.0-p7
|
||||
* http://jasny.github.io/bootstrap/javascript.html#rowlink
|
||||
* Bootstrap: rowlink.js v3.1.3
|
||||
* http://jasny.github.io/bootstrap/javascript/#rowlink
|
||||
* ============================================================
|
||||
* Copyright 2012 Jasny BV, Netherlands.
|
||||
* Copyright 2012-2014 Arnold Daniels
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -359,8 +484,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 +505,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')
|
||||
})
|
||||
@@ -389,11 +516,12 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
|
||||
}(window.jQuery);
|
||||
|
||||
/* ===========================================================
|
||||
* Bootstrap: inputmask.js v3.0.0-p7
|
||||
* http://jasny.github.io/bootstrap/javascript.html#inputmask
|
||||
* Bootstrap: inputmask.js v3.1.0
|
||||
* http://jasny.github.io/bootstrap/javascript/#inputmask
|
||||
*
|
||||
* Based on Masked Input plugin by Josh Bush (digitalbush.com)
|
||||
* ===========================================================
|
||||
* Copyright 2012 Jasny BV, Netherlands.
|
||||
* Copyright 2012-2014 Arnold Daniels
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License")
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -421,7 +549,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()
|
||||
@@ -430,13 +558,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]",
|
||||
'*': "."
|
||||
}
|
||||
}
|
||||
@@ -478,7 +606,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
|
||||
Inputmask.prototype.listen = function() {
|
||||
if (this.$element.attr("readonly")) return
|
||||
|
||||
var pasteEventName = (isIE ? 'paste' : 'input') + ".mask"
|
||||
var pasteEventName = (isIE ? 'paste' : 'input') + ".bs.inputmask"
|
||||
|
||||
this.$element
|
||||
.on("unmask.bs.inputmask", $.proxy(this.unmask, this))
|
||||
@@ -574,8 +702,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
|
||||
|
||||
Inputmask.prototype.unmask = function() {
|
||||
this.$element
|
||||
.unbind(".mask")
|
||||
.removeData("inputmask")
|
||||
.unbind(".bs.inputmask")
|
||||
.removeData("bs.inputmask")
|
||||
}
|
||||
|
||||
Inputmask.prototype.focusEvent = function() {
|
||||
@@ -598,8 +726,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Jasny Bootstrap\'s JavaScr
|
||||
|
||||
Inputmask.prototype.blurEvent = function() {
|
||||
this.checkVal()
|
||||
if (this.$element.val() !== this.focusText)
|
||||
if (this.$element.val() !== this.focusText) {
|
||||
this.$element.trigger('change')
|
||||
this.$element.trigger('input')
|
||||
}
|
||||
}
|
||||
|
||||
Inputmask.prototype.keydownEvent = function(e) {
|
||||
@@ -719,9 +849,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)))
|
||||
})
|
||||
}
|
||||
|
||||
@@ -742,17 +872,17 @@ 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 Jasny BV, Netherlands.
|
||||
* Copyright 2012-2014 Arnold Daniels
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License")
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -784,14 +914,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(),
|
||||
@@ -810,24 +941,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)
|
||||
|
||||
@@ -837,7 +974,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)
|
||||
@@ -872,14 +1009,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)
|
||||
@@ -905,8 +1042,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]()
|
||||
})
|
||||
}
|
||||
@@ -928,7 +1065,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"]');
|
||||
|
||||
4
dist/js/jasny-bootstrap.min.js
vendored
4
dist/js/jasny-bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
||||
<div id="aboutme-container">
|
||||
<!-- <div id="aboutme-container">
|
||||
<a href="mailto:arnold@jasny.net" class="aboutme">
|
||||
<img class="img-circle" src="http://0.gravatar.com/avatar/0bba82e8b2a9d2cf9645cb07ea54766f?s=100&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&r=G" alt="Arnold Daniels">
|
||||
<div class="aboutme-text">
|
||||
@@ -7,4 +7,10 @@
|
||||
<span class="aboutme-name">- Arnold Daniels</span>
|
||||
</div>
|
||||
</a>
|
||||
</div> -->
|
||||
|
||||
|
||||
<div id="carbonads-container">
|
||||
<script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=jansy" id="_carbonads_js"></script>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
|
||||
<script src="{{ page.base_url }}dist/js/jasny-bootstrap.min.js"></script>
|
||||
|
||||
<script src="http://platform.twitter.com/widgets.js"></script>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
</title>
|
||||
|
||||
<!-- Bootstrap core CSS -->
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="{{ page.base_url }}dist/css/jasny-bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Documentation extras -->
|
||||
@@ -41,3 +41,14 @@
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
/* <![CDATA[ */
|
||||
(function() {
|
||||
var s = document.createElement('script'), t = document.getElementsByTagName('script')[0];
|
||||
s.type = 'text/javascript';
|
||||
s.async = true;
|
||||
s.src = 'http://api.flattr.com/js/0.6/load.js?mode=auto';
|
||||
t.parentNode.insertBefore(s, t);
|
||||
})();
|
||||
/* ]]> */</script>
|
||||
|
||||
@@ -12,5 +12,8 @@
|
||||
<li class="tweet-btn">
|
||||
<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://jasny.github.io/bootstrap" data-count="horizontal" data-via="ArnoldDaniels">Tweet</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="FlattrButton" style="display:none;" rev="flattr;button:compact;" href="http://github.com/jasny/bootstrap">Flattr</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
<div class="container">
|
||||
{% include social-buttons.html %}
|
||||
|
||||
<p>Jasny Bootstrap is a fork of <a href="http://getbootstrap.com/" target="_blank">Twitter Bootstrap</a>. This fork is developed and maintained by <a href="http://twitter.com/ArnoldDaniels" target="_blank">Arnold Daniels</a>.</p>
|
||||
<p>Jasny Bootstrap is a fork of <a href="http://getbootstrap.com/" target="_blank">vanilla Bootstrap</a>. This fork is developed and maintained by <a href="http://twitter.com/ArnoldDaniels" target="_blank">Arnold Daniels</a>.</p>
|
||||
<p>Code licensed under <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>, documentation under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
|
||||
<ul class="footer-links">
|
||||
<li>Currently v{{ site.current_version }}</li>
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
*
|
||||
* Update the basics of our documents to prep for docs content.
|
||||
*/
|
||||
html {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
position: relative; /* For scrollyspy */
|
||||
@@ -193,12 +196,12 @@ span.hidden-sm {
|
||||
.bs-social-buttons li {
|
||||
display: inline-block;
|
||||
line-height: 1;
|
||||
padding: 5px 8px;
|
||||
padding: 5px 8px 5px 0;
|
||||
}
|
||||
.bs-social-buttons .twitter-follow-button {
|
||||
width: 225px !important;
|
||||
.bs-social-buttons .follow-btn {
|
||||
width: 240px !important;
|
||||
}
|
||||
.bs-social-buttons .twitter-share-button {
|
||||
.bs-social-buttons .tweet-btn {
|
||||
width: 98px !important;
|
||||
}
|
||||
/* Style the GitHub buttons via CSS instead of inline attributes */
|
||||
@@ -231,6 +234,8 @@ span.hidden-sm {
|
||||
background-image: url(../img/bg-1920x1200.jpg);
|
||||
}
|
||||
@media (min-width: 1921px), (min-height: 1201px) {
|
||||
.bs-docs-nav,
|
||||
.bs-docs-home,
|
||||
.bs-header {
|
||||
background-image: url(../img/bg-3500x2500.jpg);
|
||||
}
|
||||
@@ -351,6 +356,99 @@ span.hidden-sm {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Carbon ads
|
||||
*
|
||||
* Single display ad that shows on all pages (except homepage) in page headers.
|
||||
* The hella `!important` is required for any pre-set property.
|
||||
*/
|
||||
|
||||
#carbonads {
|
||||
width: auto !important;
|
||||
margin: 50px -30px -40px !important;
|
||||
padding: 20px !important;
|
||||
overflow: hidden; /* clearfix */
|
||||
height: auto !important;
|
||||
font-size: 13px !important;
|
||||
line-height: 16px !important;
|
||||
text-align: left;
|
||||
background: #63303A !important;
|
||||
background: rgba(255, 255, 255, 0.15) !important;
|
||||
box-shadow: inset 0 3px 5px rgba(0,0,0,.075);
|
||||
border: 0 !important;
|
||||
}
|
||||
.carbon-img {
|
||||
margin: 0 !important;
|
||||
float: left;
|
||||
}
|
||||
.carbon-text {
|
||||
float: none !important;
|
||||
display: block !important;
|
||||
width: auto !important;
|
||||
height: auto !important;
|
||||
margin-left: 145px !important;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important;
|
||||
padding-top: 0 !important;
|
||||
color: #eee !important;
|
||||
}
|
||||
.carbon-poweredby {
|
||||
color: #ceb6b8 !important;
|
||||
margin-left: 145px;
|
||||
display: block;
|
||||
margin-top: 10px;
|
||||
font-size: 0.85em;
|
||||
}
|
||||
#carbonads a:hover {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
#carbonads {
|
||||
margin: 0 !important;
|
||||
border-radius: 4px;
|
||||
box-shadow: inset 0 3px 5px rgba(0,0,0,.075), 0 1px 0 rgba(255,255,255,.1);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) {
|
||||
#carbonads {
|
||||
position: absolute;
|
||||
top: 20px !important;
|
||||
right: 15px !important; /* 15px instead of 0 since box-sizing */
|
||||
width: 330px !important;
|
||||
padding: 15px !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Homepage variations */
|
||||
.bs-docs-home #carbonads {
|
||||
margin: 0 -15px 40px !important;
|
||||
}
|
||||
@media (min-width: 480px) {
|
||||
.bs-docs-home #carbonads {
|
||||
width: 330px !important;
|
||||
margin: 0 auto 40px !important;
|
||||
border-radius: 4px;
|
||||
}
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
.bs-docs-home #carbonads {
|
||||
float: left;
|
||||
width: 330px !important;
|
||||
margin: 0 0 30px !important;
|
||||
}
|
||||
}
|
||||
@media (min-width: 992px) {
|
||||
.bs-docs-home #carbonads {
|
||||
position: static;
|
||||
}
|
||||
}
|
||||
@media (min-width: 1170px) {
|
||||
.bs-docs-home #carbonads {
|
||||
margin-top: -25px !important;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* About me
|
||||
*
|
||||
|
||||
2
docs/assets/css/docs.min.css
vendored
2
docs/assets/css/docs.min.css
vendored
File diff suppressed because one or more lines are too long
8
docs/assets/js/customize.min.js
vendored
8
docs/assets/js/customize.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -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)
|
||||
|
||||
6
docs/assets/js/raw-files.min.js
vendored
6
docs/assets/js/raw-files.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -173,12 +173,12 @@ base_url: "../"
|
||||
<p>Add <code>.alert-fixed-top</code> top stick the alert on top of your page. Use <code>.alert-fixed-bottom</code> for the bottom.</p>
|
||||
<div class="bs-example">
|
||||
<div class="alert alert-success alert-fixed-top">
|
||||
<strong>Success!</strong> Your action has been completed succefully.
|
||||
<strong>Success!</strong> Your action has been completed successfully.
|
||||
</div>
|
||||
</div>
|
||||
{% highlight html %}
|
||||
<div class="alert alert-success alert-fixed-top">
|
||||
<strong>Success!</strong> Your action has been completed succefully.
|
||||
<strong>Success!</strong> Your action has been completed successfully.
|
||||
</div>
|
||||
{% endhighlight %}
|
||||
|
||||
|
||||
@@ -79,8 +79,8 @@ base_url: "../"
|
||||
</div><!-- /.row -->
|
||||
|
||||
<div class="bs-callout bs-callout-danger">
|
||||
<h4>Twitter Bootstrap required</h4>
|
||||
<p>Jasny Bootstrap requires <a href="http://getbootstrap.com/" target="_blank">Twitter Bootstrap</a> to be included.</p>
|
||||
<h4>Vanilla Bootstrap required</h4>
|
||||
<p>Jasny Bootstrap requires <a href="http://getbootstrap.com/" target="_blank">vanilla Bootstrap</a> to be included.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
2
docs/dist/css/jasny-bootstrap.css.map
vendored
2
docs/dist/css/jasny-bootstrap.css.map
vendored
File diff suppressed because one or more lines are too long
4
docs/dist/css/jasny-bootstrap.min.css
vendored
4
docs/dist/css/jasny-bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
4
docs/dist/js/jasny-bootstrap.min.js
vendored
4
docs/dist/js/jasny-bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -11,7 +11,7 @@
|
||||
<title>Navbar Template for Bootstrap</title>
|
||||
|
||||
<!-- Bootstrap core CSS -->
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../../dist/css/jasny-bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom styles for this template -->
|
||||
@@ -44,9 +44,10 @@
|
||||
<div class="navbar-offcanvas offcanvas">
|
||||
<a class="navmenu-brand" href="#">Project name</a>
|
||||
<ul class="nav navbar-nav">
|
||||
<li class="active"><a href="#">Link</a></li>
|
||||
<li><a href="#">Link</a></li>
|
||||
<li><a href="#">Link</a></li>
|
||||
<li><a href="../navmenu/">Slide in</a></li>
|
||||
<li><a href="../navmenu-push/">Push</a></li>
|
||||
<li><a href="../navmenu-reveal">Reveal</a></li>
|
||||
<li class="active"><a href="./">Off canvas navbar</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
@@ -68,6 +69,11 @@
|
||||
<h1>Offcanvas Navbar example</h1>
|
||||
<p>This example demonstrates using the offcanvas plugin with the navbar.</p>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
By default the navbar is show on the right side of the screen. You can show it on the left side instead by
|
||||
adding <code>.navmenu-fixed-left</code> to the <code>.navbar-offcanvas</code>.
|
||||
</p>
|
||||
</div> <!-- /container -->
|
||||
|
||||
|
||||
@@ -75,7 +81,7 @@
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
|
||||
<script src="../../dist/js/jasny-bootstrap.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<title>Off Canvas Push Menu Template for Bootstrap</title>
|
||||
|
||||
<!-- Bootstrap core CSS -->
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../../dist/css/jasny-bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom styles for this template -->
|
||||
@@ -33,6 +33,7 @@
|
||||
<li><a href="../navmenu/">Slide in</a></li>
|
||||
<li class="active"><a href="./">Push</a></li>
|
||||
<li><a href="../navmenu-reveal/">Reveal</a></li>
|
||||
<li><a href="../navbar-offcanvas/">Off canvas navbar</a></li>
|
||||
</ul>
|
||||
<ul class="nav navmenu-nav">
|
||||
<li><a href="#">Link</a></li>
|
||||
@@ -74,7 +75,8 @@
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
|
||||
<script src="../../dist/js/jasny-bootstrap.min.js"></script>
|
||||
<script src="../../../js/offcanvas.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<title>Off Canvas Reveal Menu Template for Bootstrap</title>
|
||||
|
||||
<!-- Bootstrap core CSS -->
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../../dist/css/jasny-bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom styles for this template -->
|
||||
@@ -33,6 +33,7 @@
|
||||
<li><a href="../navmenu/">Slide in</a></li>
|
||||
<li><a href="../navmenu-push/">Push</a></li>
|
||||
<li class="active"><a href="./">Reveal</a></li>
|
||||
<li><a href="../navbar-offcanvas/">Off canvas navbar</a></li>
|
||||
</ul>
|
||||
<ul class="nav navmenu-nav">
|
||||
<li><a href="#">Link</a></li>
|
||||
@@ -69,7 +70,7 @@
|
||||
<p class="lead">This example demonstrates the use of the offcanvas plugin with a reveal effect.</p>
|
||||
<p>On the contrary of the push effect, the menu doesn't move with the canvas.</p>
|
||||
<p>You get the reveal effect by wrapping the content in a div and setting the <code>canvas</code> option to target that div.</p>
|
||||
<p>Note that in this example, the navmenu doesn't have the <code>.offcanvas</code> class, but is placed under the canvas by setting the <code>z-index</code>.</p>
|
||||
<p>Note that in this example, the navmenu doesn't have the <code>offcanvas</code> class, but is placed under the canvas by setting the <code>z-index</code>.</p>
|
||||
<p>Also take a look at the examples for a navmenu with <a href="../navmenu">slide in effect</a> and <a href="../navmenu-push">push effect</a>.</p>
|
||||
</div><!-- /.container -->
|
||||
</div>
|
||||
@@ -79,7 +80,7 @@
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
|
||||
<script src="../../dist/js/jasny-bootstrap.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<title>Navmenu Template for Bootstrap</title>
|
||||
|
||||
<!-- Bootstrap core CSS -->
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../../dist/css/jasny-bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom styles for this template -->
|
||||
@@ -33,6 +33,7 @@
|
||||
<li class="active"><a href="./">Slide in</a></li>
|
||||
<li><a href="../navmenu-push/">Push</a></li>
|
||||
<li><a href="../navmenu-reveal/">Reveal</a></li>
|
||||
<li><a href="../navbar-offcanvas/">Off canvas navbar</a></li>
|
||||
</ul>
|
||||
<ul class="nav navmenu-nav">
|
||||
<li><a href="#">Link</a></li>
|
||||
@@ -75,7 +76,7 @@
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
|
||||
<script src="../../dist/js/jasny-bootstrap.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<title>Starter Template for Bootstrap</title>
|
||||
|
||||
<!-- Bootstrap core CSS -->
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../../dist/css/jasny-bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom styles for this template -->
|
||||
@@ -63,7 +63,7 @@
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
|
||||
<script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
|
||||
<script src="../../dist/js/jasny-bootstrap.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -12,12 +12,12 @@ base_url: "../"
|
||||
<div class="page-header">
|
||||
<h1 id="jasny-bootstrap">Jasny Bootstrap</h1>
|
||||
</div>
|
||||
<p class="lead">Jasny Bootstrap is an extension to <a href="http://getbootstrap.com">Twitter Bootstrap</a>, adding a number of features and components.</p>
|
||||
<p class="lead">Jasny Bootstrap is an extension to <a href="http://getbootstrap.com">vanilla Bootstrap</a>, adding a number of features and components.</p>
|
||||
<p>The aim of Jasny Bootstrap is to provide all the required features for building highly interactive web applications for desktop and mobile.</p>
|
||||
|
||||
<div class="bs-callout bs-callout-warning">
|
||||
<h4>Delivered as extension only</h4>
|
||||
<p>As of version 3.1.0 Jasny Bootstrap is no longer bundeled with Twitter Bootstrap. You should load Twitter Bootstrap's CSS before this extension.</p>
|
||||
<p>As of version 3.1.0 Jasny Bootstrap is no longer bundled with vanilla Bootstrap. You should load vanilla Bootstrap's CSS before this extension.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -91,7 +91,7 @@ jasny-bootstrap/
|
||||
|
||||
<p>This is the most basic form of Jasny Bootstrap. We provide compiled CSS and JS (<code>jasny-bootstrap.*</code>), as well as compiled and minified CSS and JS (<code>jasny-bootstrap.min.*</code>).</p>
|
||||
|
||||
<p>The <code>jasny-bootstrap.*</code> files should be loaded in conjunction with the original Twitter Bootstrap files.</p>
|
||||
<p>The <code>jasny-bootstrap.*</code> files should be loaded in conjunction with the original vanilla Bootstrap files.</p>
|
||||
|
||||
<div class="bs-callout bs-callout-danger" id="jquery-required">
|
||||
<h4>jQuery required</h4>
|
||||
@@ -305,7 +305,7 @@ jasny-bootstrap/
|
||||
<p>Other changes in v3.0 are not immediately apparent. Base classes, key styles, and behaviors have been adjusted for flexibility and our <em>mobile first</em> approach. Here's a partial list:</p>
|
||||
<ul>
|
||||
<li>The fileupload plugin has been renamed to fileinput. File upload was poorly chosen, since the plugin allows the creation of a styled file input element. It has nothing to do with how the file is uploaded.</li>
|
||||
<li class="bs-jasny-only">Tab alignments are still supported in this fork (while dropped in Twitter Bootstrap).</li>
|
||||
<li class="bs-jasny-only">Tab alignments are still supported in this fork (while dropped in vanilla Bootstrap).</li>
|
||||
<li>Typeahead has been dropped, in favor of using <a href="http://brianreavis.github.io/selectize.js/">Selectize.js</a>.</li>
|
||||
<li>Iconic icons are still available from <a href="http://www.somerandomdude.com/work/open-iconic/">P.J. Onori</a>.</li>
|
||||
</ul>
|
||||
|
||||
@@ -6,7 +6,7 @@ title: Jasny Bootstrap
|
||||
<main class="bs-masthead" id="content" role="main">
|
||||
<div class="container">
|
||||
<h1>{{ page.title }}</h1>
|
||||
<p class="lead">The missing components for you favorite front-end framework.</p>
|
||||
<p class="lead">The missing components for your favorite front-end framework.</p>
|
||||
<p>
|
||||
<a href="{{ site.download.dist }}" class="btn btn-outline-inverse btn-lg" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Download', 'Download {{ site.current_version }}']);">Download</a>
|
||||
or <a href="{{ site.download.source }}" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Download', 'Download {{ site.current_version }} source']);">Download source</a>
|
||||
|
||||
@@ -15,8 +15,8 @@ base_url: "../"
|
||||
</div>
|
||||
|
||||
<h3 id="js-individual-compiled">Individual or compiled</h3>
|
||||
<p>Plugins can be included individually (using Jasny Bootstrap's individual <code>*.js</code> files), or all at once (using <code>jasny-bootstrap.js</code> or the minified <code>jasn-bootstrap.min.js</code>).</p>
|
||||
<p>The Jasny Bootstrap plugins work with or without loading Twitter Bootstrap's <code>bootstrap.js</code>.</p>
|
||||
<p>Plugins can be included individually (using Jasny Bootstrap's individual <code>*.js</code> files), or all at once (using <code>jasny-bootstrap.js</code> or the minified <code>jasny-bootstrap.min.js</code>).</p>
|
||||
<p>The Jasny Bootstrap plugins work with or without loading vanilla Bootstrap's <code>bootstrap.js</code>.</p>
|
||||
|
||||
<div class="bs-callout bs-callout-danger">
|
||||
<h4>Do not attempt to include both.</h4>
|
||||
@@ -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) {
|
||||
@@ -78,7 +78,7 @@ $('#myMenu').on('show.bs.offcanvas', function (e) {
|
||||
</div>
|
||||
|
||||
<h2 id="offcanvas-examples">Example</h2>
|
||||
<p>The offcanvas plugin allows you to hide an element from sight and than show it by moving either that or any other element. It's intented to be used for off canvas navigation, like push menus.</p>
|
||||
<p>The offcanvas plugin allows you to hide an element from sight and than show it by moving either that or any other element. It's intended to be used for off canvas navigation, like push menus.</p>
|
||||
<div class="bs-example bs-navmenu-offcanvas-example">
|
||||
<div id="myNavmenuCanvas">
|
||||
<nav id="myNavmenu" class="navmenu navmenu-default navmenu-fixed-left offcanvas" role="navigation">
|
||||
@@ -119,7 +119,7 @@ $('#myMenu').on('show.bs.offcanvas', function (e) {
|
||||
|
||||
<div class="bs-callout bs-callout-info">
|
||||
<h4>Examples</h4>
|
||||
<p>For better understanding, have a look at the <a href="../examples/navmenu/">off canvas slide in menu</a>, <a href="../examples/navmenu-push/">off canvas push menu</a> and <a href="../examples/navmenu-reveal/">off canvas reveal menu</a> exapmles.</p>
|
||||
<p>For better understanding, have a look at the <a href="../examples/navmenu/">off canvas slide in menu</a>, <a href="../examples/navmenu-push/">off canvas push menu</a> and <a href="../examples/navmenu-reveal/">off canvas reveal menu</a> examples.</p>
|
||||
</div>
|
||||
|
||||
<hr class="bs-docs-separator">
|
||||
@@ -180,6 +180,12 @@ $('.navmenu').offcanvas()
|
||||
<td>true</td>
|
||||
<td>Calculate if off canvas should be disabled for this viewport width on window resize. If your elements always gets hidden on window resize, try setting this to false.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>disableScrolling</td>
|
||||
<td>boolean</td>
|
||||
<td>true</td>
|
||||
<td>Disable scrolling when the off canvas element is shown, by setting overflow to hidden for the body.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -390,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>
|
||||
@@ -416,21 +423,17 @@ $('.inputmask').inputmask({
|
||||
|
||||
<h3>File input widgets</h3>
|
||||
<div class="bs-example">
|
||||
<div class="fileinput fileinput-new" data-provides="fileinput">
|
||||
<div class="input-group">
|
||||
<div class="form-control" data-trigger="fileinput"><i class="glyphicon glyphicon-file fileinput-exists"></i> <span class="fileinput-filename"></span></div>
|
||||
<span class="input-group-addon btn btn-default btn-file"><span class="fileinput-new">Select file</span><span class="fileinput-exists">Change</span><input type="file"></span>
|
||||
<a href="#" class="input-group-addon btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a>
|
||||
</div>
|
||||
<div class="fileinput fileinput-new input-group" data-provides="fileinput">
|
||||
<div class="form-control" data-trigger="fileinput"><i class="glyphicon glyphicon-file fileinput-exists"></i> <span class="fileinput-filename"></span></div>
|
||||
<span class="input-group-addon btn btn-default btn-file"><span class="fileinput-new">Select file</span><span class="fileinput-exists">Change</span><input type="file"></span>
|
||||
<a href="#" class="input-group-addon btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a>
|
||||
</div>
|
||||
</div>
|
||||
{% highlight html %}
|
||||
<div class="fileinput fileinput-new" data-provides="fileinput">
|
||||
<div class="input-group">
|
||||
<div class="form-control" data-trigger="fileinput"><i class="glyphicon glyphicon-file fileinput-exists"></i> <span class="fileinput-filename"></span></div>
|
||||
<span class="input-group-addon btn btn-default btn-file"><span class="fileinput-new">Select file</span><span class="fileinput-exists">Change</span><input type="file" name="..."></span>
|
||||
<a href="#" class="input-group-addon btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a>
|
||||
</div>
|
||||
<div class="fileinput fileinput-new input-group" data-provides="fileinput">
|
||||
<div class="form-control" data-trigger="fileinput"><i class="glyphicon glyphicon-file fileinput-exists"></i> <span class="fileinput-filename"></span></div>
|
||||
<span class="input-group-addon btn btn-default btn-file"><span class="fileinput-new">Select file</span><span class="fileinput-exists">Change</span><input type="file" name="..."></span>
|
||||
<a href="#" class="input-group-addon btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a>
|
||||
</div>
|
||||
{% endhighlight %}
|
||||
|
||||
|
||||
@@ -6,19 +6,26 @@
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
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 +33,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);
|
||||
};
|
||||
|
||||
@@ -9,6 +9,7 @@ This Grunt task updates the npm-shrinkwrap.canonical.json file that's used as th
|
||||
This task should be run and the updated file should be committed whenever Bootstrap's dependencies change.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
var canonicallyJsonStringify = require('canonical-json');
|
||||
var NON_CANONICAL_FILE = 'npm-shrinkwrap.json';
|
||||
var DEST_FILE = 'test-infra/npm-shrinkwrap.canonical.json';
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"disallowKeywords": ["with"],
|
||||
"requireLeftStickedOperators": [","],
|
||||
"disallowLeftStickedOperators": ["?", "+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
|
||||
"disallowRightStickedOperators": ["?", "/", "*", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
|
||||
"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~"],
|
||||
"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
|
||||
"requireLineFeedAtFileEnd": true,
|
||||
"requireRightStickedOperators": ["!"],
|
||||
"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
|
||||
"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"],
|
||||
"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
|
||||
"requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true },
|
||||
"validateLineBreaks": "LF"
|
||||
}
|
||||
43
js/.jscsrc
Normal file
43
js/.jscsrc
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"disallowEmptyBlocks": true,
|
||||
"disallowKeywords": ["with"],
|
||||
"disallowMixedSpacesAndTabs": true,
|
||||
"disallowMultipleLineStrings": true,
|
||||
"disallowMultipleVarDecl": true,
|
||||
"disallowQuotedKeysInObjects": "allButReserved",
|
||||
"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
|
||||
"disallowSpaceBeforeBinaryOperators": [","],
|
||||
"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
|
||||
"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
|
||||
"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
|
||||
"disallowSpacesInsideArrayBrackets": true,
|
||||
"disallowSpacesInsideParentheses": true,
|
||||
"disallowTrailingComma": true,
|
||||
"disallowTrailingWhitespace": true,
|
||||
"requireCamelCaseOrUpperCaseIdentifiers": true,
|
||||
"requireCapitalizedConstructors": true,
|
||||
"requireCommaBeforeLineBreak": true,
|
||||
"requireDollarBeforejQueryAssignment": true,
|
||||
"requireDotNotation": true,
|
||||
"requireLineFeedAtFileEnd": true,
|
||||
"requirePaddingNewLinesAfterUseStrict": true,
|
||||
"requirePaddingNewLinesBeforeExport": true,
|
||||
"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="],
|
||||
"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"],
|
||||
"requireSpaceAfterLineComment": true,
|
||||
"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="],
|
||||
"requireSpaceBetweenArguments": true,
|
||||
"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningCurlyBrace": true, "beforeOpeningRoundBrace": true },
|
||||
"requireSpacesInConditionalExpression": true,
|
||||
"requireSpacesInForStatement": true,
|
||||
"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
|
||||
"requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true },
|
||||
"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
|
||||
"requireSpacesInsideObjectBrackets": "allButNested",
|
||||
"validateAlignedFunctionParameters": true,
|
||||
"validateIndentation": 2,
|
||||
"validateLineBreaks": "LF",
|
||||
"validateNewlineAfterArrayElements": true,
|
||||
"validateQuoteMarks": "'"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* ===========================================================
|
||||
* Bootstrap: fileinput.js v3.1.0
|
||||
* Bootstrap: fileinput.js v3.1.3
|
||||
* http://jasny.github.com/bootstrap/javascript/#fileinput
|
||||
* ===========================================================
|
||||
* Copyright 2012-2014 Arnold Daniels
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
var Fileinput = function (element, options) {
|
||||
this.$element = $(element)
|
||||
|
||||
|
||||
this.$input = this.$element.find(':file')
|
||||
if (this.$input.length === 0) return
|
||||
|
||||
@@ -34,82 +34,90 @@
|
||||
|
||||
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(),
|
||||
hiddenVal: this.$hidden.val()
|
||||
}
|
||||
|
||||
|
||||
this.listen()
|
||||
}
|
||||
|
||||
|
||||
Fileinput.prototype.listen = function() {
|
||||
this.$input.on('change.bs.fileinput', $.proxy(this.change, this))
|
||||
$(this.$input[0].form).on('reset.bs.fileinput', $.proxy(this.reset, this))
|
||||
|
||||
|
||||
this.$element.find('[data-trigger="fileinput"]').on('click.bs.fileinput', $.proxy(this.trigger, this))
|
||||
this.$element.find('[data-dismiss="fileinput"]').on('click.bs.fileinput', $.proxy(this.clear, this))
|
||||
},
|
||||
|
||||
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()
|
||||
this.$element.trigger('clear.bs.fileinput')
|
||||
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)
|
||||
|
||||
|
||||
// if parent has max-height, using `(max-)height: 100%` on child doesn't take padding and border into account
|
||||
if (preview.css('max-height') != 'none') $img.css('max-height', parseInt(preview.css('max-height'), 10) - parseInt(preview.css('padding-top'), 10) - parseInt(preview.css('padding-bottom'), 10) - parseInt(preview.css('border-top'), 10) - parseInt(preview.css('border-bottom'), 10))
|
||||
|
||||
|
||||
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)
|
||||
} else {
|
||||
this.$element.find('.fileinput-filename').text(file.name)
|
||||
this.$preview.text(file.name)
|
||||
|
||||
|
||||
this.$element.addClass('fileinput-exists').removeClass('fileinput-new')
|
||||
|
||||
|
||||
this.$element.trigger('change.bs.fileinput')
|
||||
}
|
||||
},
|
||||
|
||||
Fileinput.prototype.clear = function(e) {
|
||||
if (e) e.preventDefault()
|
||||
|
||||
|
||||
this.$hidden.val('')
|
||||
this.$hidden.attr('name', this.name)
|
||||
this.$input.attr('name', '')
|
||||
|
||||
//ie8+ doesn't support changing the value of input with type=file so clone instead
|
||||
if (isIE) {
|
||||
if (isIE) {
|
||||
var inputClone = this.$input.clone(true);
|
||||
this.$input.after(inputClone);
|
||||
this.$input.remove();
|
||||
@@ -121,15 +129,15 @@
|
||||
this.$preview.html('')
|
||||
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)
|
||||
@@ -137,7 +145,7 @@
|
||||
|
||||
if (this.original.exists) this.$element.addClass('fileinput-exists').removeClass('fileinput-new')
|
||||
else this.$element.addClass('fileinput-new').removeClass('fileinput-exists')
|
||||
|
||||
|
||||
this.$element.trigger('reset.bs.fileinput')
|
||||
},
|
||||
|
||||
@@ -146,17 +154,17 @@
|
||||
e.preventDefault()
|
||||
}
|
||||
|
||||
|
||||
|
||||
// FILEUPLOAD PLUGIN DEFINITION
|
||||
// ===========================
|
||||
|
||||
var old = $.fn.fileinput
|
||||
|
||||
|
||||
$.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]()
|
||||
})
|
||||
}
|
||||
@@ -178,9 +186,9 @@
|
||||
|
||||
$(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"]');
|
||||
if ($target.length > 0) {
|
||||
e.preventDefault()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* ===========================================================
|
||||
* Bootstrap: inputmask.js v3.1.0
|
||||
* http://jasny.github.io/bootstrap/javascript/#inputmask
|
||||
*
|
||||
*
|
||||
* Based on Masked Input plugin by Josh Bush (digitalbush.com)
|
||||
* ===========================================================
|
||||
* Copyright 2012-2014 Arnold Daniels
|
||||
@@ -30,24 +30,24 @@
|
||||
|
||||
var Inputmask = function (element, options) {
|
||||
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()
|
||||
this.listen()
|
||||
|
||||
|
||||
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]",
|
||||
'*': "."
|
||||
}
|
||||
}
|
||||
@@ -56,7 +56,7 @@
|
||||
var defs = this.options.definitions
|
||||
var len = this.mask.length
|
||||
|
||||
this.tests = []
|
||||
this.tests = []
|
||||
this.partialPosition = this.mask.length
|
||||
this.firstNonMaskPos = null
|
||||
|
||||
@@ -85,11 +85,11 @@
|
||||
}).join('')
|
||||
}, this))
|
||||
}
|
||||
|
||||
|
||||
Inputmask.prototype.listen = function() {
|
||||
if (this.$element.attr("readonly")) return
|
||||
|
||||
var pasteEventName = (isIE ? 'paste' : 'input') + ".mask"
|
||||
var pasteEventName = (isIE ? 'paste' : 'input') + ".bs.inputmask"
|
||||
|
||||
this.$element
|
||||
.on("unmask.bs.inputmask", $.proxy(this.unmask, this))
|
||||
@@ -129,19 +129,19 @@
|
||||
end = begin + range.text.length
|
||||
}
|
||||
return {
|
||||
begin: begin,
|
||||
begin: begin,
|
||||
end: end
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Inputmask.prototype.seekNext = function(pos) {
|
||||
var len = this.mask.length
|
||||
while (++pos <= len && !this.tests[pos]);
|
||||
|
||||
return pos
|
||||
}
|
||||
|
||||
|
||||
Inputmask.prototype.seekPrev = function(pos) {
|
||||
while (--pos >= 0 && !this.tests[pos]);
|
||||
|
||||
@@ -185,13 +185,13 @@
|
||||
|
||||
Inputmask.prototype.unmask = function() {
|
||||
this.$element
|
||||
.unbind(".mask")
|
||||
.removeData("inputmask")
|
||||
.unbind(".bs.inputmask")
|
||||
.removeData("bs.inputmask")
|
||||
}
|
||||
|
||||
Inputmask.prototype.focusEvent = function() {
|
||||
this.focusText = this.$element.val()
|
||||
var len = this.mask.length
|
||||
var len = this.mask.length
|
||||
var pos = this.checkVal()
|
||||
this.writeBuffer()
|
||||
|
||||
@@ -209,8 +209,10 @@
|
||||
|
||||
Inputmask.prototype.blurEvent = function() {
|
||||
this.checkVal()
|
||||
if (this.$element.val() !== this.focusText)
|
||||
if (this.$element.val() !== this.focusText) {
|
||||
this.$element.trigger('change')
|
||||
this.$element.trigger('input')
|
||||
}
|
||||
}
|
||||
|
||||
Inputmask.prototype.keydownEvent = function(e) {
|
||||
@@ -321,18 +323,18 @@
|
||||
return (this.partialPosition ? i : this.firstNonMaskPos)
|
||||
}
|
||||
|
||||
|
||||
|
||||
// INPUTMASK PLUGIN DEFINITION
|
||||
// ===========================
|
||||
|
||||
var old = $.fn.inputmask
|
||||
|
||||
|
||||
$.fn.inputmask = function (options) {
|
||||
return this.each(function () {
|
||||
var $this = $(this)
|
||||
var data = $this.data('inputmask')
|
||||
|
||||
if (!data) $this.data('inputmask', (data = new Inputmask(this, options)))
|
||||
var data = $this.data('bs.inputmask')
|
||||
|
||||
if (!data) $this.data('bs.inputmask', (data = new Inputmask(this, options)))
|
||||
})
|
||||
}
|
||||
|
||||
@@ -353,7 +355,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())
|
||||
})
|
||||
|
||||
|
||||
223
js/offcanvas.js
223
js/offcanvas.js
@@ -1,8 +1,6 @@
|
||||
/* ========================================================================
|
||||
* Bootstrap: offcanvas.js v3.1.0
|
||||
* 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
|
||||
*
|
||||
@@ -28,60 +26,75 @@
|
||||
this.$element = $(element)
|
||||
this.options = $.extend({}, OffCanvas.DEFAULTS, options)
|
||||
this.state = null
|
||||
|
||||
this.placement = null
|
||||
|
||||
if (this.options.recalc) {
|
||||
this.calcClone()
|
||||
$(window).on('resize', $.proxy(this.recalc, this))
|
||||
}
|
||||
|
||||
if (this.options.autohide)
|
||||
$(document).on('click', $.proxy(this.autohide, this))
|
||||
|
||||
if (this.options.autohide && !this.options.modal) {
|
||||
var eventName = (navigator.userAgent.match(/(iPad|iPhone)/i) === null) ? 'click' : 'touchstart'
|
||||
$(document).on('click touchstart', $.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,
|
||||
modal: false
|
||||
}
|
||||
|
||||
OffCanvas.prototype.offset = function () {
|
||||
switch (this.options.placement) {
|
||||
switch (this.placement) {
|
||||
case 'left':
|
||||
case 'right': return this.$element.outerWidth()
|
||||
case 'top':
|
||||
case 'bottom': return this.$element.outerHeight()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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', '')
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
OffCanvas.prototype.opposite = function (placement) {
|
||||
switch (placement) {
|
||||
case 'top': return 'bottom'
|
||||
@@ -90,37 +103,37 @@
|
||||
case 'right': return 'left'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
OffCanvas.prototype.getCanvasElements = function() {
|
||||
// Return a set containing the canvas plus all fixed elements
|
||||
var canvas = this.options.canvas ? $(this.options.canvas) : this.$element
|
||||
|
||||
|
||||
var fixed_elements = canvas.find('*').filter(function() {
|
||||
return $(this).css('position') === 'fixed'
|
||||
}).not(this.options.exclude)
|
||||
|
||||
|
||||
return canvas.add(fixed_elements)
|
||||
}
|
||||
|
||||
|
||||
OffCanvas.prototype.slide = function (elements, offset, callback) {
|
||||
// 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')
|
||||
$(this).css(placement, (parseInt($(this).css(placement), 10) || 0) + offset)
|
||||
|
||||
|
||||
if ($(this).css(opposite) !== 'auto')
|
||||
$(this).css(opposite, (parseInt($(this).css(opposite), 10) || 0) - offset)
|
||||
})
|
||||
|
||||
|
||||
this.$element
|
||||
.one($.support.transition.end, callback)
|
||||
.emulateTransitionEnd(350)
|
||||
@@ -128,51 +141,68 @@
|
||||
|
||||
OffCanvas.prototype.disableScrolling = function() {
|
||||
var bodyWidth = $('body').width()
|
||||
var prop = 'padding-' + this.opposite(this.options.placement)
|
||||
var prop = 'padding-right'
|
||||
|
||||
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) {
|
||||
var padding = parseInt($('body').css(prop), 10) + $('body').width() - bodyWidth
|
||||
|
||||
|
||||
setTimeout(function() {
|
||||
$('body').css(prop, padding)
|
||||
}, 1)
|
||||
}
|
||||
//disable scrolling on mobiles (they ignore overflow:hidden)
|
||||
$('body').on('touchmove.bs', function(e) {
|
||||
if (!$(event.target).closest('.offcanvas').length)
|
||||
e.preventDefault();
|
||||
});
|
||||
}
|
||||
|
||||
OffCanvas.prototype.enableScrolling = function() {
|
||||
$('body').off('touchmove.bs');
|
||||
}
|
||||
|
||||
OffCanvas.prototype.show = function () {
|
||||
if (this.state) return
|
||||
|
||||
|
||||
var startEvent = $.Event('show.bs.offcanvas')
|
||||
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')) {
|
||||
$(this).css(placement, 0)
|
||||
}
|
||||
})
|
||||
|
||||
if (elements.index(this.$element) !== -1) this.$element.css(placement, -1 * offset)
|
||||
|
||||
this.disableScrolling()
|
||||
|
||||
if (this.options.disableScrolling) this.disableScrolling()
|
||||
if (this.options.modal) this.toggleBackdrop()
|
||||
|
||||
var complete = function () {
|
||||
if (this.state != 'slide-in') return
|
||||
|
||||
this.state = 'slid'
|
||||
|
||||
elements.removeClass('canvas-sliding').addClass('canvas-slid')
|
||||
@@ -192,36 +222,84 @@
|
||||
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() {
|
||||
$(this).attr('style', $(this).data('offcanvas-style')).removeData('offcanvas-style')
|
||||
elements.add(this.$element).add('body').each(function() {
|
||||
$(this).style = $(this).data('offcanvas-style')
|
||||
$(this).removeData('offcanvas-style')
|
||||
})
|
||||
|
||||
this.$element.trigger('hidden.bs.offcanvas')
|
||||
}
|
||||
|
||||
if (this.options.disableScrolling) this.enableScrolling()
|
||||
if (this.options.modal) this.toggleBackdrop()
|
||||
|
||||
elements.removeClass('canvas-slid').addClass('canvas-sliding')
|
||||
|
||||
|
||||
setTimeout($.proxy(function() {
|
||||
this.slide(elements, offset, $.proxy(complete, this))
|
||||
}, this), 1)
|
||||
}
|
||||
|
||||
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']()
|
||||
}
|
||||
|
||||
OffCanvas.prototype.toggleBackdrop = function (callback) {
|
||||
callback = callback || $.noop;
|
||||
if (this.state == 'slide-in') {
|
||||
var doAnimate = $.support.transition;
|
||||
|
||||
this.$backdrop = $('<div class="modal-backdrop fade" />')
|
||||
.insertAfter(this.$element);
|
||||
|
||||
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
|
||||
|
||||
this.$backdrop.addClass('in')
|
||||
this.$backdrop.on('click.bs', $.proxy(this.autohide, this))
|
||||
|
||||
doAnimate ?
|
||||
this.$backdrop
|
||||
.one($.support.transition.end, callback)
|
||||
.emulateTransitionEnd(150) :
|
||||
callback()
|
||||
} else if (this.state == 'slide-out' && this.$backdrop) {
|
||||
this.$backdrop.removeClass('in');
|
||||
$('body').off('touchmove.bs');
|
||||
var self = this;
|
||||
if ($.support.transition) {
|
||||
this.$backdrop
|
||||
.one($.support.transition.end, function() {
|
||||
self.$backdrop.remove();
|
||||
callback()
|
||||
self.$backdrop = null;
|
||||
})
|
||||
.emulateTransitionEnd(150);
|
||||
} else {
|
||||
this.$backdrop.remove();
|
||||
this.$backdrop = null;
|
||||
callback();
|
||||
}
|
||||
} else if (callback) {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
|
||||
OffCanvas.prototype.calcClone = function() {
|
||||
this.$calcClone = this.$element.clone()
|
||||
.html('')
|
||||
@@ -230,21 +308,24 @@
|
||||
}
|
||||
|
||||
OffCanvas.prototype.recalc = function () {
|
||||
if (this.state() !== 'slid' || this.$calcClone.css('display') === 'none') return
|
||||
|
||||
var offset = -1 * this.offset()
|
||||
|
||||
var placement = this.options.placement
|
||||
this.getCanvasElements().each(function() {
|
||||
$(this).css(placement, (parseInt($(this).css(placement), 10) || 0) + offset)
|
||||
}).removeClass('canvas-slid')
|
||||
|
||||
$('body').css('overflow', '')
|
||||
this.$element.css(placement, '').removeClass('in canvas-slid')
|
||||
if (this.$calcClone.css('display') === 'none' || (this.state !== 'slid' && this.state !== 'slide-in')) return
|
||||
|
||||
this.state = null
|
||||
this.placement = null
|
||||
var elements = this.getCanvasElements()
|
||||
|
||||
this.$element.removeClass('in')
|
||||
|
||||
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) {
|
||||
if ($(e.target).closest(this.$element).length === 0) this.hide()
|
||||
var target = $(e.target);
|
||||
if (!target.hasClass('dropdown-backdrop') && $(e.target).closest(this.$element).length === 0) this.hide()
|
||||
}
|
||||
|
||||
// OFFCANVAS PLUGIN DEFINITION
|
||||
@@ -256,10 +337,10 @@
|
||||
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]()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -281,12 +362,12 @@
|
||||
$(document).on('click.bs.offcanvas.data-api', '[data-toggle=offcanvas]', function (e) {
|
||||
var $this = $(this), href
|
||||
var target = $this.attr('data-target')
|
||||
|| e.preventDefault()
|
||||
|| (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
|
||||
var $canvas = $(target)
|
||||
var data = $canvas.data('bs.offcanvas')
|
||||
var option = data ? 'toggle' : $this.data()
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation()
|
||||
|
||||
if (data) data.toggle()
|
||||
|
||||
@@ -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
|
||||
@@ -22,7 +22,7 @@
|
||||
var Rowlink = function (element, options) {
|
||||
this.$element = $(element)
|
||||
this.options = $.extend({}, Rowlink.DEFAULTS, options)
|
||||
|
||||
|
||||
this.$element.on('click.bs.rowlink', 'td:not(.rowlink-skip)', $.proxy(this.click, this))
|
||||
}
|
||||
|
||||
@@ -33,19 +33,19 @@
|
||||
Rowlink.prototype.click = function(e) {
|
||||
var target = $(e.currentTarget).closest('tr').find(this.options.target)[0]
|
||||
if ($(e.target)[0] === target) return
|
||||
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
|
||||
if (target.click) {
|
||||
target.click()
|
||||
} else if (document.createEvent) {
|
||||
var evt = document.createEvent("MouseEvents");
|
||||
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
|
||||
var evt = document.createEvent("MouseEvents");
|
||||
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
|
||||
target.dispatchEvent(evt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ROWLINK PLUGIN DEFINITION
|
||||
// ===========================
|
||||
|
||||
@@ -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,10 +75,12 @@
|
||||
// ==================
|
||||
|
||||
$(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')
|
||||
})
|
||||
|
||||
|
||||
}(window.jQuery);
|
||||
|
||||
@@ -15,6 +15,6 @@ $(function () {
|
||||
test('should return element', function () {
|
||||
ok($(document.body).fileinput()[0] == document.body, 'document.body returned')
|
||||
})
|
||||
|
||||
|
||||
// TODO: add fileinput tests
|
||||
})
|
||||
|
||||
@@ -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
|
||||
})
|
||||
|
||||
@@ -15,6 +15,6 @@ $(function () {
|
||||
test('should return element', function () {
|
||||
ok($(document.body).offcanvas()[0] == document.body, 'document.body returned')
|
||||
})
|
||||
|
||||
|
||||
// TODO: add offcanvas tests
|
||||
})
|
||||
|
||||
@@ -15,6 +15,6 @@ $(function () {
|
||||
test('should return element', function () {
|
||||
ok($(document.body).rowlink()[0] == document.body, 'document.body returned')
|
||||
})
|
||||
|
||||
|
||||
// TODO: add rowlink tests
|
||||
})
|
||||
|
||||
50
js/transition.js
Normal file
50
js/transition.js
Normal 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 vanilla 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);
|
||||
@@ -1,6 +1,6 @@
|
||||
// Fixed alerts
|
||||
//
|
||||
// Position to the top or bottom.
|
||||
// ------------------------------------------------
|
||||
|
||||
.alert-fixed-top,
|
||||
.alert-fixed-bottom {
|
||||
|
||||
@@ -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
61
less/build/mixins.less
Normal file
@@ -0,0 +1,61 @@
|
||||
//
|
||||
// These mixins are used when Jasny Bootstrap is
|
||||
// built without importing vanilla 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;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// These variables are used when Jasny Bootstrap is built
|
||||
// without importing Twitter Bootstrap.
|
||||
// without importing vanilla Bootstrap.
|
||||
// --------------------------------------------------------
|
||||
|
||||
//-- Colors
|
||||
@@ -69,6 +69,8 @@
|
||||
@zindex-navmenu-fixed: 1030;
|
||||
@zindex-alert-fixed: 1035;
|
||||
|
||||
@zindex-modal: 1050;
|
||||
|
||||
|
||||
//== Media queries breakpoints
|
||||
//
|
||||
|
||||
@@ -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;
|
||||
@@ -23,3 +36,7 @@
|
||||
.btn-xs .btn-label {
|
||||
.button-label-size(1px; 5px; @border-radius-small);
|
||||
}
|
||||
.btn-group > .btn:last-child:not(:first-child) .btn-label, .btn-group > .dropdown-toggle:not(:first-child) .btn-label {
|
||||
border-bottom-left-radius: 0px;
|
||||
border-top-left-radius: 0px;
|
||||
}
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
margin: 0;
|
||||
opacity: 0;
|
||||
filter: alpha(opacity=0);
|
||||
transform: translate(-300px, 0) scale(4);
|
||||
font-size: 23px;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
direction: ltr;
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -50,6 +50,12 @@
|
||||
.fileinput-new .fileinput-exists {
|
||||
display: none;
|
||||
}
|
||||
|
||||
//close X button alignment
|
||||
.fileinput-exists.close {
|
||||
float: none;
|
||||
}
|
||||
|
||||
.fileinput-inline .fileinput-controls {
|
||||
display: inline;
|
||||
}
|
||||
@@ -63,16 +69,30 @@
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.fileinput.input-group {
|
||||
display: table;
|
||||
|
||||
> * {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
> .btn-file {
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
.fileinput-new .input-group .btn-file.btn-xs,
|
||||
.fileinput-new .input-group .btn-file.btn-sm {
|
||||
border-radius: 0 @border-radius-small @border-radius-small 0;
|
||||
}
|
||||
.fileinput-new .input-group .btn-file.btn-lg {
|
||||
border-radius: 0 @border-radius-large @border-radius-large 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 {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
// Smooth sizing container
|
||||
// -------------------------
|
||||
|
||||
@media (min-width: 1px) {
|
||||
.container-smooth {
|
||||
max-width: @container-lg;
|
||||
.container-smooth {
|
||||
max-width: @container-lg;
|
||||
|
||||
@media (min-width: 1px) {
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
// Twitter Bootstrap's "variables.less" should already be imported
|
||||
// Vanilla Bootstrap's "variables.less" should already be imported
|
||||
|
||||
// Core variables and mixins
|
||||
@import "variables.less";
|
||||
@import "mixins.less";
|
||||
|
||||
// Core CSS
|
||||
@import "grid-container-smooth.less";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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,14 +22,19 @@
|
||||
position: fixed;
|
||||
z-index: @zindex-navmenu-fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
overflow-y: auto;
|
||||
border-radius: 0;
|
||||
}
|
||||
.navmenu-fixed-left,
|
||||
.navbar-offcanvas {
|
||||
.navbar-offcanvas.navmenu-fixed-left {
|
||||
left: 0;
|
||||
right: auto;
|
||||
border-width: 0 1px 0 0;
|
||||
}
|
||||
.navmenu-fixed-right {
|
||||
.navmenu-fixed-right,
|
||||
.navbar-offcanvas {
|
||||
left: auto;
|
||||
right: 0;
|
||||
border-width: 0 0 0 1px;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
//
|
||||
// Off canvas navigation
|
||||
// --------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
//
|
||||
// Rowlink
|
||||
// --------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
//
|
||||
// Variables
|
||||
//
|
||||
// Either Twitter Bootstrap's "variables.less" or this package's
|
||||
// Either vanilla Bootstrap's "variables.less" or this package's
|
||||
// "default-variables.less" should be loaded before this file.
|
||||
// -------------------------------------------------------------
|
||||
|
||||
@zindex-navmenu-fixed: 1030;
|
||||
@zindex-navmenu-fixed: @zindex-modal;
|
||||
@zindex-alert-fixed: 1035;
|
||||
|
||||
@container-smooth: @container-lg;
|
||||
|
||||
20
package.js
Normal file
20
package.js
Normal file
@@ -0,0 +1,20 @@
|
||||
// package metadata file for Meteor.js
|
||||
|
||||
Package.describe({
|
||||
name: 'jasny:bootstrap', // http://atmospherejs.com/jasny/bootstrap
|
||||
version: '3.1.3',
|
||||
summary: 'Jasny Bootstrap (official): The missing components for your favorite front-end framework.',
|
||||
git: 'https://github.com/jasny/bootstrap.git',
|
||||
documentation: 'README.md'
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
api.versionsFrom('METEOR@1.0');
|
||||
|
||||
api.use('jquery', 'client');
|
||||
|
||||
api.addFiles([
|
||||
'dist/css/jasny-bootstrap.css',
|
||||
'dist/js/jasny-bootstrap.js'
|
||||
], 'client');
|
||||
});
|
||||
48
package.json
48
package.json
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"name": "jasny-bootstrap",
|
||||
"description": "Additional features and components for Bootstrap",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.3",
|
||||
"main": "dist/jasny-bootstrap.js",
|
||||
"keywords": [
|
||||
"bootstrap",
|
||||
"css"
|
||||
@@ -20,35 +21,32 @@
|
||||
"bugs": {
|
||||
"url": "https://github.com/jasny/bootstrap/issues"
|
||||
},
|
||||
"license": {
|
||||
"type": "Apache-2.0",
|
||||
"url": "https://github.com/jasny/bootstrap/blob/master/LICENSE"
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"devDependencies": {
|
||||
"btoa": "~1.1.1",
|
||||
"canonical-json": "~0.0.3",
|
||||
"grunt": "~0.4.2",
|
||||
"grunt-banner": "~0.2.0",
|
||||
"grunt-contrib-clean": "~0.5.0",
|
||||
"grunt-contrib-concat": "~0.3.0",
|
||||
"grunt-contrib-connect": "~0.6.0",
|
||||
"grunt-contrib-copy": "~0.5.0",
|
||||
"grunt-contrib-csslint": "~0.2.0",
|
||||
"grunt-contrib-cssmin": "~0.7.0",
|
||||
"grunt-contrib-jade": "~0.9.1",
|
||||
"grunt-contrib-jshint": "~0.8.0",
|
||||
"grunt-contrib-less": "~0.9.0",
|
||||
"grunt-contrib-qunit": "~0.4.0",
|
||||
"grunt-contrib-uglify": "~0.3.0",
|
||||
"grunt-contrib-watch": "~0.5.3",
|
||||
"grunt-csscomb": "~2.0.1",
|
||||
"grunt-exec": "0.4.2",
|
||||
"grunt": "~0.4.5",
|
||||
"grunt-banner": "~0.4.0",
|
||||
"grunt-contrib-clean": "~0.6.0",
|
||||
"grunt-contrib-concat": "~0.5.0",
|
||||
"grunt-contrib-connect": "~0.11.0",
|
||||
"grunt-contrib-copy": "~0.8.0",
|
||||
"grunt-contrib-csslint": "~0.5.0",
|
||||
"grunt-contrib-cssmin": "~0.13.0",
|
||||
"grunt-contrib-jade": "~0.15.0",
|
||||
"grunt-contrib-jshint": "~0.11.0",
|
||||
"grunt-contrib-less": "~1.0",
|
||||
"grunt-contrib-qunit": "~0.7.0",
|
||||
"grunt-contrib-uglify": "~0.9.0",
|
||||
"grunt-contrib-watch": "~0.6.0",
|
||||
"grunt-csscomb": "~3.0.0",
|
||||
"grunt-exec": "~0.4.2",
|
||||
"grunt-html-validation": "~0.1.13",
|
||||
"grunt-jekyll": "~0.4.1",
|
||||
"grunt-jscs-checker": "~0.3.0",
|
||||
"grunt-saucelabs": "~5.0.0",
|
||||
"grunt-sed": "~0.1.1",
|
||||
"load-grunt-tasks": "~0.3.0",
|
||||
"grunt-jscs": "~2.0.0",
|
||||
"grunt-saucelabs": "~8.6.0",
|
||||
"grunt-text-replace": "~0.4.0",
|
||||
"load-grunt-tasks": "~3.2",
|
||||
"markdown": "~0.5.0"
|
||||
},
|
||||
"jspm": {
|
||||
|
||||
39
scss/_alerts-fixed.scss
Normal file
39
scss/_alerts-fixed.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
42
scss/_button-labels.scss
Normal file
42
scss/_button-labels.scss
Normal file
@@ -0,0 +1,42 @@
|
||||
// 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);
|
||||
}
|
||||
.btn-group > .btn:last-child:not(:first-child) .btn-label, .btn-group > .dropdown-toggle:not(:first-child) .btn-label {
|
||||
border-bottom-left-radius: 0px;
|
||||
border-top-left-radius: 0px;
|
||||
}
|
||||
122
scss/_fileinput.scss
Normal file
122
scss/_fileinput.scss
Normal file
@@ -0,0 +1,122 @@
|
||||
// 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;
|
||||
}
|
||||
|
||||
//close X button alignment
|
||||
.fileinput-exists.close {
|
||||
float: none;
|
||||
}
|
||||
|
||||
.fileinput-inline .fileinput-controls {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.fileinput-filename {
|
||||
vertical-align: middle;
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.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;
|
||||
}
|
||||
10
scss/_grid-container-smooth.scss
Normal file
10
scss/_grid-container-smooth.scss
Normal file
@@ -0,0 +1,10 @@
|
||||
// Smooth sizing container
|
||||
// -------------------------
|
||||
|
||||
.container-smooth {
|
||||
max-width: $container-lg;
|
||||
|
||||
@media (min-width: 1px) {
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
97
scss/_nav-tab-alignment.scss
Normal file
97
scss/_nav-tab-alignment.scss
Normal 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
273
scss/_navmenu.scss
Normal 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;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.navmenu-fixed-left,
|
||||
.navbar-offcanvas.navmenu-fixed-left {
|
||||
left: 0;
|
||||
right: auto;
|
||||
border-width: 0 1px 0 0;
|
||||
bottom: 0;
|
||||
}
|
||||
.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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
52
scss/_offcanvas.scss
Normal file
52
scss/_offcanvas.scss
Normal file
@@ -0,0 +1,52 @@
|
||||
// Off canvas navigation
|
||||
// --------------------------------------------------
|
||||
|
||||
@mixin offcanvas {
|
||||
display: none;
|
||||
&.in {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.offcanvas {
|
||||
@include offcanvas;
|
||||
}
|
||||
|
||||
@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
22
scss/_rowlink.scss
Normal 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
66
scss/_variables.scss
Normal file
@@ -0,0 +1,66 @@
|
||||
//
|
||||
// Variables
|
||||
//
|
||||
// Either vanilla 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;
|
||||
18
scss/jasny-bootstrap.scss
Normal file
18
scss/jasny-bootstrap.scss
Normal file
@@ -0,0 +1,18 @@
|
||||
// Vanilla Bootstrap's "variables.scss" should already be imported
|
||||
|
||||
// Core variables
|
||||
@import "variables";
|
||||
|
||||
// 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
@@ -1,107 +0,0 @@
|
||||
#!/usr/bin/env python2.7
|
||||
from __future__ import absolute_import, unicode_literals, print_function, division
|
||||
|
||||
from sys import argv
|
||||
from os import environ, stat, remove as _delete_file
|
||||
from os.path import isfile, dirname, basename, abspath
|
||||
from hashlib import sha256
|
||||
from subprocess import check_call as run
|
||||
|
||||
from boto.s3.connection import S3Connection
|
||||
from boto.s3.key import Key
|
||||
from boto.exception import S3ResponseError
|
||||
|
||||
|
||||
NEED_TO_UPLOAD_MARKER = '.need-to-upload'
|
||||
BYTES_PER_MB = 1024 * 1024
|
||||
try:
|
||||
BUCKET_NAME = environ['TWBS_S3_BUCKET']
|
||||
except KeyError:
|
||||
raise SystemExit("TWBS_S3_BUCKET environment variable not set!")
|
||||
|
||||
|
||||
def _sha256_of_file(filename):
|
||||
hasher = sha256()
|
||||
with open(filename, 'rb') as input_file:
|
||||
hasher.update(input_file.read())
|
||||
file_hash = hasher.hexdigest()
|
||||
print('sha256({}) = {}'.format(filename, file_hash))
|
||||
return file_hash
|
||||
|
||||
|
||||
def _delete_file_quietly(filename):
|
||||
try:
|
||||
_delete_file(filename)
|
||||
except (OSError, IOError):
|
||||
pass
|
||||
|
||||
|
||||
def _tarball_size(directory):
|
||||
kib = stat(_tarball_filename_for(directory)).st_size // BYTES_PER_MB
|
||||
return "{} MiB".format(kib)
|
||||
|
||||
|
||||
def _tarball_filename_for(directory):
|
||||
return abspath('./{}.tar.gz'.format(basename(directory)))
|
||||
|
||||
|
||||
def _create_tarball(directory):
|
||||
print("Creating tarball of {}...".format(directory))
|
||||
run(['tar', '-czf', _tarball_filename_for(directory), '-C', dirname(directory), basename(directory)])
|
||||
|
||||
|
||||
def _extract_tarball(directory):
|
||||
print("Extracting tarball of {}...".format(directory))
|
||||
run(['tar', '-xzf', _tarball_filename_for(directory), '-C', dirname(directory)])
|
||||
|
||||
|
||||
def download(directory):
|
||||
_delete_file_quietly(NEED_TO_UPLOAD_MARKER)
|
||||
try:
|
||||
print("Downloading {} tarball from S3...".format(friendly_name))
|
||||
key.get_contents_to_filename(_tarball_filename_for(directory))
|
||||
except S3ResponseError as err:
|
||||
open(NEED_TO_UPLOAD_MARKER, 'a').close()
|
||||
print(err)
|
||||
raise SystemExit("Cached {} download failed!".format(friendly_name))
|
||||
print("Downloaded {}.".format(_tarball_size(directory)))
|
||||
_extract_tarball(directory)
|
||||
print("{} successfully installed from cache.".format(friendly_name))
|
||||
|
||||
|
||||
def upload(directory):
|
||||
_create_tarball(directory)
|
||||
print("Uploading {} tarball to S3... ({})".format(friendly_name, _tarball_size(directory)))
|
||||
key.set_contents_from_filename(_tarball_filename_for(directory))
|
||||
print("{} cache successfully updated.".format(friendly_name))
|
||||
_delete_file_quietly(NEED_TO_UPLOAD_MARKER)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Uses environment variables:
|
||||
# AWS_ACCESS_KEY_ID -- AWS Access Key ID
|
||||
# AWS_SECRET_ACCESS_KEY -- AWS Secret Access Key
|
||||
argv.pop(0)
|
||||
if len(argv) != 4:
|
||||
raise SystemExit("USAGE: s3_cache.py <download | upload> <friendly name> <dependencies file> <directory>")
|
||||
mode, friendly_name, dependencies_file, directory = argv
|
||||
|
||||
conn = S3Connection()
|
||||
bucket = conn.lookup(BUCKET_NAME, validate=False)
|
||||
if bucket is None:
|
||||
raise SystemExit("Could not access bucket!")
|
||||
|
||||
dependencies_file_hash = _sha256_of_file(dependencies_file)
|
||||
|
||||
key = Key(bucket, dependencies_file_hash)
|
||||
key.storage_class = 'REDUCED_REDUNDANCY'
|
||||
|
||||
if mode == 'download':
|
||||
download(directory)
|
||||
elif mode == 'upload':
|
||||
if isfile(NEED_TO_UPLOAD_MARKER): # FIXME
|
||||
upload(directory)
|
||||
else:
|
||||
print("No need to upload anything.")
|
||||
else:
|
||||
raise SystemExit("Unrecognized mode {!r}".format(mode))
|
||||
Reference in New Issue
Block a user