Use of Grunt and Bower
This commit is contained in:
parent
a8802b3ce4
commit
65eb8e695e
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,3 +3,4 @@ chrome-app*
|
|||||||
.settings
|
.settings
|
||||||
node_modules
|
node_modules
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
res/bower-libs
|
||||||
|
209
Gruntfile.js
Normal file
209
Gruntfile.js
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
module.exports = function(grunt) {
|
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-requirejs');
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-less');
|
||||||
|
grunt.loadNpmTasks('grunt-string-replace');
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-copy');
|
||||||
|
grunt.loadNpmTasks('grunt-bower-requirejs');
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Configuration
|
||||||
|
*/
|
||||||
|
grunt.initConfig({
|
||||||
|
pkg: grunt.file.readJSON('package.json'),
|
||||||
|
requirejs: {
|
||||||
|
compile: {
|
||||||
|
options: {
|
||||||
|
baseUrl: "res",
|
||||||
|
name: "main",
|
||||||
|
out: "res-min/main.js",
|
||||||
|
mainConfigFile: 'res/main.js',
|
||||||
|
optimize: "uglify2",
|
||||||
|
uglify2: {
|
||||||
|
output: {
|
||||||
|
beautify: true,
|
||||||
|
indent_level: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
excludeShallow: [
|
||||||
|
'css/css-builder',
|
||||||
|
'less/lessc-server',
|
||||||
|
'less/lessc'
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
less: {
|
||||||
|
compile: {
|
||||||
|
files: [
|
||||||
|
{
|
||||||
|
expand: true,
|
||||||
|
cwd: 'res/themes',
|
||||||
|
src: [
|
||||||
|
'*.less'
|
||||||
|
],
|
||||||
|
dest: 'res-min/themes',
|
||||||
|
ext: '.css',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
compress: {
|
||||||
|
options: {
|
||||||
|
compress: true,
|
||||||
|
paths: 'res/styles'
|
||||||
|
},
|
||||||
|
files: [
|
||||||
|
{
|
||||||
|
expand: true,
|
||||||
|
cwd: 'res-min/themes',
|
||||||
|
src: [
|
||||||
|
'*.css'
|
||||||
|
],
|
||||||
|
dest: 'res-min/themes',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'string-replace': {
|
||||||
|
'css-import': {
|
||||||
|
files: {
|
||||||
|
'./': 'res-min/themes/*.css',
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
replacements: [
|
||||||
|
{
|
||||||
|
pattern: /@import /g,
|
||||||
|
replacement: '@import (less) '
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'cache-manifest': {
|
||||||
|
files: {
|
||||||
|
'cache.manifest': 'cache.manifest'
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
replacements: [
|
||||||
|
{
|
||||||
|
pattern: /(#Date ).*/,
|
||||||
|
replacement: '$1<%= grunt.template.today() %>'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: /(#DynamicResourcesBegin\n)[\s\S]*(\n#DynamicResourcesEnd)/,
|
||||||
|
replacement: '$1<%= resources %>$2'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
copy: {
|
||||||
|
resources: {
|
||||||
|
files: [
|
||||||
|
// Fonts
|
||||||
|
{
|
||||||
|
expand: true,
|
||||||
|
cwd: 'res/libs/fontello/font',
|
||||||
|
src: [
|
||||||
|
'**'
|
||||||
|
],
|
||||||
|
dest: 'res-min/font/'
|
||||||
|
},
|
||||||
|
// Images
|
||||||
|
{
|
||||||
|
expand: true,
|
||||||
|
cwd: 'res/img',
|
||||||
|
src: [
|
||||||
|
'**'
|
||||||
|
],
|
||||||
|
dest: 'res-min/img/'
|
||||||
|
},
|
||||||
|
// Libraries
|
||||||
|
{
|
||||||
|
expand: true,
|
||||||
|
cwd: 'res/bower-libs/requirejs',
|
||||||
|
src: [
|
||||||
|
'require.js'
|
||||||
|
],
|
||||||
|
dest: 'res-min/'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Inject bower dependencies into RequireJS configuration
|
||||||
|
bower: {
|
||||||
|
target: {
|
||||||
|
rjsConfig: 'res/main.js'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Clean
|
||||||
|
*/
|
||||||
|
grunt.registerTask('clean', function() {
|
||||||
|
|
||||||
|
// Remove res-min/ folder
|
||||||
|
grunt.file['delete']('res-min');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Build JavaScript
|
||||||
|
*/
|
||||||
|
grunt.registerTask('build-js', function() {
|
||||||
|
|
||||||
|
// Run r.js optimization
|
||||||
|
grunt.task.run('requirejs');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Build CSS
|
||||||
|
*/
|
||||||
|
grunt.registerTask('build-css', function() {
|
||||||
|
|
||||||
|
// First compile less files
|
||||||
|
grunt.task.run('less:compile');
|
||||||
|
// Then force evaluation of CSS imports
|
||||||
|
grunt.task.run('string-replace:css-import');
|
||||||
|
// Run less another time with CSS evaluation and compression
|
||||||
|
grunt.task.run('less:compress');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Resources
|
||||||
|
*/
|
||||||
|
grunt.registerTask('build-res', function() {
|
||||||
|
|
||||||
|
// Copy some resources (images, fonts...)
|
||||||
|
grunt.task.run('copy:resources');
|
||||||
|
|
||||||
|
// List resources and inject them in cache.manifest
|
||||||
|
grunt.task.run('list-res');
|
||||||
|
grunt.task.run('string-replace:cache-manifest');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Other tasks
|
||||||
|
*/
|
||||||
|
grunt.registerTask('list-res', function() {
|
||||||
|
var resourceList = [];
|
||||||
|
grunt.file.recurse('res-min', function(abspath) {
|
||||||
|
resourceList.push(abspath);
|
||||||
|
});
|
||||||
|
grunt.config.set('resources', resourceList.join('\n'));
|
||||||
|
});
|
||||||
|
|
||||||
|
function getResources(folder) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
grunt.registerTask('default', function() {
|
||||||
|
grunt.task.run('clean');
|
||||||
|
grunt.task.run('build-js');
|
||||||
|
grunt.task.run('build-css');
|
||||||
|
grunt.task.run('build-res');
|
||||||
|
});
|
||||||
|
};
|
21
bower.json
Normal file
21
bower.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "stackedit",
|
||||||
|
"dependencies": {
|
||||||
|
"bootstrap": "3.0.0",
|
||||||
|
"jquery": "2.0.3",
|
||||||
|
"underscore": "1.5.1",
|
||||||
|
"requirejs": "~2.1.8",
|
||||||
|
"require-css": "~0.0.7",
|
||||||
|
"require-less": "~0.0.7",
|
||||||
|
"mousetrap": "~1.4.4",
|
||||||
|
"jgrowl": "~1.2.10",
|
||||||
|
"google-code-prettify": "~1.0.0",
|
||||||
|
"highlightjs": "~7.3.0",
|
||||||
|
"jquery-ui": "~1.10.3",
|
||||||
|
"jquery-mousewheel": "~3.1.3",
|
||||||
|
"css_browser_selector": "*",
|
||||||
|
"FileSaver": "*",
|
||||||
|
"stacktrace": "~0.5.3",
|
||||||
|
"requirejs-text": "~2.0.10"
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,9 @@
|
|||||||
CACHE MANIFEST
|
CACHE MANIFEST
|
||||||
|
#Date Fri Aug 30 2013 23:33:00
|
||||||
|
|
||||||
CACHE:
|
CACHE:
|
||||||
index.html
|
index.html
|
||||||
viewer.html
|
viewer.html
|
||||||
res/libs/require.js
|
|
||||||
lib/MathJax/MathJax.js?config=TeX-AMS_HTML
|
lib/MathJax/MathJax.js?config=TeX-AMS_HTML
|
||||||
lib/MathJax/config/Safe.js
|
lib/MathJax/config/Safe.js
|
||||||
lib/MathJax/config/TeX-AMS_HTML.js
|
lib/MathJax/config/TeX-AMS_HTML.js
|
||||||
@ -85,9 +85,7 @@ lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js
|
|||||||
lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js
|
lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js
|
||||||
lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js
|
lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js
|
||||||
|
|
||||||
#dynamic
|
#DynamicResourcesBegin
|
||||||
|
|
||||||
# Mon 26 Aug 2013 13:29:32 WEST
|
|
||||||
res-min/font/fontello.eot
|
res-min/font/fontello.eot
|
||||||
res-min/font/fontello.svg
|
res-min/font/fontello.svg
|
||||||
res-min/font/fontello.ttf
|
res-min/font/fontello.ttf
|
||||||
@ -106,9 +104,11 @@ res-min/img/stackedit-32.ico
|
|||||||
res-min/img/stackedit-64.png
|
res-min/img/stackedit-64.png
|
||||||
res-min/img/stackedit-promo.png
|
res-min/img/stackedit-promo.png
|
||||||
res-min/main.js
|
res-min/main.js
|
||||||
|
res-min/require.js
|
||||||
res-min/themes/blue-gray.css
|
res-min/themes/blue-gray.css
|
||||||
res-min/themes/default.css
|
res-min/themes/default.css
|
||||||
res-min/themes/night.css
|
res-min/themes/night.css
|
||||||
|
#DynamicResourcesEnd
|
||||||
|
|
||||||
NETWORK:
|
NETWORK:
|
||||||
*
|
*
|
@ -24,7 +24,7 @@
|
|||||||
]
|
]
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script src="res/libs/require.js"></script>
|
<script src="res-min/require.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
35
package.json
Normal file
35
package.json
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "stackedit",
|
||||||
|
"version": "2.0.0",
|
||||||
|
"description": "StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.",
|
||||||
|
"main": "res/main.js",
|
||||||
|
"directories": {
|
||||||
|
"doc": "doc"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"less": "~1.4.2",
|
||||||
|
"requirejs": "~2.1.8"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"grunt": "~0.4.1",
|
||||||
|
"grunt-contrib-requirejs": "~0.4.1",
|
||||||
|
"grunt-contrib-less": "~0.7.0",
|
||||||
|
"grunt-string-replace": "~0.2.4",
|
||||||
|
"grunt-contrib-copy": "~0.4.1",
|
||||||
|
"bower": "~1.2.5",
|
||||||
|
"grunt-bower-requirejs": "~0.7.1",
|
||||||
|
"grunt-bower-task": "~0.3.1"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/benweet/stackedit.git"
|
||||||
|
},
|
||||||
|
"author": "Benoit Schweblin",
|
||||||
|
"license": "Apache License",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/benweet/stackedit/issues"
|
||||||
|
}
|
||||||
|
}
|
8803
res-min/main.js
8803
res-min/main.js
File diff suppressed because one or more lines are too long
@ -1,5 +1,5 @@
|
|||||||
/** vim: et:ts=4:sw=4:sts=4
|
/** vim: et:ts=4:sw=4:sts=4
|
||||||
* @license RequireJS 2.1.6 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
|
* @license RequireJS 2.1.8 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
|
||||||
* Available via the MIT or new BSD license.
|
* Available via the MIT or new BSD license.
|
||||||
* see: http://github.com/jrburke/requirejs for details
|
* see: http://github.com/jrburke/requirejs for details
|
||||||
*/
|
*/
|
||||||
@ -12,7 +12,7 @@ var requirejs, require, define;
|
|||||||
(function (global) {
|
(function (global) {
|
||||||
var req, s, head, baseElement, dataMain, src,
|
var req, s, head, baseElement, dataMain, src,
|
||||||
interactiveScript, currentlyAddingScript, mainScript, subPath,
|
interactiveScript, currentlyAddingScript, mainScript, subPath,
|
||||||
version = '2.1.6',
|
version = '2.1.8',
|
||||||
commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
|
commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
|
||||||
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
|
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
|
||||||
jsSuffixRegExp = /\.js$/,
|
jsSuffixRegExp = /\.js$/,
|
||||||
@ -1794,6 +1794,19 @@ var requirejs, require, define;
|
|||||||
*/
|
*/
|
||||||
req.onError = defaultOnError;
|
req.onError = defaultOnError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the node for the load command. Only used in browser envs.
|
||||||
|
*/
|
||||||
|
req.createNode = function (config, moduleName, url) {
|
||||||
|
var node = config.xhtml ?
|
||||||
|
document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :
|
||||||
|
document.createElement('script');
|
||||||
|
node.type = config.scriptType || 'text/javascript';
|
||||||
|
node.charset = 'utf-8';
|
||||||
|
node.async = true;
|
||||||
|
return node;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does the request to load a module for the browser case.
|
* Does the request to load a module for the browser case.
|
||||||
* Make this a separate function to allow other environments
|
* Make this a separate function to allow other environments
|
||||||
@ -1808,12 +1821,7 @@ var requirejs, require, define;
|
|||||||
node;
|
node;
|
||||||
if (isBrowser) {
|
if (isBrowser) {
|
||||||
//In the browser so use a script tag
|
//In the browser so use a script tag
|
||||||
node = config.xhtml ?
|
node = req.createNode(config, moduleName, url);
|
||||||
document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :
|
|
||||||
document.createElement('script');
|
|
||||||
node.type = config.scriptType || 'text/javascript';
|
|
||||||
node.charset = 'utf-8';
|
|
||||||
node.async = true;
|
|
||||||
|
|
||||||
node.setAttribute('data-requirecontext', context.contextName);
|
node.setAttribute('data-requirecontext', context.contextName);
|
||||||
node.setAttribute('data-requiremodule', moduleName);
|
node.setAttribute('data-requiremodule', moduleName);
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -2,8 +2,7 @@ define([
|
|||||||
"underscore",
|
"underscore",
|
||||||
"utils",
|
"utils",
|
||||||
"eventMgr",
|
"eventMgr",
|
||||||
"config",
|
"config"
|
||||||
"libs/stacktrace",
|
|
||||||
], function(_, utils, eventMgr) {
|
], function(_, utils, eventMgr) {
|
||||||
|
|
||||||
var taskQueue = [];
|
var taskQueue = [];
|
||||||
@ -115,7 +114,7 @@ define([
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enqueue() has to be called to add the task in the running task queue
|
* enqueue() has to be called to add the task to the task queue
|
||||||
*/
|
*/
|
||||||
AsyncTask.prototype.enqueue = function() {
|
AsyncTask.prototype.enqueue = function() {
|
||||||
taskQueue.push(this);
|
taskQueue.push(this);
|
||||||
|
@ -12,7 +12,7 @@ define([
|
|||||||
"text!html/settingsUserCustomExtensionTooltip.html",
|
"text!html/settingsUserCustomExtensionTooltip.html",
|
||||||
"storage",
|
"storage",
|
||||||
"config",
|
"config",
|
||||||
"libs/layout",
|
"uilayout",
|
||||||
"libs/Markdown.Editor"
|
"libs/Markdown.Editor"
|
||||||
], function($, _, crel, utils, settings, eventMgr, mousetrap, bodyIndexHTML, bodyViewerHTML, settingsTemplateTooltipHTML, settingsUserCustomExtensionTooltipHTML) {
|
], function($, _, crel, utils, settings, eventMgr, mousetrap, bodyIndexHTML, bodyViewerHTML, settingsTemplateTooltipHTML, settingsUserCustomExtensionTooltipHTML) {
|
||||||
|
|
||||||
|
@ -31,8 +31,8 @@ define([
|
|||||||
"extensions/buttonStat",
|
"extensions/buttonStat",
|
||||||
"extensions/buttonHtmlCode",
|
"extensions/buttonHtmlCode",
|
||||||
"extensions/buttonViewer",
|
"extensions/buttonViewer",
|
||||||
"libs/bootstrap/bootstrap",
|
"bootstrap",
|
||||||
"libs/jquery.waitforimages"
|
"jquery-waitforimages"
|
||||||
], function($, _, crel, utils, Extension, settings, settingsExtensionsAccordionHTML) {
|
], function($, _, crel, utils, Extension, settings, settingsExtensionsAccordionHTML) {
|
||||||
|
|
||||||
var eventMgr = {};
|
var eventMgr = {};
|
||||||
|
@ -2,7 +2,7 @@ define([
|
|||||||
"utils",
|
"utils",
|
||||||
"classes/Extension",
|
"classes/Extension",
|
||||||
"text!html/mathJaxSettingsBlock.html",
|
"text!html/mathJaxSettingsBlock.html",
|
||||||
"libs/MathJax",
|
"mathjax",
|
||||||
], function(utils, Extension, mathJaxSettingsBlockHTML) {
|
], function(utils, Extension, mathJaxSettingsBlockHTML) {
|
||||||
|
|
||||||
var mathJax = new Extension("mathJax", "MathJax", true);
|
var mathJax = new Extension("mathJax", "MathJax", true);
|
||||||
|
@ -3,8 +3,8 @@ define([
|
|||||||
"underscore",
|
"underscore",
|
||||||
"classes/Extension",
|
"classes/Extension",
|
||||||
"text!html/scrollLinkSettingsBlock.html",
|
"text!html/scrollLinkSettingsBlock.html",
|
||||||
"libs/css_browser_selector",
|
"css_browser_selector",
|
||||||
"libs/jquery.mousewheel"
|
'jquery-mousewheel',
|
||||||
], function($, _, Extension, scrollLinkSettingsBlockHTML) {
|
], function($, _, Extension, scrollLinkSettingsBlockHTML) {
|
||||||
|
|
||||||
var scrollLink = new Extension("scrollLink", "Scroll Link", true, true);
|
var scrollLink = new Extension("scrollLink", "Scroll Link", true, true);
|
||||||
|
@ -1,221 +0,0 @@
|
|||||||
/* FileSaver.js
|
|
||||||
* A saveAs() FileSaver implementation.
|
|
||||||
* 2013-01-23
|
|
||||||
*
|
|
||||||
* By Eli Grey, http://eligrey.com
|
|
||||||
* License: X11/MIT
|
|
||||||
* See LICENSE.md
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*global self */
|
|
||||||
/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
|
|
||||||
plusplus: true */
|
|
||||||
|
|
||||||
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
|
|
||||||
|
|
||||||
var saveAs = saveAs
|
|
||||||
|| (navigator.msSaveBlob && navigator.msSaveBlob.bind(navigator))
|
|
||||||
|| (function(view) {
|
|
||||||
"use strict";
|
|
||||||
try {
|
|
||||||
var
|
|
||||||
doc = view.document
|
|
||||||
// only get URL when necessary in case BlobBuilder.js hasn't overridden it yet
|
|
||||||
, get_URL = function() {
|
|
||||||
return view.URL || view.webkitURL || view;
|
|
||||||
}
|
|
||||||
, URL = view.URL || view.webkitURL || view
|
|
||||||
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
|
|
||||||
, can_use_save_link = "download" in save_link
|
|
||||||
, click = function(node) {
|
|
||||||
var event = doc.createEvent("MouseEvents");
|
|
||||||
event.initMouseEvent(
|
|
||||||
"click", true, false, view, 0, 0, 0, 0, 0
|
|
||||||
, false, false, false, false, 0, null
|
|
||||||
);
|
|
||||||
node.dispatchEvent(event);
|
|
||||||
}
|
|
||||||
, webkit_req_fs = view.webkitRequestFileSystem
|
|
||||||
, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
|
|
||||||
, throw_outside = function (ex) {
|
|
||||||
(view.setImmediate || view.setTimeout)(function() {
|
|
||||||
throw ex;
|
|
||||||
}, 0);
|
|
||||||
}
|
|
||||||
, force_saveable_type = "application/octet-stream"
|
|
||||||
, fs_min_size = 0
|
|
||||||
, deletion_queue = []
|
|
||||||
, process_deletion_queue = function() {
|
|
||||||
var i = deletion_queue.length;
|
|
||||||
while (i--) {
|
|
||||||
var file = deletion_queue[i];
|
|
||||||
if (typeof file === "string") { // file is an object URL
|
|
||||||
URL.revokeObjectURL(file);
|
|
||||||
} else { // file is a File
|
|
||||||
file.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
deletion_queue.length = 0; // clear queue
|
|
||||||
}
|
|
||||||
, dispatch = function(filesaver, event_types, event) {
|
|
||||||
event_types = [].concat(event_types);
|
|
||||||
var i = event_types.length;
|
|
||||||
while (i--) {
|
|
||||||
var listener = filesaver["on" + event_types[i]];
|
|
||||||
if (typeof listener === "function") {
|
|
||||||
try {
|
|
||||||
listener.call(filesaver, event || filesaver);
|
|
||||||
} catch (ex) {
|
|
||||||
throw_outside(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
, FileSaver = function(blob, name) {
|
|
||||||
// First try a.download, then web filesystem, then object URLs
|
|
||||||
var
|
|
||||||
filesaver = this
|
|
||||||
, type = blob.type
|
|
||||||
, blob_changed = false
|
|
||||||
, object_url
|
|
||||||
, target_view
|
|
||||||
, get_object_url = function() {
|
|
||||||
var object_url = get_URL().createObjectURL(blob);
|
|
||||||
deletion_queue.push(object_url);
|
|
||||||
return object_url;
|
|
||||||
}
|
|
||||||
, dispatch_all = function() {
|
|
||||||
dispatch(filesaver, "writestart progress write writeend".split(" "));
|
|
||||||
}
|
|
||||||
// on any filesys errors revert to saving with object URLs
|
|
||||||
, fs_error = function() {
|
|
||||||
// don't create more object URLs than needed
|
|
||||||
if (blob_changed || !object_url) {
|
|
||||||
object_url = get_object_url(blob);
|
|
||||||
}
|
|
||||||
if (target_view) {
|
|
||||||
target_view.location.href = object_url;
|
|
||||||
}
|
|
||||||
filesaver.readyState = filesaver.DONE;
|
|
||||||
dispatch_all();
|
|
||||||
}
|
|
||||||
, abortable = function(func) {
|
|
||||||
return function() {
|
|
||||||
if (filesaver.readyState !== filesaver.DONE) {
|
|
||||||
return func.apply(this, arguments);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
, create_if_not_found = {create: true, exclusive: false}
|
|
||||||
, slice
|
|
||||||
;
|
|
||||||
filesaver.readyState = filesaver.INIT;
|
|
||||||
if (!name) {
|
|
||||||
name = "download";
|
|
||||||
}
|
|
||||||
if (can_use_save_link) {
|
|
||||||
object_url = get_object_url(blob);
|
|
||||||
save_link.href = object_url;
|
|
||||||
save_link.download = name;
|
|
||||||
click(save_link);
|
|
||||||
filesaver.readyState = filesaver.DONE;
|
|
||||||
dispatch_all();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Object and web filesystem URLs have a problem saving in Google Chrome when
|
|
||||||
// viewed in a tab, so I force save with application/octet-stream
|
|
||||||
// http://code.google.com/p/chromium/issues/detail?id=91158
|
|
||||||
if (view.chrome && type && type !== force_saveable_type) {
|
|
||||||
slice = blob.slice || blob.webkitSlice;
|
|
||||||
blob = slice.call(blob, 0, blob.size, force_saveable_type);
|
|
||||||
blob_changed = true;
|
|
||||||
}
|
|
||||||
// Since I can't be sure that the guessed media type will trigger a download
|
|
||||||
// in WebKit, I append .download to the filename.
|
|
||||||
// https://bugs.webkit.org/show_bug.cgi?id=65440
|
|
||||||
if (webkit_req_fs && name !== "download") {
|
|
||||||
name += ".download";
|
|
||||||
}
|
|
||||||
if (type === force_saveable_type || webkit_req_fs) {
|
|
||||||
target_view = view;
|
|
||||||
} else {
|
|
||||||
target_view = view.open();
|
|
||||||
}
|
|
||||||
if (!req_fs) {
|
|
||||||
fs_error();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fs_min_size += blob.size;
|
|
||||||
req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
|
|
||||||
fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
|
|
||||||
var save = function() {
|
|
||||||
dir.getFile(name, create_if_not_found, abortable(function(file) {
|
|
||||||
file.createWriter(abortable(function(writer) {
|
|
||||||
writer.onwriteend = function(event) {
|
|
||||||
target_view.location.href = file.toURL();
|
|
||||||
deletion_queue.push(file);
|
|
||||||
filesaver.readyState = filesaver.DONE;
|
|
||||||
dispatch(filesaver, "writeend", event);
|
|
||||||
};
|
|
||||||
writer.onerror = function() {
|
|
||||||
var error = writer.error;
|
|
||||||
if (error.code !== error.ABORT_ERR) {
|
|
||||||
fs_error();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
"writestart progress write abort".split(" ").forEach(function(event) {
|
|
||||||
writer["on" + event] = filesaver["on" + event];
|
|
||||||
});
|
|
||||||
writer.write(blob);
|
|
||||||
filesaver.abort = function() {
|
|
||||||
writer.abort();
|
|
||||||
filesaver.readyState = filesaver.DONE;
|
|
||||||
};
|
|
||||||
filesaver.readyState = filesaver.WRITING;
|
|
||||||
}), fs_error);
|
|
||||||
}), fs_error);
|
|
||||||
};
|
|
||||||
dir.getFile(name, {create: false}, abortable(function(file) {
|
|
||||||
// delete file if it already exists
|
|
||||||
file.remove();
|
|
||||||
save();
|
|
||||||
}), abortable(function(ex) {
|
|
||||||
if (ex.code === ex.NOT_FOUND_ERR) {
|
|
||||||
save();
|
|
||||||
} else {
|
|
||||||
fs_error();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}), fs_error);
|
|
||||||
}), fs_error);
|
|
||||||
}
|
|
||||||
, FS_proto = FileSaver.prototype
|
|
||||||
, saveAs = function(blob, name) {
|
|
||||||
return new FileSaver(blob, name);
|
|
||||||
}
|
|
||||||
;
|
|
||||||
FS_proto.abort = function() {
|
|
||||||
var filesaver = this;
|
|
||||||
filesaver.readyState = filesaver.DONE;
|
|
||||||
dispatch(filesaver, "abort");
|
|
||||||
};
|
|
||||||
FS_proto.readyState = FS_proto.INIT = 0;
|
|
||||||
FS_proto.WRITING = 1;
|
|
||||||
FS_proto.DONE = 2;
|
|
||||||
|
|
||||||
FS_proto.error =
|
|
||||||
FS_proto.onwritestart =
|
|
||||||
FS_proto.onprogress =
|
|
||||||
FS_proto.onwrite =
|
|
||||||
FS_proto.onabort =
|
|
||||||
FS_proto.onerror =
|
|
||||||
FS_proto.onwriteend =
|
|
||||||
null;
|
|
||||||
|
|
||||||
view.addEventListener("unload", process_deletion_queue, false);
|
|
||||||
return saveAs;
|
|
||||||
}
|
|
||||||
catch(e) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}(self));
|
|
1999
res/libs/bootstrap/bootstrap.js
vendored
1999
res/libs/bootstrap/bootstrap.js
vendored
File diff suppressed because it is too large
Load Diff
@ -1,67 +0,0 @@
|
|||||||
//
|
|
||||||
// Alerts
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base styles
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.alert {
|
|
||||||
padding: @alert-padding;
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: @alert-border-radius;
|
|
||||||
|
|
||||||
// Headings for larger alerts
|
|
||||||
h4 {
|
|
||||||
margin-top: 0;
|
|
||||||
// Specified for the h4 to prevent conflicts of changing @headingsColor
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
// Provide class for links that match alerts
|
|
||||||
.alert-link {
|
|
||||||
font-weight: @alert-link-font-weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Improve alignment and spacing of inner content
|
|
||||||
> p,
|
|
||||||
> ul {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
> p + p {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dismissable alerts
|
|
||||||
//
|
|
||||||
// Expand the right padding and account for the close button's positioning.
|
|
||||||
|
|
||||||
.alert-dismissable {
|
|
||||||
padding-right: (@alert-padding + 20);
|
|
||||||
|
|
||||||
// Adjust close link position
|
|
||||||
.close {
|
|
||||||
position: relative;
|
|
||||||
top: -2px;
|
|
||||||
right: -21px;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alternate styles
|
|
||||||
//
|
|
||||||
// Generate contextual modifier classes for colorizing the alert.
|
|
||||||
|
|
||||||
.alert-success {
|
|
||||||
.alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);
|
|
||||||
}
|
|
||||||
.alert-info {
|
|
||||||
.alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);
|
|
||||||
}
|
|
||||||
.alert-warning {
|
|
||||||
.alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);
|
|
||||||
}
|
|
||||||
.alert-danger {
|
|
||||||
.alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
//
|
|
||||||
// Badges
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base classes
|
|
||||||
.badge {
|
|
||||||
display: inline-block;
|
|
||||||
min-width: 10px;
|
|
||||||
padding: 3px 7px;
|
|
||||||
font-size: @font-size-small;
|
|
||||||
font-weight: @badge-font-weight;
|
|
||||||
color: @badge-color;
|
|
||||||
line-height: @badge-line-height;
|
|
||||||
vertical-align: baseline;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-align: center;
|
|
||||||
background-color: @badge-bg;
|
|
||||||
border-radius: @badge-border-radius;
|
|
||||||
|
|
||||||
// Empty badges collapse automatically (not available in IE8)
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover state, but only for links
|
|
||||||
a.badge {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @badge-link-hover-color;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quick fix for labels/badges in buttons
|
|
||||||
.btn .badge {
|
|
||||||
position: relative;
|
|
||||||
top: -1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Account for counters in navs
|
|
||||||
a.list-group-item.active > .badge,
|
|
||||||
.nav-pills > .active > a > .badge {
|
|
||||||
color: @badge-active-color;
|
|
||||||
background-color: @badge-active-bg;
|
|
||||||
}
|
|
||||||
.nav-pills > li > a > .badge {
|
|
||||||
margin-left: 3px;
|
|
||||||
}
|
|
59
res/libs/bootstrap/less/bootstrap.less
vendored
59
res/libs/bootstrap/less/bootstrap.less
vendored
@ -1,59 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Bootstrap v3.0.0
|
|
||||||
*
|
|
||||||
* Copyright 2013 Twitter, Inc
|
|
||||||
* Licensed under the Apache License v2.0
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Designed and built with all the love in the world by @mdo and @fat.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Core variables and mixins
|
|
||||||
@import "variables.less";
|
|
||||||
@import "mixins.less";
|
|
||||||
|
|
||||||
// Reset
|
|
||||||
@import "normalize.less";
|
|
||||||
@import "print.less";
|
|
||||||
|
|
||||||
// Core CSS
|
|
||||||
@import "scaffolding.less";
|
|
||||||
@import "type.less";
|
|
||||||
@import "code.less";
|
|
||||||
@import "grid.less";
|
|
||||||
@import "tables.less";
|
|
||||||
@import "forms.less";
|
|
||||||
@import "buttons.less";
|
|
||||||
|
|
||||||
// Components
|
|
||||||
@import "component-animations.less";
|
|
||||||
@import "glyphicons.less";
|
|
||||||
@import "dropdowns.less";
|
|
||||||
@import "button-groups.less";
|
|
||||||
@import "input-groups.less";
|
|
||||||
@import "navs.less";
|
|
||||||
@import "navbar.less";
|
|
||||||
@import "breadcrumbs.less";
|
|
||||||
@import "pagination.less";
|
|
||||||
@import "pager.less";
|
|
||||||
@import "labels.less";
|
|
||||||
@import "badges.less";
|
|
||||||
@import "jumbotron.less";
|
|
||||||
@import "thumbnails.less";
|
|
||||||
@import "alerts.less";
|
|
||||||
@import "progress-bars.less";
|
|
||||||
@import "media.less";
|
|
||||||
@import "list-group.less";
|
|
||||||
@import "panels.less";
|
|
||||||
@import "wells.less";
|
|
||||||
@import "close.less";
|
|
||||||
|
|
||||||
// Components w/ JavaScript
|
|
||||||
@import "modals.less";
|
|
||||||
@import "tooltip.less";
|
|
||||||
@import "popovers.less";
|
|
||||||
@import "carousel.less";
|
|
||||||
|
|
||||||
// Utility classes
|
|
||||||
@import "utilities.less";
|
|
||||||
@import "responsive-utilities.less";
|
|
@ -1,23 +0,0 @@
|
|||||||
//
|
|
||||||
// Breadcrumbs
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.breadcrumb {
|
|
||||||
padding: 8px 15px;
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
list-style: none;
|
|
||||||
background-color: @breadcrumb-bg;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
> li {
|
|
||||||
display: inline-block;
|
|
||||||
&+li:before {
|
|
||||||
content: "/\00a0"; // Unicode space added since inline-block means non-collapsing white-space
|
|
||||||
padding: 0 5px;
|
|
||||||
color: @breadcrumb-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .active {
|
|
||||||
color: @breadcrumb-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,248 +0,0 @@
|
|||||||
//
|
|
||||||
// Button groups
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Button carets
|
|
||||||
//
|
|
||||||
// Match the button text color to the arrow/caret for indicating dropdown-ness.
|
|
||||||
|
|
||||||
.caret {
|
|
||||||
.btn-default & {
|
|
||||||
border-top-color: @btn-default-color;
|
|
||||||
}
|
|
||||||
.btn-primary &,
|
|
||||||
.btn-success &,
|
|
||||||
.btn-warning &,
|
|
||||||
.btn-danger &,
|
|
||||||
.btn-info & {
|
|
||||||
border-top-color: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.dropup {
|
|
||||||
& .btn-default .caret {
|
|
||||||
border-bottom-color: @btn-default-color;
|
|
||||||
}
|
|
||||||
.btn-primary,
|
|
||||||
.btn-success,
|
|
||||||
.btn-warning,
|
|
||||||
.btn-danger,
|
|
||||||
.btn-info {
|
|
||||||
.caret {
|
|
||||||
border-bottom-color: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make the div behave like a button
|
|
||||||
.btn-group,
|
|
||||||
.btn-group-vertical {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: middle; // match .btn alignment given font-size hack above
|
|
||||||
> .btn {
|
|
||||||
position: relative;
|
|
||||||
float: left;
|
|
||||||
// Bring the "active" button to the front
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
z-index: 2;
|
|
||||||
}
|
|
||||||
&:focus {
|
|
||||||
// Remove focus outline when dropdown JS adds it after closing the menu
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent double borders when buttons are next to each other
|
|
||||||
.btn-group {
|
|
||||||
.btn + .btn,
|
|
||||||
.btn + .btn-group,
|
|
||||||
.btn-group + .btn,
|
|
||||||
.btn-group + .btn-group {
|
|
||||||
margin-left: -1px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional: Group multiple button groups together for a toolbar
|
|
||||||
.btn-toolbar {
|
|
||||||
.clearfix();
|
|
||||||
|
|
||||||
.btn-group {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
// Space out series of button groups
|
|
||||||
> .btn,
|
|
||||||
> .btn-group {
|
|
||||||
+ .btn,
|
|
||||||
+ .btn-group {
|
|
||||||
margin-left: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
|
|
||||||
.btn-group > .btn:first-child {
|
|
||||||
margin-left: 0;
|
|
||||||
&:not(:last-child):not(.dropdown-toggle) {
|
|
||||||
.border-right-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
|
|
||||||
.btn-group > .btn:last-child:not(:first-child),
|
|
||||||
.btn-group > .dropdown-toggle:not(:first-child) {
|
|
||||||
.border-left-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
|
|
||||||
.btn-group > .btn-group {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
.btn-group > .btn-group:first-child {
|
|
||||||
> .btn:last-child,
|
|
||||||
> .dropdown-toggle {
|
|
||||||
.border-right-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.btn-group > .btn-group:last-child > .btn:first-child {
|
|
||||||
.border-left-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// On active and open, don't show outline
|
|
||||||
.btn-group .dropdown-toggle:active,
|
|
||||||
.btn-group.open .dropdown-toggle {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Sizing
|
|
||||||
//
|
|
||||||
// Remix the default button sizing classes into new ones for easier manipulation.
|
|
||||||
|
|
||||||
.btn-group-xs > .btn { .btn-xs(); }
|
|
||||||
.btn-group-sm > .btn { .btn-sm(); }
|
|
||||||
.btn-group-lg > .btn { .btn-lg(); }
|
|
||||||
|
|
||||||
|
|
||||||
// Split button dropdowns
|
|
||||||
// ----------------------
|
|
||||||
|
|
||||||
// Give the line between buttons some depth
|
|
||||||
.btn-group > .btn + .dropdown-toggle {
|
|
||||||
padding-left: 8px;
|
|
||||||
padding-right: 8px;
|
|
||||||
}
|
|
||||||
.btn-group > .btn-lg + .dropdown-toggle {
|
|
||||||
padding-left: 12px;
|
|
||||||
padding-right: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The clickable button for toggling the menu
|
|
||||||
// Remove the gradient and set the same inset shadow as the :active state
|
|
||||||
.btn-group.open .dropdown-toggle {
|
|
||||||
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Reposition the caret
|
|
||||||
.btn .caret {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
// Carets in other button sizes
|
|
||||||
.btn-lg .caret {
|
|
||||||
border-width: @caret-width-large @caret-width-large 0;
|
|
||||||
border-bottom-width: 0;
|
|
||||||
}
|
|
||||||
// Upside down carets for .dropup
|
|
||||||
.dropup .btn-lg .caret {
|
|
||||||
border-width: 0 @caret-width-large @caret-width-large;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Vertical button groups
|
|
||||||
// ----------------------
|
|
||||||
|
|
||||||
.btn-group-vertical {
|
|
||||||
> .btn,
|
|
||||||
> .btn-group {
|
|
||||||
display: block;
|
|
||||||
float: none;
|
|
||||||
width: 100%;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear floats so dropdown menus can be properly placed
|
|
||||||
> .btn-group {
|
|
||||||
.clearfix();
|
|
||||||
> .btn {
|
|
||||||
float: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .btn + .btn,
|
|
||||||
> .btn + .btn-group,
|
|
||||||
> .btn-group + .btn,
|
|
||||||
> .btn-group + .btn-group {
|
|
||||||
margin-top: -1px;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-group-vertical > .btn {
|
|
||||||
&:not(:first-child):not(:last-child) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
&:first-child:not(:last-child) {
|
|
||||||
border-top-right-radius: @border-radius-base;
|
|
||||||
.border-bottom-radius(0);
|
|
||||||
}
|
|
||||||
&:last-child:not(:first-child) {
|
|
||||||
border-bottom-left-radius: @border-radius-base;
|
|
||||||
.border-top-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
.btn-group-vertical > .btn-group:first-child {
|
|
||||||
> .btn:last-child,
|
|
||||||
> .dropdown-toggle {
|
|
||||||
.border-bottom-radius(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.btn-group-vertical > .btn-group:last-child > .btn:first-child {
|
|
||||||
.border-top-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Justified button groups
|
|
||||||
// ----------------------
|
|
||||||
|
|
||||||
.btn-group-justified {
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
table-layout: fixed;
|
|
||||||
border-collapse: separate;
|
|
||||||
.btn {
|
|
||||||
float: none;
|
|
||||||
display: table-cell;
|
|
||||||
width: 1%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checkbox and radio options
|
|
||||||
[data-toggle="buttons"] > .btn > input[type="radio"],
|
|
||||||
[data-toggle="buttons"] > .btn > input[type="checkbox"] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
@ -1,160 +0,0 @@
|
|||||||
//
|
|
||||||
// Buttons
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base styles
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Core styles
|
|
||||||
.btn {
|
|
||||||
display: inline-block;
|
|
||||||
padding: @padding-base-vertical @padding-base-horizontal;
|
|
||||||
margin-bottom: 0; // For input.btn
|
|
||||||
font-size: @font-size-base;
|
|
||||||
font-weight: @btn-font-weight;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
text-align: center;
|
|
||||||
vertical-align: middle;
|
|
||||||
cursor: pointer;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
white-space: nowrap;
|
|
||||||
.user-select(none);
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
.tab-focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @btn-default-color;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
outline: 0;
|
|
||||||
background-image: none;
|
|
||||||
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled,
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
cursor: not-allowed;
|
|
||||||
pointer-events: none; // Future-proof disabling of clicks
|
|
||||||
.opacity(.65);
|
|
||||||
.box-shadow(none);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Alternate buttons
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.btn-default {
|
|
||||||
.button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);
|
|
||||||
}
|
|
||||||
.btn-primary {
|
|
||||||
.button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);
|
|
||||||
}
|
|
||||||
// Warning appears as orange
|
|
||||||
.btn-warning {
|
|
||||||
.button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);
|
|
||||||
}
|
|
||||||
// Danger and error appear as red
|
|
||||||
.btn-danger {
|
|
||||||
.button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);
|
|
||||||
}
|
|
||||||
// Success appears as green
|
|
||||||
.btn-success {
|
|
||||||
.button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);
|
|
||||||
}
|
|
||||||
// Info appears as blue-green
|
|
||||||
.btn-info {
|
|
||||||
.button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Link buttons
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Make a button look and behave like a link
|
|
||||||
.btn-link {
|
|
||||||
color: @link-color;
|
|
||||||
font-weight: normal;
|
|
||||||
cursor: pointer;
|
|
||||||
border-radius: 0;
|
|
||||||
|
|
||||||
&,
|
|
||||||
&:active,
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
background-color: transparent;
|
|
||||||
.box-shadow(none);
|
|
||||||
}
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&:active {
|
|
||||||
border-color: transparent;
|
|
||||||
}
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @link-hover-color;
|
|
||||||
text-decoration: underline;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @btn-link-disabled-color;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Button Sizes
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.btn-lg {
|
|
||||||
// line-height: ensure even-numbered height of button next to large input
|
|
||||||
.button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
|
|
||||||
}
|
|
||||||
.btn-sm,
|
|
||||||
.btn-xs {
|
|
||||||
// line-height: ensure proper height of button next to small input
|
|
||||||
.button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
|
|
||||||
}
|
|
||||||
.btn-xs {
|
|
||||||
padding: 1px 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Block button
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.btn-block {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
padding-left: 0;
|
|
||||||
padding-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vertically space out multiple block buttons
|
|
||||||
.btn-block + .btn-block {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Specificity overrides
|
|
||||||
input[type="submit"],
|
|
||||||
input[type="reset"],
|
|
||||||
input[type="button"] {
|
|
||||||
&.btn-block {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,209 +0,0 @@
|
|||||||
//
|
|
||||||
// Carousel
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Wrapper for the slide container and indicators
|
|
||||||
.carousel {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-inner {
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
> .item {
|
|
||||||
display: none;
|
|
||||||
position: relative;
|
|
||||||
.transition(.6s ease-in-out left);
|
|
||||||
|
|
||||||
// Account for jankitude on images
|
|
||||||
> img,
|
|
||||||
> a > img {
|
|
||||||
.img-responsive();
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .active,
|
|
||||||
> .next,
|
|
||||||
> .prev { display: block; }
|
|
||||||
|
|
||||||
> .active {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .next,
|
|
||||||
> .prev {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .next {
|
|
||||||
left: 100%;
|
|
||||||
}
|
|
||||||
> .prev {
|
|
||||||
left: -100%;
|
|
||||||
}
|
|
||||||
> .next.left,
|
|
||||||
> .prev.right {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .active.left {
|
|
||||||
left: -100%;
|
|
||||||
}
|
|
||||||
> .active.right {
|
|
||||||
left: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Left/right controls for nav
|
|
||||||
// ---------------------------
|
|
||||||
|
|
||||||
.carousel-control {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
width: @carousel-control-width;
|
|
||||||
.opacity(@carousel-control-opacity);
|
|
||||||
font-size: @carousel-control-font-size;
|
|
||||||
color: @carousel-control-color;
|
|
||||||
text-align: center;
|
|
||||||
text-shadow: @carousel-text-shadow;
|
|
||||||
// We can't have this transition here because webkit cancels the carousel
|
|
||||||
// animation if you trip this while in the middle of another animation.
|
|
||||||
|
|
||||||
// Set gradients for backgrounds
|
|
||||||
&.left {
|
|
||||||
#gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));
|
|
||||||
}
|
|
||||||
&.right {
|
|
||||||
left: auto;
|
|
||||||
right: 0;
|
|
||||||
#gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover/focus state
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @carousel-control-color;
|
|
||||||
text-decoration: none;
|
|
||||||
.opacity(.9);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Toggles
|
|
||||||
.icon-prev,
|
|
||||||
.icon-next,
|
|
||||||
.glyphicon-chevron-left,
|
|
||||||
.glyphicon-chevron-right {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
z-index: 5;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.icon-prev,
|
|
||||||
.icon-next {
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
margin-top: -10px;
|
|
||||||
margin-left: -10px;
|
|
||||||
font-family: serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-prev {
|
|
||||||
&:before {
|
|
||||||
content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.icon-next {
|
|
||||||
&:before {
|
|
||||||
content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional indicator pips
|
|
||||||
//
|
|
||||||
// Add an unordered list with the following class and add a list item for each
|
|
||||||
// slide your carousel holds.
|
|
||||||
|
|
||||||
.carousel-indicators {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 10px;
|
|
||||||
left: 50%;
|
|
||||||
z-index: 15;
|
|
||||||
width: 60%;
|
|
||||||
margin-left: -30%;
|
|
||||||
padding-left: 0;
|
|
||||||
list-style: none;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
li {
|
|
||||||
display: inline-block;
|
|
||||||
width: 10px;
|
|
||||||
height: 10px;
|
|
||||||
margin: 1px;
|
|
||||||
text-indent: -999px;
|
|
||||||
border: 1px solid @carousel-indicator-border-color;
|
|
||||||
border-radius: 10px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.active {
|
|
||||||
margin: 0;
|
|
||||||
width: 12px;
|
|
||||||
height: 12px;
|
|
||||||
background-color: @carousel-indicator-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional captions
|
|
||||||
// -----------------------------
|
|
||||||
// Hidden by default for smaller viewports
|
|
||||||
.carousel-caption {
|
|
||||||
position: absolute;
|
|
||||||
left: 15%;
|
|
||||||
right: 15%;
|
|
||||||
bottom: 20px;
|
|
||||||
z-index: 10;
|
|
||||||
padding-top: 20px;
|
|
||||||
padding-bottom: 20px;
|
|
||||||
color: @carousel-caption-color;
|
|
||||||
text-align: center;
|
|
||||||
text-shadow: @carousel-text-shadow;
|
|
||||||
& .btn {
|
|
||||||
text-shadow: none; // No shadow for button elements in carousel-caption
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Scale up controls for tablets and up
|
|
||||||
@media screen and (min-width: @screen-tablet) {
|
|
||||||
|
|
||||||
// Scale up the controls a smidge
|
|
||||||
.carousel-control .icon-prev,
|
|
||||||
.carousel-control .icon-next {
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
margin-top: -15px;
|
|
||||||
margin-left: -15px;
|
|
||||||
font-size: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show and left align the captions
|
|
||||||
.carousel-caption {
|
|
||||||
left: 20%;
|
|
||||||
right: 20%;
|
|
||||||
padding-bottom: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move up the indicators
|
|
||||||
.carousel-indicators {
|
|
||||||
bottom: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
//
|
|
||||||
// Close icons
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.close {
|
|
||||||
float: right;
|
|
||||||
font-size: (@font-size-base * 1.5);
|
|
||||||
font-weight: @close-font-weight;
|
|
||||||
line-height: 1;
|
|
||||||
color: @close-color;
|
|
||||||
text-shadow: @close-text-shadow;
|
|
||||||
.opacity(.2);
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @close-color;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
.opacity(.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Additional properties for button version
|
|
||||||
// iOS requires the button element instead of an anchor tag.
|
|
||||||
// If you want the anchor version, it requires `href="#"`.
|
|
||||||
button& {
|
|
||||||
padding: 0;
|
|
||||||
cursor: pointer;
|
|
||||||
background: transparent;
|
|
||||||
border: 0;
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,56 +0,0 @@
|
|||||||
//
|
|
||||||
// Code (inline and blocK)
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Inline and block code styles
|
|
||||||
code,
|
|
||||||
pre {
|
|
||||||
font-family: @font-family-monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inline code
|
|
||||||
code {
|
|
||||||
padding: 2px 4px;
|
|
||||||
font-size: 90%;
|
|
||||||
color: @code-color;
|
|
||||||
background-color: @code-bg;
|
|
||||||
white-space: nowrap;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Blocks of code
|
|
||||||
pre {
|
|
||||||
display: block;
|
|
||||||
padding: ((@line-height-computed - 1) / 2);
|
|
||||||
margin: 0 0 (@line-height-computed / 2);
|
|
||||||
font-size: (@font-size-base - 1); // 14px to 13px
|
|
||||||
line-height: @line-height-base;
|
|
||||||
word-break: break-all;
|
|
||||||
word-wrap: break-word;
|
|
||||||
color: @pre-color;
|
|
||||||
background-color: @pre-bg;
|
|
||||||
border: 1px solid @pre-border-color;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
|
|
||||||
// Make prettyprint styles more spaced out for readability
|
|
||||||
&.prettyprint {
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Account for some code outputs that place code tags in pre tags
|
|
||||||
code {
|
|
||||||
padding: 0;
|
|
||||||
font-size: inherit;
|
|
||||||
color: inherit;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
background-color: transparent;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable scrollable blocks of code
|
|
||||||
.pre-scrollable {
|
|
||||||
max-height: @pre-scrollable-max-height;
|
|
||||||
overflow-y: scroll;
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
//
|
|
||||||
// Component animations
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Heads up!
|
|
||||||
//
|
|
||||||
// We don't use the `.opacity()` mixin here since it causes a bug with text
|
|
||||||
// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.
|
|
||||||
|
|
||||||
.fade {
|
|
||||||
opacity: 0;
|
|
||||||
.transition(opacity .15s linear);
|
|
||||||
&.in {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapse {
|
|
||||||
display: none;
|
|
||||||
&.in {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.collapsing {
|
|
||||||
position: relative;
|
|
||||||
height: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
.transition(height .35s ease);
|
|
||||||
}
|
|
@ -1,193 +0,0 @@
|
|||||||
//
|
|
||||||
// Dropdown menus
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Dropdown arrow/caret
|
|
||||||
.caret {
|
|
||||||
display: inline-block;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
margin-left: 2px;
|
|
||||||
vertical-align: middle;
|
|
||||||
border-top: @caret-width-base solid @dropdown-caret-color;
|
|
||||||
border-right: @caret-width-base solid transparent;
|
|
||||||
border-left: @caret-width-base solid transparent;
|
|
||||||
// Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once fixed,
|
|
||||||
// we can just straight up remove this.
|
|
||||||
border-bottom: 0 dotted;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// The dropdown wrapper (div)
|
|
||||||
.dropdown {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent the focus on the dropdown toggle when closing dropdowns
|
|
||||||
.dropdown-toggle:focus {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The dropdown menu (ul)
|
|
||||||
.dropdown-menu {
|
|
||||||
position: absolute;
|
|
||||||
top: 100%;
|
|
||||||
left: 0;
|
|
||||||
z-index: @zindex-dropdown;
|
|
||||||
display: none; // none by default, but block on "open" of the menu
|
|
||||||
float: left;
|
|
||||||
min-width: 160px;
|
|
||||||
padding: 5px 0;
|
|
||||||
margin: 2px 0 0; // override default ul
|
|
||||||
list-style: none;
|
|
||||||
font-size: @font-size-base;
|
|
||||||
background-color: @dropdown-bg;
|
|
||||||
border: 1px solid @dropdown-fallback-border; // IE8 fallback
|
|
||||||
border: 1px solid @dropdown-border;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
.box-shadow(0 6px 12px rgba(0,0,0,.175));
|
|
||||||
background-clip: padding-box;
|
|
||||||
|
|
||||||
// Aligns the dropdown menu to right
|
|
||||||
&.pull-right {
|
|
||||||
right: 0;
|
|
||||||
left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dividers (basically an hr) within the dropdown
|
|
||||||
.divider {
|
|
||||||
.nav-divider(@dropdown-divider-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Links within the dropdown menu
|
|
||||||
> li > a {
|
|
||||||
display: block;
|
|
||||||
padding: 3px 20px;
|
|
||||||
clear: both;
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
color: @dropdown-link-color;
|
|
||||||
white-space: nowrap; // prevent links from randomly breaking onto new lines
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover/Focus state
|
|
||||||
.dropdown-menu > li > a {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
color: @dropdown-link-hover-color;
|
|
||||||
background-color: @dropdown-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Active state
|
|
||||||
.dropdown-menu > .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @dropdown-link-active-color;
|
|
||||||
text-decoration: none;
|
|
||||||
outline: 0;
|
|
||||||
background-color: @dropdown-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disabled state
|
|
||||||
//
|
|
||||||
// Gray out text and ensure the hover/focus state remains gray
|
|
||||||
|
|
||||||
.dropdown-menu > .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @dropdown-link-disabled-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Nuke hover/focus effects
|
|
||||||
.dropdown-menu > .disabled > a {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: transparent;
|
|
||||||
background-image: none; // Remove CSS gradient
|
|
||||||
.reset-filter();
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open state for the dropdown
|
|
||||||
.open {
|
|
||||||
// Show the menu
|
|
||||||
> .dropdown-menu {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the outline when :focus is triggered
|
|
||||||
> a {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dropdown section headers
|
|
||||||
.dropdown-header {
|
|
||||||
display: block;
|
|
||||||
padding: 3px 20px;
|
|
||||||
font-size: @font-size-small;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
color: @dropdown-header-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Backdrop to catch body clicks on mobile, etc.
|
|
||||||
.dropdown-backdrop {
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
top: 0;
|
|
||||||
z-index: @zindex-dropdown - 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Right aligned dropdowns
|
|
||||||
.pull-right > .dropdown-menu {
|
|
||||||
right: 0;
|
|
||||||
left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow for dropdowns to go bottom up (aka, dropup-menu)
|
|
||||||
//
|
|
||||||
// Just add .dropup after the standard .dropdown class and you're set, bro.
|
|
||||||
// TODO: abstract this so that the navbar fixed styles are not placed here?
|
|
||||||
|
|
||||||
.dropup,
|
|
||||||
.navbar-fixed-bottom .dropdown {
|
|
||||||
// Reverse the caret
|
|
||||||
.caret {
|
|
||||||
// Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once this
|
|
||||||
// gets fixed, restore `border-top: 0;`.
|
|
||||||
border-top: 0 dotted;
|
|
||||||
border-bottom: 4px solid @dropdown-caret-color;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
// Different positioning for bottom up menu
|
|
||||||
.dropdown-menu {
|
|
||||||
top: auto;
|
|
||||||
bottom: 100%;
|
|
||||||
margin-bottom: 1px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Component alignment
|
|
||||||
//
|
|
||||||
// Reiterate per navbar.less and the modified component alignment there.
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
.navbar-right {
|
|
||||||
.dropdown-menu {
|
|
||||||
.pull-right > .dropdown-menu();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,353 +0,0 @@
|
|||||||
//
|
|
||||||
// Forms
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Normalize non-controls
|
|
||||||
//
|
|
||||||
// Restyle and baseline non-control form elements.
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
legend {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
padding: 0;
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
font-size: (@font-size-base * 1.5);
|
|
||||||
line-height: inherit;
|
|
||||||
color: @legend-color;
|
|
||||||
border: 0;
|
|
||||||
border-bottom: 1px solid @legend-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
display: inline-block;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Normalize form controls
|
|
||||||
|
|
||||||
// Override content-box in Normalize (* isn't specific enough)
|
|
||||||
input[type="search"] {
|
|
||||||
.box-sizing(border-box);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Position radios and checkboxes better
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
margin: 4px 0 0;
|
|
||||||
margin-top: 1px \9; /* IE8-9 */
|
|
||||||
line-height: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the height of select and file controls to match text inputs
|
|
||||||
input[type="file"] {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make multiple select elements height not fixed
|
|
||||||
select[multiple],
|
|
||||||
select[size] {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fix optgroup Firefox bug per https://github.com/twbs/bootstrap/issues/7611
|
|
||||||
select optgroup {
|
|
||||||
font-size: inherit;
|
|
||||||
font-style: inherit;
|
|
||||||
font-family: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Focus for select, file, radio, and checkbox
|
|
||||||
input[type="file"]:focus,
|
|
||||||
input[type="radio"]:focus,
|
|
||||||
input[type="checkbox"]:focus {
|
|
||||||
.tab-focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fix for Chrome number input
|
|
||||||
// Setting certain font-sizes causes the `I` bar to appear on hover of the bottom increment button.
|
|
||||||
// See https://github.com/twbs/bootstrap/issues/8350 for more.
|
|
||||||
input[type="number"] {
|
|
||||||
&::-webkit-outer-spin-button,
|
|
||||||
&::-webkit-inner-spin-button {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Placeholder
|
|
||||||
//
|
|
||||||
// Placeholder text gets special styles because when browsers invalidate entire
|
|
||||||
// lines if it doesn't understand a selector/
|
|
||||||
.form-control {
|
|
||||||
.placeholder();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Common form controls
|
|
||||||
//
|
|
||||||
// Shared size and type resets for form controls. Apply `.form-control` to any
|
|
||||||
// of the following form controls:
|
|
||||||
//
|
|
||||||
// select
|
|
||||||
// textarea
|
|
||||||
// input[type="text"]
|
|
||||||
// input[type="password"]
|
|
||||||
// input[type="datetime"]
|
|
||||||
// input[type="datetime-local"]
|
|
||||||
// input[type="date"]
|
|
||||||
// input[type="month"]
|
|
||||||
// input[type="time"]
|
|
||||||
// input[type="week"]
|
|
||||||
// input[type="number"]
|
|
||||||
// input[type="email"]
|
|
||||||
// input[type="url"]
|
|
||||||
// input[type="search"]
|
|
||||||
// input[type="tel"]
|
|
||||||
// input[type="color"]
|
|
||||||
|
|
||||||
.form-control {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
|
|
||||||
padding: @padding-base-vertical @padding-base-horizontal;
|
|
||||||
font-size: @font-size-base;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
color: @input-color;
|
|
||||||
vertical-align: middle;
|
|
||||||
background-color: @input-bg;
|
|
||||||
border: 1px solid @input-border;
|
|
||||||
border-radius: @input-border-radius;
|
|
||||||
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
|
|
||||||
.transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s");
|
|
||||||
|
|
||||||
// Customize the `:focus` state to imitate native WebKit styles.
|
|
||||||
.form-control-focus();
|
|
||||||
|
|
||||||
// Disabled and read-only inputs
|
|
||||||
// Note: HTML5 says that controls under a fieldset > legend:first-child won't
|
|
||||||
// be disabled if the fieldset is disabled. Due to implementation difficulty,
|
|
||||||
// we don't honor that edge case; we style them as disabled anyway.
|
|
||||||
&[disabled],
|
|
||||||
&[readonly],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
cursor: not-allowed;
|
|
||||||
background-color: @input-bg-disabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset height for `textarea`s
|
|
||||||
textarea& {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Form groups
|
|
||||||
//
|
|
||||||
// Designed to help with the organization and spacing of vertical forms. For
|
|
||||||
// horizontal forms, use the predefined grid classes.
|
|
||||||
|
|
||||||
.form-group {
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Checkboxes and radios
|
|
||||||
//
|
|
||||||
// Indent the labels to position radios/checkboxes as hanging controls.
|
|
||||||
|
|
||||||
.radio,
|
|
||||||
.checkbox {
|
|
||||||
display: block;
|
|
||||||
min-height: @line-height-computed; // clear the floating input if there is no label text
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
padding-left: 20px;
|
|
||||||
vertical-align: middle;
|
|
||||||
label {
|
|
||||||
display: inline;
|
|
||||||
margin-bottom: 0;
|
|
||||||
font-weight: normal;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.radio input[type="radio"],
|
|
||||||
.radio-inline input[type="radio"],
|
|
||||||
.checkbox input[type="checkbox"],
|
|
||||||
.checkbox-inline input[type="checkbox"] {
|
|
||||||
float: left;
|
|
||||||
margin-left: -20px;
|
|
||||||
}
|
|
||||||
.radio + .radio,
|
|
||||||
.checkbox + .checkbox {
|
|
||||||
margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
|
|
||||||
}
|
|
||||||
|
|
||||||
// Radios and checkboxes on same line
|
|
||||||
.radio-inline,
|
|
||||||
.checkbox-inline {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 20px;
|
|
||||||
margin-bottom: 0;
|
|
||||||
vertical-align: middle;
|
|
||||||
font-weight: normal;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.radio-inline + .radio-inline,
|
|
||||||
.checkbox-inline + .checkbox-inline {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-left: 10px; // space out consecutive inline controls
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply same disabled cursor tweak as for inputs
|
|
||||||
//
|
|
||||||
// Note: Neither radios nor checkboxes can be readonly.
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"],
|
|
||||||
.radio,
|
|
||||||
.radio-inline,
|
|
||||||
.checkbox,
|
|
||||||
.checkbox-inline {
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Form control sizing
|
|
||||||
.input-sm {
|
|
||||||
.input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-lg {
|
|
||||||
.input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Form control feedback states
|
|
||||||
//
|
|
||||||
// Apply contextual and semantic states to individual form controls.
|
|
||||||
|
|
||||||
// Warning
|
|
||||||
.has-warning {
|
|
||||||
.form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);
|
|
||||||
}
|
|
||||||
// Error
|
|
||||||
.has-error {
|
|
||||||
.form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);
|
|
||||||
}
|
|
||||||
// Success
|
|
||||||
.has-success {
|
|
||||||
.form-control-validation(@state-success-text; @state-success-text; @state-success-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Static form control text
|
|
||||||
//
|
|
||||||
// Apply class to a `p` element to make any string of text align with labels in
|
|
||||||
// a horizontal form layout.
|
|
||||||
|
|
||||||
.form-control-static {
|
|
||||||
margin-bottom: 0; // Remove default margin from `p`
|
|
||||||
padding-top: (@padding-base-vertical + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Help text
|
|
||||||
//
|
|
||||||
// Apply to any element you wish to create light text for placement immediately
|
|
||||||
// below a form control. Use for general help, formatting, or instructional text.
|
|
||||||
|
|
||||||
.help-block {
|
|
||||||
display: block; // account for any element using help-block
|
|
||||||
margin-top: 5px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
color: lighten(@text-color, 25%); // lighten the text some for contrast
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Inline forms
|
|
||||||
//
|
|
||||||
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
|
|
||||||
// forms begin stacked on extra small (mobile) devices and then go inline when
|
|
||||||
// viewports reach <768px.
|
|
||||||
//
|
|
||||||
// Requires wrapping inputs and labels with `.form-group` for proper display of
|
|
||||||
// default HTML form controls and our custom form controls (e.g., input groups).
|
|
||||||
//
|
|
||||||
// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
|
|
||||||
|
|
||||||
.form-inline {
|
|
||||||
|
|
||||||
// Kick in the inline
|
|
||||||
@media (min-width: @screen-tablet) {
|
|
||||||
// Inline-block all the things for "inline"
|
|
||||||
.form-group {
|
|
||||||
display: inline-block;
|
|
||||||
margin-bottom: 0;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// In navbar-form, allow folks to *not* use `.form-group`
|
|
||||||
.form-control {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove default margin on radios/checkboxes that were used for stacking, and
|
|
||||||
// then undo the floating of radios and checkboxes to match (which also avoids
|
|
||||||
// a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).
|
|
||||||
.radio,
|
|
||||||
.checkbox {
|
|
||||||
display: inline-block;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
.radio input[type="radio"],
|
|
||||||
.checkbox input[type="checkbox"] {
|
|
||||||
float: none;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Horizontal forms
|
|
||||||
//
|
|
||||||
// Horizontal forms are built on grid classes and allow you to create forms with
|
|
||||||
// labels on the left and inputs on the right.
|
|
||||||
|
|
||||||
.form-horizontal {
|
|
||||||
|
|
||||||
// Consistent vertical alignment of labels, radios, and checkboxes
|
|
||||||
.control-label,
|
|
||||||
.radio,
|
|
||||||
.checkbox,
|
|
||||||
.radio-inline,
|
|
||||||
.checkbox-inline {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
padding-top: (@padding-base-vertical + 1); // Default padding plus a border
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make form groups behave like rows
|
|
||||||
.form-group {
|
|
||||||
.make-row();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only right align form labels here when the columns stop stacking
|
|
||||||
@media (min-width: @screen-tablet) {
|
|
||||||
.control-label {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,232 +0,0 @@
|
|||||||
//
|
|
||||||
// Glyphicons for Bootstrap
|
|
||||||
//
|
|
||||||
// Since icons are fonts, they can be placed anywhere text is placed and are
|
|
||||||
// thus automatically sized to match the surrounding child. To use, create an
|
|
||||||
// inline element with the appropriate classes, like so:
|
|
||||||
//
|
|
||||||
// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
|
|
||||||
|
|
||||||
// Import the fonts
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Glyphicons Halflings';
|
|
||||||
src: url('@{icon-font-path}@{icon-font-name}.eot');
|
|
||||||
src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),
|
|
||||||
url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),
|
|
||||||
url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),
|
|
||||||
url('@{icon-font-path}@{icon-font-name}.svg#glyphicons-halflingsregular') format('svg');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Catchall baseclass
|
|
||||||
.glyphicon {
|
|
||||||
position: relative;
|
|
||||||
top: 1px;
|
|
||||||
display: inline-block;
|
|
||||||
font-family: 'Glyphicons Halflings';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: 1;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Individual icons
|
|
||||||
.glyphicon-asterisk { &:before { content: "\2a"; } }
|
|
||||||
.glyphicon-plus { &:before { content: "\2b"; } }
|
|
||||||
.glyphicon-euro { &:before { content: "\20ac"; } }
|
|
||||||
.glyphicon-minus { &:before { content: "\2212"; } }
|
|
||||||
.glyphicon-cloud { &:before { content: "\2601"; } }
|
|
||||||
.glyphicon-envelope { &:before { content: "\2709"; } }
|
|
||||||
.glyphicon-pencil { &:before { content: "\270f"; } }
|
|
||||||
.glyphicon-glass { &:before { content: "\e001"; } }
|
|
||||||
.glyphicon-music { &:before { content: "\e002"; } }
|
|
||||||
.glyphicon-search { &:before { content: "\e003"; } }
|
|
||||||
.glyphicon-heart { &:before { content: "\e005"; } }
|
|
||||||
.glyphicon-star { &:before { content: "\e006"; } }
|
|
||||||
.glyphicon-star-empty { &:before { content: "\e007"; } }
|
|
||||||
.glyphicon-user { &:before { content: "\e008"; } }
|
|
||||||
.glyphicon-film { &:before { content: "\e009"; } }
|
|
||||||
.glyphicon-th-large { &:before { content: "\e010"; } }
|
|
||||||
.glyphicon-th { &:before { content: "\e011"; } }
|
|
||||||
.glyphicon-th-list { &:before { content: "\e012"; } }
|
|
||||||
.glyphicon-ok { &:before { content: "\e013"; } }
|
|
||||||
.glyphicon-remove { &:before { content: "\e014"; } }
|
|
||||||
.glyphicon-zoom-in { &:before { content: "\e015"; } }
|
|
||||||
.glyphicon-zoom-out { &:before { content: "\e016"; } }
|
|
||||||
.glyphicon-off { &:before { content: "\e017"; } }
|
|
||||||
.glyphicon-signal { &:before { content: "\e018"; } }
|
|
||||||
.glyphicon-cog { &:before { content: "\e019"; } }
|
|
||||||
.glyphicon-trash { &:before { content: "\e020"; } }
|
|
||||||
.glyphicon-home { &:before { content: "\e021"; } }
|
|
||||||
.glyphicon-file { &:before { content: "\e022"; } }
|
|
||||||
.glyphicon-time { &:before { content: "\e023"; } }
|
|
||||||
.glyphicon-road { &:before { content: "\e024"; } }
|
|
||||||
.glyphicon-download-alt { &:before { content: "\e025"; } }
|
|
||||||
.glyphicon-download { &:before { content: "\e026"; } }
|
|
||||||
.glyphicon-upload { &:before { content: "\e027"; } }
|
|
||||||
.glyphicon-inbox { &:before { content: "\e028"; } }
|
|
||||||
.glyphicon-play-circle { &:before { content: "\e029"; } }
|
|
||||||
.glyphicon-repeat { &:before { content: "\e030"; } }
|
|
||||||
.glyphicon-refresh { &:before { content: "\e031"; } }
|
|
||||||
.glyphicon-list-alt { &:before { content: "\e032"; } }
|
|
||||||
.glyphicon-flag { &:before { content: "\e034"; } }
|
|
||||||
.glyphicon-headphones { &:before { content: "\e035"; } }
|
|
||||||
.glyphicon-volume-off { &:before { content: "\e036"; } }
|
|
||||||
.glyphicon-volume-down { &:before { content: "\e037"; } }
|
|
||||||
.glyphicon-volume-up { &:before { content: "\e038"; } }
|
|
||||||
.glyphicon-qrcode { &:before { content: "\e039"; } }
|
|
||||||
.glyphicon-barcode { &:before { content: "\e040"; } }
|
|
||||||
.glyphicon-tag { &:before { content: "\e041"; } }
|
|
||||||
.glyphicon-tags { &:before { content: "\e042"; } }
|
|
||||||
.glyphicon-book { &:before { content: "\e043"; } }
|
|
||||||
.glyphicon-print { &:before { content: "\e045"; } }
|
|
||||||
.glyphicon-font { &:before { content: "\e047"; } }
|
|
||||||
.glyphicon-bold { &:before { content: "\e048"; } }
|
|
||||||
.glyphicon-italic { &:before { content: "\e049"; } }
|
|
||||||
.glyphicon-text-height { &:before { content: "\e050"; } }
|
|
||||||
.glyphicon-text-width { &:before { content: "\e051"; } }
|
|
||||||
.glyphicon-align-left { &:before { content: "\e052"; } }
|
|
||||||
.glyphicon-align-center { &:before { content: "\e053"; } }
|
|
||||||
.glyphicon-align-right { &:before { content: "\e054"; } }
|
|
||||||
.glyphicon-align-justify { &:before { content: "\e055"; } }
|
|
||||||
.glyphicon-list { &:before { content: "\e056"; } }
|
|
||||||
.glyphicon-indent-left { &:before { content: "\e057"; } }
|
|
||||||
.glyphicon-indent-right { &:before { content: "\e058"; } }
|
|
||||||
.glyphicon-facetime-video { &:before { content: "\e059"; } }
|
|
||||||
.glyphicon-picture { &:before { content: "\e060"; } }
|
|
||||||
.glyphicon-map-marker { &:before { content: "\e062"; } }
|
|
||||||
.glyphicon-adjust { &:before { content: "\e063"; } }
|
|
||||||
.glyphicon-tint { &:before { content: "\e064"; } }
|
|
||||||
.glyphicon-edit { &:before { content: "\e065"; } }
|
|
||||||
.glyphicon-share { &:before { content: "\e066"; } }
|
|
||||||
.glyphicon-check { &:before { content: "\e067"; } }
|
|
||||||
.glyphicon-move { &:before { content: "\e068"; } }
|
|
||||||
.glyphicon-step-backward { &:before { content: "\e069"; } }
|
|
||||||
.glyphicon-fast-backward { &:before { content: "\e070"; } }
|
|
||||||
.glyphicon-backward { &:before { content: "\e071"; } }
|
|
||||||
.glyphicon-play { &:before { content: "\e072"; } }
|
|
||||||
.glyphicon-pause { &:before { content: "\e073"; } }
|
|
||||||
.glyphicon-stop { &:before { content: "\e074"; } }
|
|
||||||
.glyphicon-forward { &:before { content: "\e075"; } }
|
|
||||||
.glyphicon-fast-forward { &:before { content: "\e076"; } }
|
|
||||||
.glyphicon-step-forward { &:before { content: "\e077"; } }
|
|
||||||
.glyphicon-eject { &:before { content: "\e078"; } }
|
|
||||||
.glyphicon-chevron-left { &:before { content: "\e079"; } }
|
|
||||||
.glyphicon-chevron-right { &:before { content: "\e080"; } }
|
|
||||||
.glyphicon-plus-sign { &:before { content: "\e081"; } }
|
|
||||||
.glyphicon-minus-sign { &:before { content: "\e082"; } }
|
|
||||||
.glyphicon-remove-sign { &:before { content: "\e083"; } }
|
|
||||||
.glyphicon-ok-sign { &:before { content: "\e084"; } }
|
|
||||||
.glyphicon-question-sign { &:before { content: "\e085"; } }
|
|
||||||
.glyphicon-info-sign { &:before { content: "\e086"; } }
|
|
||||||
.glyphicon-screenshot { &:before { content: "\e087"; } }
|
|
||||||
.glyphicon-remove-circle { &:before { content: "\e088"; } }
|
|
||||||
.glyphicon-ok-circle { &:before { content: "\e089"; } }
|
|
||||||
.glyphicon-ban-circle { &:before { content: "\e090"; } }
|
|
||||||
.glyphicon-arrow-left { &:before { content: "\e091"; } }
|
|
||||||
.glyphicon-arrow-right { &:before { content: "\e092"; } }
|
|
||||||
.glyphicon-arrow-up { &:before { content: "\e093"; } }
|
|
||||||
.glyphicon-arrow-down { &:before { content: "\e094"; } }
|
|
||||||
.glyphicon-share-alt { &:before { content: "\e095"; } }
|
|
||||||
.glyphicon-resize-full { &:before { content: "\e096"; } }
|
|
||||||
.glyphicon-resize-small { &:before { content: "\e097"; } }
|
|
||||||
.glyphicon-exclamation-sign { &:before { content: "\e101"; } }
|
|
||||||
.glyphicon-gift { &:before { content: "\e102"; } }
|
|
||||||
.glyphicon-leaf { &:before { content: "\e103"; } }
|
|
||||||
.glyphicon-eye-open { &:before { content: "\e105"; } }
|
|
||||||
.glyphicon-eye-close { &:before { content: "\e106"; } }
|
|
||||||
.glyphicon-warning-sign { &:before { content: "\e107"; } }
|
|
||||||
.glyphicon-plane { &:before { content: "\e108"; } }
|
|
||||||
.glyphicon-random { &:before { content: "\e110"; } }
|
|
||||||
.glyphicon-comment { &:before { content: "\e111"; } }
|
|
||||||
.glyphicon-magnet { &:before { content: "\e112"; } }
|
|
||||||
.glyphicon-chevron-up { &:before { content: "\e113"; } }
|
|
||||||
.glyphicon-chevron-down { &:before { content: "\e114"; } }
|
|
||||||
.glyphicon-retweet { &:before { content: "\e115"; } }
|
|
||||||
.glyphicon-shopping-cart { &:before { content: "\e116"; } }
|
|
||||||
.glyphicon-folder-close { &:before { content: "\e117"; } }
|
|
||||||
.glyphicon-folder-open { &:before { content: "\e118"; } }
|
|
||||||
.glyphicon-resize-vertical { &:before { content: "\e119"; } }
|
|
||||||
.glyphicon-resize-horizontal { &:before { content: "\e120"; } }
|
|
||||||
.glyphicon-hdd { &:before { content: "\e121"; } }
|
|
||||||
.glyphicon-bullhorn { &:before { content: "\e122"; } }
|
|
||||||
.glyphicon-certificate { &:before { content: "\e124"; } }
|
|
||||||
.glyphicon-thumbs-up { &:before { content: "\e125"; } }
|
|
||||||
.glyphicon-thumbs-down { &:before { content: "\e126"; } }
|
|
||||||
.glyphicon-hand-right { &:before { content: "\e127"; } }
|
|
||||||
.glyphicon-hand-left { &:before { content: "\e128"; } }
|
|
||||||
.glyphicon-hand-up { &:before { content: "\e129"; } }
|
|
||||||
.glyphicon-hand-down { &:before { content: "\e130"; } }
|
|
||||||
.glyphicon-circle-arrow-right { &:before { content: "\e131"; } }
|
|
||||||
.glyphicon-circle-arrow-left { &:before { content: "\e132"; } }
|
|
||||||
.glyphicon-circle-arrow-up { &:before { content: "\e133"; } }
|
|
||||||
.glyphicon-circle-arrow-down { &:before { content: "\e134"; } }
|
|
||||||
.glyphicon-globe { &:before { content: "\e135"; } }
|
|
||||||
.glyphicon-tasks { &:before { content: "\e137"; } }
|
|
||||||
.glyphicon-filter { &:before { content: "\e138"; } }
|
|
||||||
.glyphicon-fullscreen { &:before { content: "\e140"; } }
|
|
||||||
.glyphicon-dashboard { &:before { content: "\e141"; } }
|
|
||||||
.glyphicon-heart-empty { &:before { content: "\e143"; } }
|
|
||||||
.glyphicon-link { &:before { content: "\e144"; } }
|
|
||||||
.glyphicon-phone { &:before { content: "\e145"; } }
|
|
||||||
.glyphicon-usd { &:before { content: "\e148"; } }
|
|
||||||
.glyphicon-gbp { &:before { content: "\e149"; } }
|
|
||||||
.glyphicon-sort { &:before { content: "\e150"; } }
|
|
||||||
.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } }
|
|
||||||
.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } }
|
|
||||||
.glyphicon-sort-by-order { &:before { content: "\e153"; } }
|
|
||||||
.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } }
|
|
||||||
.glyphicon-sort-by-attributes { &:before { content: "\e155"; } }
|
|
||||||
.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
|
|
||||||
.glyphicon-unchecked { &:before { content: "\e157"; } }
|
|
||||||
.glyphicon-expand { &:before { content: "\e158"; } }
|
|
||||||
.glyphicon-collapse-down { &:before { content: "\e159"; } }
|
|
||||||
.glyphicon-collapse-up { &:before { content: "\e160"; } }
|
|
||||||
.glyphicon-log-in { &:before { content: "\e161"; } }
|
|
||||||
.glyphicon-flash { &:before { content: "\e162"; } }
|
|
||||||
.glyphicon-log-out { &:before { content: "\e163"; } }
|
|
||||||
.glyphicon-new-window { &:before { content: "\e164"; } }
|
|
||||||
.glyphicon-record { &:before { content: "\e165"; } }
|
|
||||||
.glyphicon-save { &:before { content: "\e166"; } }
|
|
||||||
.glyphicon-open { &:before { content: "\e167"; } }
|
|
||||||
.glyphicon-saved { &:before { content: "\e168"; } }
|
|
||||||
.glyphicon-import { &:before { content: "\e169"; } }
|
|
||||||
.glyphicon-export { &:before { content: "\e170"; } }
|
|
||||||
.glyphicon-send { &:before { content: "\e171"; } }
|
|
||||||
.glyphicon-floppy-disk { &:before { content: "\e172"; } }
|
|
||||||
.glyphicon-floppy-saved { &:before { content: "\e173"; } }
|
|
||||||
.glyphicon-floppy-remove { &:before { content: "\e174"; } }
|
|
||||||
.glyphicon-floppy-save { &:before { content: "\e175"; } }
|
|
||||||
.glyphicon-floppy-open { &:before { content: "\e176"; } }
|
|
||||||
.glyphicon-credit-card { &:before { content: "\e177"; } }
|
|
||||||
.glyphicon-transfer { &:before { content: "\e178"; } }
|
|
||||||
.glyphicon-cutlery { &:before { content: "\e179"; } }
|
|
||||||
.glyphicon-header { &:before { content: "\e180"; } }
|
|
||||||
.glyphicon-compressed { &:before { content: "\e181"; } }
|
|
||||||
.glyphicon-earphone { &:before { content: "\e182"; } }
|
|
||||||
.glyphicon-phone-alt { &:before { content: "\e183"; } }
|
|
||||||
.glyphicon-tower { &:before { content: "\e184"; } }
|
|
||||||
.glyphicon-stats { &:before { content: "\e185"; } }
|
|
||||||
.glyphicon-sd-video { &:before { content: "\e186"; } }
|
|
||||||
.glyphicon-hd-video { &:before { content: "\e187"; } }
|
|
||||||
.glyphicon-subtitles { &:before { content: "\e188"; } }
|
|
||||||
.glyphicon-sound-stereo { &:before { content: "\e189"; } }
|
|
||||||
.glyphicon-sound-dolby { &:before { content: "\e190"; } }
|
|
||||||
.glyphicon-sound-5-1 { &:before { content: "\e191"; } }
|
|
||||||
.glyphicon-sound-6-1 { &:before { content: "\e192"; } }
|
|
||||||
.glyphicon-sound-7-1 { &:before { content: "\e193"; } }
|
|
||||||
.glyphicon-copyright-mark { &:before { content: "\e194"; } }
|
|
||||||
.glyphicon-registration-mark { &:before { content: "\e195"; } }
|
|
||||||
.glyphicon-cloud-download { &:before { content: "\e197"; } }
|
|
||||||
.glyphicon-cloud-upload { &:before { content: "\e198"; } }
|
|
||||||
.glyphicon-tree-conifer { &:before { content: "\e199"; } }
|
|
||||||
.glyphicon-tree-deciduous { &:before { content: "\e200"; } }
|
|
||||||
.glyphicon-briefcase { &:before { content: "\1f4bc"; } }
|
|
||||||
.glyphicon-calendar { &:before { content: "\1f4c5"; } }
|
|
||||||
.glyphicon-pushpin { &:before { content: "\1f4cc"; } }
|
|
||||||
.glyphicon-paperclip { &:before { content: "\1f4ce"; } }
|
|
||||||
.glyphicon-camera { &:before { content: "\1f4f7"; } }
|
|
||||||
.glyphicon-lock { &:before { content: "\1f512"; } }
|
|
||||||
.glyphicon-bell { &:before { content: "\1f514"; } }
|
|
||||||
.glyphicon-bookmark { &:before { content: "\1f516"; } }
|
|
||||||
.glyphicon-fire { &:before { content: "\1f525"; } }
|
|
||||||
.glyphicon-wrench { &:before { content: "\1f527"; } }
|
|
@ -1,346 +0,0 @@
|
|||||||
//
|
|
||||||
// Grid system
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Set the container width, and override it for fixed navbars in media queries
|
|
||||||
.container {
|
|
||||||
.container-fixed();
|
|
||||||
}
|
|
||||||
|
|
||||||
// mobile first defaults
|
|
||||||
.row {
|
|
||||||
.make-row();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Common styles for small and large grid columns
|
|
||||||
.col-xs-1,
|
|
||||||
.col-xs-2,
|
|
||||||
.col-xs-3,
|
|
||||||
.col-xs-4,
|
|
||||||
.col-xs-5,
|
|
||||||
.col-xs-6,
|
|
||||||
.col-xs-7,
|
|
||||||
.col-xs-8,
|
|
||||||
.col-xs-9,
|
|
||||||
.col-xs-10,
|
|
||||||
.col-xs-11,
|
|
||||||
.col-xs-12,
|
|
||||||
.col-sm-1,
|
|
||||||
.col-sm-2,
|
|
||||||
.col-sm-3,
|
|
||||||
.col-sm-4,
|
|
||||||
.col-sm-5,
|
|
||||||
.col-sm-6,
|
|
||||||
.col-sm-7,
|
|
||||||
.col-sm-8,
|
|
||||||
.col-sm-9,
|
|
||||||
.col-sm-10,
|
|
||||||
.col-sm-11,
|
|
||||||
.col-sm-12,
|
|
||||||
.col-md-1,
|
|
||||||
.col-md-2,
|
|
||||||
.col-md-3,
|
|
||||||
.col-md-4,
|
|
||||||
.col-md-5,
|
|
||||||
.col-md-6,
|
|
||||||
.col-md-7,
|
|
||||||
.col-md-8,
|
|
||||||
.col-md-9,
|
|
||||||
.col-md-10,
|
|
||||||
.col-md-11,
|
|
||||||
.col-md-12,
|
|
||||||
.col-lg-1,
|
|
||||||
.col-lg-2,
|
|
||||||
.col-lg-3,
|
|
||||||
.col-lg-4,
|
|
||||||
.col-lg-5,
|
|
||||||
.col-lg-6,
|
|
||||||
.col-lg-7,
|
|
||||||
.col-lg-8,
|
|
||||||
.col-lg-9,
|
|
||||||
.col-lg-10,
|
|
||||||
.col-lg-11,
|
|
||||||
.col-lg-12 {
|
|
||||||
position: relative;
|
|
||||||
// Prevent columns from collapsing when empty
|
|
||||||
min-height: 1px;
|
|
||||||
// Inner gutter via padding
|
|
||||||
padding-left: (@grid-gutter-width / 2);
|
|
||||||
padding-right: (@grid-gutter-width / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Extra small grid
|
|
||||||
//
|
|
||||||
// Grid classes for extra small devices like smartphones. No offset, push, or
|
|
||||||
// pull classes are present here due to the size of the target.
|
|
||||||
//
|
|
||||||
// Note that `.col-xs-12` doesn't get floated on purpose—there's no need since
|
|
||||||
// it's full-width.
|
|
||||||
|
|
||||||
.col-xs-1,
|
|
||||||
.col-xs-2,
|
|
||||||
.col-xs-3,
|
|
||||||
.col-xs-4,
|
|
||||||
.col-xs-5,
|
|
||||||
.col-xs-6,
|
|
||||||
.col-xs-7,
|
|
||||||
.col-xs-8,
|
|
||||||
.col-xs-9,
|
|
||||||
.col-xs-10,
|
|
||||||
.col-xs-11 {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.col-xs-1 { width: percentage((1 / @grid-columns)); }
|
|
||||||
.col-xs-2 { width: percentage((2 / @grid-columns)); }
|
|
||||||
.col-xs-3 { width: percentage((3 / @grid-columns)); }
|
|
||||||
.col-xs-4 { width: percentage((4 / @grid-columns)); }
|
|
||||||
.col-xs-5 { width: percentage((5 / @grid-columns)); }
|
|
||||||
.col-xs-6 { width: percentage((6 / @grid-columns)); }
|
|
||||||
.col-xs-7 { width: percentage((7 / @grid-columns)); }
|
|
||||||
.col-xs-8 { width: percentage((8 / @grid-columns)); }
|
|
||||||
.col-xs-9 { width: percentage((9 / @grid-columns)); }
|
|
||||||
.col-xs-10 { width: percentage((10/ @grid-columns)); }
|
|
||||||
.col-xs-11 { width: percentage((11/ @grid-columns)); }
|
|
||||||
.col-xs-12 { width: 100%; }
|
|
||||||
|
|
||||||
|
|
||||||
// Small grid
|
|
||||||
//
|
|
||||||
// Columns, offsets, pushes, and pulls for the small device range, from phones
|
|
||||||
// to tablets.
|
|
||||||
//
|
|
||||||
// Note that `.col-sm-12` doesn't get floated on purpose—there's no need since
|
|
||||||
// it's full-width.
|
|
||||||
|
|
||||||
@media (min-width: @screen-tablet) {
|
|
||||||
.container {
|
|
||||||
max-width: @container-tablet;
|
|
||||||
}
|
|
||||||
|
|
||||||
.col-sm-1,
|
|
||||||
.col-sm-2,
|
|
||||||
.col-sm-3,
|
|
||||||
.col-sm-4,
|
|
||||||
.col-sm-5,
|
|
||||||
.col-sm-6,
|
|
||||||
.col-sm-7,
|
|
||||||
.col-sm-8,
|
|
||||||
.col-sm-9,
|
|
||||||
.col-sm-10,
|
|
||||||
.col-sm-11 {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.col-sm-1 { width: percentage((1 / @grid-columns)); }
|
|
||||||
.col-sm-2 { width: percentage((2 / @grid-columns)); }
|
|
||||||
.col-sm-3 { width: percentage((3 / @grid-columns)); }
|
|
||||||
.col-sm-4 { width: percentage((4 / @grid-columns)); }
|
|
||||||
.col-sm-5 { width: percentage((5 / @grid-columns)); }
|
|
||||||
.col-sm-6 { width: percentage((6 / @grid-columns)); }
|
|
||||||
.col-sm-7 { width: percentage((7 / @grid-columns)); }
|
|
||||||
.col-sm-8 { width: percentage((8 / @grid-columns)); }
|
|
||||||
.col-sm-9 { width: percentage((9 / @grid-columns)); }
|
|
||||||
.col-sm-10 { width: percentage((10/ @grid-columns)); }
|
|
||||||
.col-sm-11 { width: percentage((11/ @grid-columns)); }
|
|
||||||
.col-sm-12 { width: 100%; }
|
|
||||||
|
|
||||||
// Push and pull columns for source order changes
|
|
||||||
.col-sm-push-1 { left: percentage((1 / @grid-columns)); }
|
|
||||||
.col-sm-push-2 { left: percentage((2 / @grid-columns)); }
|
|
||||||
.col-sm-push-3 { left: percentage((3 / @grid-columns)); }
|
|
||||||
.col-sm-push-4 { left: percentage((4 / @grid-columns)); }
|
|
||||||
.col-sm-push-5 { left: percentage((5 / @grid-columns)); }
|
|
||||||
.col-sm-push-6 { left: percentage((6 / @grid-columns)); }
|
|
||||||
.col-sm-push-7 { left: percentage((7 / @grid-columns)); }
|
|
||||||
.col-sm-push-8 { left: percentage((8 / @grid-columns)); }
|
|
||||||
.col-sm-push-9 { left: percentage((9 / @grid-columns)); }
|
|
||||||
.col-sm-push-10 { left: percentage((10/ @grid-columns)); }
|
|
||||||
.col-sm-push-11 { left: percentage((11/ @grid-columns)); }
|
|
||||||
|
|
||||||
.col-sm-pull-1 { right: percentage((1 / @grid-columns)); }
|
|
||||||
.col-sm-pull-2 { right: percentage((2 / @grid-columns)); }
|
|
||||||
.col-sm-pull-3 { right: percentage((3 / @grid-columns)); }
|
|
||||||
.col-sm-pull-4 { right: percentage((4 / @grid-columns)); }
|
|
||||||
.col-sm-pull-5 { right: percentage((5 / @grid-columns)); }
|
|
||||||
.col-sm-pull-6 { right: percentage((6 / @grid-columns)); }
|
|
||||||
.col-sm-pull-7 { right: percentage((7 / @grid-columns)); }
|
|
||||||
.col-sm-pull-8 { right: percentage((8 / @grid-columns)); }
|
|
||||||
.col-sm-pull-9 { right: percentage((9 / @grid-columns)); }
|
|
||||||
.col-sm-pull-10 { right: percentage((10/ @grid-columns)); }
|
|
||||||
.col-sm-pull-11 { right: percentage((11/ @grid-columns)); }
|
|
||||||
|
|
||||||
// Offsets
|
|
||||||
.col-sm-offset-1 { margin-left: percentage((1 / @grid-columns)); }
|
|
||||||
.col-sm-offset-2 { margin-left: percentage((2 / @grid-columns)); }
|
|
||||||
.col-sm-offset-3 { margin-left: percentage((3 / @grid-columns)); }
|
|
||||||
.col-sm-offset-4 { margin-left: percentage((4 / @grid-columns)); }
|
|
||||||
.col-sm-offset-5 { margin-left: percentage((5 / @grid-columns)); }
|
|
||||||
.col-sm-offset-6 { margin-left: percentage((6 / @grid-columns)); }
|
|
||||||
.col-sm-offset-7 { margin-left: percentage((7 / @grid-columns)); }
|
|
||||||
.col-sm-offset-8 { margin-left: percentage((8 / @grid-columns)); }
|
|
||||||
.col-sm-offset-9 { margin-left: percentage((9 / @grid-columns)); }
|
|
||||||
.col-sm-offset-10 { margin-left: percentage((10/ @grid-columns)); }
|
|
||||||
.col-sm-offset-11 { margin-left: percentage((11/ @grid-columns)); }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Medium grid
|
|
||||||
//
|
|
||||||
// Columns, offsets, pushes, and pulls for the desktop device range.
|
|
||||||
//
|
|
||||||
// Note that `.col-md-12` doesn't get floated on purpose—there's no need since
|
|
||||||
// it's full-width.
|
|
||||||
|
|
||||||
@media (min-width: @screen-desktop) {
|
|
||||||
.container {
|
|
||||||
max-width: @container-desktop;
|
|
||||||
}
|
|
||||||
.col-md-1,
|
|
||||||
.col-md-2,
|
|
||||||
.col-md-3,
|
|
||||||
.col-md-4,
|
|
||||||
.col-md-5,
|
|
||||||
.col-md-6,
|
|
||||||
.col-md-7,
|
|
||||||
.col-md-8,
|
|
||||||
.col-md-9,
|
|
||||||
.col-md-10,
|
|
||||||
.col-md-11 {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.col-md-1 { width: percentage((1 / @grid-columns)); }
|
|
||||||
.col-md-2 { width: percentage((2 / @grid-columns)); }
|
|
||||||
.col-md-3 { width: percentage((3 / @grid-columns)); }
|
|
||||||
.col-md-4 { width: percentage((4 / @grid-columns)); }
|
|
||||||
.col-md-5 { width: percentage((5 / @grid-columns)); }
|
|
||||||
.col-md-6 { width: percentage((6 / @grid-columns)); }
|
|
||||||
.col-md-7 { width: percentage((7 / @grid-columns)); }
|
|
||||||
.col-md-8 { width: percentage((8 / @grid-columns)); }
|
|
||||||
.col-md-9 { width: percentage((9 / @grid-columns)); }
|
|
||||||
.col-md-10 { width: percentage((10/ @grid-columns)); }
|
|
||||||
.col-md-11 { width: percentage((11/ @grid-columns)); }
|
|
||||||
.col-md-12 { width: 100%; }
|
|
||||||
|
|
||||||
// Push and pull columns for source order changes
|
|
||||||
.col-md-push-0 { left: auto; }
|
|
||||||
.col-md-push-1 { left: percentage((1 / @grid-columns)); }
|
|
||||||
.col-md-push-2 { left: percentage((2 / @grid-columns)); }
|
|
||||||
.col-md-push-3 { left: percentage((3 / @grid-columns)); }
|
|
||||||
.col-md-push-4 { left: percentage((4 / @grid-columns)); }
|
|
||||||
.col-md-push-5 { left: percentage((5 / @grid-columns)); }
|
|
||||||
.col-md-push-6 { left: percentage((6 / @grid-columns)); }
|
|
||||||
.col-md-push-7 { left: percentage((7 / @grid-columns)); }
|
|
||||||
.col-md-push-8 { left: percentage((8 / @grid-columns)); }
|
|
||||||
.col-md-push-9 { left: percentage((9 / @grid-columns)); }
|
|
||||||
.col-md-push-10 { left: percentage((10/ @grid-columns)); }
|
|
||||||
.col-md-push-11 { left: percentage((11/ @grid-columns)); }
|
|
||||||
|
|
||||||
.col-md-pull-0 { right: auto; }
|
|
||||||
.col-md-pull-1 { right: percentage((1 / @grid-columns)); }
|
|
||||||
.col-md-pull-2 { right: percentage((2 / @grid-columns)); }
|
|
||||||
.col-md-pull-3 { right: percentage((3 / @grid-columns)); }
|
|
||||||
.col-md-pull-4 { right: percentage((4 / @grid-columns)); }
|
|
||||||
.col-md-pull-5 { right: percentage((5 / @grid-columns)); }
|
|
||||||
.col-md-pull-6 { right: percentage((6 / @grid-columns)); }
|
|
||||||
.col-md-pull-7 { right: percentage((7 / @grid-columns)); }
|
|
||||||
.col-md-pull-8 { right: percentage((8 / @grid-columns)); }
|
|
||||||
.col-md-pull-9 { right: percentage((9 / @grid-columns)); }
|
|
||||||
.col-md-pull-10 { right: percentage((10/ @grid-columns)); }
|
|
||||||
.col-md-pull-11 { right: percentage((11/ @grid-columns)); }
|
|
||||||
|
|
||||||
// Offsets
|
|
||||||
.col-md-offset-0 { margin-left: 0; }
|
|
||||||
.col-md-offset-1 { margin-left: percentage((1 / @grid-columns)); }
|
|
||||||
.col-md-offset-2 { margin-left: percentage((2 / @grid-columns)); }
|
|
||||||
.col-md-offset-3 { margin-left: percentage((3 / @grid-columns)); }
|
|
||||||
.col-md-offset-4 { margin-left: percentage((4 / @grid-columns)); }
|
|
||||||
.col-md-offset-5 { margin-left: percentage((5 / @grid-columns)); }
|
|
||||||
.col-md-offset-6 { margin-left: percentage((6 / @grid-columns)); }
|
|
||||||
.col-md-offset-7 { margin-left: percentage((7 / @grid-columns)); }
|
|
||||||
.col-md-offset-8 { margin-left: percentage((8 / @grid-columns)); }
|
|
||||||
.col-md-offset-9 { margin-left: percentage((9 / @grid-columns)); }
|
|
||||||
.col-md-offset-10 { margin-left: percentage((10/ @grid-columns)); }
|
|
||||||
.col-md-offset-11 { margin-left: percentage((11/ @grid-columns)); }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Large grid
|
|
||||||
//
|
|
||||||
// Columns, offsets, pushes, and pulls for the large desktop device range.
|
|
||||||
//
|
|
||||||
// Note that `.col-lg-12` doesn't get floated on purpose—there's no need since
|
|
||||||
// it's full-width.
|
|
||||||
|
|
||||||
@media (min-width: @screen-lg-desktop) {
|
|
||||||
.container {
|
|
||||||
max-width: @container-lg-desktop;
|
|
||||||
}
|
|
||||||
|
|
||||||
.col-lg-1,
|
|
||||||
.col-lg-2,
|
|
||||||
.col-lg-3,
|
|
||||||
.col-lg-4,
|
|
||||||
.col-lg-5,
|
|
||||||
.col-lg-6,
|
|
||||||
.col-lg-7,
|
|
||||||
.col-lg-8,
|
|
||||||
.col-lg-9,
|
|
||||||
.col-lg-10,
|
|
||||||
.col-lg-11 {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.col-lg-1 { width: percentage((1 / @grid-columns)); }
|
|
||||||
.col-lg-2 { width: percentage((2 / @grid-columns)); }
|
|
||||||
.col-lg-3 { width: percentage((3 / @grid-columns)); }
|
|
||||||
.col-lg-4 { width: percentage((4 / @grid-columns)); }
|
|
||||||
.col-lg-5 { width: percentage((5 / @grid-columns)); }
|
|
||||||
.col-lg-6 { width: percentage((6 / @grid-columns)); }
|
|
||||||
.col-lg-7 { width: percentage((7 / @grid-columns)); }
|
|
||||||
.col-lg-8 { width: percentage((8 / @grid-columns)); }
|
|
||||||
.col-lg-9 { width: percentage((9 / @grid-columns)); }
|
|
||||||
.col-lg-10 { width: percentage((10/ @grid-columns)); }
|
|
||||||
.col-lg-11 { width: percentage((11/ @grid-columns)); }
|
|
||||||
.col-lg-12 { width: 100%; }
|
|
||||||
|
|
||||||
// Push and pull columns for source order changes
|
|
||||||
.col-lg-push-0 { left: auto; }
|
|
||||||
.col-lg-push-1 { left: percentage((1 / @grid-columns)); }
|
|
||||||
.col-lg-push-2 { left: percentage((2 / @grid-columns)); }
|
|
||||||
.col-lg-push-3 { left: percentage((3 / @grid-columns)); }
|
|
||||||
.col-lg-push-4 { left: percentage((4 / @grid-columns)); }
|
|
||||||
.col-lg-push-5 { left: percentage((5 / @grid-columns)); }
|
|
||||||
.col-lg-push-6 { left: percentage((6 / @grid-columns)); }
|
|
||||||
.col-lg-push-7 { left: percentage((7 / @grid-columns)); }
|
|
||||||
.col-lg-push-8 { left: percentage((8 / @grid-columns)); }
|
|
||||||
.col-lg-push-9 { left: percentage((9 / @grid-columns)); }
|
|
||||||
.col-lg-push-10 { left: percentage((10/ @grid-columns)); }
|
|
||||||
.col-lg-push-11 { left: percentage((11/ @grid-columns)); }
|
|
||||||
|
|
||||||
.col-lg-pull-0 { right: auto; }
|
|
||||||
.col-lg-pull-1 { right: percentage((1 / @grid-columns)); }
|
|
||||||
.col-lg-pull-2 { right: percentage((2 / @grid-columns)); }
|
|
||||||
.col-lg-pull-3 { right: percentage((3 / @grid-columns)); }
|
|
||||||
.col-lg-pull-4 { right: percentage((4 / @grid-columns)); }
|
|
||||||
.col-lg-pull-5 { right: percentage((5 / @grid-columns)); }
|
|
||||||
.col-lg-pull-6 { right: percentage((6 / @grid-columns)); }
|
|
||||||
.col-lg-pull-7 { right: percentage((7 / @grid-columns)); }
|
|
||||||
.col-lg-pull-8 { right: percentage((8 / @grid-columns)); }
|
|
||||||
.col-lg-pull-9 { right: percentage((9 / @grid-columns)); }
|
|
||||||
.col-lg-pull-10 { right: percentage((10/ @grid-columns)); }
|
|
||||||
.col-lg-pull-11 { right: percentage((11/ @grid-columns)); }
|
|
||||||
|
|
||||||
// Offsets
|
|
||||||
.col-lg-offset-0 { margin-left: 0; }
|
|
||||||
.col-lg-offset-1 { margin-left: percentage((1 / @grid-columns)); }
|
|
||||||
.col-lg-offset-2 { margin-left: percentage((2 / @grid-columns)); }
|
|
||||||
.col-lg-offset-3 { margin-left: percentage((3 / @grid-columns)); }
|
|
||||||
.col-lg-offset-4 { margin-left: percentage((4 / @grid-columns)); }
|
|
||||||
.col-lg-offset-5 { margin-left: percentage((5 / @grid-columns)); }
|
|
||||||
.col-lg-offset-6 { margin-left: percentage((6 / @grid-columns)); }
|
|
||||||
.col-lg-offset-7 { margin-left: percentage((7 / @grid-columns)); }
|
|
||||||
.col-lg-offset-8 { margin-left: percentage((8 / @grid-columns)); }
|
|
||||||
.col-lg-offset-9 { margin-left: percentage((9 / @grid-columns)); }
|
|
||||||
.col-lg-offset-10 { margin-left: percentage((10/ @grid-columns)); }
|
|
||||||
.col-lg-offset-11 { margin-left: percentage((11/ @grid-columns)); }
|
|
||||||
}
|
|
@ -1,127 +0,0 @@
|
|||||||
//
|
|
||||||
// Input groups
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Base styles
|
|
||||||
// -------------------------
|
|
||||||
.input-group {
|
|
||||||
position: relative; // For dropdowns
|
|
||||||
display: table;
|
|
||||||
border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
|
|
||||||
|
|
||||||
// Undo padding and float of grid classes
|
|
||||||
&.col {
|
|
||||||
float: none;
|
|
||||||
padding-left: 0;
|
|
||||||
padding-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-control {
|
|
||||||
width: 100%;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sizing options
|
|
||||||
//
|
|
||||||
// Remix the default form control sizing classes into new ones for easier
|
|
||||||
// manipulation.
|
|
||||||
|
|
||||||
.input-group-lg > .form-control,
|
|
||||||
.input-group-lg > .input-group-addon,
|
|
||||||
.input-group-lg > .input-group-btn > .btn { .input-lg(); }
|
|
||||||
.input-group-sm > .form-control,
|
|
||||||
.input-group-sm > .input-group-addon,
|
|
||||||
.input-group-sm > .input-group-btn > .btn { .input-sm(); }
|
|
||||||
|
|
||||||
|
|
||||||
// Display as table-cell
|
|
||||||
// -------------------------
|
|
||||||
.input-group-addon,
|
|
||||||
.input-group-btn,
|
|
||||||
.input-group .form-control {
|
|
||||||
display: table-cell;
|
|
||||||
|
|
||||||
&:not(:first-child):not(:last-child) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Addon and addon wrapper for buttons
|
|
||||||
.input-group-addon,
|
|
||||||
.input-group-btn {
|
|
||||||
width: 1%;
|
|
||||||
white-space: nowrap;
|
|
||||||
vertical-align: middle; // Match the inputs
|
|
||||||
}
|
|
||||||
|
|
||||||
// Text input groups
|
|
||||||
// -------------------------
|
|
||||||
.input-group-addon {
|
|
||||||
padding: @padding-base-vertical @padding-base-horizontal;
|
|
||||||
font-size: @font-size-base;
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: 1;
|
|
||||||
text-align: center;
|
|
||||||
background-color: @input-group-addon-bg;
|
|
||||||
border: 1px solid @input-group-addon-border-color;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
|
|
||||||
// Sizing
|
|
||||||
&.input-sm {
|
|
||||||
padding: @padding-small-vertical @padding-small-horizontal;
|
|
||||||
font-size: @font-size-small;
|
|
||||||
border-radius: @border-radius-small;
|
|
||||||
}
|
|
||||||
&.input-lg {
|
|
||||||
padding: @padding-large-vertical @padding-large-horizontal;
|
|
||||||
font-size: @font-size-large;
|
|
||||||
border-radius: @border-radius-large;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nuke default margins from checkboxes and radios to vertically center within.
|
|
||||||
input[type="radio"],
|
|
||||||
input[type="checkbox"] {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset rounded corners
|
|
||||||
.input-group .form-control:first-child,
|
|
||||||
.input-group-addon:first-child,
|
|
||||||
.input-group-btn:first-child > .btn,
|
|
||||||
.input-group-btn:first-child > .dropdown-toggle,
|
|
||||||
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
|
|
||||||
.border-right-radius(0);
|
|
||||||
}
|
|
||||||
.input-group-addon:first-child {
|
|
||||||
border-right: 0;
|
|
||||||
}
|
|
||||||
.input-group .form-control:last-child,
|
|
||||||
.input-group-addon:last-child,
|
|
||||||
.input-group-btn:last-child > .btn,
|
|
||||||
.input-group-btn:last-child > .dropdown-toggle,
|
|
||||||
.input-group-btn:first-child > .btn:not(:first-child) {
|
|
||||||
.border-left-radius(0);
|
|
||||||
}
|
|
||||||
.input-group-addon:last-child {
|
|
||||||
border-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Button input groups
|
|
||||||
// -------------------------
|
|
||||||
.input-group-btn {
|
|
||||||
position: relative;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.input-group-btn > .btn {
|
|
||||||
position: relative;
|
|
||||||
// Jankily prevent input button groups from wrapping
|
|
||||||
+ .btn {
|
|
||||||
margin-left: -4px;
|
|
||||||
}
|
|
||||||
// Bring the "active" button to the front
|
|
||||||
&:hover,
|
|
||||||
&:active {
|
|
||||||
z-index: 2;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
//
|
|
||||||
// Jumbotron
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.jumbotron {
|
|
||||||
padding: @jumbotron-padding;
|
|
||||||
margin-bottom: @jumbotron-padding;
|
|
||||||
font-size: (@font-size-base * 1.5);
|
|
||||||
font-weight: 200;
|
|
||||||
line-height: (@line-height-base * 1.5);
|
|
||||||
color: @jumbotron-color;
|
|
||||||
background-color: @jumbotron-bg;
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
line-height: 1;
|
|
||||||
color: @jumbotron-heading-color;
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
line-height: 1.4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container & {
|
|
||||||
border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: @screen-tablet) {
|
|
||||||
padding-top: (@jumbotron-padding * 1.6);
|
|
||||||
padding-bottom: (@jumbotron-padding * 1.6);
|
|
||||||
|
|
||||||
.container & {
|
|
||||||
padding-left: (@jumbotron-padding * 2);
|
|
||||||
padding-right: (@jumbotron-padding * 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: (@font-size-base * 4.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
//
|
|
||||||
// Labels
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.label {
|
|
||||||
display: inline;
|
|
||||||
padding: .2em .6em .3em;
|
|
||||||
font-size: 75%;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 1;
|
|
||||||
color: @label-color;
|
|
||||||
text-align: center;
|
|
||||||
white-space: nowrap;
|
|
||||||
vertical-align: baseline;
|
|
||||||
border-radius: .25em;
|
|
||||||
|
|
||||||
// Add hover effects, but only for links
|
|
||||||
&[href] {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @label-link-hover-color;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Empty labels collapse automatically (not available in IE8)
|
|
||||||
&:empty {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Colors
|
|
||||||
// Contextual variations (linked labels get darker on :hover)
|
|
||||||
|
|
||||||
.label-default {
|
|
||||||
.label-variant(@label-default-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-primary {
|
|
||||||
.label-variant(@label-primary-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-success {
|
|
||||||
.label-variant(@label-success-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-info {
|
|
||||||
.label-variant(@label-info-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-warning {
|
|
||||||
.label-variant(@label-warning-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.label-danger {
|
|
||||||
.label-variant(@label-danger-bg);
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
//
|
|
||||||
// List groups
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
//
|
|
||||||
// Easily usable on <ul>, <ol>, or <div>.
|
|
||||||
.list-group {
|
|
||||||
// No need to set list-style: none; since .list-group-item is block level
|
|
||||||
margin-bottom: 20px;
|
|
||||||
padding-left: 0; // reset padding because ul and ol
|
|
||||||
}
|
|
||||||
|
|
||||||
// Individual list items
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.list-group-item {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
padding: 10px 15px;
|
|
||||||
// Place the border on the list items and negative margin up for better styling
|
|
||||||
margin-bottom: -1px;
|
|
||||||
background-color: @list-group-bg;
|
|
||||||
border: 1px solid @list-group-border;
|
|
||||||
|
|
||||||
// Round the first and last items
|
|
||||||
&:first-child {
|
|
||||||
.border-top-radius(@list-group-border-radius);
|
|
||||||
}
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
.border-bottom-radius(@list-group-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Align badges within list items
|
|
||||||
> .badge {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
> .badge + .badge {
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Linked list items
|
|
||||||
a& {
|
|
||||||
color: @list-group-link-color;
|
|
||||||
|
|
||||||
.list-group-item-heading {
|
|
||||||
color: @list-group-link-heading-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover state
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: @list-group-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Active class on item itself, not parent
|
|
||||||
&.active,
|
|
||||||
&.active:hover,
|
|
||||||
&.active:focus {
|
|
||||||
z-index: 2; // Place active items above their siblings for proper border styling
|
|
||||||
color: @list-group-active-color;
|
|
||||||
background-color: @list-group-active-bg;
|
|
||||||
border-color: @list-group-active-border;
|
|
||||||
|
|
||||||
// Force color to inherit for custom content
|
|
||||||
.list-group-item-heading {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
.list-group-item-text {
|
|
||||||
color: lighten(@list-group-active-bg, 40%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom content options
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.list-group-item-heading {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
.list-group-item-text {
|
|
||||||
margin-bottom: 0;
|
|
||||||
line-height: 1.3;
|
|
||||||
}
|
|
@ -1,56 +0,0 @@
|
|||||||
// Media objects
|
|
||||||
// Source: http://stubbornella.org/content/?p=497
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Common styles
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Clear the floats
|
|
||||||
.media,
|
|
||||||
.media-body {
|
|
||||||
overflow: hidden;
|
|
||||||
zoom: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proper spacing between instances of .media
|
|
||||||
.media,
|
|
||||||
.media .media {
|
|
||||||
margin-top: 15px;
|
|
||||||
}
|
|
||||||
.media:first-child {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For images and videos, set to block
|
|
||||||
.media-object {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset margins on headings for tighter default spacing
|
|
||||||
.media-heading {
|
|
||||||
margin: 0 0 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Media image alignment
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.media {
|
|
||||||
> .pull-left {
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
> .pull-right {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Media list variation
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Undo default ul/ol styles
|
|
||||||
.media-list {
|
|
||||||
padding-left: 0;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
@ -1,723 +0,0 @@
|
|||||||
//
|
|
||||||
// Mixins
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Utilities
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Clearfix
|
|
||||||
// Source: http://nicolasgallagher.com/micro-clearfix-hack/
|
|
||||||
//
|
|
||||||
// For modern browsers
|
|
||||||
// 1. The space content is one way to avoid an Opera bug when the
|
|
||||||
// contenteditable attribute is included anywhere else in the document.
|
|
||||||
// Otherwise it causes space to appear at the top and bottom of elements
|
|
||||||
// that are clearfixed.
|
|
||||||
// 2. The use of `table` rather than `block` is only necessary if using
|
|
||||||
// `:before` to contain the top-margins of child elements.
|
|
||||||
.clearfix() {
|
|
||||||
&:before,
|
|
||||||
&:after {
|
|
||||||
content: " "; /* 1 */
|
|
||||||
display: table; /* 2 */
|
|
||||||
}
|
|
||||||
&:after {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Webkit-style focus
|
|
||||||
.tab-focus() {
|
|
||||||
// Default
|
|
||||||
outline: thin dotted #333;
|
|
||||||
// Webkit
|
|
||||||
outline: 5px auto -webkit-focus-ring-color;
|
|
||||||
outline-offset: -2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Center-align a block level element
|
|
||||||
.center-block() {
|
|
||||||
display: block;
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sizing shortcuts
|
|
||||||
.size(@width; @height) {
|
|
||||||
width: @width;
|
|
||||||
height: @height;
|
|
||||||
}
|
|
||||||
.square(@size) {
|
|
||||||
.size(@size; @size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Placeholder text
|
|
||||||
.placeholder(@color: @input-color-placeholder) {
|
|
||||||
&:-moz-placeholder { color: @color; } // Firefox 4-18
|
|
||||||
&::-moz-placeholder { color: @color; } // Firefox 19+
|
|
||||||
&:-ms-input-placeholder { color: @color; } // Internet Explorer 10+
|
|
||||||
&::-webkit-input-placeholder { color: @color; } // Safari and Chrome
|
|
||||||
}
|
|
||||||
|
|
||||||
// Text overflow
|
|
||||||
// Requires inline-block or block for proper styling
|
|
||||||
.text-overflow() {
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CSS image replacement
|
|
||||||
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
|
|
||||||
.hide-text() {
|
|
||||||
font: ~"0/0" a;
|
|
||||||
color: transparent;
|
|
||||||
text-shadow: none;
|
|
||||||
background-color: transparent;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transitions
|
|
||||||
.transition(@transition) {
|
|
||||||
-webkit-transition: @transition;
|
|
||||||
transition: @transition;
|
|
||||||
}
|
|
||||||
.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-transform(@transition) {
|
|
||||||
-webkit-transition: -webkit-transform @transition;
|
|
||||||
-moz-transition: -moz-transform @transition;
|
|
||||||
-o-transition: -o-transform @transition;
|
|
||||||
transition: transform @transition;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transformations
|
|
||||||
.rotate(@degrees) {
|
|
||||||
-webkit-transform: rotate(@degrees);
|
|
||||||
-ms-transform: rotate(@degrees); // IE9+
|
|
||||||
transform: rotate(@degrees);
|
|
||||||
}
|
|
||||||
.scale(@ratio) {
|
|
||||||
-webkit-transform: scale(@ratio);
|
|
||||||
-ms-transform: scale(@ratio); // IE9+
|
|
||||||
transform: scale(@ratio);
|
|
||||||
}
|
|
||||||
.translate(@x; @y) {
|
|
||||||
-webkit-transform: translate(@x, @y);
|
|
||||||
-ms-transform: translate(@x, @y); // IE9+
|
|
||||||
transform: translate(@x, @y);
|
|
||||||
}
|
|
||||||
.skew(@x; @y) {
|
|
||||||
-webkit-transform: skew(@x, @y);
|
|
||||||
-ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
|
|
||||||
transform: skew(@x, @y);
|
|
||||||
}
|
|
||||||
.translate3d(@x; @y; @z) {
|
|
||||||
-webkit-transform: translate3d(@x, @y, @z);
|
|
||||||
transform: translate3d(@x, @y, @z);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Backface visibility
|
|
||||||
// Prevent browsers from flickering when using CSS 3D transforms.
|
|
||||||
// Default value is `visible`, but can be changed to `hidden`
|
|
||||||
// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
|
|
||||||
.backface-visibility(@visibility){
|
|
||||||
-webkit-backface-visibility: @visibility;
|
|
||||||
-moz-backface-visibility: @visibility;
|
|
||||||
backface-visibility: @visibility;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Box sizing
|
|
||||||
.box-sizing(@boxmodel) {
|
|
||||||
-webkit-box-sizing: @boxmodel;
|
|
||||||
-moz-box-sizing: @boxmodel;
|
|
||||||
box-sizing: @boxmodel;
|
|
||||||
}
|
|
||||||
|
|
||||||
// User select
|
|
||||||
// For selecting text on the page
|
|
||||||
.user-select(@select) {
|
|
||||||
-webkit-user-select: @select;
|
|
||||||
-moz-user-select: @select;
|
|
||||||
-ms-user-select: @select; // IE10+
|
|
||||||
-o-user-select: @select;
|
|
||||||
user-select: @select;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resize anything
|
|
||||||
.resizable(@direction) {
|
|
||||||
resize: @direction; // Options: horizontal, vertical, both
|
|
||||||
overflow: auto; // Safari fix
|
|
||||||
}
|
|
||||||
|
|
||||||
// CSS3 Content Columns
|
|
||||||
.content-columns(@column-count; @column-gap: @grid-gutter-width) {
|
|
||||||
-webkit-column-count: @column-count;
|
|
||||||
-moz-column-count: @column-count;
|
|
||||||
column-count: @column-count;
|
|
||||||
-webkit-column-gap: @column-gap;
|
|
||||||
-moz-column-gap: @column-gap;
|
|
||||||
column-gap: @column-gap;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional hyphenation
|
|
||||||
.hyphens(@mode: auto) {
|
|
||||||
word-wrap: break-word;
|
|
||||||
-webkit-hyphens: @mode;
|
|
||||||
-moz-hyphens: @mode;
|
|
||||||
-ms-hyphens: @mode; // IE10+
|
|
||||||
-o-hyphens: @mode;
|
|
||||||
hyphens: @mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Opacity
|
|
||||||
.opacity(@opacity) {
|
|
||||||
opacity: @opacity;
|
|
||||||
// IE8 filter
|
|
||||||
@opacity-ie: (@opacity * 100);
|
|
||||||
filter: ~"alpha(opacity=@{opacity-ie})";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// GRADIENTS
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
#gradient {
|
|
||||||
|
|
||||||
// Horizontal gradient, from left to right
|
|
||||||
//
|
|
||||||
// Creates two color stops, start and end, by specifying a color and position for each color stop.
|
|
||||||
// Color stops are not available in IE9 and below.
|
|
||||||
.horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
|
|
||||||
background-image: -webkit-gradient(linear, @start-percent top, @end-percent top, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+
|
|
||||||
background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1+, Chrome 10+
|
|
||||||
background-image: -moz-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // FF 3.6+
|
|
||||||
background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vertical gradient, from top to bottom
|
|
||||||
//
|
|
||||||
// Creates two color stops, start and end, by specifying a color and position for each color stop.
|
|
||||||
// Color stops are not available in IE9 and below.
|
|
||||||
.vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
|
|
||||||
background-image: -webkit-gradient(linear, left @start-percent, left @end-percent, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+
|
|
||||||
background-image: -webkit-linear-gradient(top, @start-color, @start-percent, @end-color, @end-percent); // Safari 5.1+, Chrome 10+
|
|
||||||
background-image: -moz-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // FF 3.6+
|
|
||||||
background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
|
|
||||||
}
|
|
||||||
|
|
||||||
.directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1+, Chrome 10+
|
|
||||||
background-image: -moz-linear-gradient(@deg, @start-color, @end-color); // FF 3.6+
|
|
||||||
background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10
|
|
||||||
}
|
|
||||||
.horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
|
|
||||||
background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));
|
|
||||||
background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
|
|
||||||
background-image: -moz-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
|
|
||||||
background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
|
|
||||||
}
|
|
||||||
.vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
|
|
||||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));
|
|
||||||
background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
|
|
||||||
background-image: -moz-linear-gradient(top, @start-color, @mid-color @color-stop, @end-color);
|
|
||||||
background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
|
|
||||||
}
|
|
||||||
.radial(@inner-color: #555; @outer-color: #333) {
|
|
||||||
background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@inner-color), to(@outer-color));
|
|
||||||
background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
|
|
||||||
background-image: -moz-radial-gradient(circle, @inner-color, @outer-color);
|
|
||||||
background-image: radial-gradient(circle, @inner-color, @outer-color);
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
.striped(@color: #555; @angle: 45deg) {
|
|
||||||
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
|
|
||||||
background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
|
|
||||||
background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
|
|
||||||
background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset filters for IE
|
|
||||||
//
|
|
||||||
// When you need to remove a gradient background, do not forget to use this to reset
|
|
||||||
// the IE filter for IE9 and below.
|
|
||||||
.reset-filter() {
|
|
||||||
filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Retina images
|
|
||||||
//
|
|
||||||
// Short retina mixin for setting background-image and -size
|
|
||||||
|
|
||||||
.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
|
|
||||||
background-image: url("@{file-1x}");
|
|
||||||
|
|
||||||
@media
|
|
||||||
only screen and (-webkit-min-device-pixel-ratio: 2),
|
|
||||||
only screen and ( min--moz-device-pixel-ratio: 2),
|
|
||||||
only screen and ( -o-min-device-pixel-ratio: 2/1),
|
|
||||||
only screen and ( min-device-pixel-ratio: 2),
|
|
||||||
only screen and ( min-resolution: 192dpi),
|
|
||||||
only screen and ( min-resolution: 2dppx) {
|
|
||||||
background-image: url("@{file-2x}");
|
|
||||||
background-size: @width-1x @height-1x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Responsive image
|
|
||||||
//
|
|
||||||
// Keep images from scaling beyond the width of their parents.
|
|
||||||
|
|
||||||
.img-responsive(@display: block;) {
|
|
||||||
display: @display;
|
|
||||||
max-width: 100%; // Part 1: Set a maximum relative to the parent
|
|
||||||
height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// COMPONENT MIXINS
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Horizontal dividers
|
|
||||||
// -------------------------
|
|
||||||
// Dividers (basically an hr) within dropdowns and nav lists
|
|
||||||
.nav-divider(@color: #e5e5e5) {
|
|
||||||
height: 1px;
|
|
||||||
margin: ((@line-height-computed / 2) - 1) 0;
|
|
||||||
overflow: hidden;
|
|
||||||
background-color: @color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panels
|
|
||||||
// -------------------------
|
|
||||||
.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border;) {
|
|
||||||
border-color: @border;
|
|
||||||
& > .panel-heading {
|
|
||||||
color: @heading-text-color;
|
|
||||||
background-color: @heading-bg-color;
|
|
||||||
border-color: @heading-border;
|
|
||||||
+ .panel-collapse .panel-body {
|
|
||||||
border-top-color: @border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
& > .panel-footer {
|
|
||||||
+ .panel-collapse .panel-body {
|
|
||||||
border-bottom-color: @border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alerts
|
|
||||||
// -------------------------
|
|
||||||
.alert-variant(@background; @border; @text-color) {
|
|
||||||
background-color: @background;
|
|
||||||
border-color: @border;
|
|
||||||
color: @text-color;
|
|
||||||
hr {
|
|
||||||
border-top-color: darken(@border, 5%);
|
|
||||||
}
|
|
||||||
.alert-link {
|
|
||||||
color: darken(@text-color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tables
|
|
||||||
// -------------------------
|
|
||||||
.table-row-variant(@state; @background; @border) {
|
|
||||||
// Exact selectors below required to override `.table-striped` and prevent
|
|
||||||
// inheritance to nested tables.
|
|
||||||
.table > thead > tr,
|
|
||||||
.table > tbody > tr,
|
|
||||||
.table > tfoot > tr {
|
|
||||||
> td.@{state},
|
|
||||||
> th.@{state},
|
|
||||||
&.@{state} > td,
|
|
||||||
&.@{state} > th {
|
|
||||||
background-color: @background;
|
|
||||||
border-color: @border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover states for `.table-hover`
|
|
||||||
// Note: this is not available for cells or rows within `thead` or `tfoot`.
|
|
||||||
.table-hover > tbody > tr {
|
|
||||||
> td.@{state}:hover,
|
|
||||||
> th.@{state}:hover,
|
|
||||||
&.@{state}:hover > td {
|
|
||||||
background-color: darken(@background, 5%);
|
|
||||||
border-color: darken(@border, 5%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Button variants
|
|
||||||
// -------------------------
|
|
||||||
// Easily pump out default styles, as well as :hover, :focus, :active,
|
|
||||||
// and disabled options for all buttons
|
|
||||||
.button-variant(@color; @background; @border) {
|
|
||||||
color: @color;
|
|
||||||
background-color: @background;
|
|
||||||
border-color: @border;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&:active,
|
|
||||||
&.active,
|
|
||||||
.open .dropdown-toggle& {
|
|
||||||
color: @color;
|
|
||||||
background-color: darken(@background, 8%);
|
|
||||||
border-color: darken(@border, 12%);
|
|
||||||
}
|
|
||||||
&:active,
|
|
||||||
&.active,
|
|
||||||
.open .dropdown-toggle& {
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
&.disabled,
|
|
||||||
&[disabled],
|
|
||||||
fieldset[disabled] & {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
background-color: @background;
|
|
||||||
border-color: @border
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Button sizes
|
|
||||||
// -------------------------
|
|
||||||
.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
|
|
||||||
padding: @padding-vertical @padding-horizontal;
|
|
||||||
font-size: @font-size;
|
|
||||||
line-height: @line-height;
|
|
||||||
border-radius: @border-radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pagination
|
|
||||||
// -------------------------
|
|
||||||
.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {
|
|
||||||
> li {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
padding: @padding-vertical @padding-horizontal;
|
|
||||||
font-size: @font-size;
|
|
||||||
}
|
|
||||||
&:first-child {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
.border-left-radius(@border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:last-child {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
.border-right-radius(@border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Labels
|
|
||||||
// -------------------------
|
|
||||||
.label-variant(@color) {
|
|
||||||
background-color: @color;
|
|
||||||
&[href] {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: darken(@color, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Navbar vertical align
|
|
||||||
// -------------------------
|
|
||||||
// Vertically center elements in the navbar.
|
|
||||||
// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
|
|
||||||
.navbar-vertical-align(@element-height) {
|
|
||||||
margin-top: ((@navbar-height - @element-height) / 2);
|
|
||||||
margin-bottom: ((@navbar-height - @element-height) / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Progress bars
|
|
||||||
// -------------------------
|
|
||||||
.progress-bar-variant(@color) {
|
|
||||||
background-color: @color;
|
|
||||||
.progress-striped & {
|
|
||||||
#gradient > .striped(@color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Responsive utilities
|
|
||||||
// -------------------------
|
|
||||||
// More easily include all the states for responsive-utilities.less.
|
|
||||||
.responsive-visibility() {
|
|
||||||
display: block !important;
|
|
||||||
tr& { display: table-row !important; }
|
|
||||||
th&,
|
|
||||||
td& { display: table-cell !important; }
|
|
||||||
}
|
|
||||||
|
|
||||||
.responsive-invisibility() {
|
|
||||||
display: none !important;
|
|
||||||
tr& { display: none !important; }
|
|
||||||
th&,
|
|
||||||
td& { display: none !important; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Grid System
|
|
||||||
// -----------
|
|
||||||
|
|
||||||
// Centered container element
|
|
||||||
.container-fixed() {
|
|
||||||
margin-right: auto;
|
|
||||||
margin-left: auto;
|
|
||||||
padding-left: (@grid-gutter-width / 2);
|
|
||||||
padding-right: (@grid-gutter-width / 2);
|
|
||||||
.clearfix();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Creates a wrapper for a series of columns
|
|
||||||
.make-row(@gutter: @grid-gutter-width) {
|
|
||||||
margin-left: (@gutter / -2);
|
|
||||||
margin-right: (@gutter / -2);
|
|
||||||
.clearfix();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate the extra small columns
|
|
||||||
.make-xs-column(@columns; @gutter: @grid-gutter-width) {
|
|
||||||
position: relative;
|
|
||||||
float: left;
|
|
||||||
width: percentage((@columns / @grid-columns));
|
|
||||||
// Prevent columns from collapsing when empty
|
|
||||||
min-height: 1px;
|
|
||||||
// Inner gutter via padding
|
|
||||||
padding-left: (@gutter / 2);
|
|
||||||
padding-right: (@gutter / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate the small columns
|
|
||||||
.make-sm-column(@columns; @gutter: @grid-gutter-width) {
|
|
||||||
position: relative;
|
|
||||||
// Prevent columns from collapsing when empty
|
|
||||||
min-height: 1px;
|
|
||||||
// Inner gutter via padding
|
|
||||||
padding-left: (@gutter / 2);
|
|
||||||
padding-right: (@gutter / 2);
|
|
||||||
|
|
||||||
// Calculate width based on number of columns available
|
|
||||||
@media (min-width: @screen-sm) {
|
|
||||||
float: left;
|
|
||||||
width: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate the small column offsets
|
|
||||||
.make-sm-column-offset(@columns) {
|
|
||||||
@media (min-width: @screen-sm) {
|
|
||||||
margin-left: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.make-sm-column-push(@columns) {
|
|
||||||
@media (min-width: @screen-sm) {
|
|
||||||
left: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.make-sm-column-pull(@columns) {
|
|
||||||
@media (min-width: @screen-sm) {
|
|
||||||
right: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate the medium columns
|
|
||||||
.make-md-column(@columns; @gutter: @grid-gutter-width) {
|
|
||||||
position: relative;
|
|
||||||
// Prevent columns from collapsing when empty
|
|
||||||
min-height: 1px;
|
|
||||||
// Inner gutter via padding
|
|
||||||
padding-left: (@gutter / 2);
|
|
||||||
padding-right: (@gutter / 2);
|
|
||||||
|
|
||||||
// Calculate width based on number of columns available
|
|
||||||
@media (min-width: @screen-md) {
|
|
||||||
float: left;
|
|
||||||
width: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate the large column offsets
|
|
||||||
.make-md-column-offset(@columns) {
|
|
||||||
@media (min-width: @screen-md) {
|
|
||||||
margin-left: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.make-md-column-push(@columns) {
|
|
||||||
@media (min-width: @screen-md) {
|
|
||||||
left: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.make-md-column-pull(@columns) {
|
|
||||||
@media (min-width: @screen-md) {
|
|
||||||
right: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate the large columns
|
|
||||||
.make-lg-column(@columns; @gutter: @grid-gutter-width) {
|
|
||||||
position: relative;
|
|
||||||
// Prevent columns from collapsing when empty
|
|
||||||
min-height: 1px;
|
|
||||||
// Inner gutter via padding
|
|
||||||
padding-left: (@gutter / 2);
|
|
||||||
padding-right: (@gutter / 2);
|
|
||||||
|
|
||||||
// Calculate width based on number of columns available
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
float: left;
|
|
||||||
width: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate the large column offsets
|
|
||||||
.make-lg-column-offset(@columns) {
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
margin-left: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.make-lg-column-push(@columns) {
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
left: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.make-lg-column-pull(@columns) {
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
right: percentage((@columns / @grid-columns));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Form validation states
|
|
||||||
//
|
|
||||||
// Used in forms.less to generate the form validation CSS for warnings, errors,
|
|
||||||
// and successes.
|
|
||||||
|
|
||||||
.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
|
|
||||||
// Color the label and help text
|
|
||||||
.help-block,
|
|
||||||
.control-label {
|
|
||||||
color: @text-color;
|
|
||||||
}
|
|
||||||
// Set the border and box shadow on specific inputs to match
|
|
||||||
.form-control {
|
|
||||||
border-color: @border-color;
|
|
||||||
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
|
|
||||||
&:focus {
|
|
||||||
border-color: darken(@border-color, 10%);
|
|
||||||
@shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);
|
|
||||||
.box-shadow(@shadow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Set validation states also for addons
|
|
||||||
.input-group-addon {
|
|
||||||
color: @text-color;
|
|
||||||
border-color: @border-color;
|
|
||||||
background-color: @background-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Form control focus state
|
|
||||||
//
|
|
||||||
// Generate a customized focus state and for any input with the specified color,
|
|
||||||
// which defaults to the `@input-focus-border` variable.
|
|
||||||
//
|
|
||||||
// We highly encourage you to not customize the default value, but instead use
|
|
||||||
// this to tweak colors on an as-needed basis. This aesthetic change is based on
|
|
||||||
// WebKit's default styles, but applicable to a wider range of browsers. Its
|
|
||||||
// usability and accessibility should be taken into account with any change.
|
|
||||||
//
|
|
||||||
// Example usage: change the default blue border and shadow to white for better
|
|
||||||
// contrast against a dark gray background.
|
|
||||||
|
|
||||||
.form-control-focus(@color: @input-border-focus) {
|
|
||||||
@color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
|
|
||||||
&:focus {
|
|
||||||
border-color: @color;
|
|
||||||
outline: 0;
|
|
||||||
.box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Form control sizing
|
|
||||||
//
|
|
||||||
// Relative text size, padding, and border-radii changes for form controls. For
|
|
||||||
// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
|
|
||||||
// element gets special love because it's special, and that's a fact!
|
|
||||||
|
|
||||||
.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
|
|
||||||
height: @input-height;
|
|
||||||
padding: @padding-vertical @padding-horizontal;
|
|
||||||
font-size: @font-size;
|
|
||||||
line-height: @line-height;
|
|
||||||
border-radius: @border-radius;
|
|
||||||
|
|
||||||
select& {
|
|
||||||
height: @input-height;
|
|
||||||
line-height: @input-height;
|
|
||||||
}
|
|
||||||
|
|
||||||
textarea& {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,141 +0,0 @@
|
|||||||
//
|
|
||||||
// Modals
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// .modal-open - body class for killing the scroll
|
|
||||||
// .modal - container to scroll within
|
|
||||||
// .modal-dialog - positioning shell for the actual modal
|
|
||||||
// .modal-content - actual modal w/ bg and corners and shit
|
|
||||||
|
|
||||||
// Kill the scroll on the body
|
|
||||||
.modal-open {
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
|
|
||||||
// Account for hiding of scrollbar
|
|
||||||
body&,
|
|
||||||
.navbar-fixed-top,
|
|
||||||
.navbar-fixed-bottom {
|
|
||||||
margin-right: 15px
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Container that the modal scrolls within
|
|
||||||
.modal {
|
|
||||||
display: none;
|
|
||||||
overflow: auto;
|
|
||||||
overflow-y: scroll;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: @zindex-modal-background;
|
|
||||||
|
|
||||||
// When fading in the modal, animate it to slide down
|
|
||||||
&.fade .modal-dialog {
|
|
||||||
.translate(0, -25%);
|
|
||||||
.transition-transform(~"0.3s ease-out");
|
|
||||||
}
|
|
||||||
&.in .modal-dialog { .translate(0, 0)}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shell div to position the modal with bottom padding
|
|
||||||
.modal-dialog {
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
width: auto;
|
|
||||||
padding: 10px;
|
|
||||||
z-index: (@zindex-modal-background + 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actual modal
|
|
||||||
.modal-content {
|
|
||||||
position: relative;
|
|
||||||
background-color: @modal-content-bg;
|
|
||||||
border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
|
|
||||||
border: 1px solid @modal-content-border-color;
|
|
||||||
border-radius: @border-radius-large;
|
|
||||||
.box-shadow(0 3px 9px rgba(0,0,0,.5));
|
|
||||||
background-clip: padding-box;
|
|
||||||
// Remove focus outline from opened modal
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal background
|
|
||||||
.modal-backdrop {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: (@zindex-modal-background - 10);
|
|
||||||
background-color: @modal-backdrop-bg;
|
|
||||||
// Fade for backdrop
|
|
||||||
&.fade { .opacity(0); }
|
|
||||||
&.in { .opacity(.5); }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal header
|
|
||||||
// Top section of the modal w/ title and dismiss
|
|
||||||
.modal-header {
|
|
||||||
padding: @modal-title-padding;
|
|
||||||
border-bottom: 1px solid @modal-header-border-color;
|
|
||||||
min-height: (@modal-title-padding + @modal-title-line-height);
|
|
||||||
}
|
|
||||||
// Close icon
|
|
||||||
.modal-header .close {
|
|
||||||
margin-top: -2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Title text within header
|
|
||||||
.modal-title {
|
|
||||||
margin: 0;
|
|
||||||
line-height: @modal-title-line-height;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modal body
|
|
||||||
// Where all modal content resides (sibling of .modal-header and .modal-footer)
|
|
||||||
.modal-body {
|
|
||||||
position: relative;
|
|
||||||
padding: @modal-inner-padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Footer (for actions)
|
|
||||||
.modal-footer {
|
|
||||||
margin-top: 15px;
|
|
||||||
padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;
|
|
||||||
text-align: right; // right align buttons
|
|
||||||
border-top: 1px solid @modal-footer-border-color;
|
|
||||||
.clearfix(); // clear it in case folks use .pull-* classes on buttons
|
|
||||||
|
|
||||||
// Properly space out buttons
|
|
||||||
.btn + .btn {
|
|
||||||
margin-left: 5px;
|
|
||||||
margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
|
|
||||||
}
|
|
||||||
// but override that for button groups
|
|
||||||
.btn-group .btn + .btn {
|
|
||||||
margin-left: -1px;
|
|
||||||
}
|
|
||||||
// and override it for block buttons as well
|
|
||||||
.btn-block + .btn-block {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scale up the modal
|
|
||||||
@media screen and (min-width: @screen-tablet) {
|
|
||||||
|
|
||||||
.modal-dialog {
|
|
||||||
left: 50%;
|
|
||||||
right: auto;
|
|
||||||
width: 600px;
|
|
||||||
padding-top: 30px;
|
|
||||||
padding-bottom: 30px;
|
|
||||||
}
|
|
||||||
.modal-content {
|
|
||||||
.box-shadow(0 5px 15px rgba(0,0,0,.5));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,621 +0,0 @@
|
|||||||
//
|
|
||||||
// Navbars
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Wrapper and base class
|
|
||||||
//
|
|
||||||
// Provide a static navbar from which we expand to create full-width, fixed, and
|
|
||||||
// other navbar variations.
|
|
||||||
|
|
||||||
.navbar {
|
|
||||||
position: relative;
|
|
||||||
z-index: @zindex-navbar;
|
|
||||||
min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
|
|
||||||
margin-bottom: @navbar-margin-bottom;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
|
|
||||||
// Prevent floats from breaking the navbar
|
|
||||||
.clearfix();
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
border-radius: @navbar-border-radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar heading
|
|
||||||
//
|
|
||||||
// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
|
|
||||||
// styling of responsive aspects.
|
|
||||||
|
|
||||||
.navbar-header {
|
|
||||||
.clearfix();
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar collapse (body)
|
|
||||||
//
|
|
||||||
// Group your navbar content into this for easy collapsing and expanding across
|
|
||||||
// various device sizes. By default, this content is collapsed when <768px, but
|
|
||||||
// will expand past that for a horizontal display.
|
|
||||||
//
|
|
||||||
// To start (on mobile devices) the navbar links, forms, and buttons are stacked
|
|
||||||
// vertically and include a `max-height` to overflow in case you have too much
|
|
||||||
// content for the user's viewport.
|
|
||||||
|
|
||||||
.navbar-collapse {
|
|
||||||
max-height: 340px;
|
|
||||||
overflow-x: visible;
|
|
||||||
padding-right: @navbar-padding-horizontal;
|
|
||||||
padding-left: @navbar-padding-horizontal;
|
|
||||||
border-top: 1px solid transparent;
|
|
||||||
box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
|
|
||||||
.clearfix();
|
|
||||||
-webkit-overflow-scrolling: touch;
|
|
||||||
|
|
||||||
&.in {
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
width: auto;
|
|
||||||
border-top: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
|
|
||||||
&.collapse {
|
|
||||||
display: block !important;
|
|
||||||
height: auto !important;
|
|
||||||
padding-bottom: 0; // Override default setting
|
|
||||||
overflow: visible !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.in {
|
|
||||||
overflow-y: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
.navbar-text:last-child {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Both navbar header and collapse
|
|
||||||
//
|
|
||||||
// When a container is present, change the behavior of the header and collapse.
|
|
||||||
|
|
||||||
.container > .navbar-header,
|
|
||||||
.container > .navbar-collapse {
|
|
||||||
margin-right: -@navbar-padding-horizontal;
|
|
||||||
margin-left: -@navbar-padding-horizontal;
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
margin-right: 0;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Navbar alignment options
|
|
||||||
//
|
|
||||||
// Display the navbar across the entirity of the page or fixed it to the top or
|
|
||||||
// bottom of the page.
|
|
||||||
|
|
||||||
// Static top (unfixed, but 100% wide) navbar
|
|
||||||
.navbar-static-top {
|
|
||||||
border-width: 0 0 1px;
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fix the top/bottom navbars when screen real estate supports it
|
|
||||||
.navbar-fixed-top,
|
|
||||||
.navbar-fixed-bottom {
|
|
||||||
position: fixed;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
border-width: 0 0 1px;
|
|
||||||
|
|
||||||
// Undo the rounded corners
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.navbar-fixed-top {
|
|
||||||
z-index: @zindex-navbar-fixed;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
.navbar-fixed-bottom {
|
|
||||||
bottom: 0;
|
|
||||||
margin-bottom: 0; // override .navbar defaults
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Brand/project name
|
|
||||||
|
|
||||||
.navbar-brand {
|
|
||||||
float: left;
|
|
||||||
padding: @navbar-padding-vertical @navbar-padding-horizontal;
|
|
||||||
font-size: @font-size-large;
|
|
||||||
line-height: @line-height-computed;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
.navbar > .container & {
|
|
||||||
margin-left: -@navbar-padding-horizontal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar toggle
|
|
||||||
//
|
|
||||||
// Custom button for toggling the `.navbar-collapse`, powered by the collapse
|
|
||||||
// JavaScript plugin.
|
|
||||||
|
|
||||||
.navbar-toggle {
|
|
||||||
position: relative;
|
|
||||||
float: right;
|
|
||||||
margin-right: @navbar-padding-horizontal;
|
|
||||||
padding: 9px 10px;
|
|
||||||
.navbar-vertical-align(34px);
|
|
||||||
background-color: transparent;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
|
|
||||||
// Bars
|
|
||||||
.icon-bar {
|
|
||||||
display: block;
|
|
||||||
width: 22px;
|
|
||||||
height: 2px;
|
|
||||||
border-radius: 1px;
|
|
||||||
}
|
|
||||||
.icon-bar + .icon-bar {
|
|
||||||
margin-top: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar nav links
|
|
||||||
//
|
|
||||||
// Builds on top of the `.nav` components with it's own modifier class to make
|
|
||||||
// the nav the full height of the horizontal nav (above 768px).
|
|
||||||
|
|
||||||
.navbar-nav {
|
|
||||||
margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;
|
|
||||||
|
|
||||||
> li > a {
|
|
||||||
padding-top: 10px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
line-height: @line-height-computed;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
// Dropdowns get custom display when collapsed
|
|
||||||
.open .dropdown-menu {
|
|
||||||
position: static;
|
|
||||||
float: none;
|
|
||||||
width: auto;
|
|
||||||
margin-top: 0;
|
|
||||||
background-color: transparent;
|
|
||||||
border: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
> li > a,
|
|
||||||
.dropdown-header {
|
|
||||||
padding: 5px 15px 5px 25px;
|
|
||||||
}
|
|
||||||
> li > a {
|
|
||||||
line-height: @line-height-computed;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uncollapse the nav
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
float: left;
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
float: left;
|
|
||||||
> a {
|
|
||||||
padding-top: ((@navbar-height - @line-height-computed) / 2);
|
|
||||||
padding-bottom: ((@navbar-height - @line-height-computed) / 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Component alignment
|
|
||||||
//
|
|
||||||
// Repurpose the pull utilities as their own navbar utilities to avoid specifity
|
|
||||||
// issues with parents and chaining. Only do this when the navbar is uncollapsed
|
|
||||||
// though so that navbar contents properly stack and align in mobile.
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
.navbar-left { .pull-left(); }
|
|
||||||
.navbar-right { .pull-right(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar form
|
|
||||||
//
|
|
||||||
// Extension of the `.form-inline` with some extra flavor for optimum display in
|
|
||||||
// our navbars.
|
|
||||||
|
|
||||||
.navbar-form {
|
|
||||||
margin-left: -@navbar-padding-horizontal;
|
|
||||||
margin-right: -@navbar-padding-horizontal;
|
|
||||||
padding: 10px @navbar-padding-horizontal;
|
|
||||||
border-top: 1px solid transparent;
|
|
||||||
border-bottom: 1px solid transparent;
|
|
||||||
@shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
|
|
||||||
.box-shadow(@shadow);
|
|
||||||
|
|
||||||
// Mixin behavior for optimum display
|
|
||||||
.form-inline();
|
|
||||||
|
|
||||||
.form-group {
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vertically center in expanded, horizontal navbar
|
|
||||||
.navbar-vertical-align(@input-height-base);
|
|
||||||
|
|
||||||
// Undo 100% width for pull classes
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
width: auto;
|
|
||||||
border: 0;
|
|
||||||
margin-left: 0;
|
|
||||||
margin-right: 0;
|
|
||||||
padding-top: 0;
|
|
||||||
padding-bottom: 0;
|
|
||||||
.box-shadow(none);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Dropdown menus
|
|
||||||
|
|
||||||
// Menu position and menu carets
|
|
||||||
.navbar-nav > li > .dropdown-menu {
|
|
||||||
margin-top: 0;
|
|
||||||
.border-top-radius(0);
|
|
||||||
}
|
|
||||||
// Menu position and menu caret support for dropups via extra dropup class
|
|
||||||
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
|
|
||||||
.border-bottom-radius(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Right aligned menus need alt position
|
|
||||||
.navbar-nav.pull-right > li > .dropdown-menu,
|
|
||||||
.navbar-nav > li > .dropdown-menu.pull-right {
|
|
||||||
left: auto;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Buttons in navbars
|
|
||||||
//
|
|
||||||
// Vertically center a button within a navbar (when *not* in a form).
|
|
||||||
|
|
||||||
.navbar-btn {
|
|
||||||
.navbar-vertical-align(@input-height-base);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Text in navbars
|
|
||||||
//
|
|
||||||
// Add a class to make any element properly align itself vertically within the navbars.
|
|
||||||
|
|
||||||
.navbar-text {
|
|
||||||
float: left;
|
|
||||||
.navbar-vertical-align(@line-height-computed);
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
margin-left: @navbar-padding-horizontal;
|
|
||||||
margin-right: @navbar-padding-horizontal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alternate navbars
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Default navbar
|
|
||||||
.navbar-default {
|
|
||||||
background-color: @navbar-default-bg;
|
|
||||||
border-color: @navbar-default-border;
|
|
||||||
|
|
||||||
.navbar-brand {
|
|
||||||
color: @navbar-default-brand-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-default-brand-hover-color;
|
|
||||||
background-color: @navbar-default-brand-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-text {
|
|
||||||
color: @navbar-default-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav {
|
|
||||||
> li > a {
|
|
||||||
color: @navbar-default-link-color;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-default-link-hover-color;
|
|
||||||
background-color: @navbar-default-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-default-link-active-color;
|
|
||||||
background-color: @navbar-default-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-default-link-disabled-color;
|
|
||||||
background-color: @navbar-default-link-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-toggle {
|
|
||||||
border-color: @navbar-default-toggle-border-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: @navbar-default-toggle-hover-bg;
|
|
||||||
}
|
|
||||||
.icon-bar {
|
|
||||||
background-color: @navbar-default-toggle-icon-bar-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-collapse,
|
|
||||||
.navbar-form {
|
|
||||||
border-color: darken(@navbar-default-bg, 7%);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dropdown menu items and carets
|
|
||||||
.navbar-nav {
|
|
||||||
// Caret should match text color on hover
|
|
||||||
> .dropdown > a:hover .caret,
|
|
||||||
> .dropdown > a:focus .caret {
|
|
||||||
border-top-color: @navbar-default-link-hover-color;
|
|
||||||
border-bottom-color: @navbar-default-link-hover-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove background color from open dropdown
|
|
||||||
> .open > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: @navbar-default-link-active-bg;
|
|
||||||
color: @navbar-default-link-active-color;
|
|
||||||
.caret {
|
|
||||||
border-top-color: @navbar-default-link-active-color;
|
|
||||||
border-bottom-color: @navbar-default-link-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .dropdown > a .caret {
|
|
||||||
border-top-color: @navbar-default-link-color;
|
|
||||||
border-bottom-color: @navbar-default-link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
// Dropdowns get custom display when collapsed
|
|
||||||
.open .dropdown-menu {
|
|
||||||
> li > a {
|
|
||||||
color: @navbar-default-link-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-default-link-hover-color;
|
|
||||||
background-color: @navbar-default-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-default-link-active-color;
|
|
||||||
background-color: @navbar-default-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-default-link-disabled-color;
|
|
||||||
background-color: @navbar-default-link-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Links in navbars
|
|
||||||
//
|
|
||||||
// Add a class to ensure links outside the navbar nav are colored correctly.
|
|
||||||
|
|
||||||
.navbar-link {
|
|
||||||
color: @navbar-default-link-color;
|
|
||||||
&:hover {
|
|
||||||
color: @navbar-default-link-hover-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inverse navbar
|
|
||||||
|
|
||||||
.navbar-inverse {
|
|
||||||
background-color: @navbar-inverse-bg;
|
|
||||||
border-color: @navbar-inverse-border;
|
|
||||||
|
|
||||||
.navbar-brand {
|
|
||||||
color: @navbar-inverse-brand-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-inverse-brand-hover-color;
|
|
||||||
background-color: @navbar-inverse-brand-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-text {
|
|
||||||
color: @navbar-inverse-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav {
|
|
||||||
> li > a {
|
|
||||||
color: @navbar-inverse-link-color;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-inverse-link-hover-color;
|
|
||||||
background-color: @navbar-inverse-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-inverse-link-active-color;
|
|
||||||
background-color: @navbar-inverse-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-inverse-link-disabled-color;
|
|
||||||
background-color: @navbar-inverse-link-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Darken the responsive nav toggle
|
|
||||||
.navbar-toggle {
|
|
||||||
border-color: @navbar-inverse-toggle-border-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: @navbar-inverse-toggle-hover-bg;
|
|
||||||
}
|
|
||||||
.icon-bar {
|
|
||||||
background-color: @navbar-inverse-toggle-icon-bar-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-collapse,
|
|
||||||
.navbar-form {
|
|
||||||
border-color: darken(@navbar-inverse-bg, 7%);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dropdowns
|
|
||||||
.navbar-nav {
|
|
||||||
> .open > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: @navbar-inverse-link-active-bg;
|
|
||||||
color: @navbar-inverse-link-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .dropdown > a:hover .caret {
|
|
||||||
border-top-color: @navbar-inverse-link-hover-color;
|
|
||||||
border-bottom-color: @navbar-inverse-link-hover-color;
|
|
||||||
}
|
|
||||||
> .dropdown > a .caret {
|
|
||||||
border-top-color: @navbar-inverse-link-color;
|
|
||||||
border-bottom-color: @navbar-inverse-link-color;
|
|
||||||
}
|
|
||||||
> .open > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
.caret {
|
|
||||||
border-top-color: @navbar-inverse-link-active-color;
|
|
||||||
border-bottom-color: @navbar-inverse-link-active-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
// Dropdowns get custom display
|
|
||||||
.open .dropdown-menu {
|
|
||||||
> .dropdown-header {
|
|
||||||
border-color: @navbar-inverse-border;
|
|
||||||
}
|
|
||||||
> li > a {
|
|
||||||
color: @navbar-inverse-link-color;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-inverse-link-hover-color;
|
|
||||||
background-color: @navbar-inverse-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-inverse-link-active-color;
|
|
||||||
background-color: @navbar-inverse-link-active-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> .disabled > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @navbar-inverse-link-disabled-color;
|
|
||||||
background-color: @navbar-inverse-link-disabled-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-link {
|
|
||||||
color: @navbar-inverse-link-color;
|
|
||||||
&:hover {
|
|
||||||
color: @navbar-inverse-link-hover-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,229 +0,0 @@
|
|||||||
//
|
|
||||||
// Navs
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.nav {
|
|
||||||
margin-bottom: 0;
|
|
||||||
padding-left: 0; // Override default ul/ol
|
|
||||||
list-style: none;
|
|
||||||
.clearfix();
|
|
||||||
|
|
||||||
> li {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
|
|
||||||
> a {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
padding: @nav-link-padding;
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: @nav-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disabled state sets text to gray and nukes hover/tab effects
|
|
||||||
&.disabled > a {
|
|
||||||
color: @nav-disabled-link-color;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @nav-disabled-link-hover-color;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: transparent;
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open dropdowns
|
|
||||||
.open > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: @nav-link-hover-bg;
|
|
||||||
border-color: @link-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dividers (basically an hr) within the dropdown
|
|
||||||
.nav-divider {
|
|
||||||
.nav-divider();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent IE8 from misplacing imgs
|
|
||||||
// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
|
|
||||||
> li > a > img {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tabs
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Give the tabs something to sit on
|
|
||||||
.nav-tabs {
|
|
||||||
border-bottom: 1px solid @nav-tabs-border-color;
|
|
||||||
> li {
|
|
||||||
float: left;
|
|
||||||
// Make the list-items overlay the bottom border
|
|
||||||
margin-bottom: -1px;
|
|
||||||
|
|
||||||
// Actual tabs (as links)
|
|
||||||
> a {
|
|
||||||
margin-right: 2px;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: @border-radius-base @border-radius-base 0 0;
|
|
||||||
&:hover {
|
|
||||||
border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Active state, and it's :hover to override normal :hover
|
|
||||||
&.active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @nav-tabs-active-link-hover-color;
|
|
||||||
background-color: @nav-tabs-active-link-hover-bg;
|
|
||||||
border: 1px solid @nav-tabs-active-link-hover-border-color;
|
|
||||||
border-bottom-color: transparent;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// pulling this in mainly for less shorthand
|
|
||||||
&.nav-justified {
|
|
||||||
.nav-justified();
|
|
||||||
.nav-tabs-justified();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Pills
|
|
||||||
// -------------------------
|
|
||||||
.nav-pills {
|
|
||||||
> li {
|
|
||||||
float: left;
|
|
||||||
|
|
||||||
// Links rendered as pills
|
|
||||||
> a {
|
|
||||||
border-radius: 5px;
|
|
||||||
}
|
|
||||||
+ li {
|
|
||||||
margin-left: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Active state
|
|
||||||
&.active > a {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @nav-pills-active-link-hover-color;
|
|
||||||
background-color: @nav-pills-active-link-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Stacked pills
|
|
||||||
.nav-stacked {
|
|
||||||
> li {
|
|
||||||
float: none;
|
|
||||||
+ li {
|
|
||||||
margin-top: 2px;
|
|
||||||
margin-left: 0; // no need for this gap between nav items
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Nav variations
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Justified nav links
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.nav-justified {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
float: none;
|
|
||||||
> a {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: @screen-sm) {
|
|
||||||
> li {
|
|
||||||
display: table-cell;
|
|
||||||
width: 1%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move borders to anchors instead of bottom of list
|
|
||||||
.nav-tabs-justified {
|
|
||||||
border-bottom: 0;
|
|
||||||
> li > a {
|
|
||||||
border-bottom: 1px solid @nav-tabs-justified-link-border-color;
|
|
||||||
|
|
||||||
// Override margin from .nav-tabs
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
> .active > a {
|
|
||||||
border-bottom-color: @nav-tabs-justified-active-link-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tabbable tabs
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Clear any floats
|
|
||||||
.tabbable {
|
|
||||||
.clearfix();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show/hide tabbable areas
|
|
||||||
.tab-content > .tab-pane,
|
|
||||||
.pill-content > .pill-pane {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.tab-content,
|
|
||||||
.pill-content {
|
|
||||||
> .active {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Dropdowns
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Make dropdown carets use link color in navs
|
|
||||||
.nav .caret {
|
|
||||||
border-top-color: @link-color;
|
|
||||||
border-bottom-color: @link-color;
|
|
||||||
}
|
|
||||||
.nav a:hover .caret {
|
|
||||||
border-top-color: @link-hover-color;
|
|
||||||
border-bottom-color: @link-hover-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Specific dropdowns
|
|
||||||
.nav-tabs .dropdown-menu {
|
|
||||||
// make dropdown border overlap tab border
|
|
||||||
margin-top: -1px;
|
|
||||||
// Remove the top rounded corners here since there is a hard edge above the menu
|
|
||||||
.border-top-radius(0);
|
|
||||||
}
|
|
396
res/libs/bootstrap/less/normalize.less
vendored
396
res/libs/bootstrap/less/normalize.less
vendored
@ -1,396 +0,0 @@
|
|||||||
/*! normalize.css v2.1.0 | MIT License | git.io/normalize */
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// HTML5 display definitions
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Correct `block` display not defined in IE 8/9.
|
|
||||||
//
|
|
||||||
|
|
||||||
article,
|
|
||||||
aside,
|
|
||||||
details,
|
|
||||||
figcaption,
|
|
||||||
figure,
|
|
||||||
footer,
|
|
||||||
header,
|
|
||||||
hgroup,
|
|
||||||
main,
|
|
||||||
nav,
|
|
||||||
section,
|
|
||||||
summary {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Correct `inline-block` display not defined in IE 8/9.
|
|
||||||
//
|
|
||||||
|
|
||||||
audio,
|
|
||||||
canvas,
|
|
||||||
video {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Prevent modern browsers from displaying `audio` without controls.
|
|
||||||
// Remove excess height in iOS 5 devices.
|
|
||||||
//
|
|
||||||
|
|
||||||
audio:not([controls]) {
|
|
||||||
display: none;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address styling not present in IE 8/9.
|
|
||||||
//
|
|
||||||
|
|
||||||
[hidden] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// Base
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Set default font family to sans-serif.
|
|
||||||
// 2. Prevent iOS text size adjust after orientation change, without disabling
|
|
||||||
// user zoom.
|
|
||||||
//
|
|
||||||
|
|
||||||
html {
|
|
||||||
font-family: sans-serif; // 1
|
|
||||||
-webkit-text-size-adjust: 100%; // 2
|
|
||||||
-ms-text-size-adjust: 100%; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove default margin.
|
|
||||||
//
|
|
||||||
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// Links
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address `outline` inconsistency between Chrome and other browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
a:focus {
|
|
||||||
outline: thin dotted;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Improve readability when focused and also mouse hovered in all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
a:active,
|
|
||||||
a:hover {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// Typography
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address variable `h1` font-size and margin within `section` and `article`
|
|
||||||
// contexts in Firefox 4+, Safari 5, and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 2em;
|
|
||||||
margin: 0.67em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address styling not present in IE 8/9, Safari 5, and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
abbr[title] {
|
|
||||||
border-bottom: 1px dotted;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
b,
|
|
||||||
strong {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address styling not present in Safari 5 and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
dfn {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address differences between Firefox and other browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
hr {
|
|
||||||
-moz-box-sizing: content-box;
|
|
||||||
box-sizing: content-box;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address styling not present in IE 8/9.
|
|
||||||
//
|
|
||||||
|
|
||||||
mark {
|
|
||||||
background: #ff0;
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Correct font family set oddly in Safari 5 and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
code,
|
|
||||||
kbd,
|
|
||||||
pre,
|
|
||||||
samp {
|
|
||||||
font-family: monospace, serif;
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Improve readability of pre-formatted text in all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
pre {
|
|
||||||
white-space: pre-wrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Set consistent quote types.
|
|
||||||
//
|
|
||||||
|
|
||||||
q {
|
|
||||||
quotes: "\201C" "\201D" "\2018" "\2019";
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address inconsistent and variable font size in all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
small {
|
|
||||||
font-size: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
sub,
|
|
||||||
sup {
|
|
||||||
font-size: 75%;
|
|
||||||
line-height: 0;
|
|
||||||
position: relative;
|
|
||||||
vertical-align: baseline;
|
|
||||||
}
|
|
||||||
|
|
||||||
sup {
|
|
||||||
top: -0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub {
|
|
||||||
bottom: -0.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// Embedded content
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove border when inside `a` element in IE 8/9.
|
|
||||||
//
|
|
||||||
|
|
||||||
img {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Correct overflow displayed oddly in IE 9.
|
|
||||||
//
|
|
||||||
|
|
||||||
svg:not(:root) {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// Figures
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address margin not present in IE 8/9 and Safari 5.
|
|
||||||
//
|
|
||||||
|
|
||||||
figure {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// Forms
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Define consistent border, margin, and padding.
|
|
||||||
//
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
border: 1px solid #c0c0c0;
|
|
||||||
margin: 0 2px;
|
|
||||||
padding: 0.35em 0.625em 0.75em;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Correct `color` not being inherited in IE 8/9.
|
|
||||||
// 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
|
||||||
//
|
|
||||||
|
|
||||||
legend {
|
|
||||||
border: 0; // 1
|
|
||||||
padding: 0; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Correct font family not being inherited in all browsers.
|
|
||||||
// 2. Correct font size not being inherited in all browsers.
|
|
||||||
// 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
|
|
||||||
//
|
|
||||||
|
|
||||||
button,
|
|
||||||
input,
|
|
||||||
select,
|
|
||||||
textarea {
|
|
||||||
font-family: inherit; // 1
|
|
||||||
font-size: 100%; // 2
|
|
||||||
margin: 0; // 3
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
|
||||||
// the UA stylesheet.
|
|
||||||
//
|
|
||||||
|
|
||||||
button,
|
|
||||||
input {
|
|
||||||
line-height: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Address inconsistent `text-transform` inheritance for `button` and `select`.
|
|
||||||
// All other form control elements do not inherit `text-transform` values.
|
|
||||||
// Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
|
|
||||||
// Correct `select` style inheritance in Firefox 4+ and Opera.
|
|
||||||
//
|
|
||||||
|
|
||||||
button,
|
|
||||||
select {
|
|
||||||
text-transform: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
|
||||||
// and `video` controls.
|
|
||||||
// 2. Correct inability to style clickable `input` types in iOS.
|
|
||||||
// 3. Improve usability and consistency of cursor style between image-type
|
|
||||||
// `input` and others.
|
|
||||||
//
|
|
||||||
|
|
||||||
button,
|
|
||||||
html input[type="button"], // 1
|
|
||||||
input[type="reset"],
|
|
||||||
input[type="submit"] {
|
|
||||||
-webkit-appearance: button; // 2
|
|
||||||
cursor: pointer; // 3
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Re-set default cursor for disabled elements.
|
|
||||||
//
|
|
||||||
|
|
||||||
button[disabled],
|
|
||||||
html input[disabled] {
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Address box sizing set to `content-box` in IE 8/9.
|
|
||||||
// 2. Remove excess padding in IE 8/9.
|
|
||||||
//
|
|
||||||
|
|
||||||
input[type="checkbox"],
|
|
||||||
input[type="radio"] {
|
|
||||||
box-sizing: border-box; // 1
|
|
||||||
padding: 0; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
|
|
||||||
// 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
|
|
||||||
// (include `-moz` to future-proof).
|
|
||||||
//
|
|
||||||
|
|
||||||
input[type="search"] {
|
|
||||||
-webkit-appearance: textfield; // 1
|
|
||||||
-moz-box-sizing: content-box;
|
|
||||||
-webkit-box-sizing: content-box; // 2
|
|
||||||
box-sizing: content-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove inner padding and search cancel button in Safari 5 and Chrome
|
|
||||||
// on OS X.
|
|
||||||
//
|
|
||||||
|
|
||||||
input[type="search"]::-webkit-search-cancel-button,
|
|
||||||
input[type="search"]::-webkit-search-decoration {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove inner padding and border in Firefox 4+.
|
|
||||||
//
|
|
||||||
|
|
||||||
button::-moz-focus-inner,
|
|
||||||
input::-moz-focus-inner {
|
|
||||||
border: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1. Remove default vertical scrollbar in IE 8/9.
|
|
||||||
// 2. Improve readability and alignment in all browsers.
|
|
||||||
//
|
|
||||||
|
|
||||||
textarea {
|
|
||||||
overflow: auto; // 1
|
|
||||||
vertical-align: top; // 2
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================================
|
|
||||||
// Tables
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Remove most spacing between table cells.
|
|
||||||
//
|
|
||||||
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
border-spacing: 0;
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
//
|
|
||||||
// Pager pagination
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.pager {
|
|
||||||
padding-left: 0;
|
|
||||||
margin: @line-height-computed 0;
|
|
||||||
list-style: none;
|
|
||||||
text-align: center;
|
|
||||||
.clearfix();
|
|
||||||
li {
|
|
||||||
display: inline;
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 5px 14px;
|
|
||||||
background-color: @pagination-bg;
|
|
||||||
border: 1px solid @pagination-border;
|
|
||||||
border-radius: @pager-border-radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
> a:hover,
|
|
||||||
> a:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: @pagination-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.next {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.previous {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.disabled {
|
|
||||||
> a,
|
|
||||||
> a:hover,
|
|
||||||
> a:focus,
|
|
||||||
> span {
|
|
||||||
color: @pager-disabled-color;
|
|
||||||
background-color: @pagination-bg;
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,83 +0,0 @@
|
|||||||
//
|
|
||||||
// Pagination (multiple pages)
|
|
||||||
// --------------------------------------------------
|
|
||||||
.pagination {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 0;
|
|
||||||
margin: @line-height-computed 0;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
display: inline; // Remove list-style and block-level defaults
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
position: relative;
|
|
||||||
float: left; // Collapse white-space
|
|
||||||
padding: @padding-base-vertical @padding-base-horizontal;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: @pagination-bg;
|
|
||||||
border: 1px solid @pagination-border;
|
|
||||||
margin-left: -1px;
|
|
||||||
}
|
|
||||||
&:first-child {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
margin-left: 0;
|
|
||||||
.border-left-radius(@border-radius-base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:last-child {
|
|
||||||
> a,
|
|
||||||
> span {
|
|
||||||
.border-right-radius(@border-radius-base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> li > a,
|
|
||||||
> li > span {
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
background-color: @pagination-hover-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .active > a,
|
|
||||||
> .active > span {
|
|
||||||
&,
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
z-index: 2;
|
|
||||||
color: @pagination-active-color;
|
|
||||||
background-color: @pagination-active-bg;
|
|
||||||
border-color: @pagination-active-bg;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
> .disabled {
|
|
||||||
> span,
|
|
||||||
> a,
|
|
||||||
> a:hover,
|
|
||||||
> a:focus {
|
|
||||||
color: @pagination-disabled-color;
|
|
||||||
background-color: @pagination-bg;
|
|
||||||
border-color: @pagination-border;
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sizing
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Large
|
|
||||||
.pagination-lg {
|
|
||||||
.pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Small
|
|
||||||
.pagination-sm {
|
|
||||||
.pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);
|
|
||||||
}
|
|
@ -1,148 +0,0 @@
|
|||||||
//
|
|
||||||
// Panels
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
.panel {
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
background-color: @panel-bg;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: @panel-border-radius;
|
|
||||||
.box-shadow(0 1px 1px rgba(0,0,0,.05));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panel contents
|
|
||||||
.panel-body {
|
|
||||||
padding: 15px;
|
|
||||||
.clearfix();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// List groups in panels
|
|
||||||
//
|
|
||||||
// By default, space out list group content from panel headings to account for
|
|
||||||
// any kind of custom content between the two.
|
|
||||||
|
|
||||||
.panel {
|
|
||||||
> .list-group {
|
|
||||||
margin-bottom: 0;
|
|
||||||
|
|
||||||
.list-group-item {
|
|
||||||
border-width: 1px 0;
|
|
||||||
|
|
||||||
// Remove border radius for top one
|
|
||||||
&:first-child {
|
|
||||||
.border-top-radius(0);
|
|
||||||
}
|
|
||||||
// But keep it for the last one
|
|
||||||
&:last-child {
|
|
||||||
border-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Collapse space between when there's no additional content.
|
|
||||||
.panel-heading + .list-group {
|
|
||||||
.list-group-item:first-child {
|
|
||||||
border-top-width: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tables in panels
|
|
||||||
//
|
|
||||||
// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
|
|
||||||
// watch it go full width.
|
|
||||||
|
|
||||||
.panel {
|
|
||||||
> .table {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
> .panel-body + .table {
|
|
||||||
border-top: 1px solid @table-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Optional heading
|
|
||||||
.panel-heading {
|
|
||||||
padding: 10px 15px;
|
|
||||||
border-bottom: 1px solid transparent;
|
|
||||||
.border-top-radius(@panel-border-radius - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Within heading, strip any `h*` tag of it's default margins for spacing.
|
|
||||||
.panel-title {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
font-size: ceil((@font-size-base * 1.125));
|
|
||||||
> a {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optional footer (stays gray in every modifier class)
|
|
||||||
.panel-footer {
|
|
||||||
padding: 10px 15px;
|
|
||||||
background-color: @panel-footer-bg;
|
|
||||||
border-top: 1px solid @panel-inner-border;
|
|
||||||
.border-bottom-radius(@panel-border-radius - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Collapsable panels (aka, accordion)
|
|
||||||
//
|
|
||||||
// Wrap a series of panels in `.panel-group` to turn them into an accordion with
|
|
||||||
// the help of our collapse JavaScript plugin.
|
|
||||||
|
|
||||||
.panel-group {
|
|
||||||
// Tighten up margin so it's only between panels
|
|
||||||
.panel {
|
|
||||||
margin-bottom: 0;
|
|
||||||
border-radius: @panel-border-radius;
|
|
||||||
overflow: hidden; // crop contents when collapsed
|
|
||||||
+ .panel {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-heading {
|
|
||||||
border-bottom: 0;
|
|
||||||
+ .panel-collapse .panel-body {
|
|
||||||
border-top: 1px solid @panel-inner-border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.panel-footer {
|
|
||||||
border-top: 0;
|
|
||||||
+ .panel-collapse .panel-body {
|
|
||||||
border-bottom: 1px solid @panel-inner-border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// New subcomponent for wrapping collapsable content for proper animations
|
|
||||||
.panel-collapse {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Contextual variations
|
|
||||||
.panel-default {
|
|
||||||
.panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);
|
|
||||||
}
|
|
||||||
.panel-primary {
|
|
||||||
.panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);
|
|
||||||
}
|
|
||||||
.panel-success {
|
|
||||||
.panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);
|
|
||||||
}
|
|
||||||
.panel-warning {
|
|
||||||
.panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);
|
|
||||||
}
|
|
||||||
.panel-danger {
|
|
||||||
.panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);
|
|
||||||
}
|
|
||||||
.panel-info {
|
|
||||||
.panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);
|
|
||||||
}
|
|
@ -1,133 +0,0 @@
|
|||||||
//
|
|
||||||
// Popovers
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.popover {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: @zindex-popover;
|
|
||||||
display: none;
|
|
||||||
max-width: @popover-max-width;
|
|
||||||
padding: 1px;
|
|
||||||
text-align: left; // Reset given new insertion method
|
|
||||||
background-color: @popover-bg;
|
|
||||||
background-clip: padding-box;
|
|
||||||
border: 1px solid @popover-fallback-border-color;
|
|
||||||
border: 1px solid @popover-border-color;
|
|
||||||
border-radius: @border-radius-large;
|
|
||||||
.box-shadow(0 5px 10px rgba(0,0,0,.2));
|
|
||||||
|
|
||||||
// Overrides for proper insertion
|
|
||||||
white-space: normal;
|
|
||||||
|
|
||||||
// Offset the popover to account for the popover arrow
|
|
||||||
&.top { margin-top: -10px; }
|
|
||||||
&.right { margin-left: 10px; }
|
|
||||||
&.bottom { margin-top: 10px; }
|
|
||||||
&.left { margin-left: -10px; }
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover-title {
|
|
||||||
margin: 0; // reset heading margin
|
|
||||||
padding: 8px 14px;
|
|
||||||
font-size: @font-size-base;
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: 18px;
|
|
||||||
background-color: @popover-title-bg;
|
|
||||||
border-bottom: 1px solid darken(@popover-title-bg, 5%);
|
|
||||||
border-radius: 5px 5px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover-content {
|
|
||||||
padding: 9px 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Arrows
|
|
||||||
//
|
|
||||||
// .arrow is outer, .arrow:after is inner
|
|
||||||
|
|
||||||
.popover .arrow {
|
|
||||||
&,
|
|
||||||
&:after {
|
|
||||||
position: absolute;
|
|
||||||
display: block;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
border-color: transparent;
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.popover .arrow {
|
|
||||||
border-width: @popover-arrow-outer-width;
|
|
||||||
}
|
|
||||||
.popover .arrow:after {
|
|
||||||
border-width: @popover-arrow-width;
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover {
|
|
||||||
&.top .arrow {
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -@popover-arrow-outer-width;
|
|
||||||
border-bottom-width: 0;
|
|
||||||
border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback
|
|
||||||
border-top-color: @popover-arrow-outer-color;
|
|
||||||
bottom: -@popover-arrow-outer-width;
|
|
||||||
&:after {
|
|
||||||
content: " ";
|
|
||||||
bottom: 1px;
|
|
||||||
margin-left: -@popover-arrow-width;
|
|
||||||
border-bottom-width: 0;
|
|
||||||
border-top-color: @popover-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.right .arrow {
|
|
||||||
top: 50%;
|
|
||||||
left: -@popover-arrow-outer-width;
|
|
||||||
margin-top: -@popover-arrow-outer-width;
|
|
||||||
border-left-width: 0;
|
|
||||||
border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback
|
|
||||||
border-right-color: @popover-arrow-outer-color;
|
|
||||||
&:after {
|
|
||||||
content: " ";
|
|
||||||
left: 1px;
|
|
||||||
bottom: -@popover-arrow-width;
|
|
||||||
border-left-width: 0;
|
|
||||||
border-right-color: @popover-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.bottom .arrow {
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -@popover-arrow-outer-width;
|
|
||||||
border-top-width: 0;
|
|
||||||
border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback
|
|
||||||
border-bottom-color: @popover-arrow-outer-color;
|
|
||||||
top: -@popover-arrow-outer-width;
|
|
||||||
&:after {
|
|
||||||
content: " ";
|
|
||||||
top: 1px;
|
|
||||||
margin-left: -@popover-arrow-width;
|
|
||||||
border-top-width: 0;
|
|
||||||
border-bottom-color: @popover-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.left .arrow {
|
|
||||||
top: 50%;
|
|
||||||
right: -@popover-arrow-outer-width;
|
|
||||||
margin-top: -@popover-arrow-outer-width;
|
|
||||||
border-right-width: 0;
|
|
||||||
border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback
|
|
||||||
border-left-color: @popover-arrow-outer-color;
|
|
||||||
&:after {
|
|
||||||
content: " ";
|
|
||||||
right: 1px;
|
|
||||||
border-right-width: 0;
|
|
||||||
border-left-color: @popover-arrow-color;
|
|
||||||
bottom: -@popover-arrow-width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,100 +0,0 @@
|
|||||||
//
|
|
||||||
// Basic print styles
|
|
||||||
// --------------------------------------------------
|
|
||||||
// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
|
|
||||||
* {
|
|
||||||
text-shadow: none !important;
|
|
||||||
color: #000 !important; // Black prints faster: h5bp.com/s
|
|
||||||
background: transparent !important;
|
|
||||||
box-shadow: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
a,
|
|
||||||
a:visited {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
a[href]:after {
|
|
||||||
content: " (" attr(href) ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
abbr[title]:after {
|
|
||||||
content: " (" attr(title) ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't show links for images, or javascript/internal links
|
|
||||||
.ir a:after,
|
|
||||||
a[href^="javascript:"]:after,
|
|
||||||
a[href^="#"]:after {
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
pre,
|
|
||||||
blockquote {
|
|
||||||
border: 1px solid #999;
|
|
||||||
page-break-inside: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
thead {
|
|
||||||
display: table-header-group; // h5bp.com/t
|
|
||||||
}
|
|
||||||
|
|
||||||
tr,
|
|
||||||
img {
|
|
||||||
page-break-inside: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
max-width: 100% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
@page {
|
|
||||||
margin: 2cm .5cm;
|
|
||||||
}
|
|
||||||
|
|
||||||
p,
|
|
||||||
h2,
|
|
||||||
h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2,
|
|
||||||
h3 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bootstrap components
|
|
||||||
.navbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.table {
|
|
||||||
td,
|
|
||||||
th {
|
|
||||||
background-color: #fff !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.btn,
|
|
||||||
.dropup > .btn {
|
|
||||||
> .caret {
|
|
||||||
border-top-color: #000 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.label {
|
|
||||||
border: 1px solid #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table {
|
|
||||||
border-collapse: collapse !important;
|
|
||||||
}
|
|
||||||
.table-bordered {
|
|
||||||
th,
|
|
||||||
td {
|
|
||||||
border: 1px solid #ddd !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,95 +0,0 @@
|
|||||||
//
|
|
||||||
// Progress bars
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Bar animations
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Webkit
|
|
||||||
@-webkit-keyframes progress-bar-stripes {
|
|
||||||
from { background-position: 40px 0; }
|
|
||||||
to { background-position: 0 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Firefox
|
|
||||||
@-moz-keyframes progress-bar-stripes {
|
|
||||||
from { background-position: 40px 0; }
|
|
||||||
to { background-position: 0 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Opera
|
|
||||||
@-o-keyframes progress-bar-stripes {
|
|
||||||
from { background-position: 0 0; }
|
|
||||||
to { background-position: 40px 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Spec and IE10+
|
|
||||||
@keyframes progress-bar-stripes {
|
|
||||||
from { background-position: 40px 0; }
|
|
||||||
to { background-position: 0 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Bar itself
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Outer container
|
|
||||||
.progress {
|
|
||||||
overflow: hidden;
|
|
||||||
height: @line-height-computed;
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
background-color: @progress-bg;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
.box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bar of progress
|
|
||||||
.progress-bar {
|
|
||||||
float: left;
|
|
||||||
width: 0%;
|
|
||||||
height: 100%;
|
|
||||||
font-size: @font-size-small;
|
|
||||||
color: @progress-bar-color;
|
|
||||||
text-align: center;
|
|
||||||
background-color: @progress-bar-bg;
|
|
||||||
.box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
|
|
||||||
.transition(width .6s ease);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Striped bars
|
|
||||||
.progress-striped .progress-bar {
|
|
||||||
#gradient > .striped(@progress-bar-bg);
|
|
||||||
background-size: 40px 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call animation for the active one
|
|
||||||
.progress.active .progress-bar {
|
|
||||||
-webkit-animation: progress-bar-stripes 2s linear infinite;
|
|
||||||
-moz-animation: progress-bar-stripes 2s linear infinite;
|
|
||||||
-ms-animation: progress-bar-stripes 2s linear infinite;
|
|
||||||
-o-animation: progress-bar-stripes 2s linear infinite;
|
|
||||||
animation: progress-bar-stripes 2s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Variations
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.progress-bar-success {
|
|
||||||
.progress-bar-variant(@progress-bar-success-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-bar-info {
|
|
||||||
.progress-bar-variant(@progress-bar-info-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-bar-warning {
|
|
||||||
.progress-bar-variant(@progress-bar-warning-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-bar-danger {
|
|
||||||
.progress-bar-variant(@progress-bar-danger-bg);
|
|
||||||
}
|
|
@ -1,220 +0,0 @@
|
|||||||
//
|
|
||||||
// Responsive: Utility classes
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// IE10 Metro responsive
|
|
||||||
// Required for Windows 8 Metro split-screen snapping with IE10
|
|
||||||
//
|
|
||||||
// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
|
|
||||||
@-ms-viewport{
|
|
||||||
width: device-width;
|
|
||||||
}
|
|
||||||
|
|
||||||
// IE10 on Windows Phone 8
|
|
||||||
// IE10 on WP8 doesn't report CSS pixels, but actual device pixels. In
|
|
||||||
// other words, say on a Lumia, you'll get 768px as the device width,
|
|
||||||
// meaning users will see the tablet styles and not phone styles.
|
|
||||||
//
|
|
||||||
// Alternatively you can override this with JS (see source below), but
|
|
||||||
// we won't be doing that here given our limited scope.
|
|
||||||
//
|
|
||||||
// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
|
|
||||||
@media screen and (max-width: 400px) {
|
|
||||||
@-ms-viewport{
|
|
||||||
width: 320px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hide from screenreaders and browsers
|
|
||||||
// Credit: HTML5 Boilerplate
|
|
||||||
.hidden {
|
|
||||||
display: none !important;
|
|
||||||
visibility: hidden !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Visibility utilities
|
|
||||||
|
|
||||||
.visible-xs {
|
|
||||||
.responsive-invisibility();
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
&.visible-sm {
|
|
||||||
@media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.visible-md {
|
|
||||||
@media (min-width: @screen-md) and (max-width: @screen-md-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.visible-lg {
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-sm {
|
|
||||||
.responsive-invisibility();
|
|
||||||
&.visible-xs {
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
&.visible-md {
|
|
||||||
@media (min-width: @screen-md) and (max-width: @screen-md-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.visible-lg {
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-md {
|
|
||||||
.responsive-invisibility();
|
|
||||||
&.visible-xs {
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.visible-sm {
|
|
||||||
@media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: @screen-md) and (max-width: @screen-md-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
&.visible-lg {
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.visible-lg {
|
|
||||||
.responsive-invisibility();
|
|
||||||
&.visible-xs {
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.visible-sm {
|
|
||||||
@media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.visible-md {
|
|
||||||
@media (min-width: @screen-md) and (max-width: @screen-md-max) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.hidden-xs {
|
|
||||||
.responsive-visibility();
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
&.hidden-sm {
|
|
||||||
@media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.hidden-md {
|
|
||||||
@media (min-width: @screen-md) and (max-width: @screen-md-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.hidden-lg {
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.hidden-sm {
|
|
||||||
.responsive-visibility();
|
|
||||||
&.hidden-xs {
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
&.hidden-md {
|
|
||||||
@media (min-width: @screen-md) and (max-width: @screen-md-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.hidden-lg {
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.hidden-md {
|
|
||||||
.responsive-visibility();
|
|
||||||
&.hidden-xs {
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.hidden-sm {
|
|
||||||
@media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: @screen-md) and (max-width: @screen-md-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
&.hidden-lg {
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.hidden-lg {
|
|
||||||
.responsive-visibility();
|
|
||||||
&.hidden-xs {
|
|
||||||
@media (max-width: @screen-xs-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.hidden-sm {
|
|
||||||
@media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.hidden-md {
|
|
||||||
@media (min-width: @screen-md) and (max-width: @screen-md-max) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: @screen-lg) {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print utilities
|
|
||||||
.visible-print {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
.visible-print {
|
|
||||||
.responsive-visibility();
|
|
||||||
}
|
|
||||||
.hidden-print {
|
|
||||||
.responsive-invisibility();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,130 +0,0 @@
|
|||||||
//
|
|
||||||
// Scaffolding
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Reset the box-sizing
|
|
||||||
|
|
||||||
*,
|
|
||||||
*:before,
|
|
||||||
*:after {
|
|
||||||
.box-sizing(border-box);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Body reset
|
|
||||||
|
|
||||||
html {
|
|
||||||
font-size: 62.5%;
|
|
||||||
-webkit-tap-highlight-color: rgba(0,0,0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: @font-family-base;
|
|
||||||
font-size: @font-size-base;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
color: @text-color;
|
|
||||||
background-color: @body-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset fonts for relevant elements
|
|
||||||
input,
|
|
||||||
button,
|
|
||||||
select,
|
|
||||||
textarea {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset unusual Firefox-on-Android default style.
|
|
||||||
//
|
|
||||||
// See https://github.com/necolas/normalize.css/issues/214
|
|
||||||
|
|
||||||
button,
|
|
||||||
input,
|
|
||||||
select[multiple],
|
|
||||||
textarea {
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Links
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: @link-color;
|
|
||||||
text-decoration: none;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: @link-hover-color;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
.tab-focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Images
|
|
||||||
|
|
||||||
img {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Responsive images (ensure images don't scale beyond their parents)
|
|
||||||
.img-responsive {
|
|
||||||
.img-responsive();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rounded corners
|
|
||||||
.img-rounded {
|
|
||||||
border-radius: @border-radius-large;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Image thumbnails
|
|
||||||
//
|
|
||||||
// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
|
|
||||||
.img-thumbnail {
|
|
||||||
padding: @thumbnail-padding;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
background-color: @thumbnail-bg;
|
|
||||||
border: 1px solid @thumbnail-border;
|
|
||||||
border-radius: @thumbnail-border-radius;
|
|
||||||
.transition(all .2s ease-in-out);
|
|
||||||
|
|
||||||
// Keep them at most 100% wide
|
|
||||||
.img-responsive(inline-block);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perfect circle
|
|
||||||
.img-circle {
|
|
||||||
border-radius: 50%; // set radius in percents
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Horizontal rules
|
|
||||||
|
|
||||||
hr {
|
|
||||||
margin-top: @line-height-computed;
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
border: 0;
|
|
||||||
border-top: 1px solid @hr-border;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Only display content to screen readers
|
|
||||||
//
|
|
||||||
// See: http://a11yproject.com/posts/how-to-hide-content/
|
|
||||||
|
|
||||||
.sr-only {
|
|
||||||
position: absolute;
|
|
||||||
width: 1px;
|
|
||||||
height: 1px;
|
|
||||||
margin: -1px;
|
|
||||||
padding: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
clip: rect(0 0 0 0);
|
|
||||||
border: 0;
|
|
||||||
}
|
|
@ -1,236 +0,0 @@
|
|||||||
//
|
|
||||||
// Tables
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
table {
|
|
||||||
max-width: 100%;
|
|
||||||
background-color: @table-bg;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Baseline styles
|
|
||||||
|
|
||||||
.table {
|
|
||||||
width: 100%;
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
// Cells
|
|
||||||
thead,
|
|
||||||
tbody,
|
|
||||||
tfoot {
|
|
||||||
> tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
padding: @table-cell-padding;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
vertical-align: top;
|
|
||||||
border-top: 1px solid @table-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Bottom align for column headings
|
|
||||||
thead > tr > th {
|
|
||||||
vertical-align: bottom;
|
|
||||||
border-bottom: 2px solid @table-border-color;
|
|
||||||
}
|
|
||||||
// Remove top border from thead by default
|
|
||||||
caption + thead,
|
|
||||||
colgroup + thead,
|
|
||||||
thead:first-child {
|
|
||||||
tr:first-child {
|
|
||||||
th, td {
|
|
||||||
border-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Account for multiple tbody instances
|
|
||||||
tbody + tbody {
|
|
||||||
border-top: 2px solid @table-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nesting
|
|
||||||
.table {
|
|
||||||
background-color: @body-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Condensed table w/ half padding
|
|
||||||
|
|
||||||
.table-condensed {
|
|
||||||
thead,
|
|
||||||
tbody,
|
|
||||||
tfoot {
|
|
||||||
> tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
padding: @table-condensed-cell-padding;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Bordered version
|
|
||||||
//
|
|
||||||
// Add borders all around the table and between all the columns.
|
|
||||||
|
|
||||||
.table-bordered {
|
|
||||||
border: 1px solid @table-border-color;
|
|
||||||
> thead,
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
border: 1px solid @table-border-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> thead {
|
|
||||||
> tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
border-bottom-width: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Zebra-striping
|
|
||||||
//
|
|
||||||
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
|
|
||||||
|
|
||||||
.table-striped {
|
|
||||||
> tbody {
|
|
||||||
> tr:nth-child(odd) {
|
|
||||||
> td,
|
|
||||||
> th {
|
|
||||||
background-color: @table-bg-accent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Hover effect
|
|
||||||
//
|
|
||||||
// Placed here since it has to come after the potential zebra striping
|
|
||||||
|
|
||||||
.table-hover {
|
|
||||||
> tbody {
|
|
||||||
> tr:hover {
|
|
||||||
> td,
|
|
||||||
> th {
|
|
||||||
background-color: @table-bg-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Table cell sizing
|
|
||||||
//
|
|
||||||
// Reset default table behavior
|
|
||||||
|
|
||||||
table col[class*="col-"] {
|
|
||||||
float: none;
|
|
||||||
display: table-column;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
td,
|
|
||||||
th {
|
|
||||||
&[class*="col-"] {
|
|
||||||
float: none;
|
|
||||||
display: table-cell;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Table backgrounds
|
|
||||||
//
|
|
||||||
// Exact selectors below required to override `.table-striped` and prevent
|
|
||||||
// inheritance to nested tables.
|
|
||||||
|
|
||||||
.table > thead > tr,
|
|
||||||
.table > tbody > tr,
|
|
||||||
.table > tfoot > tr {
|
|
||||||
> td.active,
|
|
||||||
> th.active,
|
|
||||||
&.active > td,
|
|
||||||
&.active > th {
|
|
||||||
background-color: @table-bg-active;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate the contextual variants
|
|
||||||
.table-row-variant(success; @state-success-bg; @state-success-border);
|
|
||||||
.table-row-variant(danger; @state-danger-bg; @state-danger-border);
|
|
||||||
.table-row-variant(warning; @state-warning-bg; @state-warning-border);
|
|
||||||
|
|
||||||
|
|
||||||
// Responsive tables
|
|
||||||
//
|
|
||||||
// Wrap your tables in `.table-scrollable` and we'll make them mobile friendly
|
|
||||||
// by enabling horizontal scrolling. Only applies <768px. Everything above that
|
|
||||||
// will display normally.
|
|
||||||
|
|
||||||
@media (max-width: @screen-sm) {
|
|
||||||
.table-responsive {
|
|
||||||
width: 100%;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
overflow-y: hidden;
|
|
||||||
overflow-x: scroll;
|
|
||||||
border: 1px solid @table-border-color;
|
|
||||||
|
|
||||||
// Tighten up spacing and give a background color
|
|
||||||
> .table {
|
|
||||||
margin-bottom: 0;
|
|
||||||
background-color: #fff;
|
|
||||||
|
|
||||||
// Ensure the content doesn't wrap
|
|
||||||
> thead,
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special overrides for the bordered tables
|
|
||||||
> .table-bordered {
|
|
||||||
border: 0;
|
|
||||||
|
|
||||||
// Nuke the appropriate borders so that the parent can handle them
|
|
||||||
> thead,
|
|
||||||
> tbody,
|
|
||||||
> tfoot {
|
|
||||||
> tr {
|
|
||||||
> th:first-child,
|
|
||||||
> td:first-child {
|
|
||||||
border-left: 0;
|
|
||||||
}
|
|
||||||
> th:last-child,
|
|
||||||
> td:last-child {
|
|
||||||
border-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
> tr:last-child {
|
|
||||||
> th,
|
|
||||||
> td {
|
|
||||||
border-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,232 +0,0 @@
|
|||||||
|
|
||||||
//
|
|
||||||
// Load core variables and mixins
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
@import "variables.less";
|
|
||||||
@import "mixins.less";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Buttons
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Common styles
|
|
||||||
.btn-default,
|
|
||||||
.btn-primary,
|
|
||||||
.btn-success,
|
|
||||||
.btn-info,
|
|
||||||
.btn-warning,
|
|
||||||
.btn-danger {
|
|
||||||
text-shadow: 0 -1px 0 rgba(0,0,0,.2);
|
|
||||||
@shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
|
|
||||||
.box-shadow(@shadow);
|
|
||||||
|
|
||||||
// Reset the shadow
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mixin for generating new styles
|
|
||||||
.btn-styles(@btn-color: #555;) {
|
|
||||||
#gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 10%));
|
|
||||||
border-color: darken(@btn-color, 12%);
|
|
||||||
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
background-color: darken(@btn-color, 10%);
|
|
||||||
border-color: darken(@btn-color, 12%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Common styles
|
|
||||||
.btn {
|
|
||||||
// Remove the gradient for the pressed/active state
|
|
||||||
&:active,
|
|
||||||
&.active {
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the mixin to the buttons
|
|
||||||
.btn-default { .btn-styles(@btn-default-bg;); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
|
|
||||||
.btn-primary { .btn-styles(@btn-primary-bg); }
|
|
||||||
.btn-success { .btn-styles(@btn-success-bg); }
|
|
||||||
.btn-warning { .btn-styles(@btn-warning-bg); }
|
|
||||||
.btn-danger { .btn-styles(@btn-danger-bg); }
|
|
||||||
.btn-info { .btn-styles(@btn-info-bg); }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Images
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.thumbnail,
|
|
||||||
.img-thumbnail {
|
|
||||||
.box-shadow(0 1px 2px rgba(0,0,0,.075));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Dropdowns
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.dropdown-menu > li > a:hover,
|
|
||||||
.dropdown-menu > li > a:focus,
|
|
||||||
.dropdown-menu > .active > a,
|
|
||||||
.dropdown-menu > .active > a:hover,
|
|
||||||
.dropdown-menu > .active > a:focus {
|
|
||||||
#gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));
|
|
||||||
background-color: darken(@dropdown-link-hover-bg, 5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Navbar
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Basic navbar
|
|
||||||
.navbar {
|
|
||||||
#gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg;);
|
|
||||||
border-radius: @navbar-border-radius;
|
|
||||||
@shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
|
|
||||||
.box-shadow(@shadow);
|
|
||||||
|
|
||||||
.navbar-nav > .active > a {
|
|
||||||
background-color: @navbar-default-bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.navbar-brand,
|
|
||||||
.navbar-nav > li > a {
|
|
||||||
text-shadow: 0 1px 0 rgba(255,255,255,.25);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inverted navbar
|
|
||||||
.navbar-inverse {
|
|
||||||
#gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg;);
|
|
||||||
|
|
||||||
.navbar-nav > .active > a {
|
|
||||||
background-color: @navbar-inverse-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-brand,
|
|
||||||
.navbar-nav > li > a {
|
|
||||||
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Undo rounded corners in static and fixed navbars
|
|
||||||
.navbar-static-top,
|
|
||||||
.navbar-fixed-top,
|
|
||||||
.navbar-fixed-bottom {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Alerts
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Common styles
|
|
||||||
.alert {
|
|
||||||
text-shadow: 0 1px 0 rgba(255,255,255,.2);
|
|
||||||
@shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
|
|
||||||
.box-shadow(@shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mixin for generating new styles
|
|
||||||
.alert-styles(@color) {
|
|
||||||
#gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));
|
|
||||||
border-color: darken(@color, 15%);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the mixin to the alerts
|
|
||||||
.alert-success { .alert-styles(@alert-success-bg); }
|
|
||||||
.alert-info { .alert-styles(@alert-info-bg); }
|
|
||||||
.alert-warning { .alert-styles(@alert-warning-bg); }
|
|
||||||
.alert-danger { .alert-styles(@alert-danger-bg); }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Progress bars
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Give the progress background some depth
|
|
||||||
.progress {
|
|
||||||
#gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg;)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mixin for generating new styles
|
|
||||||
.progress-bar-styles(@color) {
|
|
||||||
#gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the mixin to the progress bars
|
|
||||||
.progress-bar { .progress-bar-styles(@progress-bar-bg); }
|
|
||||||
.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }
|
|
||||||
.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }
|
|
||||||
.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }
|
|
||||||
.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// List groups
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.list-group {
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
.box-shadow(0 1px 2px rgba(0,0,0,.075));
|
|
||||||
}
|
|
||||||
.list-group-item.active,
|
|
||||||
.list-group-item.active:hover,
|
|
||||||
.list-group-item.active:focus {
|
|
||||||
text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);
|
|
||||||
#gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));
|
|
||||||
border-color: darken(@list-group-active-border, 7.5%);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Panels
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Common styles
|
|
||||||
.panel {
|
|
||||||
.box-shadow(0 1px 2px rgba(0,0,0,.05));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mixin for generating new styles
|
|
||||||
.panel-heading-styles(@color) {
|
|
||||||
#gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the mixin to the panel headings only
|
|
||||||
.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }
|
|
||||||
.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }
|
|
||||||
.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }
|
|
||||||
.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }
|
|
||||||
.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }
|
|
||||||
.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Wells
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.well {
|
|
||||||
#gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg;);
|
|
||||||
border-color: darken(@well-bg, 10%);
|
|
||||||
@shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
|
|
||||||
.box-shadow(@shadow);
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
//
|
|
||||||
// Thumbnails
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Mixin and adjust the regular image class
|
|
||||||
.thumbnail {
|
|
||||||
.img-thumbnail();
|
|
||||||
display: block; // Override the inline-block from `.img-thumbnail`
|
|
||||||
|
|
||||||
> img {
|
|
||||||
.img-responsive();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Add a hover state for linked versions only
|
|
||||||
a.thumbnail:hover,
|
|
||||||
a.thumbnail:focus {
|
|
||||||
border-color: @link-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Images and captions
|
|
||||||
.thumbnail > img {
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
}
|
|
||||||
.thumbnail .caption {
|
|
||||||
padding: @thumbnail-caption-padding;
|
|
||||||
color: @thumbnail-caption-color;
|
|
||||||
}
|
|
@ -1,95 +0,0 @@
|
|||||||
//
|
|
||||||
// Tooltips
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
.tooltip {
|
|
||||||
position: absolute;
|
|
||||||
z-index: @zindex-tooltip;
|
|
||||||
display: block;
|
|
||||||
visibility: visible;
|
|
||||||
font-size: @font-size-small;
|
|
||||||
line-height: 1.4;
|
|
||||||
.opacity(0);
|
|
||||||
|
|
||||||
&.in { .opacity(.9); }
|
|
||||||
&.top { margin-top: -3px; padding: 5px 0; }
|
|
||||||
&.right { margin-left: 3px; padding: 0 5px; }
|
|
||||||
&.bottom { margin-top: 3px; padding: 5px 0; }
|
|
||||||
&.left { margin-left: -3px; padding: 0 5px; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wrapper for the tooltip content
|
|
||||||
.tooltip-inner {
|
|
||||||
max-width: @tooltip-max-width;
|
|
||||||
padding: 3px 8px;
|
|
||||||
color: @tooltip-color;
|
|
||||||
text-align: center;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: @tooltip-bg;
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Arrows
|
|
||||||
.tooltip-arrow {
|
|
||||||
position: absolute;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
border-color: transparent;
|
|
||||||
border-style: solid;
|
|
||||||
}
|
|
||||||
.tooltip {
|
|
||||||
&.top .tooltip-arrow {
|
|
||||||
bottom: 0;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -@tooltip-arrow-width;
|
|
||||||
border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
|
|
||||||
border-top-color: @tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.top-left .tooltip-arrow {
|
|
||||||
bottom: 0;
|
|
||||||
left: 5px;
|
|
||||||
border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
|
|
||||||
border-top-color: @tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.top-right .tooltip-arrow {
|
|
||||||
bottom: 0;
|
|
||||||
right: 5px;
|
|
||||||
border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
|
|
||||||
border-top-color: @tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.right .tooltip-arrow {
|
|
||||||
top: 50%;
|
|
||||||
left: 0;
|
|
||||||
margin-top: -@tooltip-arrow-width;
|
|
||||||
border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;
|
|
||||||
border-right-color: @tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.left .tooltip-arrow {
|
|
||||||
top: 50%;
|
|
||||||
right: 0;
|
|
||||||
margin-top: -@tooltip-arrow-width;
|
|
||||||
border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;
|
|
||||||
border-left-color: @tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.bottom .tooltip-arrow {
|
|
||||||
top: 0;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -@tooltip-arrow-width;
|
|
||||||
border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
|
|
||||||
border-bottom-color: @tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.bottom-left .tooltip-arrow {
|
|
||||||
top: 0;
|
|
||||||
left: 5px;
|
|
||||||
border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
|
|
||||||
border-bottom-color: @tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
&.bottom-right .tooltip-arrow {
|
|
||||||
top: 0;
|
|
||||||
right: 5px;
|
|
||||||
border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
|
|
||||||
border-bottom-color: @tooltip-arrow-color;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,238 +0,0 @@
|
|||||||
//
|
|
||||||
// Typography
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Body text
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: 0 0 (@line-height-computed / 2);
|
|
||||||
}
|
|
||||||
.lead {
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
font-size: (@font-size-base * 1.15);
|
|
||||||
font-weight: 200;
|
|
||||||
line-height: 1.4;
|
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
font-size: (@font-size-base * 1.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Emphasis & misc
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Ex: 14px base font * 85% = about 12px
|
|
||||||
small { font-size: 85%; }
|
|
||||||
|
|
||||||
// Undo browser default styling
|
|
||||||
cite { font-style: normal; }
|
|
||||||
|
|
||||||
// Contextual emphasis
|
|
||||||
.text-muted { color: @text-muted; }
|
|
||||||
.text-primary { color: @brand-primary; }
|
|
||||||
.text-warning { color: @state-warning-text; }
|
|
||||||
.text-danger { color: @state-danger-text; }
|
|
||||||
.text-success { color: @state-success-text; }
|
|
||||||
.text-info { color: @state-info-text; }
|
|
||||||
|
|
||||||
// Alignment
|
|
||||||
.text-left { text-align: left; }
|
|
||||||
.text-right { text-align: right; }
|
|
||||||
.text-center { text-align: center; }
|
|
||||||
|
|
||||||
|
|
||||||
// Headings
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6,
|
|
||||||
.h1, .h2, .h3, .h4, .h5, .h6 {
|
|
||||||
font-family: @headings-font-family;
|
|
||||||
font-weight: @headings-font-weight;
|
|
||||||
line-height: @headings-line-height;
|
|
||||||
small {
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: 1;
|
|
||||||
color: @headings-small-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3 {
|
|
||||||
margin-top: @line-height-computed;
|
|
||||||
margin-bottom: (@line-height-computed / 2);
|
|
||||||
}
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6 {
|
|
||||||
margin-top: (@line-height-computed / 2);
|
|
||||||
margin-bottom: (@line-height-computed / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, .h1 { font-size: floor(@font-size-base * 2.60); } // ~36px
|
|
||||||
h2, .h2 { font-size: floor(@font-size-base * 2.15); } // ~30px
|
|
||||||
h3, .h3 { font-size: ceil(@font-size-base * 1.70); } // ~24px
|
|
||||||
h4, .h4 { font-size: ceil(@font-size-base * 1.25); } // ~18px
|
|
||||||
h5, .h5 { font-size: @font-size-base; }
|
|
||||||
h6, .h6 { font-size: ceil(@font-size-base * 0.85); } // ~12px
|
|
||||||
|
|
||||||
h1 small, .h1 small { font-size: ceil(@font-size-base * 1.70); } // ~24px
|
|
||||||
h2 small, .h2 small { font-size: ceil(@font-size-base * 1.25); } // ~18px
|
|
||||||
h3 small, .h3 small,
|
|
||||||
h4 small, .h4 small { font-size: @font-size-base; }
|
|
||||||
|
|
||||||
|
|
||||||
// Page header
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.page-header {
|
|
||||||
padding-bottom: ((@line-height-computed / 2) - 1);
|
|
||||||
margin: (@line-height-computed * 2) 0 @line-height-computed;
|
|
||||||
border-bottom: 1px solid @page-header-border-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Lists
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Unordered and Ordered lists
|
|
||||||
ul,
|
|
||||||
ol {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: (@line-height-computed / 2);
|
|
||||||
ul,
|
|
||||||
ol{
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// List options
|
|
||||||
|
|
||||||
// Unstyled keeps list items block level, just removes default browser padding and list-style
|
|
||||||
.list-unstyled {
|
|
||||||
padding-left: 0;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
// Inline turns list items into inline-block
|
|
||||||
.list-inline {
|
|
||||||
.list-unstyled();
|
|
||||||
> li {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 5px;
|
|
||||||
padding-right: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description Lists
|
|
||||||
dl {
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
}
|
|
||||||
dt,
|
|
||||||
dd {
|
|
||||||
line-height: @line-height-base;
|
|
||||||
}
|
|
||||||
dt {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
dd {
|
|
||||||
margin-left: 0; // Undo browser default
|
|
||||||
}
|
|
||||||
|
|
||||||
// Horizontal description lists
|
|
||||||
//
|
|
||||||
// Defaults to being stacked without any of the below styles applied, until the
|
|
||||||
// grid breakpoint is reached (default of ~768px).
|
|
||||||
|
|
||||||
@media (min-width: @grid-float-breakpoint) {
|
|
||||||
.dl-horizontal {
|
|
||||||
dt {
|
|
||||||
float: left;
|
|
||||||
width: (@component-offset-horizontal - 20);
|
|
||||||
clear: left;
|
|
||||||
text-align: right;
|
|
||||||
.text-overflow();
|
|
||||||
}
|
|
||||||
dd {
|
|
||||||
margin-left: @component-offset-horizontal;
|
|
||||||
.clearfix(); // Clear the floated `dt` if an empty `dd` is present
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MISC
|
|
||||||
// ----
|
|
||||||
|
|
||||||
// Abbreviations and acronyms
|
|
||||||
abbr[title],
|
|
||||||
// Added data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
|
|
||||||
abbr[data-original-title] {
|
|
||||||
cursor: help;
|
|
||||||
border-bottom: 1px dotted @abbr-border-color;
|
|
||||||
}
|
|
||||||
abbr.initialism {
|
|
||||||
font-size: 90%;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Blockquotes
|
|
||||||
blockquote {
|
|
||||||
padding: (@line-height-computed / 2) @line-height-computed;
|
|
||||||
margin: 0 0 @line-height-computed;
|
|
||||||
border-left: 5px solid @blockquote-border-color;
|
|
||||||
p {
|
|
||||||
font-size: (@font-size-base * 1.25);
|
|
||||||
font-weight: 300;
|
|
||||||
line-height: 1.25;
|
|
||||||
}
|
|
||||||
p:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
small {
|
|
||||||
display: block;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
color: @blockquote-small-color;
|
|
||||||
&:before {
|
|
||||||
content: '\2014 \00A0';// EM DASH, NBSP
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float right with text-align: right
|
|
||||||
&.pull-right {
|
|
||||||
padding-right: 15px;
|
|
||||||
padding-left: 0;
|
|
||||||
border-right: 5px solid @blockquote-border-color;
|
|
||||||
border-left: 0;
|
|
||||||
p,
|
|
||||||
small {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
small {
|
|
||||||
&:before {
|
|
||||||
content: '';
|
|
||||||
}
|
|
||||||
&:after {
|
|
||||||
content: '\00A0 \2014';// NBSP, EM DASH
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quotes
|
|
||||||
q:before,
|
|
||||||
q:after,
|
|
||||||
blockquote:before,
|
|
||||||
blockquote:after {
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Addresses
|
|
||||||
address {
|
|
||||||
display: block;
|
|
||||||
margin-bottom: @line-height-computed;
|
|
||||||
font-style: normal;
|
|
||||||
line-height: @line-height-base;
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
//
|
|
||||||
// Utility classes
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Floats
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.clearfix {
|
|
||||||
.clearfix();
|
|
||||||
}
|
|
||||||
.pull-right {
|
|
||||||
float: right !important;
|
|
||||||
}
|
|
||||||
.pull-left {
|
|
||||||
float: left !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Toggling content
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.hide {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
.show {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
.invisible {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
.text-hide {
|
|
||||||
.hide-text();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// For Affix plugin
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
.affix {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
@ -1,620 +0,0 @@
|
|||||||
//
|
|
||||||
// Variables
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Global values
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Grays
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@gray-darker: lighten(#000, 13.5%); // #222
|
|
||||||
@gray-dark: lighten(#000, 20%); // #333
|
|
||||||
@gray: lighten(#000, 33.5%); // #555
|
|
||||||
@gray-light: lighten(#000, 60%); // #999
|
|
||||||
@gray-lighter: lighten(#000, 93.5%); // #eee
|
|
||||||
|
|
||||||
// Brand colors
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@brand-primary: #428bca;
|
|
||||||
@brand-success: #5cb85c;
|
|
||||||
@brand-warning: #f0ad4e;
|
|
||||||
@brand-danger: #d9534f;
|
|
||||||
@brand-info: #5bc0de;
|
|
||||||
|
|
||||||
// Scaffolding
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@body-bg: #fff;
|
|
||||||
@text-color: @gray-dark;
|
|
||||||
|
|
||||||
// Links
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@link-color: @brand-primary;
|
|
||||||
@link-hover-color: darken(@link-color, 15%);
|
|
||||||
|
|
||||||
// Typography
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
@font-family-serif: Georgia, "Times New Roman", Times, serif;
|
|
||||||
@font-family-monospace: Monaco, Menlo, Consolas, "Courier New", monospace;
|
|
||||||
@font-family-base: @font-family-sans-serif;
|
|
||||||
|
|
||||||
@font-size-base: 14px;
|
|
||||||
@font-size-large: ceil(@font-size-base * 1.25); // ~18px
|
|
||||||
@font-size-small: ceil(@font-size-base * 0.85); // ~12px
|
|
||||||
|
|
||||||
@line-height-base: 1.428571429; // 20/14
|
|
||||||
@line-height-computed: floor(@font-size-base * @line-height-base); // ~20px
|
|
||||||
|
|
||||||
@headings-font-family: @font-family-base;
|
|
||||||
@headings-font-weight: 500;
|
|
||||||
@headings-line-height: 1.1;
|
|
||||||
|
|
||||||
// Iconography
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@icon-font-path: "../fonts/";
|
|
||||||
@icon-font-name: "glyphicons-halflings-regular";
|
|
||||||
|
|
||||||
|
|
||||||
// Components
|
|
||||||
// -------------------------
|
|
||||||
// Based on 14px font-size and 1.428 line-height (~20px to start)
|
|
||||||
|
|
||||||
@padding-base-vertical: 6px;
|
|
||||||
@padding-base-horizontal: 12px;
|
|
||||||
|
|
||||||
@padding-large-vertical: 10px;
|
|
||||||
@padding-large-horizontal: 16px;
|
|
||||||
|
|
||||||
@padding-small-vertical: 5px;
|
|
||||||
@padding-small-horizontal: 10px;
|
|
||||||
|
|
||||||
@line-height-large: 1.33;
|
|
||||||
@line-height-small: 1.5;
|
|
||||||
|
|
||||||
@border-radius-base: 4px;
|
|
||||||
@border-radius-large: 6px;
|
|
||||||
@border-radius-small: 3px;
|
|
||||||
|
|
||||||
@component-active-bg: @brand-primary;
|
|
||||||
|
|
||||||
@caret-width-base: 4px;
|
|
||||||
@caret-width-large: 5px;
|
|
||||||
|
|
||||||
// Tables
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@table-cell-padding: 8px;
|
|
||||||
@table-condensed-cell-padding: 5px;
|
|
||||||
|
|
||||||
@table-bg: transparent; // overall background-color
|
|
||||||
@table-bg-accent: #f9f9f9; // for striping
|
|
||||||
@table-bg-hover: #f5f5f5;
|
|
||||||
@table-bg-active: @table-bg-hover;
|
|
||||||
|
|
||||||
@table-border-color: #ddd; // table and cell border
|
|
||||||
|
|
||||||
|
|
||||||
// Buttons
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@btn-font-weight: normal;
|
|
||||||
|
|
||||||
@btn-default-color: #333;
|
|
||||||
@btn-default-bg: #fff;
|
|
||||||
@btn-default-border: #ccc;
|
|
||||||
|
|
||||||
@btn-primary-color: #fff;
|
|
||||||
@btn-primary-bg: @brand-primary;
|
|
||||||
@btn-primary-border: darken(@btn-primary-bg, 5%);
|
|
||||||
|
|
||||||
@btn-success-color: #fff;
|
|
||||||
@btn-success-bg: @brand-success;
|
|
||||||
@btn-success-border: darken(@btn-success-bg, 5%);
|
|
||||||
|
|
||||||
@btn-warning-color: #fff;
|
|
||||||
@btn-warning-bg: @brand-warning;
|
|
||||||
@btn-warning-border: darken(@btn-warning-bg, 5%);
|
|
||||||
|
|
||||||
@btn-danger-color: #fff;
|
|
||||||
@btn-danger-bg: @brand-danger;
|
|
||||||
@btn-danger-border: darken(@btn-danger-bg, 5%);
|
|
||||||
|
|
||||||
@btn-info-color: #fff;
|
|
||||||
@btn-info-bg: @brand-info;
|
|
||||||
@btn-info-border: darken(@btn-info-bg, 5%);
|
|
||||||
|
|
||||||
@btn-link-disabled-color: @gray-light;
|
|
||||||
|
|
||||||
|
|
||||||
// Forms
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@input-bg: #fff;
|
|
||||||
@input-bg-disabled: @gray-lighter;
|
|
||||||
|
|
||||||
@input-color: @gray;
|
|
||||||
@input-border: #ccc;
|
|
||||||
@input-border-radius: @border-radius-base;
|
|
||||||
@input-border-focus: #66afe9;
|
|
||||||
|
|
||||||
@input-color-placeholder: @gray-light;
|
|
||||||
|
|
||||||
@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2);
|
|
||||||
@input-height-large: (floor(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
|
|
||||||
@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
|
|
||||||
|
|
||||||
@legend-color: @gray-dark;
|
|
||||||
@legend-border-color: #e5e5e5;
|
|
||||||
|
|
||||||
@input-group-addon-bg: @gray-lighter;
|
|
||||||
@input-group-addon-border-color: @input-border;
|
|
||||||
|
|
||||||
|
|
||||||
// Dropdowns
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@dropdown-bg: #fff;
|
|
||||||
@dropdown-border: rgba(0,0,0,.15);
|
|
||||||
@dropdown-fallback-border: #ccc;
|
|
||||||
@dropdown-divider-bg: #e5e5e5;
|
|
||||||
|
|
||||||
@dropdown-link-active-color: #fff;
|
|
||||||
@dropdown-link-active-bg: @component-active-bg;
|
|
||||||
|
|
||||||
@dropdown-link-color: @gray-dark;
|
|
||||||
@dropdown-link-hover-color: #fff;
|
|
||||||
@dropdown-link-hover-bg: @dropdown-link-active-bg;
|
|
||||||
|
|
||||||
@dropdown-link-disabled-color: @gray-light;
|
|
||||||
|
|
||||||
@dropdown-header-color: @gray-light;
|
|
||||||
|
|
||||||
@dropdown-caret-color: #000;
|
|
||||||
|
|
||||||
|
|
||||||
// COMPONENT VARIABLES
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Z-index master list
|
|
||||||
// -------------------------
|
|
||||||
// Used for a bird's eye view of components dependent on the z-axis
|
|
||||||
// Try to avoid customizing these :)
|
|
||||||
|
|
||||||
@zindex-navbar: 1000;
|
|
||||||
@zindex-dropdown: 1000;
|
|
||||||
@zindex-popover: 1010;
|
|
||||||
@zindex-tooltip: 1030;
|
|
||||||
@zindex-navbar-fixed: 1030;
|
|
||||||
@zindex-modal-background: 1040;
|
|
||||||
@zindex-modal: 1050;
|
|
||||||
|
|
||||||
// Media queries breakpoints
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Extra small screen / phone
|
|
||||||
@screen-xs: 480px;
|
|
||||||
@screen-phone: @screen-xs;
|
|
||||||
|
|
||||||
// Small screen / tablet
|
|
||||||
@screen-sm: 768px;
|
|
||||||
@screen-tablet: @screen-sm;
|
|
||||||
|
|
||||||
// Medium screen / desktop
|
|
||||||
@screen-md: 992px;
|
|
||||||
@screen-desktop: @screen-md;
|
|
||||||
|
|
||||||
// Large screen / wide desktop
|
|
||||||
@screen-lg: 1200px;
|
|
||||||
@screen-lg-desktop: @screen-lg;
|
|
||||||
|
|
||||||
// So media queries don't overlap when required, provide a maximum
|
|
||||||
@screen-xs-max: (@screen-sm - 1);
|
|
||||||
@screen-sm-max: (@screen-md - 1);
|
|
||||||
@screen-md-max: (@screen-lg - 1);
|
|
||||||
|
|
||||||
|
|
||||||
// Grid system
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Number of columns in the grid system
|
|
||||||
@grid-columns: 12;
|
|
||||||
// Padding, to be divided by two and applied to the left and right of all columns
|
|
||||||
@grid-gutter-width: 30px;
|
|
||||||
// Point at which the navbar stops collapsing
|
|
||||||
@grid-float-breakpoint: @screen-tablet;
|
|
||||||
|
|
||||||
|
|
||||||
// Navbar
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Basics of a navbar
|
|
||||||
@navbar-height: 50px;
|
|
||||||
@navbar-margin-bottom: @line-height-computed;
|
|
||||||
@navbar-default-color: #777;
|
|
||||||
@navbar-default-bg: #f8f8f8;
|
|
||||||
@navbar-default-border: darken(@navbar-default-bg, 6.5%);
|
|
||||||
@navbar-border-radius: @border-radius-base;
|
|
||||||
@navbar-padding-horizontal: floor(@grid-gutter-width / 2);
|
|
||||||
@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);
|
|
||||||
|
|
||||||
// Navbar links
|
|
||||||
@navbar-default-link-color: #777;
|
|
||||||
@navbar-default-link-hover-color: #333;
|
|
||||||
@navbar-default-link-hover-bg: transparent;
|
|
||||||
@navbar-default-link-active-color: #555;
|
|
||||||
@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%);
|
|
||||||
@navbar-default-link-disabled-color: #ccc;
|
|
||||||
@navbar-default-link-disabled-bg: transparent;
|
|
||||||
|
|
||||||
// Navbar brand label
|
|
||||||
@navbar-default-brand-color: @navbar-default-link-color;
|
|
||||||
@navbar-default-brand-hover-color: darken(@navbar-default-link-color, 10%);
|
|
||||||
@navbar-default-brand-hover-bg: transparent;
|
|
||||||
|
|
||||||
// Navbar toggle
|
|
||||||
@navbar-default-toggle-hover-bg: #ddd;
|
|
||||||
@navbar-default-toggle-icon-bar-bg: #ccc;
|
|
||||||
@navbar-default-toggle-border-color: #ddd;
|
|
||||||
|
|
||||||
|
|
||||||
// Inverted navbar
|
|
||||||
//
|
|
||||||
// Reset inverted navbar basics
|
|
||||||
@navbar-inverse-color: @gray-light;
|
|
||||||
@navbar-inverse-bg: #222;
|
|
||||||
@navbar-inverse-border: darken(@navbar-inverse-bg, 10%);
|
|
||||||
|
|
||||||
// Inverted navbar links
|
|
||||||
@navbar-inverse-link-color: @gray-light;
|
|
||||||
@navbar-inverse-link-hover-color: #fff;
|
|
||||||
@navbar-inverse-link-hover-bg: transparent;
|
|
||||||
@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color;
|
|
||||||
@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%);
|
|
||||||
@navbar-inverse-link-disabled-color: #444;
|
|
||||||
@navbar-inverse-link-disabled-bg: transparent;
|
|
||||||
|
|
||||||
// Inverted navbar brand label
|
|
||||||
@navbar-inverse-brand-color: @navbar-inverse-link-color;
|
|
||||||
@navbar-inverse-brand-hover-color: #fff;
|
|
||||||
@navbar-inverse-brand-hover-bg: transparent;
|
|
||||||
|
|
||||||
// Inverted navbar search
|
|
||||||
// Normal navbar needs no special styles or vars
|
|
||||||
@navbar-inverse-search-bg: lighten(@navbar-inverse-bg, 25%);
|
|
||||||
@navbar-inverse-search-bg-focus: #fff;
|
|
||||||
@navbar-inverse-search-border: @navbar-inverse-bg;
|
|
||||||
@navbar-inverse-search-placeholder-color: #ccc;
|
|
||||||
|
|
||||||
// Inverted navbar toggle
|
|
||||||
@navbar-inverse-toggle-hover-bg: #333;
|
|
||||||
@navbar-inverse-toggle-icon-bar-bg: #fff;
|
|
||||||
@navbar-inverse-toggle-border-color: #333;
|
|
||||||
|
|
||||||
|
|
||||||
// Navs
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@nav-link-padding: 10px 15px;
|
|
||||||
@nav-link-hover-bg: @gray-lighter;
|
|
||||||
|
|
||||||
@nav-disabled-link-color: @gray-light;
|
|
||||||
@nav-disabled-link-hover-color: @gray-light;
|
|
||||||
|
|
||||||
@nav-open-link-hover-color: #fff;
|
|
||||||
@nav-open-caret-border-color: #fff;
|
|
||||||
|
|
||||||
// Tabs
|
|
||||||
@nav-tabs-border-color: #ddd;
|
|
||||||
|
|
||||||
@nav-tabs-link-hover-border-color: @gray-lighter;
|
|
||||||
|
|
||||||
@nav-tabs-active-link-hover-bg: @body-bg;
|
|
||||||
@nav-tabs-active-link-hover-color: @gray;
|
|
||||||
@nav-tabs-active-link-hover-border-color: #ddd;
|
|
||||||
|
|
||||||
@nav-tabs-justified-link-border-color: #ddd;
|
|
||||||
@nav-tabs-justified-active-link-border-color: @body-bg;
|
|
||||||
|
|
||||||
// Pills
|
|
||||||
@nav-pills-active-link-hover-bg: @component-active-bg;
|
|
||||||
@nav-pills-active-link-hover-color: #fff;
|
|
||||||
|
|
||||||
|
|
||||||
// Pagination
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@pagination-bg: #fff;
|
|
||||||
@pagination-border: #ddd;
|
|
||||||
|
|
||||||
@pagination-hover-bg: @gray-lighter;
|
|
||||||
|
|
||||||
@pagination-active-bg: @brand-primary;
|
|
||||||
@pagination-active-color: #fff;
|
|
||||||
|
|
||||||
@pagination-disabled-color: @gray-light;
|
|
||||||
|
|
||||||
|
|
||||||
// Pager
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@pager-border-radius: 15px;
|
|
||||||
@pager-disabled-color: @gray-light;
|
|
||||||
|
|
||||||
|
|
||||||
// Jumbotron
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@jumbotron-padding: 30px;
|
|
||||||
@jumbotron-color: inherit;
|
|
||||||
@jumbotron-bg: @gray-lighter;
|
|
||||||
|
|
||||||
@jumbotron-heading-color: inherit;
|
|
||||||
|
|
||||||
|
|
||||||
// Form states and alerts
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@state-warning-text: #c09853;
|
|
||||||
@state-warning-bg: #fcf8e3;
|
|
||||||
@state-warning-border: darken(spin(@state-warning-bg, -10), 3%);
|
|
||||||
|
|
||||||
@state-danger-text: #b94a48;
|
|
||||||
@state-danger-bg: #f2dede;
|
|
||||||
@state-danger-border: darken(spin(@state-danger-bg, -10), 3%);
|
|
||||||
|
|
||||||
@state-success-text: #468847;
|
|
||||||
@state-success-bg: #dff0d8;
|
|
||||||
@state-success-border: darken(spin(@state-success-bg, -10), 5%);
|
|
||||||
|
|
||||||
@state-info-text: #3a87ad;
|
|
||||||
@state-info-bg: #d9edf7;
|
|
||||||
@state-info-border: darken(spin(@state-info-bg, -10), 7%);
|
|
||||||
|
|
||||||
|
|
||||||
// Tooltips
|
|
||||||
// -------------------------
|
|
||||||
@tooltip-max-width: 200px;
|
|
||||||
@tooltip-color: #fff;
|
|
||||||
@tooltip-bg: #000;
|
|
||||||
|
|
||||||
@tooltip-arrow-width: 5px;
|
|
||||||
@tooltip-arrow-color: @tooltip-bg;
|
|
||||||
|
|
||||||
|
|
||||||
// Popovers
|
|
||||||
// -------------------------
|
|
||||||
@popover-bg: #fff;
|
|
||||||
@popover-max-width: 276px;
|
|
||||||
@popover-border-color: rgba(0,0,0,.2);
|
|
||||||
@popover-fallback-border-color: #ccc;
|
|
||||||
|
|
||||||
@popover-title-bg: darken(@popover-bg, 3%);
|
|
||||||
|
|
||||||
@popover-arrow-width: 10px;
|
|
||||||
@popover-arrow-color: #fff;
|
|
||||||
|
|
||||||
@popover-arrow-outer-width: (@popover-arrow-width + 1);
|
|
||||||
@popover-arrow-outer-color: rgba(0,0,0,.25);
|
|
||||||
@popover-arrow-outer-fallback-color: #999;
|
|
||||||
|
|
||||||
|
|
||||||
// Labels
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
@label-default-bg: @gray-light;
|
|
||||||
@label-primary-bg: @brand-primary;
|
|
||||||
@label-success-bg: @brand-success;
|
|
||||||
@label-info-bg: @brand-info;
|
|
||||||
@label-warning-bg: @brand-warning;
|
|
||||||
@label-danger-bg: @brand-danger;
|
|
||||||
|
|
||||||
@label-color: #fff;
|
|
||||||
@label-link-hover-color: #fff;
|
|
||||||
|
|
||||||
|
|
||||||
// Modals
|
|
||||||
// -------------------------
|
|
||||||
@modal-inner-padding: 20px;
|
|
||||||
|
|
||||||
@modal-title-padding: 15px;
|
|
||||||
@modal-title-line-height: @line-height-base;
|
|
||||||
|
|
||||||
@modal-content-bg: #fff;
|
|
||||||
@modal-content-border-color: rgba(0,0,0,.2);
|
|
||||||
@modal-content-fallback-border-color: #999;
|
|
||||||
|
|
||||||
@modal-backdrop-bg: #000;
|
|
||||||
@modal-header-border-color: #e5e5e5;
|
|
||||||
@modal-footer-border-color: @modal-header-border-color;
|
|
||||||
|
|
||||||
|
|
||||||
// Alerts
|
|
||||||
// -------------------------
|
|
||||||
@alert-padding: 15px;
|
|
||||||
@alert-border-radius: @border-radius-base;
|
|
||||||
@alert-link-font-weight: bold;
|
|
||||||
|
|
||||||
@alert-success-bg: @state-success-bg;
|
|
||||||
@alert-success-text: @state-success-text;
|
|
||||||
@alert-success-border: @state-success-border;
|
|
||||||
|
|
||||||
@alert-info-bg: @state-info-bg;
|
|
||||||
@alert-info-text: @state-info-text;
|
|
||||||
@alert-info-border: @state-info-border;
|
|
||||||
|
|
||||||
@alert-warning-bg: @state-warning-bg;
|
|
||||||
@alert-warning-text: @state-warning-text;
|
|
||||||
@alert-warning-border: @state-warning-border;
|
|
||||||
|
|
||||||
@alert-danger-bg: @state-danger-bg;
|
|
||||||
@alert-danger-text: @state-danger-text;
|
|
||||||
@alert-danger-border: @state-danger-border;
|
|
||||||
|
|
||||||
|
|
||||||
// Progress bars
|
|
||||||
// -------------------------
|
|
||||||
@progress-bg: #f5f5f5;
|
|
||||||
@progress-bar-color: #fff;
|
|
||||||
|
|
||||||
@progress-bar-bg: @brand-primary;
|
|
||||||
@progress-bar-success-bg: @brand-success;
|
|
||||||
@progress-bar-warning-bg: @brand-warning;
|
|
||||||
@progress-bar-danger-bg: @brand-danger;
|
|
||||||
@progress-bar-info-bg: @brand-info;
|
|
||||||
|
|
||||||
|
|
||||||
// List group
|
|
||||||
// -------------------------
|
|
||||||
@list-group-bg: #fff;
|
|
||||||
@list-group-border: #ddd;
|
|
||||||
@list-group-border-radius: @border-radius-base;
|
|
||||||
|
|
||||||
@list-group-hover-bg: #f5f5f5;
|
|
||||||
@list-group-active-color: #fff;
|
|
||||||
@list-group-active-bg: @component-active-bg;
|
|
||||||
@list-group-active-border: @list-group-active-bg;
|
|
||||||
|
|
||||||
@list-group-link-color: #555;
|
|
||||||
@list-group-link-heading-color: #333;
|
|
||||||
|
|
||||||
|
|
||||||
// Panels
|
|
||||||
// -------------------------
|
|
||||||
@panel-bg: #fff;
|
|
||||||
@panel-inner-border: #ddd;
|
|
||||||
@panel-border-radius: @border-radius-base;
|
|
||||||
@panel-footer-bg: #f5f5f5;
|
|
||||||
|
|
||||||
@panel-default-text: @gray-dark;
|
|
||||||
@panel-default-border: #ddd;
|
|
||||||
@panel-default-heading-bg: #f5f5f5;
|
|
||||||
|
|
||||||
@panel-primary-text: #fff;
|
|
||||||
@panel-primary-border: @brand-primary;
|
|
||||||
@panel-primary-heading-bg: @brand-primary;
|
|
||||||
|
|
||||||
@panel-success-text: @state-success-text;
|
|
||||||
@panel-success-border: @state-success-border;
|
|
||||||
@panel-success-heading-bg: @state-success-bg;
|
|
||||||
|
|
||||||
@panel-warning-text: @state-warning-text;
|
|
||||||
@panel-warning-border: @state-warning-border;
|
|
||||||
@panel-warning-heading-bg: @state-warning-bg;
|
|
||||||
|
|
||||||
@panel-danger-text: @state-danger-text;
|
|
||||||
@panel-danger-border: @state-danger-border;
|
|
||||||
@panel-danger-heading-bg: @state-danger-bg;
|
|
||||||
|
|
||||||
@panel-info-text: @state-info-text;
|
|
||||||
@panel-info-border: @state-info-border;
|
|
||||||
@panel-info-heading-bg: @state-info-bg;
|
|
||||||
|
|
||||||
|
|
||||||
// Thumbnails
|
|
||||||
// -------------------------
|
|
||||||
@thumbnail-padding: 4px;
|
|
||||||
@thumbnail-bg: @body-bg;
|
|
||||||
@thumbnail-border: #ddd;
|
|
||||||
@thumbnail-border-radius: @border-radius-base;
|
|
||||||
|
|
||||||
@thumbnail-caption-color: @text-color;
|
|
||||||
@thumbnail-caption-padding: 9px;
|
|
||||||
|
|
||||||
|
|
||||||
// Wells
|
|
||||||
// -------------------------
|
|
||||||
@well-bg: #f5f5f5;
|
|
||||||
|
|
||||||
|
|
||||||
// Badges
|
|
||||||
// -------------------------
|
|
||||||
@badge-color: #fff;
|
|
||||||
@badge-link-hover-color: #fff;
|
|
||||||
@badge-bg: @gray-light;
|
|
||||||
|
|
||||||
@badge-active-color: @link-color;
|
|
||||||
@badge-active-bg: #fff;
|
|
||||||
|
|
||||||
@badge-font-weight: bold;
|
|
||||||
@badge-line-height: 1;
|
|
||||||
@badge-border-radius: 10px;
|
|
||||||
|
|
||||||
|
|
||||||
// Breadcrumbs
|
|
||||||
// -------------------------
|
|
||||||
@breadcrumb-bg: #f5f5f5;
|
|
||||||
@breadcrumb-color: #ccc;
|
|
||||||
@breadcrumb-active-color: @gray-light;
|
|
||||||
|
|
||||||
|
|
||||||
// Carousel
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
@carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6);
|
|
||||||
|
|
||||||
@carousel-control-color: #fff;
|
|
||||||
@carousel-control-width: 15%;
|
|
||||||
@carousel-control-opacity: .5;
|
|
||||||
@carousel-control-font-size: 20px;
|
|
||||||
|
|
||||||
@carousel-indicator-active-bg: #fff;
|
|
||||||
@carousel-indicator-border-color: #fff;
|
|
||||||
|
|
||||||
@carousel-caption-color: #fff;
|
|
||||||
|
|
||||||
|
|
||||||
// Close
|
|
||||||
// ------------------------
|
|
||||||
@close-color: #000;
|
|
||||||
@close-font-weight: bold;
|
|
||||||
@close-text-shadow: 0 1px 0 #fff;
|
|
||||||
|
|
||||||
|
|
||||||
// Code
|
|
||||||
// ------------------------
|
|
||||||
@code-color: #c7254e;
|
|
||||||
@code-bg: #f9f2f4;
|
|
||||||
|
|
||||||
@pre-bg: #f5f5f5;
|
|
||||||
@pre-color: @gray-dark;
|
|
||||||
@pre-border-color: #ccc;
|
|
||||||
@pre-scrollable-max-height: 340px;
|
|
||||||
|
|
||||||
// Type
|
|
||||||
// ------------------------
|
|
||||||
@text-muted: @gray-light;
|
|
||||||
@abbr-border-color: @gray-light;
|
|
||||||
@headings-small-color: @gray-light;
|
|
||||||
@blockquote-small-color: @gray-light;
|
|
||||||
@blockquote-border-color: @gray-lighter;
|
|
||||||
@page-header-border-color: @gray-lighter;
|
|
||||||
|
|
||||||
// Miscellaneous
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Hr border color
|
|
||||||
@hr-border: @gray-lighter;
|
|
||||||
|
|
||||||
// Horizontal forms & lists
|
|
||||||
@component-offset-horizontal: 180px;
|
|
||||||
|
|
||||||
|
|
||||||
// Container sizes
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
// Small screen / tablet
|
|
||||||
@container-tablet: ((720px + @grid-gutter-width));
|
|
||||||
|
|
||||||
// Medium screen / desktop
|
|
||||||
@container-desktop: ((940px + @grid-gutter-width));
|
|
||||||
|
|
||||||
// Large screen / wide desktop
|
|
||||||
@container-lg-desktop: ((1140px + @grid-gutter-width));
|
|
@ -1,29 +0,0 @@
|
|||||||
//
|
|
||||||
// Wells
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
// Base class
|
|
||||||
.well {
|
|
||||||
min-height: 20px;
|
|
||||||
padding: 19px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
background-color: @well-bg;
|
|
||||||
border: 1px solid darken(@well-bg, 7%);
|
|
||||||
border-radius: @border-radius-base;
|
|
||||||
.box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
|
|
||||||
blockquote {
|
|
||||||
border-color: #ddd;
|
|
||||||
border-color: rgba(0,0,0,.15);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sizes
|
|
||||||
.well-lg {
|
|
||||||
padding: 24px;
|
|
||||||
border-radius: @border-radius-large;
|
|
||||||
}
|
|
||||||
.well-sm {
|
|
||||||
padding: 9px;
|
|
||||||
border-radius: @border-radius-small;
|
|
||||||
}
|
|
@ -1,251 +0,0 @@
|
|||||||
define(['require', './normalize'], function(req, normalize) {
|
|
||||||
var nodePrint = function() {};
|
|
||||||
if (requirejs.tools)
|
|
||||||
requirejs.tools.useLib(function(req) {
|
|
||||||
req(['node/print'], function(_nodePrint) {
|
|
||||||
nodePrint = _nodePrint;
|
|
||||||
}, function(){});
|
|
||||||
});
|
|
||||||
|
|
||||||
var cssAPI = {};
|
|
||||||
|
|
||||||
function compress(css) {
|
|
||||||
if (typeof process !== "undefined" && process.versions && !!process.versions.node && require.nodeRequire) {
|
|
||||||
try {
|
|
||||||
var csso = require.nodeRequire('csso');
|
|
||||||
var csslen = css.length;
|
|
||||||
css = csso.justDoIt(css);
|
|
||||||
nodePrint('Compressed CSS output to ' + Math.round(css.length / csslen * 100) + '%.');
|
|
||||||
return css;
|
|
||||||
}
|
|
||||||
catch(e) {
|
|
||||||
nodePrint('Compression module not installed. Use "npm install csso -g" to enable.');
|
|
||||||
return css;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nodePrint('Compression not supported outside of nodejs environments.');
|
|
||||||
return css;
|
|
||||||
}
|
|
||||||
|
|
||||||
//load file code - stolen from text plugin
|
|
||||||
function loadFile(path) {
|
|
||||||
if (typeof process !== "undefined" && process.versions && !!process.versions.node && require.nodeRequire) {
|
|
||||||
var fs = require.nodeRequire('fs');
|
|
||||||
var file = fs.readFileSync(path, 'utf8');
|
|
||||||
if (file.indexOf('\uFEFF') === 0)
|
|
||||||
return file.substring(1);
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var file = new java.io.File(path),
|
|
||||||
lineSeparator = java.lang.System.getProperty("line.separator"),
|
|
||||||
input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), 'utf-8')),
|
|
||||||
stringBuffer, line;
|
|
||||||
try {
|
|
||||||
stringBuffer = new java.lang.StringBuffer();
|
|
||||||
line = input.readLine();
|
|
||||||
if (line && line.length() && line.charAt(0) === 0xfeff)
|
|
||||||
line = line.substring(1);
|
|
||||||
stringBuffer.append(line);
|
|
||||||
while ((line = input.readLine()) !== null) {
|
|
||||||
stringBuffer.append(lineSeparator).append(line);
|
|
||||||
}
|
|
||||||
return String(stringBuffer.toString());
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
input.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function saveFile(path, data) {
|
|
||||||
if (typeof process !== "undefined" && process.versions && !!process.versions.node && require.nodeRequire) {
|
|
||||||
var fs = require.nodeRequire('fs');
|
|
||||||
fs.writeFileSync(path, data, 'utf8');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var content = new java.lang.String(data);
|
|
||||||
var output = new java.io.BufferedWriter(new java.io.OutputStreamWriter(new java.io.FileOutputStream(path), 'utf-8'));
|
|
||||||
|
|
||||||
try {
|
|
||||||
output.write(content, 0, content.length());
|
|
||||||
output.flush();
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
output.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//when adding to the link buffer, paths are normalised to the baseUrl
|
|
||||||
//when removing from the link buffer, paths are normalised to the output file path
|
|
||||||
function escape(content) {
|
|
||||||
return content.replace(/(["'\\])/g, '\\$1')
|
|
||||||
.replace(/[\f]/g, "\\f")
|
|
||||||
.replace(/[\b]/g, "\\b")
|
|
||||||
.replace(/[\n]/g, "\\n")
|
|
||||||
.replace(/[\t]/g, "\\t")
|
|
||||||
.replace(/[\r]/g, "\\r");
|
|
||||||
}
|
|
||||||
|
|
||||||
// NB add @media query support for media imports
|
|
||||||
var importRegEx = /@import\s*(url)?\s*(('([^']*)'|"([^"]*)")|\(('([^']*)'|"([^"]*)"|([^\)]*))\))\s*;?/g;
|
|
||||||
|
|
||||||
var loadCSSFile = function(fileUrl) {
|
|
||||||
var css = loadFile(fileUrl);
|
|
||||||
|
|
||||||
// normalize the css (except import statements)
|
|
||||||
css = normalize(css, fileUrl, baseUrl, cssBase);
|
|
||||||
|
|
||||||
// detect all import statements in the css and normalize
|
|
||||||
var importUrls = [];
|
|
||||||
var importIndex = [];
|
|
||||||
var importLength = [];
|
|
||||||
var match;
|
|
||||||
while (match = importRegEx.exec(css)) {
|
|
||||||
var importUrl = match[4] || match[5] || match[7] || match[8] || match[9];
|
|
||||||
|
|
||||||
// normalize import url
|
|
||||||
if (importUrl.substr(importUrl.length - 5, 5) != '.less' && importUrl.substr(importUrl.length - 4, 4) != '.css')
|
|
||||||
importUrl += '.css';
|
|
||||||
|
|
||||||
// contains a protocol
|
|
||||||
if (importUrl.match(/:\/\//))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// relative to css base
|
|
||||||
if (importUrl.substr(0, 1) == '/' && cssBase)
|
|
||||||
importUrl = cssBase + importUrl;
|
|
||||||
else
|
|
||||||
importUrl = baseUrl + importUrl;
|
|
||||||
|
|
||||||
importUrls.push(importUrl);
|
|
||||||
importIndex.push(importRegEx.lastIndex - match[0].length);
|
|
||||||
importLength.push(match[0].length);
|
|
||||||
}
|
|
||||||
|
|
||||||
// load the import stylesheets and substitute into the css
|
|
||||||
for (var i = 0; i < importUrls.length; i++)
|
|
||||||
(function(i) {
|
|
||||||
var importCSS = loadCSSFile(importUrls[i]);
|
|
||||||
css = css.substr(0, importIndex[i]) + importCSS + css.substr(importIndex[i] + importLength[i]);
|
|
||||||
var lenDiff = importCSS.length - importLength[i];
|
|
||||||
for (var j = i + 1; j < importUrls.length; j++)
|
|
||||||
importIndex[j] += lenDiff;
|
|
||||||
})(i);
|
|
||||||
|
|
||||||
return css;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var baseUrl;
|
|
||||||
var cssBase;
|
|
||||||
var curModule;
|
|
||||||
cssAPI.load = function(name, req, load, config, parse) {
|
|
||||||
if (!baseUrl)
|
|
||||||
baseUrl = config.baseUrl;
|
|
||||||
|
|
||||||
if (!cssBase)
|
|
||||||
cssBase = config.cssBase;
|
|
||||||
|
|
||||||
if (config.modules) {
|
|
||||||
//run through the module list - the first one without a layer set is the current layer we are in
|
|
||||||
//allows to track the current layer number for layer-specific config
|
|
||||||
for (var i = 0; i < config.modules.length; i++)
|
|
||||||
if (config.modules[i].layer === undefined) {
|
|
||||||
curModule = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//store config
|
|
||||||
cssAPI.config = cssAPI.config || config;
|
|
||||||
|
|
||||||
name += !parse ? '.css' : '.less';
|
|
||||||
|
|
||||||
var fileUrl = req.toUrl(name);
|
|
||||||
|
|
||||||
//external URLS don't get added (just like JS requires)
|
|
||||||
if (fileUrl.substr(0, 7) == 'http://' || fileUrl.substr(0, 8) == 'https://')
|
|
||||||
return load();
|
|
||||||
|
|
||||||
//add to the buffer
|
|
||||||
_cssBuffer[name] = loadCSSFile(fileUrl);
|
|
||||||
|
|
||||||
// parse if necessary
|
|
||||||
if (parse)
|
|
||||||
_cssBuffer[name] = parse(_cssBuffer[name]);
|
|
||||||
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
|
|
||||||
cssAPI.normalize = function(name, normalize) {
|
|
||||||
if (name.substr(name.length - 4, 4) == '.css')
|
|
||||||
name = name.substr(0, name.length - 4);
|
|
||||||
return normalize(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
//list of cssIds included in this layer
|
|
||||||
var _layerBuffer = [];
|
|
||||||
var _cssBuffer = [];
|
|
||||||
cssAPI.write = function(pluginName, moduleName, write, parse) {
|
|
||||||
//external URLS don't get added (just like JS requires)
|
|
||||||
if (moduleName.substr(0, 7) == 'http://' || moduleName.substr(0, 8) == 'https://' || moduleName.substr(0, 2) == '//')
|
|
||||||
return;
|
|
||||||
|
|
||||||
var resourceName = moduleName + (!parse ? '.css' : '.less');
|
|
||||||
_layerBuffer.push(_cssBuffer[resourceName]);
|
|
||||||
|
|
||||||
var separateCSS = false;
|
|
||||||
if (cssAPI.config.separateCSS)
|
|
||||||
separateCSS = true;
|
|
||||||
if (typeof curModule == 'number' && cssAPI.config.modules[curModule].separateCSS !== undefined)
|
|
||||||
separateCSS = cssAPI.config.modules[curModule].separateCSS;
|
|
||||||
if (separateCSS)
|
|
||||||
write.asModule(pluginName + '!' + moduleName, 'define(function(){})');
|
|
||||||
else
|
|
||||||
write("requirejs.s.contexts._.nextTick = function(f){f()}; require(['css'], function(css) { css.addBuffer('" + resourceName + "'); }); requirejs.s.contexts._.nextTick = requirejs.nextTick;");
|
|
||||||
}
|
|
||||||
|
|
||||||
cssAPI.onLayerEnd = function(write, data, parser) {
|
|
||||||
firstWrite = true;
|
|
||||||
//separateCSS parameter set either globally or as a layer setting
|
|
||||||
var separateCSS = false;
|
|
||||||
if (cssAPI.config.separateCSS)
|
|
||||||
separateCSS = true;
|
|
||||||
if (typeof curModule == 'number' && cssAPI.config.modules[curModule].separateCSS !== undefined)
|
|
||||||
separateCSS = cssAPI.config.modules[curModule].separateCSS;
|
|
||||||
curModule = null;
|
|
||||||
|
|
||||||
//calculate layer css
|
|
||||||
var css = _layerBuffer.join('');
|
|
||||||
|
|
||||||
if (separateCSS) {
|
|
||||||
nodePrint('Writing CSS! file: ' + data.name + '\n');
|
|
||||||
|
|
||||||
//calculate the css output path for this layer
|
|
||||||
var path = this.config.appDir ? this.config.baseUrl + data.name + '.css' : cssAPI.config.out.replace(/\.js$/, '.css');
|
|
||||||
|
|
||||||
//renormalize the css to the output path
|
|
||||||
var output = compress(normalize(css, baseUrl, path));
|
|
||||||
|
|
||||||
saveFile(path, output);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (css == '')
|
|
||||||
return;
|
|
||||||
//write the injection and layer index into the layer
|
|
||||||
//prepare the css
|
|
||||||
css = escape(compress(css));
|
|
||||||
|
|
||||||
//the code below overrides async require functionality to ensure instant buffer injection
|
|
||||||
write("requirejs.s.contexts._.nextTick = function(f){f()}; require(['css'], function(css) { css.setBuffer('" + css + (parser ? "', true" : "'") + "); }); requirejs.s.contexts._.nextTick = requirejs.nextTick; ");
|
|
||||||
}
|
|
||||||
|
|
||||||
//clear layer buffer for next layer
|
|
||||||
_layerBuffer = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return cssAPI;
|
|
||||||
});
|
|
@ -1,436 +0,0 @@
|
|||||||
/*
|
|
||||||
* Require-CSS RequireJS css! loader plugin
|
|
||||||
* Guy Bedford 2013
|
|
||||||
* MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Usage:
|
|
||||||
* require(['css!./mycssFile']);
|
|
||||||
*
|
|
||||||
* NB leave out the '.css' extension.
|
|
||||||
*
|
|
||||||
* - Fully supports cross origin CSS loading
|
|
||||||
* - Works with builds
|
|
||||||
*
|
|
||||||
* Tested and working in (up to latest versions as of March 2013):
|
|
||||||
* Android
|
|
||||||
* iOS 6
|
|
||||||
* IE 6 - 10
|
|
||||||
* Chome 3 - 26
|
|
||||||
* Firefox 3.5 - 19
|
|
||||||
* Opera 10 - 12
|
|
||||||
*
|
|
||||||
* browserling.com used for virtual testing environment
|
|
||||||
*
|
|
||||||
* Credit to B Cavalier & J Hann for the elegant IE 6 - 9 hack.
|
|
||||||
*
|
|
||||||
* Sources that helped along the way:
|
|
||||||
* - https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
|
|
||||||
* - http://www.phpied.com/when-is-a-stylesheet-really-loaded/
|
|
||||||
* - https://github.com/cujojs/curl/blob/master/src/curl/plugin/css.js
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
define(['./normalize'], function(normalize) {
|
|
||||||
function indexOf(a, e) { for (var i=0, l=a.length; i < l; i++) if (a[i] === e) return i; return -1 }
|
|
||||||
|
|
||||||
if (typeof window == 'undefined')
|
|
||||||
return { load: function(n, r, load){ load() } };
|
|
||||||
|
|
||||||
// set to true to enable test prompts for device testing
|
|
||||||
var testing = false;
|
|
||||||
|
|
||||||
var head = document.getElementsByTagName('head')[0];
|
|
||||||
|
|
||||||
var engine = window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)/);
|
|
||||||
var hackLinks = false;
|
|
||||||
|
|
||||||
if (!engine) {}
|
|
||||||
else if (engine[1] || engine[7]) {
|
|
||||||
hackLinks = parseInt(engine[1]) < 6 || parseInt(engine[7]) <= 9;
|
|
||||||
engine = 'trident';
|
|
||||||
}
|
|
||||||
else if (engine[2]) {
|
|
||||||
// unfortunately style querying still doesnt work with onload callback in webkit
|
|
||||||
hackLinks = true;
|
|
||||||
engine = 'webkit';
|
|
||||||
}
|
|
||||||
else if (engine[3]) {
|
|
||||||
// engine = 'opera';
|
|
||||||
}
|
|
||||||
else if (engine[4]) {
|
|
||||||
hackLinks = parseInt(engine[4]) < 18;
|
|
||||||
engine = 'gecko';
|
|
||||||
}
|
|
||||||
else if (testing)
|
|
||||||
alert('Engine detection failed');
|
|
||||||
|
|
||||||
//main api object
|
|
||||||
var cssAPI = {};
|
|
||||||
|
|
||||||
var absUrlRegEx = /^\/|([^\:\/]*:)/;
|
|
||||||
|
|
||||||
cssAPI.pluginBuilder = './css-builder';
|
|
||||||
|
|
||||||
// used by layer builds to register their css buffers
|
|
||||||
|
|
||||||
// the current layer buffer items (from addBuffer)
|
|
||||||
var curBuffer = [];
|
|
||||||
|
|
||||||
// the callbacks for buffer loads
|
|
||||||
var onBufferLoad = {};
|
|
||||||
|
|
||||||
// the full list of resources in the buffer
|
|
||||||
var bufferResources = [];
|
|
||||||
|
|
||||||
cssAPI.addBuffer = function(resourceId) {
|
|
||||||
// just in case layer scripts are included twice, also check
|
|
||||||
// against the previous buffers
|
|
||||||
if (indexOf(curBuffer, resourceId) != -1)
|
|
||||||
return;
|
|
||||||
if (indexOf(bufferResources, resourceId) != -1)
|
|
||||||
return;
|
|
||||||
curBuffer.push(resourceId);
|
|
||||||
bufferResources.push(resourceId);
|
|
||||||
}
|
|
||||||
cssAPI.setBuffer = function(css, isLess) {
|
|
||||||
var pathname = window.location.pathname.split('/');
|
|
||||||
pathname.pop();
|
|
||||||
pathname = pathname.join('/') + '/';
|
|
||||||
|
|
||||||
var baseParts = require.toUrl('base_url').split('/');
|
|
||||||
baseParts.pop();
|
|
||||||
var baseUrl = baseParts.join('/') + '/';
|
|
||||||
baseUrl = normalize.convertURIBase(baseUrl, pathname, '/');
|
|
||||||
if (!baseUrl.match(absUrlRegEx))
|
|
||||||
baseUrl = '/' + baseUrl;
|
|
||||||
if (baseUrl.substr(baseUrl.length - 1, 1) != '/')
|
|
||||||
baseUrl = baseUrl + '/';
|
|
||||||
|
|
||||||
cssAPI.inject(normalize(css, baseUrl, pathname));
|
|
||||||
|
|
||||||
// set up attach callback if registered
|
|
||||||
// clear the current buffer for the next layer
|
|
||||||
// (just the less or css part as we have two buffers in one effectively)
|
|
||||||
for (var i = 0; i < curBuffer.length; i++) {
|
|
||||||
// find the resources in the less or css buffer dependening which one this is
|
|
||||||
if ((isLess && curBuffer[i].substr(curBuffer[i].length - 5, 5) == '.less') ||
|
|
||||||
(!isLess && curBuffer[i].substr(curBuffer[i].length - 4, 4) == '.css')) {
|
|
||||||
(function(resourceId) {
|
|
||||||
// mark that the onBufferLoad is about to be called (set to true if not already a callback function)
|
|
||||||
onBufferLoad[resourceId] = onBufferLoad[resourceId] || true;
|
|
||||||
|
|
||||||
// set a short timeout (as injection isn't instant in Chrome), then call the load
|
|
||||||
setTimeout(function() {
|
|
||||||
if (typeof onBufferLoad[resourceId] == 'function')
|
|
||||||
onBufferLoad[resourceId]();
|
|
||||||
// remove from onBufferLoad to indicate loaded
|
|
||||||
delete onBufferLoad[resourceId];
|
|
||||||
}, 7);
|
|
||||||
})(curBuffer[i]);
|
|
||||||
|
|
||||||
// remove the current resource from the buffer
|
|
||||||
curBuffer.splice(i--, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cssAPI.attachBuffer = function(resourceId, load) {
|
|
||||||
// attach can happen during buffer collecting, or between injection and callback
|
|
||||||
// we assume it is not possible to attach multiple callbacks
|
|
||||||
// requirejs plugin load function ensures this by queueing duplicate calls
|
|
||||||
|
|
||||||
// check if the resourceId is in the current buffer
|
|
||||||
for (var i = 0; i < curBuffer.length; i++)
|
|
||||||
if (curBuffer[i] == resourceId) {
|
|
||||||
onBufferLoad[resourceId] = load;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if the resourceId is waiting for injection callback
|
|
||||||
// (onBufferLoad === true is a shortcut indicator for this)
|
|
||||||
if (onBufferLoad[resourceId] === true) {
|
|
||||||
onBufferLoad[resourceId] = load;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if it's in the full buffer list and not either of the above, its loaded already
|
|
||||||
if (indexOf(bufferResources, resourceId) != -1) {
|
|
||||||
load();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var webkitLoadCheck = function(link, callback) {
|
|
||||||
setTimeout(function() {
|
|
||||||
for (var i = 0; i < document.styleSheets.length; i++) {
|
|
||||||
var sheet = document.styleSheets[i];
|
|
||||||
if (sheet.href == link.href)
|
|
||||||
return callback();
|
|
||||||
}
|
|
||||||
webkitLoadCheck(link, callback);
|
|
||||||
}, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
var mozillaLoadCheck = function(style, callback) {
|
|
||||||
setTimeout(function() {
|
|
||||||
try {
|
|
||||||
style.sheet.cssRules;
|
|
||||||
return callback();
|
|
||||||
} catch (e){}
|
|
||||||
mozillaLoadCheck(style, callback);
|
|
||||||
}, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ie link detection, as adapted from https://github.com/cujojs/curl/blob/master/src/curl/plugin/css.js
|
|
||||||
if (engine == 'trident' && hackLinks) {
|
|
||||||
var ieStyles = [],
|
|
||||||
ieQueue = [],
|
|
||||||
ieStyleCnt = 0;
|
|
||||||
var ieLoad = function(url, callback) {
|
|
||||||
var style;
|
|
||||||
ieQueue.push({
|
|
||||||
url: url,
|
|
||||||
cb: callback
|
|
||||||
});
|
|
||||||
style = ieStyles.shift();
|
|
||||||
if (!style && ieStyleCnt++ < 31) {
|
|
||||||
style = document.createElement('style');
|
|
||||||
head.appendChild(style);
|
|
||||||
}
|
|
||||||
if (style)
|
|
||||||
ieLoadNextImport(style);
|
|
||||||
}
|
|
||||||
var ieLoadNextImport = function(style) {
|
|
||||||
var curImport = ieQueue.shift();
|
|
||||||
if (!curImport) {
|
|
||||||
style.onload = noop;
|
|
||||||
ieStyles.push(style);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
style.onload = function() {
|
|
||||||
curImport.cb(curImport.ss);
|
|
||||||
ieLoadNextImport(style);
|
|
||||||
};
|
|
||||||
var curSheet = style.styleSheet;
|
|
||||||
curImport.ss = curSheet.imports[curSheet.addImport(curImport.url)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// uses the <link> load method
|
|
||||||
var createLink = function(url) {
|
|
||||||
var link = document.createElement('link');
|
|
||||||
link.type = 'text/css';
|
|
||||||
link.rel = 'stylesheet';
|
|
||||||
link.href = url;
|
|
||||||
return link;
|
|
||||||
}
|
|
||||||
|
|
||||||
var noop = function(){}
|
|
||||||
|
|
||||||
cssAPI.linkLoad = function(url, callback) {
|
|
||||||
var timeout = setTimeout(function() {
|
|
||||||
if (testing) alert('timeout');
|
|
||||||
callback();
|
|
||||||
}, waitSeconds * 1000 - 100);
|
|
||||||
var _callback = function() {
|
|
||||||
clearTimeout(timeout);
|
|
||||||
if (link)
|
|
||||||
link.onload = noop;
|
|
||||||
// for style querying, a short delay still seems necessary
|
|
||||||
setTimeout(callback, 7);
|
|
||||||
}
|
|
||||||
if (!hackLinks) {
|
|
||||||
var link = createLink(url);
|
|
||||||
link.onload = _callback;
|
|
||||||
head.appendChild(link);
|
|
||||||
}
|
|
||||||
// hacks
|
|
||||||
else {
|
|
||||||
if (engine == 'webkit') {
|
|
||||||
var link = createLink(url);
|
|
||||||
webkitLoadCheck(link, _callback);
|
|
||||||
head.appendChild(link);
|
|
||||||
}
|
|
||||||
else if (engine == 'gecko') {
|
|
||||||
var style = document.createElement('style');
|
|
||||||
style.textContent = '@import "' + url + '"';
|
|
||||||
mozillaLoadCheck(style, _callback);
|
|
||||||
head.appendChild(style);
|
|
||||||
}
|
|
||||||
else if (engine == 'trident')
|
|
||||||
ieLoad(url, _callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* injection api */
|
|
||||||
var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
|
|
||||||
var fileCache = {};
|
|
||||||
var get = function(url, callback, errback) {
|
|
||||||
if (fileCache[url]) {
|
|
||||||
callback(fileCache[url]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var xhr, i, progId;
|
|
||||||
if (typeof XMLHttpRequest !== 'undefined')
|
|
||||||
xhr = new XMLHttpRequest();
|
|
||||||
else if (typeof ActiveXObject !== 'undefined')
|
|
||||||
for (i = 0; i < 3; i += 1) {
|
|
||||||
progId = progIds[i];
|
|
||||||
try {
|
|
||||||
xhr = new ActiveXObject(progId);
|
|
||||||
}
|
|
||||||
catch (e) {}
|
|
||||||
|
|
||||||
if (xhr) {
|
|
||||||
progIds = [progId]; // so faster next time
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.open('GET', url, requirejs.inlineRequire ? false : true);
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function (evt) {
|
|
||||||
var status, err;
|
|
||||||
//Do not explicitly handle errors, those should be
|
|
||||||
//visible via console output in the browser.
|
|
||||||
if (xhr.readyState === 4) {
|
|
||||||
status = xhr.status;
|
|
||||||
if (status > 399 && status < 600) {
|
|
||||||
//An http 4xx or 5xx error. Signal an error.
|
|
||||||
err = new Error(url + ' HTTP status: ' + status);
|
|
||||||
err.xhr = xhr;
|
|
||||||
errback(err);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fileCache[url] = xhr.responseText;
|
|
||||||
callback(xhr.responseText);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
xhr.send(null);
|
|
||||||
}
|
|
||||||
//uses the <style> load method
|
|
||||||
var styleCnt = 0;
|
|
||||||
var curStyle;
|
|
||||||
cssAPI.inject = function(css) {
|
|
||||||
if (styleCnt < 31) {
|
|
||||||
curStyle = document.createElement('style');
|
|
||||||
curStyle.type = 'text/css';
|
|
||||||
head.appendChild(curStyle);
|
|
||||||
styleCnt++;
|
|
||||||
}
|
|
||||||
if (curStyle.styleSheet)
|
|
||||||
curStyle.styleSheet.cssText += css;
|
|
||||||
else
|
|
||||||
curStyle.appendChild(document.createTextNode(css));
|
|
||||||
}
|
|
||||||
|
|
||||||
// NB add @media query support for media imports
|
|
||||||
var importRegEx = /@import\s*(url)?\s*(('([^']*)'|"([^"]*)")|\(('([^']*)'|"([^"]*)"|([^\)]*))\))\s*;?/g;
|
|
||||||
|
|
||||||
var pathname = window.location.pathname.split('/');
|
|
||||||
pathname.pop();
|
|
||||||
pathname = pathname.join('/') + '/';
|
|
||||||
|
|
||||||
var loadCSS = function(fileUrl, callback, errback) {
|
|
||||||
|
|
||||||
//make file url absolute
|
|
||||||
if (!fileUrl.match(absUrlRegEx))
|
|
||||||
fileUrl = '/' + normalize.convertURIBase(fileUrl, pathname, '/');
|
|
||||||
|
|
||||||
get(fileUrl, function(css) {
|
|
||||||
|
|
||||||
// normalize the css (except import statements)
|
|
||||||
css = normalize(css, fileUrl, pathname);
|
|
||||||
|
|
||||||
// detect all import statements in the css and normalize
|
|
||||||
var importUrls = [];
|
|
||||||
var importIndex = [];
|
|
||||||
var importLength = [];
|
|
||||||
var match;
|
|
||||||
while (match = importRegEx.exec(css)) {
|
|
||||||
var importUrl = match[4] || match[5] || match[7] || match[8] || match[9];
|
|
||||||
|
|
||||||
importUrls.push(importUrl);
|
|
||||||
importIndex.push(importRegEx.lastIndex - match[0].length);
|
|
||||||
importLength.push(match[0].length);
|
|
||||||
}
|
|
||||||
|
|
||||||
// load the import stylesheets and substitute into the css
|
|
||||||
var completeCnt = 0;
|
|
||||||
for (var i = 0; i < importUrls.length; i++)
|
|
||||||
(function(i) {
|
|
||||||
loadCSS(importUrls[i], function(importCSS) {
|
|
||||||
css = css.substr(0, importIndex[i]) + importCSS + css.substr(importIndex[i] + importLength[i]);
|
|
||||||
var lenDiff = importCSS.length - importLength[i];
|
|
||||||
for (var j = i + 1; j < importUrls.length; j++)
|
|
||||||
importIndex[j] += lenDiff;
|
|
||||||
completeCnt++;
|
|
||||||
if (completeCnt == importUrls.length) {
|
|
||||||
callback(css);
|
|
||||||
}
|
|
||||||
}, errback);
|
|
||||||
})(i);
|
|
||||||
|
|
||||||
if (importUrls.length == 0)
|
|
||||||
callback(css);
|
|
||||||
}, errback);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
cssAPI.normalize = function(name, normalize) {
|
|
||||||
if (name.substr(name.length - 4, 4) == '.css')
|
|
||||||
name = name.substr(0, name.length - 4);
|
|
||||||
|
|
||||||
return normalize(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
var waitSeconds;
|
|
||||||
var alerted = false;
|
|
||||||
cssAPI.load = function(cssId, req, load, config, parse) {
|
|
||||||
|
|
||||||
waitSeconds = waitSeconds || config.waitSeconds || 7;
|
|
||||||
|
|
||||||
var resourceId = cssId + (!parse ? '.css' : '.less');
|
|
||||||
|
|
||||||
// attach the load function to a buffer if there is one in registration
|
|
||||||
// if not, we do a full injection load
|
|
||||||
if (cssAPI.attachBuffer(resourceId, load))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var fileUrl = req.toUrl(resourceId);
|
|
||||||
|
|
||||||
if (!alerted && testing) {
|
|
||||||
alert(hackLinks ? 'hacking links' : 'not hacking');
|
|
||||||
alerted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!parse) {
|
|
||||||
cssAPI.linkLoad(fileUrl, load);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
loadCSS(fileUrl, function(css) {
|
|
||||||
// run parsing after normalization - since less is a CSS subset this works fine
|
|
||||||
if (parse)
|
|
||||||
css = parse(css, function(css) {
|
|
||||||
cssAPI.inject(css);
|
|
||||||
setTimeout(load, 7);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (testing)
|
|
||||||
cssAPI.inspect = function() {
|
|
||||||
if (stylesheet.styleSheet)
|
|
||||||
return stylesheet.styleSheet.cssText;
|
|
||||||
else if (stylesheet.innerHTML)
|
|
||||||
return stylesheet.innerHTML;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cssAPI;
|
|
||||||
});
|
|
@ -1,138 +0,0 @@
|
|||||||
/*
|
|
||||||
* css.normalize.js
|
|
||||||
*
|
|
||||||
* CSS Normalization
|
|
||||||
*
|
|
||||||
* CSS paths are normalized based on an optional basePath and the RequireJS config
|
|
||||||
*
|
|
||||||
* Usage:
|
|
||||||
* normalize(css, fromBasePath, toBasePath);
|
|
||||||
*
|
|
||||||
* css: the stylesheet content to normalize
|
|
||||||
* fromBasePath: the absolute base path of the css relative to any root (but without ../ backtracking)
|
|
||||||
* toBasePath: the absolute new base path of the css relative to the same root
|
|
||||||
*
|
|
||||||
* Absolute dependencies are left untouched.
|
|
||||||
*
|
|
||||||
* Urls in the CSS are picked up by regular expressions.
|
|
||||||
* These will catch all statements of the form:
|
|
||||||
*
|
|
||||||
* url(*)
|
|
||||||
* url('*')
|
|
||||||
* url("*")
|
|
||||||
*
|
|
||||||
* @import '*'
|
|
||||||
* @import "*"
|
|
||||||
*
|
|
||||||
* (and so also @import url(*) variations)
|
|
||||||
*
|
|
||||||
* For urls needing normalization
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
define(['require', 'module'], function(require, module) {
|
|
||||||
|
|
||||||
// regular expression for removing double slashes
|
|
||||||
// eg http://www.example.com//my///url/here -> http://www.example.com/my/url/here
|
|
||||||
var slashes = /([^:])\/+/g
|
|
||||||
var removeDoubleSlashes = function(uri) {
|
|
||||||
return uri.replace(slashes, '$1/');
|
|
||||||
}
|
|
||||||
|
|
||||||
// given a relative URI, and two absolute base URIs, convert it from one base to another
|
|
||||||
var protocolRegEx = /[^\:\/]*:\/\/([^\/])*/
|
|
||||||
function convertURIBase(uri, fromBase, toBase) {
|
|
||||||
if(uri.indexOf("data:") === 0)
|
|
||||||
return uri;
|
|
||||||
uri = removeDoubleSlashes(uri);
|
|
||||||
// absolute urls are left in tact
|
|
||||||
if (uri.match(/^\//) || uri.match(protocolRegEx))
|
|
||||||
return uri;
|
|
||||||
// if toBase specifies a protocol path, ensure this is the same protocol as fromBase, if not
|
|
||||||
// use absolute path at fromBase
|
|
||||||
var toBaseProtocol = toBase.match(protocolRegEx);
|
|
||||||
var fromBaseProtocol = fromBase.match(protocolRegEx);
|
|
||||||
if (fromBaseProtocol && (!toBaseProtocol || toBaseProtocol[1] != fromBaseProtocol[1] || toBaseProtocol[2] != fromBaseProtocol[2]))
|
|
||||||
return absoluteURI(uri, fromBase);
|
|
||||||
|
|
||||||
else {
|
|
||||||
return relativeURI(absoluteURI(uri, fromBase), toBase);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// given a relative URI, calculate the absolute URI
|
|
||||||
function absoluteURI(uri, base) {
|
|
||||||
if (uri.substr(0, 2) == './')
|
|
||||||
uri = uri.substr(2);
|
|
||||||
|
|
||||||
var baseParts = base.split('/');
|
|
||||||
var uriParts = uri.split('/');
|
|
||||||
|
|
||||||
baseParts.pop();
|
|
||||||
|
|
||||||
while (curPart = uriParts.shift())
|
|
||||||
if (curPart == '..')
|
|
||||||
baseParts.pop();
|
|
||||||
else
|
|
||||||
baseParts.push(curPart);
|
|
||||||
|
|
||||||
return baseParts.join('/');
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// given an absolute URI, calculate the relative URI
|
|
||||||
function relativeURI(uri, base) {
|
|
||||||
|
|
||||||
// reduce base and uri strings to just their difference string
|
|
||||||
var baseParts = base.split('/');
|
|
||||||
baseParts.pop();
|
|
||||||
base = baseParts.join('/') + '/';
|
|
||||||
i = 0;
|
|
||||||
while (base.substr(i, 1) == uri.substr(i, 1))
|
|
||||||
i++;
|
|
||||||
while (base.substr(i, 1) != '/')
|
|
||||||
i--;
|
|
||||||
base = base.substr(i + 1);
|
|
||||||
uri = uri.substr(i + 1);
|
|
||||||
|
|
||||||
// each base folder difference is thus a backtrack
|
|
||||||
baseParts = base.split('/');
|
|
||||||
var uriParts = uri.split('/');
|
|
||||||
out = '';
|
|
||||||
while (baseParts.shift())
|
|
||||||
out += '../';
|
|
||||||
|
|
||||||
// finally add uri parts
|
|
||||||
while (curPart = uriParts.shift())
|
|
||||||
out += curPart + '/';
|
|
||||||
|
|
||||||
return out.substr(0, out.length - 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
var normalizeCSS = function(source, fromBase, toBase, cssBase) {
|
|
||||||
|
|
||||||
fromBase = removeDoubleSlashes(fromBase);
|
|
||||||
toBase = removeDoubleSlashes(toBase);
|
|
||||||
|
|
||||||
var urlRegEx = /@import\s*("([^"]*)"|'([^']*)')|url\s*\(\s*(\s*"([^"]*)"|'([^']*)'|[^\)]*\s*)\s*\)/ig;
|
|
||||||
var result, url, source;
|
|
||||||
|
|
||||||
while (result = urlRegEx.exec(source)) {
|
|
||||||
url = result[3] || result[2] || result[5] || result[6] || result[4];
|
|
||||||
var newUrl;
|
|
||||||
if (cssBase && url.substr(0, 1) == '/')
|
|
||||||
newUrl = cssBase + url;
|
|
||||||
else
|
|
||||||
newUrl = convertURIBase(url, fromBase, toBase);
|
|
||||||
var quoteLen = result[5] || result[6] ? 1 : 0;
|
|
||||||
source = source.substr(0, urlRegEx.lastIndex - url.length - quoteLen - 1) + newUrl + source.substr(urlRegEx.lastIndex - quoteLen - 1);
|
|
||||||
urlRegEx.lastIndex = urlRegEx.lastIndex + (newUrl.length - url.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
return source;
|
|
||||||
};
|
|
||||||
|
|
||||||
normalizeCSS.convertURIBase = convertURIBase;
|
|
||||||
|
|
||||||
return normalizeCSS;
|
|
||||||
});
|
|
@ -1,156 +0,0 @@
|
|||||||
/*
|
|
||||||
CSS Browser Selector 0.6.1
|
|
||||||
Originally written by Rafael Lima (http://rafael.adm.br)
|
|
||||||
http://rafael.adm.br/css_browser_selector
|
|
||||||
License: http://creativecommons.org/licenses/by/2.5/
|
|
||||||
|
|
||||||
Co-maintained by:
|
|
||||||
https://github.com/verbatim/css_browser_selector
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
showLog=true;
|
|
||||||
function log(m) {if ( window.console && showLog ) {console.log(m); } }
|
|
||||||
|
|
||||||
function css_browser_selector(u)
|
|
||||||
{
|
|
||||||
var uaInfo = {},
|
|
||||||
screens = [320, 480, 640, 768, 1024, 1152, 1280, 1440, 1680, 1920, 2560],
|
|
||||||
allScreens = screens.length,
|
|
||||||
ua=u.toLowerCase(),
|
|
||||||
is=function(t) { return RegExp(t,"i").test(ua); },
|
|
||||||
version = function(p,n)
|
|
||||||
{
|
|
||||||
n=n.replace(".","_"); var i = n.indexOf('_'), ver="";
|
|
||||||
while (i>0) {ver += " "+ p+n.substring(0,i);i = n.indexOf('_', i+1);}
|
|
||||||
ver += " "+p+n; return ver;
|
|
||||||
},
|
|
||||||
g='gecko',
|
|
||||||
w='webkit',
|
|
||||||
c='chrome',
|
|
||||||
f='firefox',
|
|
||||||
s='safari',
|
|
||||||
o='opera',
|
|
||||||
m='mobile',
|
|
||||||
a='android',
|
|
||||||
bb='blackberry',
|
|
||||||
lang='lang_',
|
|
||||||
dv='device_',
|
|
||||||
html=document.documentElement,
|
|
||||||
b= [
|
|
||||||
|
|
||||||
// browser
|
|
||||||
(!(/opera|webtv/i.test(ua))&&/msie\s(\d+)/.test(ua))?('ie ie'+(/trident\/4\.0/.test(ua) ? '8' : RegExp.$1))
|
|
||||||
:is('firefox/')?g+ " " + f+(/firefox\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua)?' '+f+RegExp.$2 + ' '+f+RegExp.$2+"_"+RegExp.$4:'')
|
|
||||||
:is('gecko/')?g
|
|
||||||
:is('opera')?o+(/version\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua)?' '+o+RegExp.$2 + ' '+o+RegExp.$2+"_"+RegExp.$4 : (/opera(\s|\/)(\d+)\.(\d+)/.test(ua)?' '+o+RegExp.$2+" "+o+RegExp.$2+"_"+RegExp.$3:''))
|
|
||||||
:is('konqueror')?'konqueror'
|
|
||||||
|
|
||||||
:is('blackberry') ?
|
|
||||||
( bb +
|
|
||||||
( /Version\/(\d+)(\.(\d+)+)/i.test(ua)
|
|
||||||
? " " + bb+ RegExp.$1 + " "+bb+ RegExp.$1+RegExp.$2.replace('.','_')
|
|
||||||
: (/Blackberry ?(([0-9]+)([a-z]?))[\/|;]/gi.test(ua)
|
|
||||||
? ' ' +bb+RegExp.$2 + (RegExp.$3?' ' +bb+RegExp.$2+RegExp.$3:'')
|
|
||||||
: '')
|
|
||||||
)
|
|
||||||
) // blackberry
|
|
||||||
|
|
||||||
:is('android') ?
|
|
||||||
( a +
|
|
||||||
( /Version\/(\d+)(\.(\d+))+/i.test(ua)
|
|
||||||
? " " + a+ RegExp.$1 + " "+a+ RegExp.$1+RegExp.$2.replace('.','_')
|
|
||||||
: '')
|
|
||||||
+ (/Android (.+); (.+) Build/i.test(ua)
|
|
||||||
? ' '+dv+( (RegExp.$2).replace(/ /g,"_") ).replace(/-/g,"_")
|
|
||||||
:'' )
|
|
||||||
) //android
|
|
||||||
|
|
||||||
:is('chrome')?w+ ' '+c+(/chrome\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua)?' '+c+RegExp.$2 +((RegExp.$4>0) ? ' '+c+RegExp.$2+"_"+RegExp.$4:''):'')
|
|
||||||
|
|
||||||
:is('iron')?w+' iron'
|
|
||||||
|
|
||||||
:is('applewebkit/') ?
|
|
||||||
( w+ ' '+ s +
|
|
||||||
( /version\/((\d+)(\.(\d+))(\.\d+)*)/.test(ua)
|
|
||||||
? ' '+ s +RegExp.$2 + " "+s+ RegExp.$2+RegExp.$3.replace('.','_')
|
|
||||||
: ( / Safari\/(\d+)/i.test(ua)
|
|
||||||
?
|
|
||||||
( (RegExp.$1=="419" || RegExp.$1=="417" || RegExp.$1=="416" || RegExp.$1=="412" ) ? ' '+ s + '2_0'
|
|
||||||
: RegExp.$1=="312" ? ' '+ s + '1_3'
|
|
||||||
: RegExp.$1=="125" ? ' '+ s + '1_2'
|
|
||||||
: RegExp.$1=="85" ? ' '+ s + '1_0'
|
|
||||||
: '' )
|
|
||||||
:'')
|
|
||||||
)
|
|
||||||
) //applewebkit
|
|
||||||
|
|
||||||
:is('mozilla/')?g
|
|
||||||
:''
|
|
||||||
|
|
||||||
// mobile
|
|
||||||
,is("android|mobi|mobile|j2me|iphone|ipod|ipad|blackberry|playbook|kindle|silk")?m:''
|
|
||||||
|
|
||||||
// os/platform
|
|
||||||
,is('j2me')?'j2me'
|
|
||||||
:is('ipad|ipod|iphone')?
|
|
||||||
(
|
|
||||||
(
|
|
||||||
/CPU( iPhone)? OS (\d+[_|\.]\d+([_|\.]\d+)*)/i.test(ua) ?
|
|
||||||
'ios' + version('ios',RegExp.$2) : ''
|
|
||||||
) + ' ' + ( /(ip(ad|od|hone))/gi.test(ua) ? RegExp.$1 : "" )
|
|
||||||
) //'iphone'
|
|
||||||
//:is('ipod')?'ipod'
|
|
||||||
//:is('ipad')?'ipad'
|
|
||||||
:is('playbook')?'playbook'
|
|
||||||
:is('kindle|silk')?'kindle'
|
|
||||||
:is('playbook')?'playbook'
|
|
||||||
:is('mac')?'mac'+ (/mac os x ((\d+)[.|_](\d+))/.test(ua) ? ( ' mac' + (RegExp.$2) + ' mac' + (RegExp.$1).replace('.',"_") ) : '' )
|
|
||||||
:is('win')?'win'+
|
|
||||||
(is('windows nt 6.2')?' win8'
|
|
||||||
:is('windows nt 6.1')?' win7'
|
|
||||||
:is('windows nt 6.0')?' vista'
|
|
||||||
:is('windows nt 5.2') || is('windows nt 5.1') ? ' win_xp'
|
|
||||||
:is('windows nt 5.0')?' win_2k'
|
|
||||||
:is('windows nt 4.0') || is('WinNT4.0') ?' win_nt'
|
|
||||||
: ''
|
|
||||||
)
|
|
||||||
:is('freebsd')?'freebsd'
|
|
||||||
:(is('x11|linux'))?'linux'
|
|
||||||
:''
|
|
||||||
|
|
||||||
// user agent language
|
|
||||||
,(/[; |\[](([a-z]{2})(\-[a-z]{2})?)[)|;|\]]/i.test(ua))?(lang+RegExp.$2).replace("-","_")+(RegExp.$3!=''?(' '+lang+RegExp.$1).replace("-","_"):''):''
|
|
||||||
|
|
||||||
// beta: test if running iPad app
|
|
||||||
,( is('ipad|iphone|ipod') && !is('safari') ) ? 'ipad_app' : ''
|
|
||||||
|
|
||||||
|
|
||||||
]; // b
|
|
||||||
|
|
||||||
function screenSize()
|
|
||||||
{
|
|
||||||
var w = window.outerWidth || html.clientWidth;
|
|
||||||
var h = window.outerHeight || html.clientHeight;
|
|
||||||
uaInfo.orientation = ((w<h) ? "portrait" : "landscape");
|
|
||||||
// remove previous min-width, max-width, client-width, client-height, and orientation
|
|
||||||
html.className = html.className.replace(/ ?orientation_\w+/g, "").replace(/ [min|max|cl]+[w|h]_\d+/g, "")
|
|
||||||
for (var i=(allScreens-1);i>=0;i--) { if (w >= screens[i] ) { uaInfo.maxw = screens[i]; break; }}
|
|
||||||
widthClasses="";
|
|
||||||
for (var info in uaInfo) { widthClasses+=" "+info+"_"+ uaInfo[info] };
|
|
||||||
html.className = ( html.className +widthClasses );
|
|
||||||
return widthClasses;
|
|
||||||
} // screenSize
|
|
||||||
|
|
||||||
window.onresize = screenSize;
|
|
||||||
screenSize();
|
|
||||||
|
|
||||||
var cssbs = (b.join(' ')) + " js ";
|
|
||||||
html.className = ( cssbs + html.className.replace(/\b(no[-|_]?)?js\b/g,"") ).replace(/^ /, "").replace(/ +/g," ");
|
|
||||||
|
|
||||||
return cssbs;
|
|
||||||
}
|
|
||||||
|
|
||||||
css_browser_selector(navigator.userAgent);
|
|
||||||
|
|
||||||
|
|
@ -1,149 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
|
|
||||||
|
|
||||||
pre code {
|
|
||||||
display: block; padding: 0.5em;
|
|
||||||
background: #F0F0F0;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
pre code,
|
|
||||||
pre .subst,
|
|
||||||
pre .tag .title,
|
|
||||||
pre .lisp .title,
|
|
||||||
pre .clojure .built_in,
|
|
||||||
pre .nginx .title {
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre .string,
|
|
||||||
pre .title,
|
|
||||||
pre .constant,
|
|
||||||
pre .parent,
|
|
||||||
pre .tag .value,
|
|
||||||
pre .rules .value,
|
|
||||||
pre .rules .value .number,
|
|
||||||
pre .preprocessor,
|
|
||||||
pre .haml .symbol,
|
|
||||||
pre .ruby .symbol,
|
|
||||||
pre .ruby .symbol .string,
|
|
||||||
pre .aggregate,
|
|
||||||
pre .template_tag,
|
|
||||||
pre .django .variable,
|
|
||||||
pre .smalltalk .class,
|
|
||||||
pre .addition,
|
|
||||||
pre .flow,
|
|
||||||
pre .stream,
|
|
||||||
pre .bash .variable,
|
|
||||||
pre .apache .tag,
|
|
||||||
pre .apache .cbracket,
|
|
||||||
pre .tex .command,
|
|
||||||
pre .tex .special,
|
|
||||||
pre .erlang_repl .function_or_atom,
|
|
||||||
pre .asciidoc .header,
|
|
||||||
pre .markdown .header,
|
|
||||||
pre .coffeescript .attribute {
|
|
||||||
color: #800;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre .comment,
|
|
||||||
pre .annotation,
|
|
||||||
pre .template_comment,
|
|
||||||
pre .diff .header,
|
|
||||||
pre .chunk,
|
|
||||||
pre .asciidoc .blockquote,
|
|
||||||
pre .markdown .blockquote {
|
|
||||||
color: #888;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre .number,
|
|
||||||
pre .date,
|
|
||||||
pre .regexp,
|
|
||||||
pre .literal,
|
|
||||||
pre .hexcolor,
|
|
||||||
pre .smalltalk .symbol,
|
|
||||||
pre .smalltalk .char,
|
|
||||||
pre .go .constant,
|
|
||||||
pre .change,
|
|
||||||
pre .lasso .variable,
|
|
||||||
pre .asciidoc .bullet,
|
|
||||||
pre .markdown .bullet,
|
|
||||||
pre .asciidoc .link_url,
|
|
||||||
pre .markdown .link_url {
|
|
||||||
color: #080;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre .label,
|
|
||||||
pre .javadoc,
|
|
||||||
pre .ruby .string,
|
|
||||||
pre .decorator,
|
|
||||||
pre .filter .argument,
|
|
||||||
pre .localvars,
|
|
||||||
pre .array,
|
|
||||||
pre .attr_selector,
|
|
||||||
pre .important,
|
|
||||||
pre .pseudo,
|
|
||||||
pre .pi,
|
|
||||||
pre .haml .bullet,
|
|
||||||
pre .doctype,
|
|
||||||
pre .deletion,
|
|
||||||
pre .envvar,
|
|
||||||
pre .shebang,
|
|
||||||
pre .apache .sqbracket,
|
|
||||||
pre .nginx .built_in,
|
|
||||||
pre .tex .formula,
|
|
||||||
pre .erlang_repl .reserved,
|
|
||||||
pre .prompt,
|
|
||||||
pre .asciidoc .link_label,
|
|
||||||
pre .markdown .link_label,
|
|
||||||
pre .vhdl .attribute,
|
|
||||||
pre .clojure .attribute,
|
|
||||||
pre .asciidoc .attribute,
|
|
||||||
pre .lasso .attribute,
|
|
||||||
pre .coffeescript .property {
|
|
||||||
color: #88F
|
|
||||||
}
|
|
||||||
|
|
||||||
pre .keyword,
|
|
||||||
pre .id,
|
|
||||||
pre .title,
|
|
||||||
pre .built_in,
|
|
||||||
pre .aggregate,
|
|
||||||
pre .css .tag,
|
|
||||||
pre .javadoctag,
|
|
||||||
pre .phpdoc,
|
|
||||||
pre .yardoctag,
|
|
||||||
pre .smalltalk .class,
|
|
||||||
pre .winutils,
|
|
||||||
pre .bash .variable,
|
|
||||||
pre .apache .tag,
|
|
||||||
pre .go .typename,
|
|
||||||
pre .tex .command,
|
|
||||||
pre .asciidoc .strong,
|
|
||||||
pre .markdown .strong,
|
|
||||||
pre .request,
|
|
||||||
pre .status {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre .asciidoc .emphasis,
|
|
||||||
pre .markdown .emphasis {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre .nginx .built_in {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre .coffeescript .javascript,
|
|
||||||
pre .javascript .xml,
|
|
||||||
pre .lasso .markup,
|
|
||||||
pre .tex .formula,
|
|
||||||
pre .xml .javascript,
|
|
||||||
pre .xml .vbscript,
|
|
||||||
pre .xml .css,
|
|
||||||
pre .xml .cdata {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
File diff suppressed because one or more lines are too long
@ -1,138 +0,0 @@
|
|||||||
|
|
||||||
div.jGrowl {
|
|
||||||
z-index: 9999;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Special IE6 Style Positioning **/
|
|
||||||
/*
|
|
||||||
div.ie6 {
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.ie6.top-right {
|
|
||||||
right: auto;
|
|
||||||
bottom: auto;
|
|
||||||
left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
|
|
||||||
top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
|
|
||||||
}
|
|
||||||
|
|
||||||
div.ie6.top-left {
|
|
||||||
left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
|
|
||||||
top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
|
|
||||||
}
|
|
||||||
|
|
||||||
div.ie6.bottom-right {
|
|
||||||
left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
|
|
||||||
top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
|
|
||||||
}
|
|
||||||
|
|
||||||
div.ie6.bottom-left {
|
|
||||||
left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
|
|
||||||
top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
|
|
||||||
}
|
|
||||||
|
|
||||||
div.ie6.center {
|
|
||||||
left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
|
|
||||||
top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** Normal Style Positions **/
|
|
||||||
div.jGrowl {
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
body > div.jGrowl {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl.top-left {
|
|
||||||
left: 0px;
|
|
||||||
top: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl.top-right {
|
|
||||||
right: 0px;
|
|
||||||
top: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl.bottom-left {
|
|
||||||
left: 0px;
|
|
||||||
bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl.bottom-right {
|
|
||||||
right: 0px;
|
|
||||||
bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl.center {
|
|
||||||
top: 0px;
|
|
||||||
width: 50%;
|
|
||||||
left: 25%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Cross Browser Styling **/
|
|
||||||
div.center div.jGrowl-notification, div.center div.jGrowl-closer {
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer {
|
|
||||||
background-color: #000;
|
|
||||||
opacity: .85;
|
|
||||||
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)";
|
|
||||||
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85);
|
|
||||||
zoom: 1;
|
|
||||||
width: 235px;
|
|
||||||
padding: 10px;
|
|
||||||
margin-top: 5px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
font-family: Tahoma, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 1em;
|
|
||||||
text-align: left;
|
|
||||||
display: none;
|
|
||||||
-moz-border-radius: 5px;
|
|
||||||
-webkit-border-radius: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl div.jGrowl-notification {
|
|
||||||
min-height: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl div.jGrowl-notification,
|
|
||||||
div.jGrowl div.jGrowl-closer {
|
|
||||||
margin: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl div.jGrowl-notification div.jGrowl-header {
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: .85em;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl div.jGrowl-notification div.jGrowl-close {
|
|
||||||
z-index: 99;
|
|
||||||
float: right;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 1em;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.jGrowl div.jGrowl-closer {
|
|
||||||
padding-top: 4px;
|
|
||||||
padding-bottom: 4px;
|
|
||||||
cursor: pointer;
|
|
||||||
font-size: .9em;
|
|
||||||
font-weight: bold;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Hide jGrowl when printing **/
|
|
||||||
@media print {
|
|
||||||
div.jGrowl {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,364 +0,0 @@
|
|||||||
/**
|
|
||||||
* jGrowl 1.2.12
|
|
||||||
*
|
|
||||||
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
|
||||||
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
|
||||||
*
|
|
||||||
* Written by Stan Lemon <stosh1985@gmail.com>
|
|
||||||
* Last updated: 2013.02.14
|
|
||||||
*
|
|
||||||
* jGrowl is a jQuery plugin implementing unobtrusive userland notifications. These
|
|
||||||
* notifications function similarly to the Growl Framework available for
|
|
||||||
* Mac OS X (http://growl.info).
|
|
||||||
*
|
|
||||||
* To Do:
|
|
||||||
* - Move library settings to containers and allow them to be changed per container
|
|
||||||
*
|
|
||||||
* Changes in 1.2.13
|
|
||||||
* - Fixed clearing interval when the container shuts down
|
|
||||||
*
|
|
||||||
* Changes in 1.2.12
|
|
||||||
* - Added compressed versions using UglifyJS and Sqwish
|
|
||||||
* - Improved README with configuration options explanation
|
|
||||||
* - Added a source map
|
|
||||||
*
|
|
||||||
* Changes in 1.2.11
|
|
||||||
* - Fix artifacts left behind by the shutdown method and text-cleanup
|
|
||||||
*
|
|
||||||
* Changes in 1.2.10
|
|
||||||
* - Fix beforeClose to be called in click event
|
|
||||||
*
|
|
||||||
* Changes in 1.2.9
|
|
||||||
* - Fixed BC break in jQuery 2.0 beta
|
|
||||||
*
|
|
||||||
* Changes in 1.2.8
|
|
||||||
* - Fixes for jQuery 1.9 and the MSIE6 check, note that with jQuery 2.0 support
|
|
||||||
* jGrowl intends to drop support for IE6 altogether
|
|
||||||
*
|
|
||||||
* Changes in 1.2.6
|
|
||||||
* - Fixed js error when a notification is opening and closing at the same time
|
|
||||||
*
|
|
||||||
* Changes in 1.2.5
|
|
||||||
* - Changed wrapper jGrowl's options usage to "o" instead of $.jGrowl.defaults
|
|
||||||
* - Added themeState option to control 'highlight' or 'error' for jQuery UI
|
|
||||||
* - Ammended some CSS to provide default positioning for nested usage.
|
|
||||||
* - Changed some CSS to be prefixed with jGrowl- to prevent namespacing issues
|
|
||||||
* - Added two new options - openDuration and closeDuration to allow
|
|
||||||
* better control of notification open and close speeds, respectively
|
|
||||||
* Patch contributed by Jesse Vincet.
|
|
||||||
* - Added afterOpen callback. Patch contributed by Russel Branca.
|
|
||||||
*
|
|
||||||
* Changes in 1.2.4
|
|
||||||
* - Fixed IE bug with the close-all button
|
|
||||||
* - Fixed IE bug with the filter CSS attribute (special thanks to gotwic)
|
|
||||||
* - Update IE opacity CSS
|
|
||||||
* - Changed font sizes to use "em", and only set the base style
|
|
||||||
*
|
|
||||||
* Changes in 1.2.3
|
|
||||||
* - The callbacks no longer use the container as context, instead they use the actual notification
|
|
||||||
* - The callbacks now receive the container as a parameter after the options parameter
|
|
||||||
* - beforeOpen and beforeClose now check the return value, if it's false - the notification does
|
|
||||||
* not continue. The open callback will also halt execution if it returns false.
|
|
||||||
* - Fixed bug where containers would get confused
|
|
||||||
* - Expanded the pause functionality to pause an entire container.
|
|
||||||
*
|
|
||||||
* Changes in 1.2.2
|
|
||||||
* - Notification can now be theme rolled for jQuery UI, special thanks to Jeff Chan!
|
|
||||||
*
|
|
||||||
* Changes in 1.2.1
|
|
||||||
* - Fixed instance where the interval would fire the close method multiple times.
|
|
||||||
* - Added CSS to hide from print media
|
|
||||||
* - Fixed issue with closer button when div { position: relative } is set
|
|
||||||
* - Fixed leaking issue with multiple containers. Special thanks to Matthew Hanlon!
|
|
||||||
*
|
|
||||||
* Changes in 1.2.0
|
|
||||||
* - Added message pooling to limit the number of messages appearing at a given time.
|
|
||||||
* - Closing a notification is now bound to the notification object and triggered by the close button.
|
|
||||||
*
|
|
||||||
* Changes in 1.1.2
|
|
||||||
* - Added iPhone styled example
|
|
||||||
* - Fixed possible IE7 bug when determining if the ie6 class shoudl be applied.
|
|
||||||
* - Added template for the close button, so that it's content could be customized.
|
|
||||||
*
|
|
||||||
* Changes in 1.1.1
|
|
||||||
* - Fixed CSS styling bug for ie6 caused by a mispelling
|
|
||||||
* - Changes height restriction on default notifications to min-height
|
|
||||||
* - Added skinned examples using a variety of images
|
|
||||||
* - Added the ability to customize the content of the [close all] box
|
|
||||||
* - Added jTweet, an example of using jGrowl + Twitter
|
|
||||||
*
|
|
||||||
* Changes in 1.1.0
|
|
||||||
* - Multiple container and instances.
|
|
||||||
* - Standard $.jGrowl() now wraps $.fn.jGrowl() by first establishing a generic jGrowl container.
|
|
||||||
* - Instance methods of a jGrowl container can be called by $.fn.jGrowl(methodName)
|
|
||||||
* - Added glue preferenced, which allows notifications to be inserted before or after nodes in the container
|
|
||||||
* - Added new log callback which is called before anything is done for the notification
|
|
||||||
* - Corner's attribute are now applied on an individual notification basis.
|
|
||||||
*
|
|
||||||
* Changes in 1.0.4
|
|
||||||
* - Various CSS fixes so that jGrowl renders correctly in IE6.
|
|
||||||
*
|
|
||||||
* Changes in 1.0.3
|
|
||||||
* - Fixed bug with options persisting across notifications
|
|
||||||
* - Fixed theme application bug
|
|
||||||
* - Simplified some selectors and manipulations.
|
|
||||||
* - Added beforeOpen and beforeClose callbacks
|
|
||||||
* - Reorganized some lines of code to be more readable
|
|
||||||
* - Removed unnecessary this.defaults context
|
|
||||||
* - If corners plugin is present, it's now customizable.
|
|
||||||
* - Customizable open animation.
|
|
||||||
* - Customizable close animation.
|
|
||||||
* - Customizable animation easing.
|
|
||||||
* - Added customizable positioning (top-left, top-right, bottom-left, bottom-right, center)
|
|
||||||
*
|
|
||||||
* Changes in 1.0.2
|
|
||||||
* - All CSS styling is now external.
|
|
||||||
* - Added a theme parameter which specifies a secondary class for styling, such
|
|
||||||
* that notifications can be customized in appearance on a per message basis.
|
|
||||||
* - Notification life span is now customizable on a per message basis.
|
|
||||||
* - Added the ability to disable the global closer, enabled by default.
|
|
||||||
* - Added callbacks for when a notification is opened or closed.
|
|
||||||
* - Added callback for the global closer.
|
|
||||||
* - Customizable animation speed.
|
|
||||||
* - jGrowl now set itself up and tears itself down.
|
|
||||||
*
|
|
||||||
* Changes in 1.0.1:
|
|
||||||
* - Removed dependency on metadata plugin in favor of .data()
|
|
||||||
* - Namespaced all events
|
|
||||||
*/
|
|
||||||
(function($) {
|
|
||||||
/** Compatibility holdover for 1.9 to check IE6 **/
|
|
||||||
var $ie6 = (function(){
|
|
||||||
return false === $.support.boxModel && $.support.objectAll && $.support.leadingWhitespace;
|
|
||||||
})();
|
|
||||||
|
|
||||||
/** jGrowl Wrapper - Establish a base jGrowl Container for compatibility with older releases. **/
|
|
||||||
$.jGrowl = function( m , o ) {
|
|
||||||
// To maintain compatibility with older version that only supported one instance we'll create the base container.
|
|
||||||
if ( $('#jGrowl').size() == 0 )
|
|
||||||
$('<div id="jGrowl"></div>').addClass( (o && o.position) ? o.position : $.jGrowl.defaults.position ).appendTo('body');
|
|
||||||
|
|
||||||
// Create a notification on the container.
|
|
||||||
$('#jGrowl').jGrowl(m,o);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/** Raise jGrowl Notification on a jGrowl Container **/
|
|
||||||
$.fn.jGrowl = function( m , o ) {
|
|
||||||
if ( $.isFunction(this.each) ) {
|
|
||||||
var args = arguments;
|
|
||||||
|
|
||||||
return this.each(function() {
|
|
||||||
/** Create a jGrowl Instance on the Container if it does not exist **/
|
|
||||||
if ( $(this).data('jGrowl.instance') == undefined ) {
|
|
||||||
$(this).data('jGrowl.instance', $.extend( new $.fn.jGrowl(), { notifications: [], element: null, interval: null } ));
|
|
||||||
$(this).data('jGrowl.instance').startup( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Optionally call jGrowl instance methods, or just raise a normal notification **/
|
|
||||||
if ( $.isFunction($(this).data('jGrowl.instance')[m]) ) {
|
|
||||||
$(this).data('jGrowl.instance')[m].apply( $(this).data('jGrowl.instance') , $.makeArray(args).slice(1) );
|
|
||||||
} else {
|
|
||||||
$(this).data('jGrowl.instance').create( m , o );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
$.extend( $.fn.jGrowl.prototype , {
|
|
||||||
|
|
||||||
/** Default JGrowl Settings **/
|
|
||||||
defaults: {
|
|
||||||
pool: 0,
|
|
||||||
header: '',
|
|
||||||
group: '',
|
|
||||||
sticky: false,
|
|
||||||
position: 'top-right',
|
|
||||||
glue: 'after',
|
|
||||||
theme: 'default',
|
|
||||||
themeState: 'highlight',
|
|
||||||
corners: '10px',
|
|
||||||
check: 250,
|
|
||||||
life: 3000,
|
|
||||||
closeDuration: 'normal',
|
|
||||||
openDuration: 'normal',
|
|
||||||
easing: 'swing',
|
|
||||||
closer: true,
|
|
||||||
closeTemplate: '×',
|
|
||||||
closerTemplate: '<div>[ close all ]</div>',
|
|
||||||
log: function() {},
|
|
||||||
beforeOpen: function() {},
|
|
||||||
afterOpen: function() {},
|
|
||||||
open: function() {},
|
|
||||||
beforeClose: function() {},
|
|
||||||
close: function() {},
|
|
||||||
animateOpen: {
|
|
||||||
opacity: 'show'
|
|
||||||
},
|
|
||||||
animateClose: {
|
|
||||||
opacity: 'hide'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
notifications: [],
|
|
||||||
|
|
||||||
/** jGrowl Container Node **/
|
|
||||||
element: null,
|
|
||||||
|
|
||||||
/** Interval Function **/
|
|
||||||
interval: null,
|
|
||||||
|
|
||||||
/** Create a Notification **/
|
|
||||||
create: function( message , o ) {
|
|
||||||
var o = $.extend({}, this.defaults, o);
|
|
||||||
|
|
||||||
/* To keep backward compatibility with 1.24 and earlier, honor 'speed' if the user has set it */
|
|
||||||
if (typeof o.speed !== 'undefined') {
|
|
||||||
o.openDuration = o.speed;
|
|
||||||
o.closeDuration = o.speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.notifications.push({ message: message , options: o });
|
|
||||||
|
|
||||||
o.log.apply( this.element , [this.element,message,o] );
|
|
||||||
},
|
|
||||||
|
|
||||||
render: function( notification ) {
|
|
||||||
var self = this;
|
|
||||||
var message = notification.message;
|
|
||||||
var o = notification.options;
|
|
||||||
|
|
||||||
// Support for jQuery theme-states, if this is not used it displays a widget header
|
|
||||||
o.themeState = (o.themeState == '') ? '' : 'ui-state-' + o.themeState;
|
|
||||||
|
|
||||||
var notification = $('<div/>')
|
|
||||||
.addClass('jGrowl-notification ' + o.themeState + ' ui-corner-all' + ((o.group != undefined && o.group != '') ? ' ' + o.group : ''))
|
|
||||||
.append($('<div/>').addClass('jGrowl-close').html(o.closeTemplate))
|
|
||||||
.append($('<div/>').addClass('jGrowl-header').html(o.header))
|
|
||||||
.append($('<div/>').addClass('jGrowl-message').html(message))
|
|
||||||
.data("jGrowl", o).addClass(o.theme).children('div.jGrowl-close').bind("click.jGrowl", function() {
|
|
||||||
$(this).parent().trigger('jGrowl.beforeClose');
|
|
||||||
})
|
|
||||||
.parent();
|
|
||||||
|
|
||||||
|
|
||||||
/** Notification Actions **/
|
|
||||||
$(notification).bind("mouseover.jGrowl", function() {
|
|
||||||
$('div.jGrowl-notification', self.element).data("jGrowl.pause", true);
|
|
||||||
}).bind("mouseout.jGrowl", function() {
|
|
||||||
$('div.jGrowl-notification', self.element).data("jGrowl.pause", false);
|
|
||||||
}).bind('jGrowl.beforeOpen', function() {
|
|
||||||
if ( o.beforeOpen.apply( notification , [notification,message,o,self.element] ) !== false ) {
|
|
||||||
$(this).trigger('jGrowl.open');
|
|
||||||
}
|
|
||||||
}).bind('jGrowl.open', function() {
|
|
||||||
if ( o.open.apply( notification , [notification,message,o,self.element] ) !== false ) {
|
|
||||||
if ( o.glue == 'after' ) {
|
|
||||||
$('div.jGrowl-notification:last', self.element).after(notification);
|
|
||||||
} else {
|
|
||||||
$('div.jGrowl-notification:first', self.element).before(notification);
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this).animate(o.animateOpen, o.openDuration, o.easing, function() {
|
|
||||||
// Fixes some anti-aliasing issues with IE filters.
|
|
||||||
if ($.support.opacity === false)
|
|
||||||
this.style.removeAttribute('filter');
|
|
||||||
|
|
||||||
if ( $(this).data("jGrowl") !== null ) // Happens when a notification is closing before it's open.
|
|
||||||
$(this).data("jGrowl").created = new Date();
|
|
||||||
|
|
||||||
$(this).trigger('jGrowl.afterOpen');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}).bind('jGrowl.afterOpen', function() {
|
|
||||||
o.afterOpen.apply( notification , [notification,message,o,self.element] );
|
|
||||||
}).bind('jGrowl.beforeClose', function() {
|
|
||||||
if ( o.beforeClose.apply( notification , [notification,message,o,self.element] ) !== false )
|
|
||||||
$(this).trigger('jGrowl.close');
|
|
||||||
}).bind('jGrowl.close', function() {
|
|
||||||
// Pause the notification, lest during the course of animation another close event gets called.
|
|
||||||
$(this).data('jGrowl.pause', true);
|
|
||||||
$(this).animate(o.animateClose, o.closeDuration, o.easing, function() {
|
|
||||||
if ( $.isFunction(o.close) ) {
|
|
||||||
if ( o.close.apply( notification , [notification,message,o,self.element] ) !== false )
|
|
||||||
$(this).remove();
|
|
||||||
} else {
|
|
||||||
$(this).remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}).trigger('jGrowl.beforeOpen');
|
|
||||||
|
|
||||||
/** Optional Corners Plugin **/
|
|
||||||
if ( o.corners != '' && $.fn.corner != undefined ) $(notification).corner( o.corners );
|
|
||||||
|
|
||||||
/** Add a Global Closer if more than one notification exists **/
|
|
||||||
if ( $('div.jGrowl-notification:parent', self.element).size() > 1 &&
|
|
||||||
$('div.jGrowl-closer', self.element).size() == 0 && this.defaults.closer !== false ) {
|
|
||||||
$(this.defaults.closerTemplate).addClass('jGrowl-closer ' + this.defaults.themeState + ' ui-corner-all').addClass(this.defaults.theme)
|
|
||||||
.appendTo(self.element).animate(this.defaults.animateOpen, this.defaults.speed, this.defaults.easing)
|
|
||||||
.bind("click.jGrowl", function() {
|
|
||||||
$(this).siblings().trigger("jGrowl.beforeClose");
|
|
||||||
|
|
||||||
if ( $.isFunction( self.defaults.closer ) ) {
|
|
||||||
self.defaults.closer.apply( $(this).parent()[0] , [$(this).parent()[0]] );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
/** Update the jGrowl Container, removing old jGrowl notifications **/
|
|
||||||
update: function() {
|
|
||||||
$(this.element).find('div.jGrowl-notification:parent').each( function() {
|
|
||||||
if ( $(this).data("jGrowl") != undefined && $(this).data("jGrowl").created !== undefined &&
|
|
||||||
($(this).data("jGrowl").created.getTime() + parseInt($(this).data("jGrowl").life)) < (new Date()).getTime() &&
|
|
||||||
$(this).data("jGrowl").sticky !== true &&
|
|
||||||
($(this).data("jGrowl.pause") == undefined || $(this).data("jGrowl.pause") !== true) ) {
|
|
||||||
|
|
||||||
// Pause the notification, lest during the course of animation another close event gets called.
|
|
||||||
$(this).trigger('jGrowl.beforeClose');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if ( this.notifications.length > 0 &&
|
|
||||||
(this.defaults.pool == 0 || $(this.element).find('div.jGrowl-notification:parent').size() < this.defaults.pool) )
|
|
||||||
this.render( this.notifications.shift() );
|
|
||||||
|
|
||||||
if ( $(this.element).find('div.jGrowl-notification:parent').size() < 2 ) {
|
|
||||||
$(this.element).find('div.jGrowl-closer').animate(this.defaults.animateClose, this.defaults.speed, this.defaults.easing, function() {
|
|
||||||
$(this).remove();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/** Setup the jGrowl Notification Container **/
|
|
||||||
startup: function(e) {
|
|
||||||
this.element = $(e).addClass('jGrowl').append('<div class="jGrowl-notification"></div>');
|
|
||||||
this.interval = setInterval( function() {
|
|
||||||
$(e).data('jGrowl.instance').update();
|
|
||||||
}, parseInt(this.defaults.check));
|
|
||||||
|
|
||||||
if ($ie6) {
|
|
||||||
$(this.element).addClass('ie6');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/** Shutdown jGrowl, removing it and clearing the interval **/
|
|
||||||
shutdown: function() {
|
|
||||||
$(this.element).removeClass('jGrowl')
|
|
||||||
.find('div.jGrowl-notification').trigger('jGrowl.close')
|
|
||||||
.parent().empty()
|
|
||||||
|
|
||||||
clearInterval(this.interval);
|
|
||||||
},
|
|
||||||
|
|
||||||
close: function() {
|
|
||||||
$(this.element).find('div.jGrowl-notification').each(function(){
|
|
||||||
$(this).trigger('jGrowl.beforeClose');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/** Reference the Defaults Object for compatibility with older versions of jGrowl **/
|
|
||||||
$.jGrowl.defaults = $.fn.jGrowl.prototype.defaults;
|
|
||||||
|
|
||||||
})(jQuery);
|
|
3742
res/libs/jquery-ui.js
vendored
3742
res/libs/jquery-ui.js
vendored
File diff suppressed because it is too large
Load Diff
8829
res/libs/jquery.js
vendored
8829
res/libs/jquery.js
vendored
File diff suppressed because it is too large
Load Diff
@ -1,117 +0,0 @@
|
|||||||
/*! Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net)
|
|
||||||
* Licensed under the MIT License (LICENSE.txt).
|
|
||||||
*
|
|
||||||
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
|
|
||||||
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
|
|
||||||
* Thanks to: Seamus Leahy for adding deltaX and deltaY
|
|
||||||
*
|
|
||||||
* Version: 3.1.3
|
|
||||||
*
|
|
||||||
* Requires: 1.2.2+
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function (factory) {
|
|
||||||
if ( typeof define === 'function' && define.amd ) {
|
|
||||||
// AMD. Register as an anonymous module.
|
|
||||||
define(['jquery'], factory);
|
|
||||||
} else if (typeof exports === 'object') {
|
|
||||||
// Node/CommonJS style for Browserify
|
|
||||||
module.exports = factory;
|
|
||||||
} else {
|
|
||||||
// Browser globals
|
|
||||||
factory(jQuery);
|
|
||||||
}
|
|
||||||
}(function ($) {
|
|
||||||
|
|
||||||
var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'];
|
|
||||||
var toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'];
|
|
||||||
var lowestDelta, lowestDeltaXY;
|
|
||||||
|
|
||||||
if ( $.event.fixHooks ) {
|
|
||||||
for ( var i = toFix.length; i; ) {
|
|
||||||
$.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$.event.special.mousewheel = {
|
|
||||||
setup: function() {
|
|
||||||
if ( this.addEventListener ) {
|
|
||||||
for ( var i = toBind.length; i; ) {
|
|
||||||
this.addEventListener( toBind[--i], handler, false );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.onmousewheel = handler;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
teardown: function() {
|
|
||||||
if ( this.removeEventListener ) {
|
|
||||||
for ( var i = toBind.length; i; ) {
|
|
||||||
this.removeEventListener( toBind[--i], handler, false );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.onmousewheel = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$.fn.extend({
|
|
||||||
mousewheel: function(fn) {
|
|
||||||
return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
|
|
||||||
},
|
|
||||||
|
|
||||||
unmousewheel: function(fn) {
|
|
||||||
return this.unbind("mousewheel", fn);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
function handler(event) {
|
|
||||||
var orgEvent = event || window.event,
|
|
||||||
args = [].slice.call(arguments, 1),
|
|
||||||
delta = 0,
|
|
||||||
deltaX = 0,
|
|
||||||
deltaY = 0,
|
|
||||||
absDelta = 0,
|
|
||||||
absDeltaXY = 0,
|
|
||||||
fn;
|
|
||||||
event = $.event.fix(orgEvent);
|
|
||||||
event.type = "mousewheel";
|
|
||||||
|
|
||||||
// Old school scrollwheel delta
|
|
||||||
if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta; }
|
|
||||||
if ( orgEvent.detail ) { delta = orgEvent.detail * -1; }
|
|
||||||
|
|
||||||
// New school wheel delta (wheel event)
|
|
||||||
if ( orgEvent.deltaY ) {
|
|
||||||
deltaY = orgEvent.deltaY * -1;
|
|
||||||
delta = deltaY;
|
|
||||||
}
|
|
||||||
if ( orgEvent.deltaX ) {
|
|
||||||
deltaX = orgEvent.deltaX;
|
|
||||||
delta = deltaX * -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Webkit
|
|
||||||
if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY; }
|
|
||||||
if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = orgEvent.wheelDeltaX * -1; }
|
|
||||||
|
|
||||||
// Look for lowest delta to normalize the delta values
|
|
||||||
absDelta = Math.abs(delta);
|
|
||||||
if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; }
|
|
||||||
absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX));
|
|
||||||
if ( !lowestDeltaXY || absDeltaXY < lowestDeltaXY ) { lowestDeltaXY = absDeltaXY; }
|
|
||||||
|
|
||||||
// Get a whole value for the deltas
|
|
||||||
fn = delta > 0 ? 'floor' : 'ceil';
|
|
||||||
delta = Math[fn](delta / lowestDelta);
|
|
||||||
deltaX = Math[fn](deltaX / lowestDeltaXY);
|
|
||||||
deltaY = Math[fn](deltaY / lowestDeltaXY);
|
|
||||||
|
|
||||||
// Add event and delta to the front of the arguments
|
|
||||||
args.unshift(event, delta, deltaX, deltaY);
|
|
||||||
|
|
||||||
return ($.event.dispatch || $.event.handle).apply(this, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
}));
|
|
@ -1,42 +0,0 @@
|
|||||||
define(['css/css-builder', './lessc-server', 'require'], function(css, lessc, req) {
|
|
||||||
var less = {};
|
|
||||||
|
|
||||||
var baseParts = req.toUrl('base_url').split('/');
|
|
||||||
baseParts.pop();
|
|
||||||
var baseUrl = baseParts.join('/');
|
|
||||||
|
|
||||||
// include the base url as a path
|
|
||||||
var parser = new lessc.Parser({
|
|
||||||
paths: [baseUrl + '/']
|
|
||||||
});
|
|
||||||
|
|
||||||
var parseLess = function(less) {
|
|
||||||
var CSS;
|
|
||||||
parser.parse(less, function(err, tree) {
|
|
||||||
if (err)
|
|
||||||
throw err;
|
|
||||||
CSS = tree.toCSS();
|
|
||||||
});
|
|
||||||
return CSS;
|
|
||||||
}
|
|
||||||
|
|
||||||
less.normalize = function(name, normalize) {
|
|
||||||
if (name.substr(name.length - 5, 5) == '.less')
|
|
||||||
name = name.substr(0, name.length - 5);
|
|
||||||
return normalize(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
less.load = function(name, req, load, config) {
|
|
||||||
css.load(name, req, load, config, parseLess);
|
|
||||||
}
|
|
||||||
|
|
||||||
less.write = function(pluginName, moduleName, write) {
|
|
||||||
css.write(pluginName, moduleName, write, parseLess);
|
|
||||||
}
|
|
||||||
|
|
||||||
less.onLayerEnd = function(write, data) {
|
|
||||||
css.onLayerEnd(write, data, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return less;
|
|
||||||
});
|
|
@ -1,50 +0,0 @@
|
|||||||
define(['css', 'require'], function(css, require) {
|
|
||||||
|
|
||||||
var less = {};
|
|
||||||
|
|
||||||
less.pluginBuilder = './less-builder';
|
|
||||||
|
|
||||||
if (typeof window == 'undefined') {
|
|
||||||
less.load = function(n, r, load) { load(); }
|
|
||||||
return less;
|
|
||||||
}
|
|
||||||
|
|
||||||
//copy api methods from the css plugin
|
|
||||||
less.normalize = function(name, normalize) {
|
|
||||||
if (name.substr(name.length - 5, 5) == '.less')
|
|
||||||
name = name.substr(0, name.length - 5);
|
|
||||||
|
|
||||||
name = normalize(name);
|
|
||||||
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
less.parse = function(less, callback) {
|
|
||||||
// set initial configuration
|
|
||||||
window.less = window.less || {
|
|
||||||
env: 'development'
|
|
||||||
};
|
|
||||||
require(['./lessc'], function(lessc) {
|
|
||||||
var css;
|
|
||||||
var parser = new lessc.Parser();
|
|
||||||
parser.parse(less, function(err, tree) {
|
|
||||||
if (err)
|
|
||||||
throw err;
|
|
||||||
try {
|
|
||||||
css = tree.toCSS();
|
|
||||||
}
|
|
||||||
catch(e) {
|
|
||||||
throw new Error("LESS parse error: " + e.type + ", " + e.message);
|
|
||||||
}
|
|
||||||
//instant callback luckily for builds
|
|
||||||
callback(css);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
less.load = function(lessId, req, load, config) {
|
|
||||||
css.load(lessId, req, load, config, less.parse);
|
|
||||||
}
|
|
||||||
|
|
||||||
return less;
|
|
||||||
});
|
|
@ -1,96 +0,0 @@
|
|||||||
define(['./lessc'], function(less) {
|
|
||||||
|
|
||||||
if (['node', 'rhino'].indexOf(less.mode) == -1) {
|
|
||||||
throw new Error('Environment not supported by require-less builder: ' + less.mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
var readFile = (function() {
|
|
||||||
if (less.mode === 'node') {
|
|
||||||
var fs = require.nodeRequire('fs');
|
|
||||||
var path = require.nodeRequire('path');
|
|
||||||
return function(pathname) {
|
|
||||||
return fs.readFileSync(pathname, 'utf-8');
|
|
||||||
};
|
|
||||||
} else if (less.mode === 'rhino') {
|
|
||||||
return function(pathname) {
|
|
||||||
return readFile(pathname, 'UTF-8');
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
|
|
||||||
var checkPath = (function() {
|
|
||||||
if (less.mode === 'node') {
|
|
||||||
var fs = require.nodeRequire('fs');
|
|
||||||
var path = require.nodeRequire('path');
|
|
||||||
return function(pathname, file) {
|
|
||||||
try {
|
|
||||||
pathname = path.join(pathname, file);
|
|
||||||
fs.statSync(pathname);
|
|
||||||
return pathname;
|
|
||||||
} catch (e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} else if (less.mode === 'rhino') {
|
|
||||||
return function(pathname, file) {
|
|
||||||
var f = new java.io.File(pathname, file);
|
|
||||||
if (f.isFile()) {
|
|
||||||
return f.getPath();
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
|
|
||||||
less.Parser.importer = function (file, paths, callback, env) {
|
|
||||||
var pathname, data;
|
|
||||||
|
|
||||||
// TODO: Undo this at some point,
|
|
||||||
// or use different approach.
|
|
||||||
var paths = [].concat(paths);
|
|
||||||
paths.push('.');
|
|
||||||
|
|
||||||
for (var i = 0; i < paths.length; i++) {
|
|
||||||
pathname = checkPath(paths[i], file);
|
|
||||||
if (pathname != null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
paths = paths.slice(0, paths.length - 1);
|
|
||||||
|
|
||||||
if (!pathname) {
|
|
||||||
if (typeof(env.errback) === "function") {
|
|
||||||
env.errback(file, paths, callback);
|
|
||||||
} else {
|
|
||||||
callback({ type: 'File', message: "'" + file + "' wasn't found.\n" });
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseFile(e, data) {
|
|
||||||
if (e) return callback(e);
|
|
||||||
env.contents = env.contents || {};
|
|
||||||
env.contents[pathname] = data; // Updating top importing parser content cache.
|
|
||||||
new(less.Parser)({
|
|
||||||
paths: [path.dirname(pathname)].concat(paths),
|
|
||||||
filename: pathname,
|
|
||||||
contents: env.contents,
|
|
||||||
files: env.files,
|
|
||||||
syncImport: env.syncImport,
|
|
||||||
dumpLineNumbers: env.dumpLineNumbers
|
|
||||||
}).parse(data, function (e, root) {
|
|
||||||
callback(e, root, pathname);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
readFile(pathname);
|
|
||||||
parseFile(null, data);
|
|
||||||
} catch (e) {
|
|
||||||
parseFile(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return less;
|
|
||||||
});
|
|
File diff suppressed because it is too large
Load Diff
@ -1,910 +0,0 @@
|
|||||||
/*global define:false */
|
|
||||||
/**
|
|
||||||
* Copyright 2013 Craig Campbell
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* Mousetrap is a simple keyboard shortcut library for Javascript with
|
|
||||||
* no external dependencies
|
|
||||||
*
|
|
||||||
* @version 1.4.1
|
|
||||||
* @url craig.is/killing/mice
|
|
||||||
*/
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mapping of special keycodes to their corresponding keys
|
|
||||||
*
|
|
||||||
* everything in this dictionary cannot use keypress events
|
|
||||||
* so it has to be here to map to the correct keycodes for
|
|
||||||
* keyup/keydown events
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
var _MAP = {
|
|
||||||
8: 'backspace',
|
|
||||||
9: 'tab',
|
|
||||||
13: 'enter',
|
|
||||||
16: 'shift',
|
|
||||||
17: 'ctrl',
|
|
||||||
18: 'alt',
|
|
||||||
20: 'capslock',
|
|
||||||
27: 'esc',
|
|
||||||
32: 'space',
|
|
||||||
33: 'pageup',
|
|
||||||
34: 'pagedown',
|
|
||||||
35: 'end',
|
|
||||||
36: 'home',
|
|
||||||
37: 'left',
|
|
||||||
38: 'up',
|
|
||||||
39: 'right',
|
|
||||||
40: 'down',
|
|
||||||
45: 'ins',
|
|
||||||
46: 'del',
|
|
||||||
91: 'meta',
|
|
||||||
93: 'meta',
|
|
||||||
224: 'meta'
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mapping for special characters so they can support
|
|
||||||
*
|
|
||||||
* this dictionary is only used incase you want to bind a
|
|
||||||
* keyup or keydown event to one of these keys
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
_KEYCODE_MAP = {
|
|
||||||
106: '*',
|
|
||||||
107: '+',
|
|
||||||
109: '-',
|
|
||||||
110: '.',
|
|
||||||
111 : '/',
|
|
||||||
186: ';',
|
|
||||||
187: '=',
|
|
||||||
188: ',',
|
|
||||||
189: '-',
|
|
||||||
190: '.',
|
|
||||||
191: '/',
|
|
||||||
192: '`',
|
|
||||||
219: '[',
|
|
||||||
220: '\\',
|
|
||||||
221: ']',
|
|
||||||
222: '\''
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* this is a mapping of keys that require shift on a US keypad
|
|
||||||
* back to the non shift equivelents
|
|
||||||
*
|
|
||||||
* this is so you can use keyup events with these keys
|
|
||||||
*
|
|
||||||
* note that this will only work reliably on US keyboards
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
_SHIFT_MAP = {
|
|
||||||
'~': '`',
|
|
||||||
'!': '1',
|
|
||||||
'@': '2',
|
|
||||||
'#': '3',
|
|
||||||
'$': '4',
|
|
||||||
'%': '5',
|
|
||||||
'^': '6',
|
|
||||||
'&': '7',
|
|
||||||
'*': '8',
|
|
||||||
'(': '9',
|
|
||||||
')': '0',
|
|
||||||
'_': '-',
|
|
||||||
'+': '=',
|
|
||||||
':': ';',
|
|
||||||
'\"': '\'',
|
|
||||||
'<': ',',
|
|
||||||
'>': '.',
|
|
||||||
'?': '/',
|
|
||||||
'|': '\\'
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* this is a list of special strings you can use to map
|
|
||||||
* to modifier keys when you specify your keyboard shortcuts
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
_SPECIAL_ALIASES = {
|
|
||||||
'option': 'alt',
|
|
||||||
'command': 'meta',
|
|
||||||
'return': 'enter',
|
|
||||||
'escape': 'esc',
|
|
||||||
'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* variable to store the flipped version of _MAP from above
|
|
||||||
* needed to check if we should use keypress or not when no action
|
|
||||||
* is specified
|
|
||||||
*
|
|
||||||
* @type {Object|undefined}
|
|
||||||
*/
|
|
||||||
_REVERSE_MAP,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* a list of all the callbacks setup via Mousetrap.bind()
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
_callbacks = {},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* direct map of string combinations to callbacks used for trigger()
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
_directMap = {},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* keeps track of what level each sequence is at since multiple
|
|
||||||
* sequences can start out with the same sequence
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
_sequenceLevels = {},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* variable to store the setTimeout call
|
|
||||||
*
|
|
||||||
* @type {null|number}
|
|
||||||
*/
|
|
||||||
_resetTimer,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* temporary state where we will ignore the next keyup
|
|
||||||
*
|
|
||||||
* @type {boolean|string}
|
|
||||||
*/
|
|
||||||
_ignoreNextKeyup = false,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* are we currently inside of a sequence?
|
|
||||||
* type of action ("keyup" or "keydown" or "keypress") or false
|
|
||||||
*
|
|
||||||
* @type {boolean|string}
|
|
||||||
*/
|
|
||||||
_nextExpectedAction = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* loop through the f keys, f1 to f19 and add them to the map
|
|
||||||
* programatically
|
|
||||||
*/
|
|
||||||
for (var i = 1; i < 20; ++i) {
|
|
||||||
_MAP[111 + i] = 'f' + i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* loop through to map numbers on the numeric keypad
|
|
||||||
*/
|
|
||||||
for (i = 0; i <= 9; ++i) {
|
|
||||||
_MAP[i + 96] = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cross browser add event method
|
|
||||||
*
|
|
||||||
* @param {Element|HTMLDocument} object
|
|
||||||
* @param {string} type
|
|
||||||
* @param {Function} callback
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _addEvent(object, type, callback) {
|
|
||||||
if (object.addEventListener) {
|
|
||||||
object.addEventListener(type, callback, false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
object.attachEvent('on' + type, callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* takes the event and returns the key character
|
|
||||||
*
|
|
||||||
* @param {Event} e
|
|
||||||
* @return {string}
|
|
||||||
*/
|
|
||||||
function _characterFromEvent(e) {
|
|
||||||
|
|
||||||
// for keypress events we should return the character as is
|
|
||||||
if (e.type == 'keypress') {
|
|
||||||
var character = String.fromCharCode(e.which);
|
|
||||||
|
|
||||||
// if the shift key is not pressed then it is safe to assume
|
|
||||||
// that we want the character to be lowercase. this means if
|
|
||||||
// you accidentally have caps lock on then your key bindings
|
|
||||||
// will continue to work
|
|
||||||
//
|
|
||||||
// the only side effect that might not be desired is if you
|
|
||||||
// bind something like 'A' cause you want to trigger an
|
|
||||||
// event when capital A is pressed caps lock will no longer
|
|
||||||
// trigger the event. shift+a will though.
|
|
||||||
if (!e.shiftKey) {
|
|
||||||
character = character.toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
return character;
|
|
||||||
}
|
|
||||||
|
|
||||||
// for non keypress events the special maps are needed
|
|
||||||
if (_MAP[e.which]) {
|
|
||||||
return _MAP[e.which];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_KEYCODE_MAP[e.which]) {
|
|
||||||
return _KEYCODE_MAP[e.which];
|
|
||||||
}
|
|
||||||
|
|
||||||
// if it is not in the special map
|
|
||||||
|
|
||||||
// with keydown and keyup events the character seems to always
|
|
||||||
// come in as an uppercase character whether you are pressing shift
|
|
||||||
// or not. we should make sure it is always lowercase for comparisons
|
|
||||||
return String.fromCharCode(e.which).toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* checks if two arrays are equal
|
|
||||||
*
|
|
||||||
* @param {Array} modifiers1
|
|
||||||
* @param {Array} modifiers2
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
function _modifiersMatch(modifiers1, modifiers2) {
|
|
||||||
return modifiers1.sort().join(',') === modifiers2.sort().join(',');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* resets all sequence counters except for the ones passed in
|
|
||||||
*
|
|
||||||
* @param {Object} doNotReset
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _resetSequences(doNotReset) {
|
|
||||||
doNotReset = doNotReset || {};
|
|
||||||
|
|
||||||
var activeSequences = false,
|
|
||||||
key;
|
|
||||||
|
|
||||||
for (key in _sequenceLevels) {
|
|
||||||
if (doNotReset[key]) {
|
|
||||||
activeSequences = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
_sequenceLevels[key] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!activeSequences) {
|
|
||||||
_nextExpectedAction = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* finds all callbacks that match based on the keycode, modifiers,
|
|
||||||
* and action
|
|
||||||
*
|
|
||||||
* @param {string} character
|
|
||||||
* @param {Array} modifiers
|
|
||||||
* @param {Event|Object} e
|
|
||||||
* @param {string=} sequenceName - name of the sequence we are looking for
|
|
||||||
* @param {string=} combination
|
|
||||||
* @param {number=} level
|
|
||||||
* @returns {Array}
|
|
||||||
*/
|
|
||||||
function _getMatches(character, modifiers, e, sequenceName, combination, level) {
|
|
||||||
var i,
|
|
||||||
callback,
|
|
||||||
matches = [],
|
|
||||||
action = e.type;
|
|
||||||
|
|
||||||
// if there are no events related to this keycode
|
|
||||||
if (!_callbacks[character]) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// if a modifier key is coming up on its own we should allow it
|
|
||||||
if (action == 'keyup' && _isModifier(character)) {
|
|
||||||
modifiers = [character];
|
|
||||||
}
|
|
||||||
|
|
||||||
// loop through all callbacks for the key that was pressed
|
|
||||||
// and see if any of them match
|
|
||||||
for (i = 0; i < _callbacks[character].length; ++i) {
|
|
||||||
callback = _callbacks[character][i];
|
|
||||||
|
|
||||||
// if a sequence name is not specified, but this is a sequence at
|
|
||||||
// the wrong level then move onto the next match
|
|
||||||
if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the action we are looking for doesn't match the action we got
|
|
||||||
// then we should keep going
|
|
||||||
if (action != callback.action) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if this is a keypress event and the meta key and control key
|
|
||||||
// are not pressed that means that we need to only look at the
|
|
||||||
// character, otherwise check the modifiers as well
|
|
||||||
//
|
|
||||||
// chrome will not fire a keypress if meta or control is down
|
|
||||||
// safari will fire a keypress if meta or meta+shift is down
|
|
||||||
// firefox will fire a keypress if meta or control is down
|
|
||||||
if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) {
|
|
||||||
|
|
||||||
// when you bind a combination or sequence a second time it
|
|
||||||
// should overwrite the first one. if a sequenceName or
|
|
||||||
// combination is specified in this call it does just that
|
|
||||||
//
|
|
||||||
// @todo make deleting its own method?
|
|
||||||
var deleteCombo = !sequenceName && callback.combo == combination;
|
|
||||||
var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level;
|
|
||||||
if (deleteCombo || deleteSequence) {
|
|
||||||
_callbacks[character].splice(i, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
matches.push(callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return matches;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* takes a key event and figures out what the modifiers are
|
|
||||||
*
|
|
||||||
* @param {Event} e
|
|
||||||
* @returns {Array}
|
|
||||||
*/
|
|
||||||
function _eventModifiers(e) {
|
|
||||||
var modifiers = [];
|
|
||||||
|
|
||||||
if (e.shiftKey) {
|
|
||||||
modifiers.push('shift');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.altKey) {
|
|
||||||
modifiers.push('alt');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.ctrlKey) {
|
|
||||||
modifiers.push('ctrl');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.metaKey) {
|
|
||||||
modifiers.push('meta');
|
|
||||||
}
|
|
||||||
|
|
||||||
return modifiers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* actually calls the callback function
|
|
||||||
*
|
|
||||||
* if your callback function returns false this will use the jquery
|
|
||||||
* convention - prevent default and stop propogation on the event
|
|
||||||
*
|
|
||||||
* @param {Function} callback
|
|
||||||
* @param {Event} e
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _fireCallback(callback, e, combo) {
|
|
||||||
|
|
||||||
// if this event should not happen stop here
|
|
||||||
if (Mousetrap.stopCallback(e, e.target || e.srcElement, combo)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (callback(e, combo) === false) {
|
|
||||||
if (e.preventDefault) {
|
|
||||||
e.preventDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.stopPropagation) {
|
|
||||||
e.stopPropagation();
|
|
||||||
}
|
|
||||||
|
|
||||||
e.returnValue = false;
|
|
||||||
e.cancelBubble = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* handles a character key event
|
|
||||||
*
|
|
||||||
* @param {string} character
|
|
||||||
* @param {Array} modifiers
|
|
||||||
* @param {Event} e
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _handleKey(character, modifiers, e) {
|
|
||||||
var callbacks = _getMatches(character, modifiers, e),
|
|
||||||
i,
|
|
||||||
doNotReset = {},
|
|
||||||
maxLevel = 0,
|
|
||||||
processedSequenceCallback = false;
|
|
||||||
|
|
||||||
// Calculate the maxLevel for sequences so we can only execute the longest callback sequence
|
|
||||||
for (i = 0; i < callbacks.length; ++i) {
|
|
||||||
if (callbacks[i].seq) {
|
|
||||||
maxLevel = Math.max(maxLevel, callbacks[i].level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// loop through matching callbacks for this key event
|
|
||||||
for (i = 0; i < callbacks.length; ++i) {
|
|
||||||
|
|
||||||
// fire for all sequence callbacks
|
|
||||||
// this is because if for example you have multiple sequences
|
|
||||||
// bound such as "g i" and "g t" they both need to fire the
|
|
||||||
// callback for matching g cause otherwise you can only ever
|
|
||||||
// match the first one
|
|
||||||
if (callbacks[i].seq) {
|
|
||||||
|
|
||||||
// only fire callbacks for the maxLevel to prevent
|
|
||||||
// subsequences from also firing
|
|
||||||
//
|
|
||||||
// for example 'a option b' should not cause 'option b' to fire
|
|
||||||
// even though 'option b' is part of the other sequence
|
|
||||||
//
|
|
||||||
// any sequences that do not match here will be discarded
|
|
||||||
// below by the _resetSequences call
|
|
||||||
if (callbacks[i].level != maxLevel) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
processedSequenceCallback = true;
|
|
||||||
|
|
||||||
// keep a list of which sequences were matches for later
|
|
||||||
doNotReset[callbacks[i].seq] = 1;
|
|
||||||
_fireCallback(callbacks[i].callback, e, callbacks[i].combo);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if there were no sequence matches but we are still here
|
|
||||||
// that means this is a regular match so we should fire that
|
|
||||||
if (!processedSequenceCallback) {
|
|
||||||
_fireCallback(callbacks[i].callback, e, callbacks[i].combo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the key you pressed matches the type of sequence without
|
|
||||||
// being a modifier (ie "keyup" or "keypress") then we should
|
|
||||||
// reset all sequences that were not matched by this event
|
|
||||||
//
|
|
||||||
// this is so, for example, if you have the sequence "h a t" and you
|
|
||||||
// type "h e a r t" it does not match. in this case the "e" will
|
|
||||||
// cause the sequence to reset
|
|
||||||
//
|
|
||||||
// modifier keys are ignored because you can have a sequence
|
|
||||||
// that contains modifiers such as "enter ctrl+space" and in most
|
|
||||||
// cases the modifier key will be pressed before the next key
|
|
||||||
if (e.type == _nextExpectedAction && !_isModifier(character)) {
|
|
||||||
_resetSequences(doNotReset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* handles a keydown event
|
|
||||||
*
|
|
||||||
* @param {Event} e
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _handleKeyEvent(e) {
|
|
||||||
|
|
||||||
// normalize e.which for key events
|
|
||||||
// @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion
|
|
||||||
if (typeof e.which !== 'number') {
|
|
||||||
e.which = e.keyCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
var character = _characterFromEvent(e);
|
|
||||||
|
|
||||||
// no character found then stop
|
|
||||||
if (!character) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.type == 'keyup' && _ignoreNextKeyup == character) {
|
|
||||||
_ignoreNextKeyup = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Mousetrap.handleKey(character, _eventModifiers(e), e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* determines if the keycode specified is a modifier key or not
|
|
||||||
*
|
|
||||||
* @param {string} key
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
function _isModifier(key) {
|
|
||||||
return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* called to set a 1 second timeout on the specified sequence
|
|
||||||
*
|
|
||||||
* this is so after each key press in the sequence you have 1 second
|
|
||||||
* to press the next key before you have to start over
|
|
||||||
*
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _resetSequenceTimer() {
|
|
||||||
clearTimeout(_resetTimer);
|
|
||||||
_resetTimer = setTimeout(_resetSequences, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* reverses the map lookup so that we can look for specific keys
|
|
||||||
* to see what can and can't use keypress
|
|
||||||
*
|
|
||||||
* @return {Object}
|
|
||||||
*/
|
|
||||||
function _getReverseMap() {
|
|
||||||
if (!_REVERSE_MAP) {
|
|
||||||
_REVERSE_MAP = {};
|
|
||||||
for (var key in _MAP) {
|
|
||||||
|
|
||||||
// pull out the numeric keypad from here cause keypress should
|
|
||||||
// be able to detect the keys from the character
|
|
||||||
if (key > 95 && key < 112) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_MAP.hasOwnProperty(key)) {
|
|
||||||
_REVERSE_MAP[_MAP[key]] = key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _REVERSE_MAP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* picks the best action based on the key combination
|
|
||||||
*
|
|
||||||
* @param {string} key - character for key
|
|
||||||
* @param {Array} modifiers
|
|
||||||
* @param {string=} action passed in
|
|
||||||
*/
|
|
||||||
function _pickBestAction(key, modifiers, action) {
|
|
||||||
|
|
||||||
// if no action was picked in we should try to pick the one
|
|
||||||
// that we think would work best for this key
|
|
||||||
if (!action) {
|
|
||||||
action = _getReverseMap()[key] ? 'keydown' : 'keypress';
|
|
||||||
}
|
|
||||||
|
|
||||||
// modifier keys don't work as expected with keypress,
|
|
||||||
// switch to keydown
|
|
||||||
if (action == 'keypress' && modifiers.length) {
|
|
||||||
action = 'keydown';
|
|
||||||
}
|
|
||||||
|
|
||||||
return action;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* binds a key sequence to an event
|
|
||||||
*
|
|
||||||
* @param {string} combo - combo specified in bind call
|
|
||||||
* @param {Array} keys
|
|
||||||
* @param {Function} callback
|
|
||||||
* @param {string=} action
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _bindSequence(combo, keys, callback, action) {
|
|
||||||
|
|
||||||
// start off by adding a sequence level record for this combination
|
|
||||||
// and setting the level to 0
|
|
||||||
_sequenceLevels[combo] = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* callback to increase the sequence level for this sequence and reset
|
|
||||||
* all other sequences that were active
|
|
||||||
*
|
|
||||||
* @param {string} nextAction
|
|
||||||
* @returns {Function}
|
|
||||||
*/
|
|
||||||
function _increaseSequence(nextAction) {
|
|
||||||
return function() {
|
|
||||||
_nextExpectedAction = nextAction;
|
|
||||||
++_sequenceLevels[combo];
|
|
||||||
_resetSequenceTimer();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* wraps the specified callback inside of another function in order
|
|
||||||
* to reset all sequence counters as soon as this sequence is done
|
|
||||||
*
|
|
||||||
* @param {Event} e
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _callbackAndReset(e) {
|
|
||||||
_fireCallback(callback, e, combo);
|
|
||||||
|
|
||||||
// we should ignore the next key up if the action is key down
|
|
||||||
// or keypress. this is so if you finish a sequence and
|
|
||||||
// release the key the final key will not trigger a keyup
|
|
||||||
if (action !== 'keyup') {
|
|
||||||
_ignoreNextKeyup = _characterFromEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// weird race condition if a sequence ends with the key
|
|
||||||
// another sequence begins with
|
|
||||||
setTimeout(_resetSequences, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// loop through keys one at a time and bind the appropriate callback
|
|
||||||
// function. for any key leading up to the final one it should
|
|
||||||
// increase the sequence. after the final, it should reset all sequences
|
|
||||||
//
|
|
||||||
// if an action is specified in the original bind call then that will
|
|
||||||
// be used throughout. otherwise we will pass the action that the
|
|
||||||
// next key in the sequence should match. this allows a sequence
|
|
||||||
// to mix and match keypress and keydown events depending on which
|
|
||||||
// ones are better suited to the key provided
|
|
||||||
for (var i = 0; i < keys.length; ++i) {
|
|
||||||
var isFinal = i + 1 === keys.length;
|
|
||||||
var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action);
|
|
||||||
_bindSingle(keys[i], wrappedCallback, action, combo, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts from a string key combination to an array
|
|
||||||
*
|
|
||||||
* @param {string} combination like "command+shift+l"
|
|
||||||
* @return {Array}
|
|
||||||
*/
|
|
||||||
function _keysFromString(combination) {
|
|
||||||
if (combination === '+') {
|
|
||||||
return ['+'];
|
|
||||||
}
|
|
||||||
|
|
||||||
return combination.split('+');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets info for a specific key combination
|
|
||||||
*
|
|
||||||
* @param {string} combination key combination ("command+s" or "a" or "*")
|
|
||||||
* @param {string=} action
|
|
||||||
* @returns {Object}
|
|
||||||
*/
|
|
||||||
function _getKeyInfo(combination, action) {
|
|
||||||
var keys,
|
|
||||||
key,
|
|
||||||
i,
|
|
||||||
modifiers = [];
|
|
||||||
|
|
||||||
// take the keys from this pattern and figure out what the actual
|
|
||||||
// pattern is all about
|
|
||||||
keys = _keysFromString(combination);
|
|
||||||
|
|
||||||
for (i = 0; i < keys.length; ++i) {
|
|
||||||
key = keys[i];
|
|
||||||
|
|
||||||
// normalize key names
|
|
||||||
if (_SPECIAL_ALIASES[key]) {
|
|
||||||
key = _SPECIAL_ALIASES[key];
|
|
||||||
}
|
|
||||||
|
|
||||||
// if this is not a keypress event then we should
|
|
||||||
// be smart about using shift keys
|
|
||||||
// this will only work for US keyboards however
|
|
||||||
if (action && action != 'keypress' && _SHIFT_MAP[key]) {
|
|
||||||
key = _SHIFT_MAP[key];
|
|
||||||
modifiers.push('shift');
|
|
||||||
}
|
|
||||||
|
|
||||||
// if this key is a modifier then add it to the list of modifiers
|
|
||||||
if (_isModifier(key)) {
|
|
||||||
modifiers.push(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// depending on what the key combination is
|
|
||||||
// we will try to pick the best event for it
|
|
||||||
action = _pickBestAction(key, modifiers, action);
|
|
||||||
|
|
||||||
return {
|
|
||||||
key: key,
|
|
||||||
modifiers: modifiers,
|
|
||||||
action: action
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* binds a single keyboard combination
|
|
||||||
*
|
|
||||||
* @param {string} combination
|
|
||||||
* @param {Function} callback
|
|
||||||
* @param {string=} action
|
|
||||||
* @param {string=} sequenceName - name of sequence if part of sequence
|
|
||||||
* @param {number=} level - what part of the sequence the command is
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _bindSingle(combination, callback, action, sequenceName, level) {
|
|
||||||
|
|
||||||
// store a direct mapped reference for use with Mousetrap.trigger
|
|
||||||
_directMap[combination + ':' + action] = callback;
|
|
||||||
|
|
||||||
// make sure multiple spaces in a row become a single space
|
|
||||||
combination = combination.replace(/\s+/g, ' ');
|
|
||||||
|
|
||||||
var sequence = combination.split(' '),
|
|
||||||
info;
|
|
||||||
|
|
||||||
// if this pattern is a sequence of keys then run through this method
|
|
||||||
// to reprocess each pattern one key at a time
|
|
||||||
if (sequence.length > 1) {
|
|
||||||
_bindSequence(combination, sequence, callback, action);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
info = _getKeyInfo(combination, action);
|
|
||||||
|
|
||||||
// make sure to initialize array if this is the first time
|
|
||||||
// a callback is added for this key
|
|
||||||
_callbacks[info.key] = _callbacks[info.key] || [];
|
|
||||||
|
|
||||||
// remove an existing match if there is one
|
|
||||||
_getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level);
|
|
||||||
|
|
||||||
// add this call back to the array
|
|
||||||
// if it is a sequence put it at the beginning
|
|
||||||
// if not put it at the end
|
|
||||||
//
|
|
||||||
// this is important because the way these are processed expects
|
|
||||||
// the sequence ones to come first
|
|
||||||
_callbacks[info.key][sequenceName ? 'unshift' : 'push']({
|
|
||||||
callback: callback,
|
|
||||||
modifiers: info.modifiers,
|
|
||||||
action: info.action,
|
|
||||||
seq: sequenceName,
|
|
||||||
level: level,
|
|
||||||
combo: combination
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* binds multiple combinations to the same callback
|
|
||||||
*
|
|
||||||
* @param {Array} combinations
|
|
||||||
* @param {Function} callback
|
|
||||||
* @param {string|undefined} action
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
function _bindMultiple(combinations, callback, action) {
|
|
||||||
for (var i = 0; i < combinations.length; ++i) {
|
|
||||||
_bindSingle(combinations[i], callback, action);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// start!
|
|
||||||
_addEvent(document, 'keypress', _handleKeyEvent);
|
|
||||||
_addEvent(document, 'keydown', _handleKeyEvent);
|
|
||||||
_addEvent(document, 'keyup', _handleKeyEvent);
|
|
||||||
|
|
||||||
var Mousetrap = {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* binds an event to mousetrap
|
|
||||||
*
|
|
||||||
* can be a single key, a combination of keys separated with +,
|
|
||||||
* an array of keys, or a sequence of keys separated by spaces
|
|
||||||
*
|
|
||||||
* be sure to list the modifier keys first to make sure that the
|
|
||||||
* correct key ends up getting bound (the last key in the pattern)
|
|
||||||
*
|
|
||||||
* @param {string|Array} keys
|
|
||||||
* @param {Function} callback
|
|
||||||
* @param {string=} action - 'keypress', 'keydown', or 'keyup'
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
bind: function(keys, callback, action) {
|
|
||||||
keys = keys instanceof Array ? keys : [keys];
|
|
||||||
_bindMultiple(keys, callback, action);
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* unbinds an event to mousetrap
|
|
||||||
*
|
|
||||||
* the unbinding sets the callback function of the specified key combo
|
|
||||||
* to an empty function and deletes the corresponding key in the
|
|
||||||
* _directMap dict.
|
|
||||||
*
|
|
||||||
* TODO: actually remove this from the _callbacks dictionary instead
|
|
||||||
* of binding an empty function
|
|
||||||
*
|
|
||||||
* the keycombo+action has to be exactly the same as
|
|
||||||
* it was defined in the bind method
|
|
||||||
*
|
|
||||||
* @param {string|Array} keys
|
|
||||||
* @param {string} action
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
unbind: function(keys, action) {
|
|
||||||
return Mousetrap.bind(keys, function() {}, action);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* triggers an event that has already been bound
|
|
||||||
*
|
|
||||||
* @param {string} keys
|
|
||||||
* @param {string=} action
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
trigger: function(keys, action) {
|
|
||||||
if (_directMap[keys + ':' + action]) {
|
|
||||||
_directMap[keys + ':' + action]({}, keys);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* resets the library back to its initial state. this is useful
|
|
||||||
* if you want to clear out the current keyboard shortcuts and bind
|
|
||||||
* new ones - for example if you switch to another page
|
|
||||||
*
|
|
||||||
* @returns void
|
|
||||||
*/
|
|
||||||
reset: function() {
|
|
||||||
_callbacks = {};
|
|
||||||
_directMap = {};
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* should we stop this event before firing off callbacks
|
|
||||||
*
|
|
||||||
* @param {Event} e
|
|
||||||
* @param {Element} element
|
|
||||||
* @return {boolean}
|
|
||||||
*/
|
|
||||||
stopCallback: function(e, element) {
|
|
||||||
|
|
||||||
// if the element has the class "mousetrap" then no need to stop
|
|
||||||
if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// stop for input, select, and textarea
|
|
||||||
return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true');
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* exposes _handleKey publicly so it can be overwritten by extensions
|
|
||||||
*/
|
|
||||||
handleKey: _handleKey
|
|
||||||
};
|
|
||||||
|
|
||||||
// expose mousetrap to the global object
|
|
||||||
window.Mousetrap = Mousetrap;
|
|
||||||
|
|
||||||
// expose mousetrap as an AMD module
|
|
||||||
if (typeof define === 'function' && define.amd) {
|
|
||||||
define(Mousetrap);
|
|
||||||
}
|
|
||||||
}) ();
|
|
@ -1,52 +0,0 @@
|
|||||||
/* Pretty printing styles. Used with prettify.js. */
|
|
||||||
|
|
||||||
/* SPAN elements with the classes below are added by prettyprint. */
|
|
||||||
.pln { color: #000 } /* plain text */
|
|
||||||
|
|
||||||
@media screen {
|
|
||||||
.str { color: #080 } /* string content */
|
|
||||||
.kwd { color: #008 } /* a keyword */
|
|
||||||
.com { color: #800 } /* a comment */
|
|
||||||
.typ { color: #606 } /* a type name */
|
|
||||||
.lit { color: #066 } /* a literal value */
|
|
||||||
/* punctuation, lisp open bracket, lisp close bracket */
|
|
||||||
.pun, .opn, .clo { color: #660 }
|
|
||||||
.tag { color: #008 } /* a markup tag name */
|
|
||||||
.atn { color: #606 } /* a markup attribute name */
|
|
||||||
.atv { color: #080 } /* a markup attribute value */
|
|
||||||
.dec, .var { color: #606 } /* a declaration; a variable name */
|
|
||||||
.fun { color: red } /* a function name */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Use higher contrast and text-weight for printable form. */
|
|
||||||
@media print, projection {
|
|
||||||
.str { color: #060 }
|
|
||||||
.kwd { color: #006; font-weight: bold }
|
|
||||||
.com { color: #600; font-style: italic }
|
|
||||||
.typ { color: #404; font-weight: bold }
|
|
||||||
.lit { color: #044 }
|
|
||||||
.pun, .opn, .clo { color: #440 }
|
|
||||||
.tag { color: #006; font-weight: bold }
|
|
||||||
.atn { color: #404 }
|
|
||||||
.atv { color: #060 }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Put a border around prettyprinted code snippets. */
|
|
||||||
/* pre.prettyprint { padding: 2px; border: 1px solid #888 } */
|
|
||||||
|
|
||||||
/* Specify class=linenums on a pre to get line numbering */
|
|
||||||
ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */
|
|
||||||
li.L0,
|
|
||||||
li.L1,
|
|
||||||
li.L2,
|
|
||||||
li.L3,
|
|
||||||
li.L5,
|
|
||||||
li.L6,
|
|
||||||
li.L7,
|
|
||||||
li.L8 { list-style-type: none }
|
|
||||||
/* Alternate shading for lines */
|
|
||||||
li.L1,
|
|
||||||
li.L3,
|
|
||||||
li.L5,
|
|
||||||
li.L7,
|
|
||||||
li.L9 { background: #eee }
|
|
File diff suppressed because it is too large
Load Diff
@ -1,446 +0,0 @@
|
|||||||
// Domain Public by Eric Wendelin http://eriwen.com/ (2008)
|
|
||||||
// Luke Smith http://lucassmith.name/ (2008)
|
|
||||||
// Loic Dachary <loic@dachary.org> (2008)
|
|
||||||
// Johan Euphrosine <proppy@aminche.com> (2008)
|
|
||||||
// Oyvind Sean Kinsey http://kinsey.no/blog (2010)
|
|
||||||
// Victor Homyakov <victor-homyakov@users.sourceforge.net> (2010)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Main function giving a function stack trace with a forced or passed in Error
|
|
||||||
*
|
|
||||||
* @cfg {Error} e The error to create a stacktrace from (optional)
|
|
||||||
* @cfg {Boolean} guess If we should try to resolve the names of anonymous functions
|
|
||||||
* @return {Array} of Strings with functions, lines, files, and arguments where possible
|
|
||||||
*/
|
|
||||||
function printStackTrace(options) {
|
|
||||||
options = options || {guess: true};
|
|
||||||
var ex = options.e || null, guess = !!options.guess;
|
|
||||||
var p = new printStackTrace.implementation(), result = p.run(ex);
|
|
||||||
return (guess) ? p.guessAnonymousFunctions(result) : result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof module !== "undefined" && module.exports) {
|
|
||||||
module.exports = printStackTrace;
|
|
||||||
}
|
|
||||||
|
|
||||||
printStackTrace.implementation = function() {
|
|
||||||
};
|
|
||||||
|
|
||||||
printStackTrace.implementation.prototype = {
|
|
||||||
/**
|
|
||||||
* @param {Error} ex The error to create a stacktrace from (optional)
|
|
||||||
* @param {String} mode Forced mode (optional, mostly for unit tests)
|
|
||||||
*/
|
|
||||||
run: function(ex, mode) {
|
|
||||||
ex = ex || this.createException();
|
|
||||||
// examine exception properties w/o debugger
|
|
||||||
//for (var prop in ex) {alert("Ex['" + prop + "']=" + ex[prop]);}
|
|
||||||
mode = mode || this.mode(ex);
|
|
||||||
if (mode === 'other') {
|
|
||||||
return this.other(arguments.callee);
|
|
||||||
} else {
|
|
||||||
return this[mode](ex);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
createException: function() {
|
|
||||||
try {
|
|
||||||
this.undef();
|
|
||||||
} catch (e) {
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mode could differ for different exception, e.g.
|
|
||||||
* exceptions in Chrome may or may not have arguments or stack.
|
|
||||||
*
|
|
||||||
* @return {String} mode of operation for the exception
|
|
||||||
*/
|
|
||||||
mode: function(e) {
|
|
||||||
if (e['arguments'] && e.stack) {
|
|
||||||
return 'chrome';
|
|
||||||
} else if (e.stack && e.sourceURL) {
|
|
||||||
return 'safari';
|
|
||||||
} else if (e.stack && e.number) {
|
|
||||||
return 'ie';
|
|
||||||
} else if (typeof e.message === 'string' && typeof window !== 'undefined' && window.opera) {
|
|
||||||
// e.message.indexOf("Backtrace:") > -1 -> opera
|
|
||||||
// !e.stacktrace -> opera
|
|
||||||
if (!e.stacktrace) {
|
|
||||||
return 'opera9'; // use e.message
|
|
||||||
}
|
|
||||||
// 'opera#sourceloc' in e -> opera9, opera10a
|
|
||||||
if (e.message.indexOf('\n') > -1 && e.message.split('\n').length > e.stacktrace.split('\n').length) {
|
|
||||||
return 'opera9'; // use e.message
|
|
||||||
}
|
|
||||||
// e.stacktrace && !e.stack -> opera10a
|
|
||||||
if (!e.stack) {
|
|
||||||
return 'opera10a'; // use e.stacktrace
|
|
||||||
}
|
|
||||||
// e.stacktrace && e.stack -> opera10b
|
|
||||||
if (e.stacktrace.indexOf("called from line") < 0) {
|
|
||||||
return 'opera10b'; // use e.stacktrace, format differs from 'opera10a'
|
|
||||||
}
|
|
||||||
// e.stacktrace && e.stack -> opera11
|
|
||||||
return 'opera11'; // use e.stacktrace, format differs from 'opera10a', 'opera10b'
|
|
||||||
} else if (e.stack) {
|
|
||||||
return 'firefox';
|
|
||||||
}
|
|
||||||
return 'other';
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a context, function name, and callback function, overwrite it so that it calls
|
|
||||||
* printStackTrace() first with a callback and then runs the rest of the body.
|
|
||||||
*
|
|
||||||
* @param {Object} context of execution (e.g. window)
|
|
||||||
* @param {String} functionName to instrument
|
|
||||||
* @param {Function} function to call with a stack trace on invocation
|
|
||||||
*/
|
|
||||||
instrumentFunction: function(context, functionName, callback) {
|
|
||||||
context = context || window;
|
|
||||||
var original = context[functionName];
|
|
||||||
context[functionName] = function instrumented() {
|
|
||||||
callback.call(this, printStackTrace().slice(4));
|
|
||||||
return context[functionName]._instrumented.apply(this, arguments);
|
|
||||||
};
|
|
||||||
context[functionName]._instrumented = original;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a context and function name of a function that has been
|
|
||||||
* instrumented, revert the function to it's original (non-instrumented)
|
|
||||||
* state.
|
|
||||||
*
|
|
||||||
* @param {Object} context of execution (e.g. window)
|
|
||||||
* @param {String} functionName to de-instrument
|
|
||||||
*/
|
|
||||||
deinstrumentFunction: function(context, functionName) {
|
|
||||||
if (context[functionName].constructor === Function &&
|
|
||||||
context[functionName]._instrumented &&
|
|
||||||
context[functionName]._instrumented.constructor === Function) {
|
|
||||||
context[functionName] = context[functionName]._instrumented;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given an Error object, return a formatted Array based on Chrome's stack string.
|
|
||||||
*
|
|
||||||
* @param e - Error object to inspect
|
|
||||||
* @return Array<String> of function calls, files and line numbers
|
|
||||||
*/
|
|
||||||
chrome: function(e) {
|
|
||||||
var stack = (e.stack + '\n').replace(/^\S[^\(]+?[\n$]/gm, '').
|
|
||||||
replace(/^\s+(at eval )?at\s+/gm, '').
|
|
||||||
replace(/^([^\(]+?)([\n$])/gm, '{anonymous}()@$1$2').
|
|
||||||
replace(/^Object.<anonymous>\s*\(([^\)]+)\)/gm, '{anonymous}()@$1').split('\n');
|
|
||||||
stack.pop();
|
|
||||||
return stack;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given an Error object, return a formatted Array based on Safari's stack string.
|
|
||||||
*
|
|
||||||
* @param e - Error object to inspect
|
|
||||||
* @return Array<String> of function calls, files and line numbers
|
|
||||||
*/
|
|
||||||
safari: function(e) {
|
|
||||||
return e.stack.replace(/\[native code\]\n/m, '')
|
|
||||||
.replace(/^(?=\w+Error\:).*$\n/m, '')
|
|
||||||
.replace(/^@/gm, '{anonymous}()@')
|
|
||||||
.split('\n');
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given an Error object, return a formatted Array based on IE's stack string.
|
|
||||||
*
|
|
||||||
* @param e - Error object to inspect
|
|
||||||
* @return Array<String> of function calls, files and line numbers
|
|
||||||
*/
|
|
||||||
ie: function(e) {
|
|
||||||
var lineRE = /^.*at (\w+) \(([^\)]+)\)$/gm;
|
|
||||||
return e.stack.replace(/at Anonymous function /gm, '{anonymous}()@')
|
|
||||||
.replace(/^(?=\w+Error\:).*$\n/m, '')
|
|
||||||
.replace(lineRE, '$1@$2')
|
|
||||||
.split('\n');
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given an Error object, return a formatted Array based on Firefox's stack string.
|
|
||||||
*
|
|
||||||
* @param e - Error object to inspect
|
|
||||||
* @return Array<String> of function calls, files and line numbers
|
|
||||||
*/
|
|
||||||
firefox: function(e) {
|
|
||||||
return e.stack.replace(/(?:\n@:0)?\s+$/m, '').replace(/^[\(@]/gm, '{anonymous}()@').split('\n');
|
|
||||||
},
|
|
||||||
|
|
||||||
opera11: function(e) {
|
|
||||||
var ANON = '{anonymous}', lineRE = /^.*line (\d+), column (\d+)(?: in (.+))? in (\S+):$/;
|
|
||||||
var lines = e.stacktrace.split('\n'), result = [];
|
|
||||||
|
|
||||||
for (var i = 0, len = lines.length; i < len; i += 2) {
|
|
||||||
var match = lineRE.exec(lines[i]);
|
|
||||||
if (match) {
|
|
||||||
var location = match[4] + ':' + match[1] + ':' + match[2];
|
|
||||||
var fnName = match[3] || "global code";
|
|
||||||
fnName = fnName.replace(/<anonymous function: (\S+)>/, "$1").replace(/<anonymous function>/, ANON);
|
|
||||||
result.push(fnName + '@' + location + ' -- ' + lines[i + 1].replace(/^\s+/, ''));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
|
|
||||||
opera10b: function(e) {
|
|
||||||
// "<anonymous function: run>([arguments not available])@file://localhost/G:/js/stacktrace.js:27\n" +
|
|
||||||
// "printStackTrace([arguments not available])@file://localhost/G:/js/stacktrace.js:18\n" +
|
|
||||||
// "@file://localhost/G:/js/test/functional/testcase1.html:15"
|
|
||||||
var lineRE = /^(.*)@(.+):(\d+)$/;
|
|
||||||
var lines = e.stacktrace.split('\n'), result = [];
|
|
||||||
|
|
||||||
for (var i = 0, len = lines.length; i < len; i++) {
|
|
||||||
var match = lineRE.exec(lines[i]);
|
|
||||||
if (match) {
|
|
||||||
var fnName = match[1]? (match[1] + '()') : "global code";
|
|
||||||
result.push(fnName + '@' + match[2] + ':' + match[3]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given an Error object, return a formatted Array based on Opera 10's stacktrace string.
|
|
||||||
*
|
|
||||||
* @param e - Error object to inspect
|
|
||||||
* @return Array<String> of function calls, files and line numbers
|
|
||||||
*/
|
|
||||||
opera10a: function(e) {
|
|
||||||
// " Line 27 of linked script file://localhost/G:/js/stacktrace.js\n"
|
|
||||||
// " Line 11 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html: In function foo\n"
|
|
||||||
var ANON = '{anonymous}', lineRE = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i;
|
|
||||||
var lines = e.stacktrace.split('\n'), result = [];
|
|
||||||
|
|
||||||
for (var i = 0, len = lines.length; i < len; i += 2) {
|
|
||||||
var match = lineRE.exec(lines[i]);
|
|
||||||
if (match) {
|
|
||||||
var fnName = match[3] || ANON;
|
|
||||||
result.push(fnName + '()@' + match[2] + ':' + match[1] + ' -- ' + lines[i + 1].replace(/^\s+/, ''));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Opera 7.x-9.2x only!
|
|
||||||
opera9: function(e) {
|
|
||||||
// " Line 43 of linked script file://localhost/G:/js/stacktrace.js\n"
|
|
||||||
// " Line 7 of inline#1 script in file://localhost/G:/js/test/functional/testcase1.html\n"
|
|
||||||
var ANON = '{anonymous}', lineRE = /Line (\d+).*script (?:in )?(\S+)/i;
|
|
||||||
var lines = e.message.split('\n'), result = [];
|
|
||||||
|
|
||||||
for (var i = 2, len = lines.length; i < len; i += 2) {
|
|
||||||
var match = lineRE.exec(lines[i]);
|
|
||||||
if (match) {
|
|
||||||
result.push(ANON + '()@' + match[2] + ':' + match[1] + ' -- ' + lines[i + 1].replace(/^\s+/, ''));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Safari 5-, IE 9-, and others
|
|
||||||
other: function(curr) {
|
|
||||||
var ANON = '{anonymous}', fnRE = /function\s*([\w\-$]+)?\s*\(/i, stack = [], fn, args, maxStackSize = 10;
|
|
||||||
while (curr && curr['arguments'] && stack.length < maxStackSize) {
|
|
||||||
fn = fnRE.test(curr.toString()) ? RegExp.$1 || ANON : ANON;
|
|
||||||
args = Array.prototype.slice.call(curr['arguments'] || []);
|
|
||||||
stack[stack.length] = fn + '(' + this.stringifyArguments(args) + ')';
|
|
||||||
curr = curr.caller;
|
|
||||||
}
|
|
||||||
return stack;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given arguments array as a String, subsituting type names for non-string types.
|
|
||||||
*
|
|
||||||
* @param {Arguments} args
|
|
||||||
* @return {Array} of Strings with stringified arguments
|
|
||||||
*/
|
|
||||||
stringifyArguments: function(args) {
|
|
||||||
var result = [];
|
|
||||||
var slice = Array.prototype.slice;
|
|
||||||
for (var i = 0; i < args.length; ++i) {
|
|
||||||
var arg = args[i];
|
|
||||||
if (arg === undefined) {
|
|
||||||
result[i] = 'undefined';
|
|
||||||
} else if (arg === null) {
|
|
||||||
result[i] = 'null';
|
|
||||||
} else if (arg.constructor) {
|
|
||||||
if (arg.constructor === Array) {
|
|
||||||
if (arg.length < 3) {
|
|
||||||
result[i] = '[' + this.stringifyArguments(arg) + ']';
|
|
||||||
} else {
|
|
||||||
result[i] = '[' + this.stringifyArguments(slice.call(arg, 0, 1)) + '...' + this.stringifyArguments(slice.call(arg, -1)) + ']';
|
|
||||||
}
|
|
||||||
} else if (arg.constructor === Object) {
|
|
||||||
result[i] = '#object';
|
|
||||||
} else if (arg.constructor === Function) {
|
|
||||||
result[i] = '#function';
|
|
||||||
} else if (arg.constructor === String) {
|
|
||||||
result[i] = '"' + arg + '"';
|
|
||||||
} else if (arg.constructor === Number) {
|
|
||||||
result[i] = arg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.join(',');
|
|
||||||
},
|
|
||||||
|
|
||||||
sourceCache: {},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the text from a given URL
|
|
||||||
*/
|
|
||||||
ajax: function(url) {
|
|
||||||
var req = this.createXMLHTTPObject();
|
|
||||||
if (req) {
|
|
||||||
try {
|
|
||||||
req.open('GET', url, false);
|
|
||||||
//req.overrideMimeType('text/plain');
|
|
||||||
//req.overrideMimeType('text/javascript');
|
|
||||||
req.send(null);
|
|
||||||
//return req.status == 200 ? req.responseText : '';
|
|
||||||
return req.responseText;
|
|
||||||
} catch (e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Try XHR methods in order and store XHR factory.
|
|
||||||
*
|
|
||||||
* @return <Function> XHR function or equivalent
|
|
||||||
*/
|
|
||||||
createXMLHTTPObject: function() {
|
|
||||||
var xmlhttp, XMLHttpFactories = [
|
|
||||||
function() {
|
|
||||||
return new XMLHttpRequest();
|
|
||||||
}, function() {
|
|
||||||
return new ActiveXObject('Msxml2.XMLHTTP');
|
|
||||||
}, function() {
|
|
||||||
return new ActiveXObject('Msxml3.XMLHTTP');
|
|
||||||
}, function() {
|
|
||||||
return new ActiveXObject('Microsoft.XMLHTTP');
|
|
||||||
}
|
|
||||||
];
|
|
||||||
for (var i = 0; i < XMLHttpFactories.length; i++) {
|
|
||||||
try {
|
|
||||||
xmlhttp = XMLHttpFactories[i]();
|
|
||||||
// Use memoization to cache the factory
|
|
||||||
this.createXMLHTTPObject = XMLHttpFactories[i];
|
|
||||||
return xmlhttp;
|
|
||||||
} catch (e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a URL, check if it is in the same domain (so we can get the source
|
|
||||||
* via Ajax).
|
|
||||||
*
|
|
||||||
* @param url <String> source url
|
|
||||||
* @return False if we need a cross-domain request
|
|
||||||
*/
|
|
||||||
isSameDomain: function(url) {
|
|
||||||
return typeof location !== "undefined" && url.indexOf(location.hostname) !== -1; // location may not be defined, e.g. when running from nodejs.
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get source code from given URL if in the same domain.
|
|
||||||
*
|
|
||||||
* @param url <String> JS source URL
|
|
||||||
* @return <Array> Array of source code lines
|
|
||||||
*/
|
|
||||||
getSource: function(url) {
|
|
||||||
// TODO reuse source from script tags?
|
|
||||||
if (!(url in this.sourceCache)) {
|
|
||||||
this.sourceCache[url] = this.ajax(url).split('\n');
|
|
||||||
}
|
|
||||||
return this.sourceCache[url];
|
|
||||||
},
|
|
||||||
|
|
||||||
guessAnonymousFunctions: function(stack) {
|
|
||||||
for (var i = 0; i < stack.length; ++i) {
|
|
||||||
var reStack = /\{anonymous\}\(.*\)@(.*)/,
|
|
||||||
reRef = /^(.*?)(?::(\d+))(?::(\d+))?(?: -- .+)?$/,
|
|
||||||
frame = stack[i], ref = reStack.exec(frame);
|
|
||||||
|
|
||||||
if (ref) {
|
|
||||||
var m = reRef.exec(ref[1]);
|
|
||||||
if (m) { // If falsey, we did not get any file/line information
|
|
||||||
var file = m[1], lineno = m[2], charno = m[3] || 0;
|
|
||||||
if (file && this.isSameDomain(file) && lineno) {
|
|
||||||
var functionName = this.guessAnonymousFunction(file, lineno, charno);
|
|
||||||
stack[i] = frame.replace('{anonymous}', functionName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return stack;
|
|
||||||
},
|
|
||||||
|
|
||||||
guessAnonymousFunction: function(url, lineNo, charNo) {
|
|
||||||
var ret;
|
|
||||||
try {
|
|
||||||
ret = this.findFunctionName(this.getSource(url), lineNo);
|
|
||||||
} catch (e) {
|
|
||||||
ret = 'getSource failed with url: ' + url + ', exception: ' + e.toString();
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
|
|
||||||
findFunctionName: function(source, lineNo) {
|
|
||||||
// FIXME findFunctionName fails for compressed source
|
|
||||||
// (more than one function on the same line)
|
|
||||||
// function {name}({args}) m[1]=name m[2]=args
|
|
||||||
var reFunctionDeclaration = /function\s+([^(]*?)\s*\(([^)]*)\)/;
|
|
||||||
// {name} = function ({args}) TODO args capture
|
|
||||||
// /['"]?([0-9A-Za-z_]+)['"]?\s*[:=]\s*function(?:[^(]*)/
|
|
||||||
var reFunctionExpression = /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/;
|
|
||||||
// {name} = eval()
|
|
||||||
var reFunctionEvaluation = /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/;
|
|
||||||
// Walk backwards in the source lines until we find
|
|
||||||
// the line which matches one of the patterns above
|
|
||||||
var code = "", line, maxLines = Math.min(lineNo, 20), m, commentPos;
|
|
||||||
for (var i = 0; i < maxLines; ++i) {
|
|
||||||
// lineNo is 1-based, source[] is 0-based
|
|
||||||
line = source[lineNo - i - 1];
|
|
||||||
commentPos = line.indexOf('//');
|
|
||||||
if (commentPos >= 0) {
|
|
||||||
line = line.substr(0, commentPos);
|
|
||||||
}
|
|
||||||
// TODO check other types of comments? Commented code may lead to false positive
|
|
||||||
if (line) {
|
|
||||||
code = line + code;
|
|
||||||
m = reFunctionExpression.exec(code);
|
|
||||||
if (m && m[1]) {
|
|
||||||
return m[1];
|
|
||||||
}
|
|
||||||
m = reFunctionDeclaration.exec(code);
|
|
||||||
if (m && m[1]) {
|
|
||||||
//return m[1] + "(" + (m[2] || "") + ")";
|
|
||||||
return m[1];
|
|
||||||
}
|
|
||||||
m = reFunctionEvaluation.exec(code);
|
|
||||||
if (m && m[1]) {
|
|
||||||
return m[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return '(?)';
|
|
||||||
}
|
|
||||||
};
|
|
367
res/libs/text.js
367
res/libs/text.js
@ -1,367 +0,0 @@
|
|||||||
/**
|
|
||||||
* @license RequireJS text 2.0.6 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
|
|
||||||
* Available via the MIT or new BSD license.
|
|
||||||
* see: http://github.com/requirejs/text for details
|
|
||||||
*/
|
|
||||||
/*jslint regexp: true */
|
|
||||||
/*global require, XMLHttpRequest, ActiveXObject,
|
|
||||||
define, window, process, Packages,
|
|
||||||
java, location, Components, FileUtils */
|
|
||||||
|
|
||||||
define(['module'], function (module) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var text, fs, Cc, Ci,
|
|
||||||
progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'],
|
|
||||||
xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,
|
|
||||||
bodyRegExp = /<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,
|
|
||||||
hasLocation = typeof location !== 'undefined' && location.href,
|
|
||||||
defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''),
|
|
||||||
defaultHostName = hasLocation && location.hostname,
|
|
||||||
defaultPort = hasLocation && (location.port || undefined),
|
|
||||||
buildMap = [],
|
|
||||||
masterConfig = (module.config && module.config()) || {};
|
|
||||||
|
|
||||||
text = {
|
|
||||||
version: '2.0.6',
|
|
||||||
|
|
||||||
strip: function (content) {
|
|
||||||
//Strips <?xml ...?> declarations so that external SVG and XML
|
|
||||||
//documents can be added to a document without worry. Also, if the string
|
|
||||||
//is an HTML document, only the part inside the body tag is returned.
|
|
||||||
if (content) {
|
|
||||||
content = content.replace(xmlRegExp, "");
|
|
||||||
var matches = content.match(bodyRegExp);
|
|
||||||
if (matches) {
|
|
||||||
content = matches[1];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
content = "";
|
|
||||||
}
|
|
||||||
return content;
|
|
||||||
},
|
|
||||||
|
|
||||||
jsEscape: function (content) {
|
|
||||||
return content.replace(/(['\\])/g, '\\$1')
|
|
||||||
.replace(/[\f]/g, "\\f")
|
|
||||||
.replace(/[\b]/g, "\\b")
|
|
||||||
.replace(/[\n]/g, "\\n")
|
|
||||||
.replace(/[\t]/g, "\\t")
|
|
||||||
.replace(/[\r]/g, "\\r")
|
|
||||||
.replace(/[\u2028]/g, "\\u2028")
|
|
||||||
.replace(/[\u2029]/g, "\\u2029");
|
|
||||||
},
|
|
||||||
|
|
||||||
createXhr: masterConfig.createXhr || function () {
|
|
||||||
//Would love to dump the ActiveX crap in here. Need IE 6 to die first.
|
|
||||||
var xhr, i, progId;
|
|
||||||
if (typeof XMLHttpRequest !== "undefined") {
|
|
||||||
return new XMLHttpRequest();
|
|
||||||
} else if (typeof ActiveXObject !== "undefined") {
|
|
||||||
for (i = 0; i < 3; i += 1) {
|
|
||||||
progId = progIds[i];
|
|
||||||
try {
|
|
||||||
xhr = new ActiveXObject(progId);
|
|
||||||
} catch (e) {}
|
|
||||||
|
|
||||||
if (xhr) {
|
|
||||||
progIds = [progId]; // so faster next time
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return xhr;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses a resource name into its component parts. Resource names
|
|
||||||
* look like: module/name.ext!strip, where the !strip part is
|
|
||||||
* optional.
|
|
||||||
* @param {String} name the resource name
|
|
||||||
* @returns {Object} with properties "moduleName", "ext" and "strip"
|
|
||||||
* where strip is a boolean.
|
|
||||||
*/
|
|
||||||
parseName: function (name) {
|
|
||||||
var modName, ext, temp,
|
|
||||||
strip = false,
|
|
||||||
index = name.indexOf("."),
|
|
||||||
isRelative = name.indexOf('./') === 0 ||
|
|
||||||
name.indexOf('../') === 0;
|
|
||||||
|
|
||||||
if (index !== -1 && (!isRelative || index > 1)) {
|
|
||||||
modName = name.substring(0, index);
|
|
||||||
ext = name.substring(index + 1, name.length);
|
|
||||||
} else {
|
|
||||||
modName = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
temp = ext || modName;
|
|
||||||
index = temp.indexOf("!");
|
|
||||||
if (index !== -1) {
|
|
||||||
//Pull off the strip arg.
|
|
||||||
strip = temp.substring(index + 1) === "strip";
|
|
||||||
temp = temp.substring(0, index);
|
|
||||||
if (ext) {
|
|
||||||
ext = temp;
|
|
||||||
} else {
|
|
||||||
modName = temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
moduleName: modName,
|
|
||||||
ext: ext,
|
|
||||||
strip: strip
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Is an URL on another domain. Only works for browser use, returns
|
|
||||||
* false in non-browser environments. Only used to know if an
|
|
||||||
* optimized .js version of a text resource should be loaded
|
|
||||||
* instead.
|
|
||||||
* @param {String} url
|
|
||||||
* @returns Boolean
|
|
||||||
*/
|
|
||||||
useXhr: function (url, protocol, hostname, port) {
|
|
||||||
var uProtocol, uHostName, uPort,
|
|
||||||
match = text.xdRegExp.exec(url);
|
|
||||||
if (!match) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
uProtocol = match[2];
|
|
||||||
uHostName = match[3];
|
|
||||||
|
|
||||||
uHostName = uHostName.split(':');
|
|
||||||
uPort = uHostName[1];
|
|
||||||
uHostName = uHostName[0];
|
|
||||||
|
|
||||||
return (!uProtocol || uProtocol === protocol) &&
|
|
||||||
(!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) &&
|
|
||||||
((!uPort && !uHostName) || uPort === port);
|
|
||||||
},
|
|
||||||
|
|
||||||
finishLoad: function (name, strip, content, onLoad) {
|
|
||||||
content = strip ? text.strip(content) : content;
|
|
||||||
if (masterConfig.isBuild) {
|
|
||||||
buildMap[name] = content;
|
|
||||||
}
|
|
||||||
onLoad(content);
|
|
||||||
},
|
|
||||||
|
|
||||||
load: function (name, req, onLoad, config) {
|
|
||||||
//Name has format: some.module.filext!strip
|
|
||||||
//The strip part is optional.
|
|
||||||
//if strip is present, then that means only get the string contents
|
|
||||||
//inside a body tag in an HTML string. For XML/SVG content it means
|
|
||||||
//removing the <?xml ...?> declarations so the content can be inserted
|
|
||||||
//into the current doc without problems.
|
|
||||||
|
|
||||||
// Do not bother with the work if a build and text will
|
|
||||||
// not be inlined.
|
|
||||||
if (config.isBuild && !config.inlineText) {
|
|
||||||
onLoad();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
masterConfig.isBuild = config.isBuild;
|
|
||||||
|
|
||||||
var parsed = text.parseName(name),
|
|
||||||
nonStripName = parsed.moduleName +
|
|
||||||
(parsed.ext ? '.' + parsed.ext : ''),
|
|
||||||
url = req.toUrl(nonStripName),
|
|
||||||
useXhr = (masterConfig.useXhr) ||
|
|
||||||
text.useXhr;
|
|
||||||
|
|
||||||
//Load the text. Use XHR if possible and in a browser.
|
|
||||||
if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) {
|
|
||||||
text.get(url, function (content) {
|
|
||||||
text.finishLoad(name, parsed.strip, content, onLoad);
|
|
||||||
}, function (err) {
|
|
||||||
if (onLoad.error) {
|
|
||||||
onLoad.error(err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
//Need to fetch the resource across domains. Assume
|
|
||||||
//the resource has been optimized into a JS module. Fetch
|
|
||||||
//by the module name + extension, but do not include the
|
|
||||||
//!strip part to avoid file system issues.
|
|
||||||
req([nonStripName], function (content) {
|
|
||||||
text.finishLoad(parsed.moduleName + '.' + parsed.ext,
|
|
||||||
parsed.strip, content, onLoad);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
write: function (pluginName, moduleName, write, config) {
|
|
||||||
if (buildMap.hasOwnProperty(moduleName)) {
|
|
||||||
var content = text.jsEscape(buildMap[moduleName]);
|
|
||||||
write.asModule(pluginName + "!" + moduleName,
|
|
||||||
"define(function () { return '" +
|
|
||||||
content +
|
|
||||||
"';});\n");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
writeFile: function (pluginName, moduleName, req, write, config) {
|
|
||||||
var parsed = text.parseName(moduleName),
|
|
||||||
extPart = parsed.ext ? '.' + parsed.ext : '',
|
|
||||||
nonStripName = parsed.moduleName + extPart,
|
|
||||||
//Use a '.js' file name so that it indicates it is a
|
|
||||||
//script that can be loaded across domains.
|
|
||||||
fileName = req.toUrl(parsed.moduleName + extPart) + '.js';
|
|
||||||
|
|
||||||
//Leverage own load() method to load plugin value, but only
|
|
||||||
//write out values that do not have the strip argument,
|
|
||||||
//to avoid any potential issues with ! in file names.
|
|
||||||
text.load(nonStripName, req, function (value) {
|
|
||||||
//Use own write() method to construct full module value.
|
|
||||||
//But need to create shell that translates writeFile's
|
|
||||||
//write() to the right interface.
|
|
||||||
var textWrite = function (contents) {
|
|
||||||
return write(fileName, contents);
|
|
||||||
};
|
|
||||||
textWrite.asModule = function (moduleName, contents) {
|
|
||||||
return write.asModule(moduleName, fileName, contents);
|
|
||||||
};
|
|
||||||
|
|
||||||
text.write(pluginName, nonStripName, textWrite, config);
|
|
||||||
}, config);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (masterConfig.env === 'node' || (!masterConfig.env &&
|
|
||||||
typeof process !== "undefined" &&
|
|
||||||
process.versions &&
|
|
||||||
!!process.versions.node)) {
|
|
||||||
//Using special require.nodeRequire, something added by r.js.
|
|
||||||
fs = require.nodeRequire('fs');
|
|
||||||
|
|
||||||
text.get = function (url, callback) {
|
|
||||||
var file = fs.readFileSync(url, 'utf8');
|
|
||||||
//Remove BOM (Byte Mark Order) from utf8 files if it is there.
|
|
||||||
if (file.indexOf('\uFEFF') === 0) {
|
|
||||||
file = file.substring(1);
|
|
||||||
}
|
|
||||||
callback(file);
|
|
||||||
};
|
|
||||||
} else if (masterConfig.env === 'xhr' || (!masterConfig.env &&
|
|
||||||
text.createXhr())) {
|
|
||||||
text.get = function (url, callback, errback, headers) {
|
|
||||||
var xhr = text.createXhr(), header;
|
|
||||||
xhr.open('GET', url, true);
|
|
||||||
|
|
||||||
//Allow plugins direct access to xhr headers
|
|
||||||
if (headers) {
|
|
||||||
for (header in headers) {
|
|
||||||
if (headers.hasOwnProperty(header)) {
|
|
||||||
xhr.setRequestHeader(header.toLowerCase(), headers[header]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Allow overrides specified in config
|
|
||||||
if (masterConfig.onXhr) {
|
|
||||||
masterConfig.onXhr(xhr, url);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function (evt) {
|
|
||||||
var status, err;
|
|
||||||
//Do not explicitly handle errors, those should be
|
|
||||||
//visible via console output in the browser.
|
|
||||||
if (xhr.readyState === 4) {
|
|
||||||
status = xhr.status;
|
|
||||||
if (status > 399 && status < 600) {
|
|
||||||
//An http 4xx or 5xx error. Signal an error.
|
|
||||||
err = new Error(url + ' HTTP status: ' + status);
|
|
||||||
err.xhr = xhr;
|
|
||||||
errback(err);
|
|
||||||
} else {
|
|
||||||
callback(xhr.responseText);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (masterConfig.onXhrComplete) {
|
|
||||||
masterConfig.onXhrComplete(xhr, url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
xhr.send(null);
|
|
||||||
};
|
|
||||||
} else if (masterConfig.env === 'rhino' || (!masterConfig.env &&
|
|
||||||
typeof Packages !== 'undefined' && typeof java !== 'undefined')) {
|
|
||||||
//Why Java, why is this so awkward?
|
|
||||||
text.get = function (url, callback) {
|
|
||||||
var stringBuffer, line,
|
|
||||||
encoding = "utf-8",
|
|
||||||
file = new java.io.File(url),
|
|
||||||
lineSeparator = java.lang.System.getProperty("line.separator"),
|
|
||||||
input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)),
|
|
||||||
content = '';
|
|
||||||
try {
|
|
||||||
stringBuffer = new java.lang.StringBuffer();
|
|
||||||
line = input.readLine();
|
|
||||||
|
|
||||||
// Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324
|
|
||||||
// http://www.unicode.org/faq/utf_bom.html
|
|
||||||
|
|
||||||
// Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK:
|
|
||||||
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
|
|
||||||
if (line && line.length() && line.charAt(0) === 0xfeff) {
|
|
||||||
// Eat the BOM, since we've already found the encoding on this file,
|
|
||||||
// and we plan to concatenating this buffer with others; the BOM should
|
|
||||||
// only appear at the top of a file.
|
|
||||||
line = line.substring(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
stringBuffer.append(line);
|
|
||||||
|
|
||||||
while ((line = input.readLine()) !== null) {
|
|
||||||
stringBuffer.append(lineSeparator);
|
|
||||||
stringBuffer.append(line);
|
|
||||||
}
|
|
||||||
//Make sure we return a JavaScript string and not a Java string.
|
|
||||||
content = String(stringBuffer.toString()); //String
|
|
||||||
} finally {
|
|
||||||
input.close();
|
|
||||||
}
|
|
||||||
callback(content);
|
|
||||||
};
|
|
||||||
} else if (masterConfig.env === 'xpconnect' || (!masterConfig.env &&
|
|
||||||
typeof Components !== 'undefined' && Components.classes &&
|
|
||||||
Components.interfaces)) {
|
|
||||||
//Avert your gaze!
|
|
||||||
Cc = Components.classes,
|
|
||||||
Ci = Components.interfaces;
|
|
||||||
Components.utils['import']('resource://gre/modules/FileUtils.jsm');
|
|
||||||
|
|
||||||
text.get = function (url, callback) {
|
|
||||||
var inStream, convertStream,
|
|
||||||
readData = {},
|
|
||||||
fileObj = new FileUtils.File(url);
|
|
||||||
|
|
||||||
//XPCOM, you so crazy
|
|
||||||
try {
|
|
||||||
inStream = Cc['@mozilla.org/network/file-input-stream;1']
|
|
||||||
.createInstance(Ci.nsIFileInputStream);
|
|
||||||
inStream.init(fileObj, 1, 0, false);
|
|
||||||
|
|
||||||
convertStream = Cc['@mozilla.org/intl/converter-input-stream;1']
|
|
||||||
.createInstance(Ci.nsIConverterInputStream);
|
|
||||||
convertStream.init(inStream, "utf-8", inStream.available(),
|
|
||||||
Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
|
|
||||||
|
|
||||||
convertStream.readString(inStream.available(), readData);
|
|
||||||
convertStream.close();
|
|
||||||
inStream.close();
|
|
||||||
callback(readData.value);
|
|
||||||
} catch (e) {
|
|
||||||
throw new Error((fileObj && fileObj.path || '') + ': ' + e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return text;
|
|
||||||
});
|
|
File diff suppressed because it is too large
Load Diff
79
res/main.js
79
res/main.js
@ -4,63 +4,96 @@ requirejs.config({
|
|||||||
packages: [
|
packages: [
|
||||||
{
|
{
|
||||||
name: 'css',
|
name: 'css',
|
||||||
location: 'libs/css',
|
location: 'bower-libs/require-css',
|
||||||
main: 'css'
|
main: 'css'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'less',
|
name: 'less',
|
||||||
location: 'libs/less',
|
location: 'bower-libs/require-less',
|
||||||
main: 'less'
|
main: 'less'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
paths: {
|
paths: {
|
||||||
"jquery": "libs/jquery",
|
jquery: 'bower-libs/jquery/jquery',
|
||||||
"underscore": "libs/underscore",
|
underscore: 'bower-libs/underscore/underscore',
|
||||||
"crel": "libs/crel",
|
crel: 'libs/crel',
|
||||||
"jgrowl": "libs/jgrowl/jquery.jgrowl",
|
jgrowl: 'bower-libs/jgrowl/jquery.jgrowl',
|
||||||
"mousetrap": "libs/mousetrap",
|
mousetrap: 'bower-libs/mousetrap/mousetrap',
|
||||||
"toMarkdown": "libs/to-markdown",
|
toMarkdown: 'libs/to-markdown',
|
||||||
"text": "libs/text",
|
text: 'bower-libs/requirejs-text/text',
|
||||||
"libs/MathJax": '../lib/MathJax/MathJax.js?config=TeX-AMS_HTML'
|
mathjax: '../lib/MathJax/MathJax.js?config=TeX-AMS_HTML',
|
||||||
|
bootstrap: 'bower-libs/bootstrap/dist/js/bootstrap',
|
||||||
|
requirejs: 'bower-libs/requirejs/require',
|
||||||
|
'google-code-prettify': 'bower-libs/google-code-prettify/src/prettify',
|
||||||
|
highlightjs: 'bower-libs/highlightjs/highlight.pack',
|
||||||
|
'jquery-mousewheel': 'bower-libs/jquery-mousewheel/jquery.mousewheel',
|
||||||
|
'jquery-waitforimages': 'libs/jquery.waitforimages',
|
||||||
|
'jquery-ui': 'bower-libs/jquery-ui/ui/jquery-ui',
|
||||||
|
'jquery-ui-core': 'bower-libs/jquery-ui/ui/jquery.ui.core',
|
||||||
|
'jquery-ui-widget': 'bower-libs/jquery-ui/ui/jquery.ui.widget',
|
||||||
|
'jquery-ui-mouse': 'bower-libs/jquery-ui/ui/jquery.ui.mouse',
|
||||||
|
'jquery-ui-draggable': 'bower-libs/jquery-ui/ui/jquery.ui.draggable',
|
||||||
|
'jquery-ui-effect': 'bower-libs/jquery-ui/ui/jquery.ui.effect',
|
||||||
|
'jquery-ui-effect-slide': 'bower-libs/jquery-ui/ui/jquery.ui.effect-slide',
|
||||||
|
uilayout: 'libs/layout',
|
||||||
|
css_browser_selector: 'bower-libs/css_browser_selector/css_browser_selector',
|
||||||
|
FileSaver: 'bower-libs/FileSaver/FileSaver',
|
||||||
|
stacktrace: 'bower-libs/stacktrace/stacktrace',
|
||||||
|
'requirejs-text': 'bower-libs/requirejs-text/text'
|
||||||
},
|
},
|
||||||
shim: {
|
shim: {
|
||||||
'underscore': {
|
underscore: {
|
||||||
exports: '_'
|
exports: '_'
|
||||||
},
|
},
|
||||||
'jgrowl': {
|
jgrowl: {
|
||||||
deps: [
|
deps: [
|
||||||
'jquery'
|
'jquery'
|
||||||
],
|
],
|
||||||
exports: 'jQuery.jGrowl'
|
exports: 'jQuery.jGrowl'
|
||||||
},
|
},
|
||||||
'mousetrap': {
|
mousetrap: {
|
||||||
exports: 'Mousetrap'
|
exports: 'Mousetrap'
|
||||||
},
|
},
|
||||||
'toMarkdown': {
|
toMarkdown: {
|
||||||
deps: [
|
deps: [
|
||||||
'jquery'
|
'jquery'
|
||||||
],
|
],
|
||||||
exports: 'toMarkdown'
|
exports: 'toMarkdown'
|
||||||
},
|
},
|
||||||
'libs/jquery-ui': [
|
bootstrap: [
|
||||||
'jquery'
|
'jquery'
|
||||||
],
|
],
|
||||||
'libs/bootstrap/bootstrap': [
|
'jquery-waitforimages': [
|
||||||
'jquery'
|
'jquery'
|
||||||
],
|
],
|
||||||
'libs/jquery.waitforimages': [
|
'jquery-mousewheel': [
|
||||||
'jquery'
|
'jquery'
|
||||||
],
|
],
|
||||||
'libs/jquery.mousewheel': [
|
uilayout: [
|
||||||
'jquery'
|
'jquery-ui-effect-slide'
|
||||||
],
|
],
|
||||||
'libs/layout': [
|
'jquery-ui-effect-slide': [
|
||||||
'libs/jquery-ui'
|
'jquery-ui-effect'
|
||||||
|
],
|
||||||
|
'jquery-ui-effect': [
|
||||||
|
'jquery-ui-draggable'
|
||||||
|
],
|
||||||
|
'jquery-ui-draggable': [
|
||||||
|
'jquery-ui-mouse'
|
||||||
|
],
|
||||||
|
'jquery-ui-mouse': [
|
||||||
|
'jquery-ui-widget'
|
||||||
|
],
|
||||||
|
'jquery-ui-widget': [
|
||||||
|
'jquery-ui-core'
|
||||||
|
],
|
||||||
|
'jquery-ui-core': [
|
||||||
|
'jquery'
|
||||||
],
|
],
|
||||||
'libs/Markdown.Extra': [
|
'libs/Markdown.Extra': [
|
||||||
'libs/Markdown.Converter',
|
'libs/Markdown.Converter',
|
||||||
'libs/prettify/prettify',
|
'google-code-prettify',
|
||||||
'libs/highlight/highlight.pack',
|
'highlightjs'
|
||||||
],
|
],
|
||||||
'libs/Markdown.Editor': [
|
'libs/Markdown.Editor': [
|
||||||
'libs/Markdown.Converter'
|
'libs/Markdown.Converter'
|
||||||
|
103
res/styles/jquery.jgrowl.css
Executable file
103
res/styles/jquery.jgrowl.css
Executable file
@ -0,0 +1,103 @@
|
|||||||
|
|
||||||
|
div.jGrowl {
|
||||||
|
z-index: 9999;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Normal Style Positions **/
|
||||||
|
div.jGrowl {
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
body > div.jGrowl {
|
||||||
|
position: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl.top-left {
|
||||||
|
left: 0px;
|
||||||
|
top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl.top-right {
|
||||||
|
right: 0px;
|
||||||
|
top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl.bottom-left {
|
||||||
|
left: 0px;
|
||||||
|
bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl.bottom-right {
|
||||||
|
right: 0px;
|
||||||
|
bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl.center {
|
||||||
|
top: 0px;
|
||||||
|
width: 50%;
|
||||||
|
left: 25%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Cross Browser Styling **/
|
||||||
|
div.center div.jGrowl-notification, div.center div.jGrowl-closer {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer {
|
||||||
|
background-color: #000;
|
||||||
|
opacity: .85;
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)";
|
||||||
|
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85);
|
||||||
|
zoom: 1;
|
||||||
|
width: 235px;
|
||||||
|
padding: 10px;
|
||||||
|
margin-top: 5px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
font-family: Tahoma, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 1em;
|
||||||
|
text-align: left;
|
||||||
|
display: none;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl div.jGrowl-notification {
|
||||||
|
min-height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl div.jGrowl-notification,
|
||||||
|
div.jGrowl div.jGrowl-closer {
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl div.jGrowl-notification div.jGrowl-header {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: .85em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl div.jGrowl-notification div.jGrowl-close {
|
||||||
|
z-index: 99;
|
||||||
|
float: right;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1em;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jGrowl div.jGrowl-closer {
|
||||||
|
padding-top: 4px;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: .9em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Hide jGrowl when printing **/
|
||||||
|
@media print {
|
||||||
|
div.jGrowl {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,8 @@
|
|||||||
@import "../libs/bootstrap/less/bootstrap.less";
|
@import "../bower-libs/bootstrap/less/bootstrap.less";
|
||||||
|
@import "../bower-libs/google-code-prettify/src/prettify.css";
|
||||||
|
@import "../bower-libs/highlightjs/styles/default.css";
|
||||||
@import "../libs/fontello/css/fontello.css";
|
@import "../libs/fontello/css/fontello.css";
|
||||||
@import "../libs/jgrowl/jquery.jgrowl.css";
|
@import "jquery.jgrowl.css";
|
||||||
@import "../libs/prettify/prettify.css";
|
|
||||||
@import "../libs/highlight/highlight.css";
|
|
||||||
|
|
||||||
/* Colors */
|
/* Colors */
|
||||||
@transparent: fade(#000, 0%);
|
@transparent: fade(#000, 0%);
|
||||||
@ -98,6 +98,7 @@ body {
|
|||||||
#preview-contents {
|
#preview-contents {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin-bottom: 50px;
|
margin-bottom: 50px;
|
||||||
|
background-color: @body-bg;
|
||||||
.ui-layout-east & {
|
.ui-layout-east & {
|
||||||
padding-left: 5px;
|
padding-left: 5px;
|
||||||
}
|
}
|
||||||
@ -997,6 +998,15 @@ code, pre {
|
|||||||
font-size: 12px !important;
|
font-size: 12px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Need to force these values because of prettify
|
||||||
|
pre {
|
||||||
|
padding: ((@line-height-computed - 1) / 2) !important;
|
||||||
|
border: 1px solid @pre-border-color !important;
|
||||||
|
code {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Definition list */
|
/* Definition list */
|
||||||
dt,dd {
|
dt,dd {
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
|
@ -2,8 +2,8 @@ define([
|
|||||||
"jquery",
|
"jquery",
|
||||||
"underscore",
|
"underscore",
|
||||||
"crel",
|
"crel",
|
||||||
"libs/FileSaver",
|
"FileSaver",
|
||||||
"libs/stacktrace",
|
"stacktrace",
|
||||||
], function($, _, crel) {
|
], function($, _, crel) {
|
||||||
|
|
||||||
var utils = {};
|
var utils = {};
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
]
|
]
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script src="res/libs/require.js"></script>
|
<script src="res-min/require.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class="viewer">
|
<body class="viewer">
|
||||||
</body>
|
</body>
|
||||||
|
Loading…
Reference in New Issue
Block a user