├── .editorconfig
├── .eslintrc
├── .gitignore
├── LICENSE
├── README.md
├── bower.json
├── dist
├── react-readalong-component.js
└── react-readalong-component.min.js
├── example
└── src
│ ├── DelimitedParagraph.js
│ ├── app.js
│ ├── app.less
│ ├── bootstrap
│ ├── config.json
│ └── css
│ │ ├── bootstrap-theme.css
│ │ ├── bootstrap-theme.min.css
│ │ ├── bootstrap.css
│ │ └── bootstrap.min.css
│ └── index.html
├── gulpconfig.js
├── gulpfile.js
├── package.json
├── src
├── Phrase.js
└── Readalong.js
└── tests
└── Readalong-test.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | # This file is for unifying the coding style for different editors and IDEs
2 | # editorconfig.org
3 | root = true
4 |
5 | [*]
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 | indent_style = space
11 | indent_size = 2
12 |
13 | [*.json]
14 | indent_style = space
15 | indent_size = 2
16 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "node": true,
4 | "browser": true
5 | },
6 | "ecmaFeatures": {
7 | "jsx": true,
8 | "forOf": true
9 | },
10 | "rules": {
11 | "indent": [2, 2],
12 | "brace-style": [2, "1tbs", { "allowSingleLine": true }],
13 | "camelcase": [2, { "properties": "never" }],
14 | "comma-style": [2, "last"],
15 | "default-case": 2,
16 | "func-style": [2, "declaration"],
17 | "guard-for-in": 2,
18 | "no-floating-decimal": 2,
19 | "no-nested-ternary": 2,
20 | "no-undefined": 2,
21 | "no-underscore-dangle": 0,
22 | "radix": 2,
23 | "space-after-function-name": [2, "never"],
24 | "space-after-keywords": [2, "always"],
25 | "space-before-blocks": 2,
26 | "spaced-line-comment": [2, "always", { "exceptions": ["-"]}],
27 | "strict": [2, "global"],
28 | "valid-jsdoc": [2, { "prefer": { "return": "returns"}}],
29 | "wrap-iife": 2,
30 | "quotes": [2, "single", "avoid-escape"],
31 | "no-trailing-spaces": [2, { "skipBlankLines": true }],
32 | "react/display-name": 1,
33 | "react/jsx-boolean-value": 1,
34 | "react/jsx-no-undef": 1,
35 | "react/jsx-quotes": 1,
36 | "react/jsx-sort-prop-types": 1,
37 | "react/jsx-sort-props": 1,
38 | "react/jsx-uses-react": 1,
39 | "react/jsx-uses-vars": 1,
40 | "react/no-did-mount-set-state": 1,
41 | "react/no-did-update-set-state": 1,
42 | "react/no-multi-comp": 1,
43 | "react/no-unknown-property": 1,
44 | "react/prop-types": 1,
45 | "react/react-in-jsx-scope": 1,
46 | "react/require-extension": 1,
47 | "react/self-closing-comp": 1,
48 | "react/sort-comp": 1,
49 | "react/wrap-multilines": 1
50 | },
51 | "plugins": [
52 | "react"
53 | ]
54 | }
55 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Coverage tools
11 | lib-cov
12 | coverage
13 | coverage.html
14 | .cover*
15 |
16 | # Dependency directory
17 | node_modules
18 |
19 | # Example build directory
20 | example/dist
21 | .publish
22 |
23 | # Editor and other tmp files
24 | *.swp
25 | *.un~
26 | *.iml
27 | *.ipr
28 | *.iws
29 | *.sublime-*
30 | .idea/
31 | *.DS_Store
32 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Talking Bibles International and Stephen Clay Smith
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # React Readalong Component
2 |
3 | [](LICENSE)
4 | [](https://www.npmjs.com/package/react-readalong-component)
5 | [](bower.json)
6 | [](https://david-dm.org/TalkingBibles/react-readalong-component)
7 |
8 |
9 | A React component that uses the Speech Synthesis API to read text out loud by sentence or word while the user follows
10 | along with their mouse or finger
11 |
12 |
13 | ## Demo & Examples
14 |
15 | Live demo: [Github Pages](http://talkingbibles.github.io/react-readalong-component/)
16 |
17 | To build the examples locally, run:
18 |
19 | ```
20 | npm install
21 | gulp dev
22 | ```
23 |
24 | Then open [`localhost:8000`](http://localhost:8000) in a browser.
25 |
26 |
27 | ## Installation
28 |
29 | The easiest way to use Readalong is to install it from NPM and include it in your own React build process (using
30 | [Browserify](http://browserify.org), [Webpack](http://webpack.github.io/), etc).
31 |
32 | You can also use the standalone build by including `dist/react-readalong-component.js` in your page. If you use this,
33 | make sure you have already included React, and it is available as a global variable.
34 |
35 | ```
36 | npm install react-readalong-component --save
37 | ```
38 |
39 | ## Usage
40 |
41 | The component provides a single element, `Readalong`, that takes three properties and some text content. The properties
42 | of `lang` and `delimiter` can be provided as attributes, while `voiceName` should be passed after the browser registers
43 | the available Speech Synthesis voices. The browser will use its default voice until a valid, different voice is passed.
44 | The component will attempt to choose a default voice based on the passed `lang` property, but this is hit-or-miss.
45 |
46 |
47 | lang Any standard HTML language encoding code. Used by the browser to select a default voice.
48 | delimiter Either "word" or "sentence." The size of the spoken chunks.
49 | voiceName Name of any voice supported by the browser. Overrides the default selected for language.
50 |
51 |
52 | ```javascript
53 | var Readalong = require('react-readalong-component');
54 |
55 |
56 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc turpis eros, interdum ut gravida ultrices, pellentesque
57 | quis metus. Fusce suscipit ullamcorper magna, eget consequat nulla pharetra at. Morbi luctus dapibus nulla, sit amet
58 | commodo purus lacinia nec. Duis in metus at est sagittis fermentum non dapibus ante. Nulla vitae sodales massa, ut
59 | ullamcorper odio. Praesent sollicitudin neque vel mauris elementum, tincidunt porta elit aliquet. Nullam tincidunt
60 | turpis a dolor condimentum maximus.
61 |
62 | ```
63 |
64 | The output of the component receives three classes for use with styling. The outer wrapper has the class,
65 | `readalong`. Every readable phrase is wrapped in a span with the `readalong-phrase` class.
66 | While a phrase is being spoken, the corresponding span also receives a `readalong-active` class. This
67 | can be used, as in the examples below, to keep the phrase highlighted after the user moves off or releases her
68 | finger.
69 |
70 | It is advisable to make the font size as large as possible for the contents of a Readalong element. This is
71 | especially true if the delimiter is set to `word`.
72 |
73 |
74 | ## Compatibility
75 |
76 | This component depends on two experimental, draft APIs: [Pointer Events](http://caniuse.com/#feat=pointer)
77 | and [Speech Synthesis](http://caniuse.com/#feat=speech-synthesis).
78 |
79 | **As of July 12, 2015, the Web Speech API is still an unofficial proposal.** As such, right out
80 | of the box this component will only work in about half of all browsers. Those include recent versions of Chrome,
81 | Opera, and Safari. Ostensibly, iOS Safari is supported, but Speech Synthesis seems to work in that browser only
82 | sporadically. All other browsers will need a polyfill. There is no polyfill for Speech Synthesis currently
83 | installed on this demonstration page.
84 |
85 | Again, as of the time of this commit, the Pointer Events API is very poorly supported across all browsers. Only
86 | IE and very late version Firefox have implemented it. **There's no getting away without a polyfill for Pointer
87 | Events.** They power the cursor/finger recognition. Fortunately, Google/jQuery have put together a fantastic
88 | polyfill called [PEP](https://github.com/jquery/PEP), which is providing cross-browser capability for
89 | this page. It does not require jQuery as a dependency.
90 |
91 | This component intentionally does not include polyfills. There are many polyfill options, and the one you choose
92 | will depend on the needs of your project. The component also intentionally does check whether the Speech Synthesis
93 | API is available. Readalong assumes that both `window.speechSynthesis` and the `SpeechSynthesisUtterance` object are
94 | available, and that they are up-to-date with the unofficial proposal.
95 |
96 |
97 | ## License
98 |
99 | This component was structured on top of [react-component-starter](https://github.com/JedWatson/react-component-starter)
100 | project by [Jed Watson](https://github.com/JedWatson).
101 |
102 | The constants, regular expressions, and punctuation encoding used in this project were originally lifted from
103 | [Blast.js](https://github.com/julianshapiro/blast), built by [Julian Shapiro](https://github.com/julianshapiro). These have
104 | been modified to fit the particular requirements of this project, including the addition of the Chinese punctuation into the
105 | regular expression used to recognize sentence boundaries.
106 |
107 | react-component-starter. MIT License. Copyright 2014 Jed Watson.
108 | Blast.js. MIT License. Copyright 2014 Julian Shapiro.
109 | react-readalong-component. MIT License. Copyright 2015 Talking Bibles International and Stephen Clay Smith.
110 |
111 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-readalong-component",
3 | "description": "A React component that uses the Speech Synthesis API to read text out loud by sentence or word while the user follows along with their mouse or finger",
4 | "homepage": "https://github.com/TalkingBibles/react-readalong-component",
5 | "version": "1.1.4",
6 | "license": "MIT",
7 | "main": "dist/react-readalong-component.min.js",
8 | "authors": [
9 | {
10 | "name": "talkingbibles",
11 | "email": "devops@talkingbibles.org",
12 | "homepage": "http://www.talkingbibles.org/"
13 | },
14 | {
15 | "name": "stphnclysmth",
16 | "email": "s.clay.smith@gmail.com",
17 | "homepage": "http://janineandclay.com/"
18 | }
19 | ],
20 | "repository": {
21 | "type": "git",
22 | "url": "https://github.com/TalkingBibles/react-readalong-component"
23 | },
24 | "moduleType": [
25 | "amd",
26 | "globals",
27 | "node"
28 | ],
29 | "keywords": [
30 | "react",
31 | "react-component",
32 | "speech synthesis",
33 | "tts",
34 | "text-to-speech",
35 | "web speech"
36 | ],
37 | "ignore": [
38 | ".editorconfig",
39 | ".gitignore",
40 | "package.json",
41 | "src",
42 | "node_modules",
43 | "example",
44 | "test"
45 | ]
46 | }
47 |
--------------------------------------------------------------------------------
/example/src/DelimitedParagraph.js:
--------------------------------------------------------------------------------
1 | /**
2 |
3 | The MIT License (MIT)
4 |
5 | Copyright (c) 2015 Talking Bibles International and Stephen Clay Smith
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the "Software"), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 | The above copyright notice and this permission notice shall be included in all
15 | copies or substantial portions of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | SOFTWARE.
24 |
25 | */
26 |
27 | 'use strict';
28 |
29 | var React = require('react');
30 | var PureRenderMixin = require('react/addons').addons.PureRenderMixin;
31 | var LinkedStateMixin = require('react/addons').addons.LinkedStateMixin;
32 | var Readalong = require('react-readalong-component');
33 |
34 | var DeliminatedParagraph = React.createClass({
35 | displayName: 'DeliminatedParagraph',
36 |
37 | propTypes: {
38 | children: React.PropTypes.node.isRequired,
39 | delimiter: React.PropTypes.oneOf(['word', 'sentence']).isRequired,
40 | lang: React.PropTypes.string.isRequired
41 | },
42 |
43 | mixins: [LinkedStateMixin, PureRenderMixin],
44 |
45 | getInitialState: function () {
46 | return {
47 | delimiter: this.props.delimiter,
48 | voices: [],
49 | voiceName: null
50 | };
51 | },
52 |
53 | componentWillMount: function () {
54 | this._getVoices(0);
55 | },
56 |
57 | _getVoices: function(attempt) {
58 | var voices = window.speechSynthesis.getVoices();
59 |
60 | if (voices && voices.length > 0) {
61 | voices.unshift('');
62 |
63 | this.setState({
64 | voices: voices
65 | });
66 |
67 | return;
68 | }
69 |
70 | if (attempt <= 30) {
71 | setTimeout(this._getVoices.bind(this, ++attempt), 500);
72 |
73 | return;
74 | }
75 |
76 | console.error(this.displayName + ': Could not load Speech Synthesis voices before timeout.');
77 | },
78 |
79 | render: function () {
80 | var voiceOptions = this.state.voices.map(function (voice, index) {
81 | if (typeof voice === 'object') {
82 | return {voice.name} ;
83 | }
84 |
85 | return
86 | });
87 |
88 | var disabled = (voiceOptions.length > 0) ? '' : 'disabled';
89 |
90 | return (
91 |
92 |
116 |
117 |
118 | {this.props.children}
119 |
120 |
121 | );
122 | }
123 | });
124 |
125 | module.exports = DeliminatedParagraph;
126 |
--------------------------------------------------------------------------------
/example/src/app.js:
--------------------------------------------------------------------------------
1 | /**
2 |
3 | The MIT License (MIT)
4 |
5 | Copyright (c) 2015 Talking Bibles International and Stephen Clay Smith
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the "Software"), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 | The above copyright notice and this permission notice shall be included in all
15 | copies or substantial portions of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | SOFTWARE.
24 |
25 | */
26 |
27 | 'use strict';
28 |
29 | var React = require('react');
30 | var Readalong = require('react-readalong-component');
31 | var DelimitedParagraph = require('./DelimitedParagraph');
32 |
33 | var Highlight = require('highlight.js');
34 |
35 | React.render((
36 |
37 | There was an old woman who lived in a shoe.
38 | She had so many children, she didn't know what to do.
39 | She gave them some broth without any bread;
40 | And whipped them all soundly and put them to bed.
41 |
42 | ), document.getElementById('simple'));
43 |
44 |
45 | React.render((
46 |
47 |
48 | This sentence has five words. Here are five more words. Five-word sentences are fine. But several together
49 | become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s
50 | like a stuck record. The ear demands some variety. Now listen. I vary the sentence length, and I create
51 | music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I
52 | use sentences of medium length. And sometimes, when I am certain the reader is rested, I will engage him
53 | with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of
54 | a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is
55 | important.
56 |
57 |
58 |
59 |
60 | ), document.getElementById('inner-element'));
61 |
62 | React.render((
63 |
64 | In the beginning was the Word, and the Word was
65 | with God, and the Word was God. The same was in
66 | the beginning with God. All things were made
67 | through him. Without him, nothing was made that has been made.
68 | In him was life, and the life was the light of
69 | men. The light shines in the darkness, and the
70 | darkness hasn’t overcome it.
71 |
72 | There came a man,
73 | sent from God, whose name was John. The same came
74 | as a witness, that he might testify about the light, that all might
75 | believe through him. He was not the light, but was
76 | sent that he might testify about the light. The
77 | true light that enlightens everyone was coming into the world.
78 |
79 |
80 |
81 | ), document.getElementById('multiple-elements'));
82 |
83 | React.render((
84 |
85 | En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
86 | no ha mucho tiempo que vivía un hidalgo de los de lanza en
87 | astillero, adarga antigua, rocín flaco y galgo corredor. Una
88 | olla de algo más vaca que carnero, salpicón las más noches,
89 | duelos y quebrantos los sábados, lentejas los viernes, algún
90 | palomino de añadidura los domingos, consumían las tres partes
91 | de su hacienda. El resto della concluían sayo de velarte,
92 | calzas de velludo para las fiestas con sus pantuflos de lo
93 | mismo, los días de entre semana se honraba con su vellori de
94 | lo más fino. Tenía en su casa una ama que pasaba de los
95 | cuarenta, y una sobrina que no llegaba a los veinte, y un mozo
96 | de campo y plaza, que así ensillaba el rocín como tomaba la
97 | podadera. Frisaba la edad de nuestro hidalgo con los cincuenta
98 | años, era de complexión recia, seco de carnes, enjuto de
99 | rostro; gran madrugador y amigo de la caza. Quieren decir que
100 | tenía el sobrenombre de Quijada o Quesada (que en esto hay
101 | alguna diferencia en los autores que deste caso escriben),
102 | aunque por conjeturas verosímiles se deja entender que se
103 | llama Quijana; pero esto importa poco a nuestro cuento; basta
104 | que en la narración dél no se salga un punto de la verdad.
105 |
106 | ), document.getElementById('spanish-language'));
107 |
108 | React.render((
109 |
110 |
111 | 1 太 初 有 道 , 道 与 神 同 在 , 道 就 是 神 。
112 | 2 这 道 太 初 与 神 同 在 。 3 万 物 是
113 | 藉 着 他 造 的 ; 凡 被 造 的 , 没 有 一 样 不 是 藉 着 他 造 的 。
114 | 4 生 命 在 他 里 头 , 这 生 命 就 是 人 的 光 。
115 | 5 光 照 在 黑 暗 里 , 黑 暗 却 不 接 受 光 。
116 | 6 有 一 个 人 , 是 从 神 那 里 差 来 的 , 名 叫 约 翰 。
117 | 7 这 人 来 , 为 要 作 见 证 , 就 是 为 光 作 见 证 ,
118 | 叫 众 人 因 他 可 以 信 。 8 他 不 是 那 光 , 乃 是 要
119 | 为 光 作 见 证 。 9 那 光 是 真 光 , 照 亮 一 切 生
120 | 在 世 上 的 人 。
121 |
122 |
123 | ), document.getElementById('chinese-language'));
124 |
125 | Highlight.initHighlightingOnLoad();
126 |
--------------------------------------------------------------------------------
/example/src/app.less:
--------------------------------------------------------------------------------
1 | // http://getbootstrap.com/customize/?id=20cc2f303dda043618b8
2 | @import (inline) "bootstrap/css/bootstrap.css";
3 | @import (inline) "../../node_modules/highlight.js/styles/github.css";
4 |
5 | .jumbotron {
6 | background: rgb(255,197,120);
7 | background: -moz-linear-gradient(top, rgba(255,197,120,1) 0%, rgba(251,157,35,1) 100%);
8 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,197,120,1)), color-stop(100%,rgba(251,157,35,1)));
9 | background: -webkit-linear-gradient(top, rgba(255,197,120,1) 0%,rgba(251,157,35,1) 100%);
10 | background: -o-linear-gradient(top, rgba(255,197,120,1) 0%,rgba(251,157,35,1) 100%);
11 | background: -ms-linear-gradient(top, rgba(255,197,120,1) 0%,rgba(251,157,35,1) 100%);
12 | background: linear-gradient(to bottom, rgba(255,197,120,1) 0%,rgba(251,157,35,1) 100%);
13 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffc578', endColorstr='#fb9d23',GradientType=0 );
14 | }
15 |
16 | .readalong {
17 | font-size: 20px;
18 | line-height: 1.6;
19 | color: #333;
20 |
21 | -webkit-touch-callout: none;
22 | -webkit-user-select: none;
23 | -webkit-tap-highlight-color: rgba(0,0,0,0);
24 | }
25 |
26 | .readalong-phrase {
27 | cursor: pointer;
28 | }
29 |
30 | .readalong-phrase:hover {
31 | cursor: help;
32 | background-color: lightyellow;
33 | }
34 |
35 | .readalong-active {
36 | background-color: lightyellow;
37 | }
38 |
39 | [data-verse]::before {
40 | content: attr(data-verse);
41 | position: relative;
42 | top: -0.5em;
43 | font-size: 80%;
44 | color: #999;
45 | }
46 |
47 | i {
48 | font-style: normal;
49 | }
50 |
51 | h2 {
52 | margin-top: 40px;
53 | }
54 |
55 | h1 + h2 {
56 | margin-top: 30px;
57 | }
58 |
59 | .page-footer {
60 | margin-top: 5em;
61 | margin-bottom: 5em;
62 | }
63 |
64 | .page-footer p {
65 | margin-bottom: 0;
66 | }
67 |
--------------------------------------------------------------------------------
/example/src/bootstrap/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "vars": {
3 | "@gray-base": "#000",
4 | "@gray-darker": "lighten(@gray-base, 13.5%)",
5 | "@gray-dark": "lighten(@gray-base, 20%)",
6 | "@gray": "lighten(@gray-base, 33.5%)",
7 | "@gray-light": "lighten(@gray-base, 46.7%)",
8 | "@gray-lighter": "lighten(@gray-base, 93.5%)",
9 | "@brand-primary": "darken(#428bca, 6.5%)",
10 | "@brand-success": "#5cb85c",
11 | "@brand-info": "#5bc0de",
12 | "@brand-warning": "#f0ad4e",
13 | "@brand-danger": "#d9534f",
14 | "@body-bg": "#fff",
15 | "@text-color": "@gray-dark",
16 | "@link-color": "@brand-primary",
17 | "@link-hover-color": "darken(@link-color, 15%)",
18 | "@link-hover-decoration": "underline",
19 | "@font-family-sans-serif": "\"Helvetica Neue\", Helvetica, Arial, sans-serif",
20 | "@font-family-serif": "Georgia, \"Times New Roman\", Times, serif",
21 | "@font-family-monospace": "Menlo, Monaco, Consolas, \"Courier New\", monospace",
22 | "@font-family-base": "@font-family-sans-serif",
23 | "@font-size-base": "14px",
24 | "@font-size-large": "ceil((@font-size-base * 1.25))",
25 | "@font-size-small": "ceil((@font-size-base * 0.85))",
26 | "@font-size-h1": "floor((@font-size-base * 2.6))",
27 | "@font-size-h2": "floor((@font-size-base * 2.15))",
28 | "@font-size-h3": "ceil((@font-size-base * 1.7))",
29 | "@font-size-h4": "ceil((@font-size-base * 1.25))",
30 | "@font-size-h5": "@font-size-base",
31 | "@font-size-h6": "ceil((@font-size-base * 0.85))",
32 | "@line-height-base": "1.428571429",
33 | "@line-height-computed": "floor((@font-size-base * @line-height-base))",
34 | "@headings-font-family": "inherit",
35 | "@headings-font-weight": "500",
36 | "@headings-line-height": "1.1",
37 | "@headings-color": "inherit",
38 | "@icon-font-path": "\"../fonts/\"",
39 | "@icon-font-name": "\"glyphicons-halflings-regular\"",
40 | "@icon-font-svg-id": "\"glyphicons_halflingsregular\"",
41 | "@padding-base-vertical": "6px",
42 | "@padding-base-horizontal": "12px",
43 | "@padding-large-vertical": "10px",
44 | "@padding-large-horizontal": "16px",
45 | "@padding-small-vertical": "5px",
46 | "@padding-small-horizontal": "10px",
47 | "@padding-xs-vertical": "1px",
48 | "@padding-xs-horizontal": "5px",
49 | "@line-height-large": "1.3333333",
50 | "@line-height-small": "1.5",
51 | "@border-radius-base": "4px",
52 | "@border-radius-large": "6px",
53 | "@border-radius-small": "3px",
54 | "@component-active-color": "#fff",
55 | "@component-active-bg": "@brand-primary",
56 | "@caret-width-base": "4px",
57 | "@caret-width-large": "5px",
58 | "@table-cell-padding": "8px",
59 | "@table-condensed-cell-padding": "5px",
60 | "@table-bg": "transparent",
61 | "@table-bg-accent": "#f9f9f9",
62 | "@table-bg-hover": "#f5f5f5",
63 | "@table-bg-active": "@table-bg-hover",
64 | "@table-border-color": "#ddd",
65 | "@btn-font-weight": "normal",
66 | "@btn-default-color": "#333",
67 | "@btn-default-bg": "#fff",
68 | "@btn-default-border": "#ccc",
69 | "@btn-primary-color": "#fff",
70 | "@btn-primary-bg": "@brand-primary",
71 | "@btn-primary-border": "darken(@btn-primary-bg, 5%)",
72 | "@btn-success-color": "#fff",
73 | "@btn-success-bg": "@brand-success",
74 | "@btn-success-border": "darken(@btn-success-bg, 5%)",
75 | "@btn-info-color": "#fff",
76 | "@btn-info-bg": "@brand-info",
77 | "@btn-info-border": "darken(@btn-info-bg, 5%)",
78 | "@btn-warning-color": "#fff",
79 | "@btn-warning-bg": "@brand-warning",
80 | "@btn-warning-border": "darken(@btn-warning-bg, 5%)",
81 | "@btn-danger-color": "#fff",
82 | "@btn-danger-bg": "@brand-danger",
83 | "@btn-danger-border": "darken(@btn-danger-bg, 5%)",
84 | "@btn-link-disabled-color": "@gray-light",
85 | "@btn-border-radius-base": "@border-radius-base",
86 | "@btn-border-radius-large": "@border-radius-large",
87 | "@btn-border-radius-small": "@border-radius-small",
88 | "@input-bg": "#fff",
89 | "@input-bg-disabled": "@gray-lighter",
90 | "@input-color": "@gray",
91 | "@input-border": "#ccc",
92 | "@input-border-radius": "@border-radius-base",
93 | "@input-border-radius-large": "@border-radius-large",
94 | "@input-border-radius-small": "@border-radius-small",
95 | "@input-border-focus": "#66afe9",
96 | "@input-color-placeholder": "#999",
97 | "@input-height-base": "(@line-height-computed + (@padding-base-vertical * 2) + 2)",
98 | "@input-height-large": "(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)",
99 | "@input-height-small": "(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)",
100 | "@form-group-margin-bottom": "15px",
101 | "@legend-color": "@gray-dark",
102 | "@legend-border-color": "#e5e5e5",
103 | "@input-group-addon-bg": "@gray-lighter",
104 | "@input-group-addon-border-color": "@input-border",
105 | "@cursor-disabled": "not-allowed",
106 | "@dropdown-bg": "#fff",
107 | "@dropdown-border": "rgba(0,0,0,.15)",
108 | "@dropdown-fallback-border": "#ccc",
109 | "@dropdown-divider-bg": "#e5e5e5",
110 | "@dropdown-link-color": "@gray-dark",
111 | "@dropdown-link-hover-color": "darken(@gray-dark, 5%)",
112 | "@dropdown-link-hover-bg": "#f5f5f5",
113 | "@dropdown-link-active-color": "@component-active-color",
114 | "@dropdown-link-active-bg": "@component-active-bg",
115 | "@dropdown-link-disabled-color": "@gray-light",
116 | "@dropdown-header-color": "@gray-light",
117 | "@dropdown-caret-color": "#000",
118 | "@screen-xs": "480px",
119 | "@screen-xs-min": "@screen-xs",
120 | "@screen-phone": "@screen-xs-min",
121 | "@screen-sm": "768px",
122 | "@screen-sm-min": "@screen-sm",
123 | "@screen-tablet": "@screen-sm-min",
124 | "@screen-md": "992px",
125 | "@screen-md-min": "@screen-md",
126 | "@screen-desktop": "@screen-md-min",
127 | "@screen-lg": "1200px",
128 | "@screen-lg-min": "@screen-lg",
129 | "@screen-lg-desktop": "@screen-lg-min",
130 | "@screen-xs-max": "(@screen-sm-min - 1)",
131 | "@screen-sm-max": "(@screen-md-min - 1)",
132 | "@screen-md-max": "(@screen-lg-min - 1)",
133 | "@grid-columns": "12",
134 | "@grid-gutter-width": "30px",
135 | "@grid-float-breakpoint": "@screen-sm-min",
136 | "@grid-float-breakpoint-max": "(@grid-float-breakpoint - 1)",
137 | "@container-tablet": "(720px + @grid-gutter-width)",
138 | "@container-sm": "@container-tablet",
139 | "@container-desktop": "(760px + @grid-gutter-width)",
140 | "@container-md": "@container-desktop",
141 | "@container-large-desktop": "(760px + @grid-gutter-width)",
142 | "@container-lg": "@container-large-desktop",
143 | "@navbar-height": "50px",
144 | "@navbar-margin-bottom": "@line-height-computed",
145 | "@navbar-border-radius": "@border-radius-base",
146 | "@navbar-padding-horizontal": "floor((@grid-gutter-width / 2))",
147 | "@navbar-padding-vertical": "((@navbar-height - @line-height-computed) / 2)",
148 | "@navbar-collapse-max-height": "340px",
149 | "@navbar-default-color": "#777",
150 | "@navbar-default-bg": "#f8f8f8",
151 | "@navbar-default-border": "darken(@navbar-default-bg, 6.5%)",
152 | "@navbar-default-link-color": "#777",
153 | "@navbar-default-link-hover-color": "#333",
154 | "@navbar-default-link-hover-bg": "transparent",
155 | "@navbar-default-link-active-color": "#555",
156 | "@navbar-default-link-active-bg": "darken(@navbar-default-bg, 6.5%)",
157 | "@navbar-default-link-disabled-color": "#ccc",
158 | "@navbar-default-link-disabled-bg": "transparent",
159 | "@navbar-default-brand-color": "@navbar-default-link-color",
160 | "@navbar-default-brand-hover-color": "darken(@navbar-default-brand-color, 10%)",
161 | "@navbar-default-brand-hover-bg": "transparent",
162 | "@navbar-default-toggle-hover-bg": "#ddd",
163 | "@navbar-default-toggle-icon-bar-bg": "#888",
164 | "@navbar-default-toggle-border-color": "#ddd",
165 | "@navbar-inverse-color": "lighten(@gray-light, 15%)",
166 | "@navbar-inverse-bg": "#222",
167 | "@navbar-inverse-border": "darken(@navbar-inverse-bg, 10%)",
168 | "@navbar-inverse-link-color": "lighten(@gray-light, 15%)",
169 | "@navbar-inverse-link-hover-color": "#fff",
170 | "@navbar-inverse-link-hover-bg": "transparent",
171 | "@navbar-inverse-link-active-color": "@navbar-inverse-link-hover-color",
172 | "@navbar-inverse-link-active-bg": "darken(@navbar-inverse-bg, 10%)",
173 | "@navbar-inverse-link-disabled-color": "#444",
174 | "@navbar-inverse-link-disabled-bg": "transparent",
175 | "@navbar-inverse-brand-color": "@navbar-inverse-link-color",
176 | "@navbar-inverse-brand-hover-color": "#fff",
177 | "@navbar-inverse-brand-hover-bg": "transparent",
178 | "@navbar-inverse-toggle-hover-bg": "#333",
179 | "@navbar-inverse-toggle-icon-bar-bg": "#fff",
180 | "@navbar-inverse-toggle-border-color": "#333",
181 | "@nav-link-padding": "10px 15px",
182 | "@nav-link-hover-bg": "@gray-lighter",
183 | "@nav-disabled-link-color": "@gray-light",
184 | "@nav-disabled-link-hover-color": "@gray-light",
185 | "@nav-tabs-border-color": "#ddd",
186 | "@nav-tabs-link-hover-border-color": "@gray-lighter",
187 | "@nav-tabs-active-link-hover-bg": "@body-bg",
188 | "@nav-tabs-active-link-hover-color": "@gray",
189 | "@nav-tabs-active-link-hover-border-color": "#ddd",
190 | "@nav-tabs-justified-link-border-color": "#ddd",
191 | "@nav-tabs-justified-active-link-border-color": "@body-bg",
192 | "@nav-pills-border-radius": "@border-radius-base",
193 | "@nav-pills-active-link-hover-bg": "@component-active-bg",
194 | "@nav-pills-active-link-hover-color": "@component-active-color",
195 | "@pagination-color": "@link-color",
196 | "@pagination-bg": "#fff",
197 | "@pagination-border": "#ddd",
198 | "@pagination-hover-color": "@link-hover-color",
199 | "@pagination-hover-bg": "@gray-lighter",
200 | "@pagination-hover-border": "#ddd",
201 | "@pagination-active-color": "#fff",
202 | "@pagination-active-bg": "@brand-primary",
203 | "@pagination-active-border": "@brand-primary",
204 | "@pagination-disabled-color": "@gray-light",
205 | "@pagination-disabled-bg": "#fff",
206 | "@pagination-disabled-border": "#ddd",
207 | "@pager-bg": "@pagination-bg",
208 | "@pager-border": "@pagination-border",
209 | "@pager-border-radius": "15px",
210 | "@pager-hover-bg": "@pagination-hover-bg",
211 | "@pager-active-bg": "@pagination-active-bg",
212 | "@pager-active-color": "@pagination-active-color",
213 | "@pager-disabled-color": "@pagination-disabled-color",
214 | "@jumbotron-padding": "30px",
215 | "@jumbotron-color": "inherit",
216 | "@jumbotron-bg": "@gray-lighter",
217 | "@jumbotron-heading-color": "inherit",
218 | "@jumbotron-font-size": "ceil((@font-size-base * 1.5))",
219 | "@jumbotron-heading-font-size": "ceil((@font-size-base * 4.5))",
220 | "@state-success-text": "#3c763d",
221 | "@state-success-bg": "#dff0d8",
222 | "@state-success-border": "darken(spin(@state-success-bg, -10), 5%)",
223 | "@state-info-text": "#31708f",
224 | "@state-info-bg": "#d9edf7",
225 | "@state-info-border": "darken(spin(@state-info-bg, -10), 7%)",
226 | "@state-warning-text": "#8a6d3b",
227 | "@state-warning-bg": "#fcf8e3",
228 | "@state-warning-border": "darken(spin(@state-warning-bg, -10), 5%)",
229 | "@state-danger-text": "#a94442",
230 | "@state-danger-bg": "#f2dede",
231 | "@state-danger-border": "darken(spin(@state-danger-bg, -10), 5%)",
232 | "@tooltip-max-width": "200px",
233 | "@tooltip-color": "#fff",
234 | "@tooltip-bg": "#000",
235 | "@tooltip-opacity": ".9",
236 | "@tooltip-arrow-width": "5px",
237 | "@tooltip-arrow-color": "@tooltip-bg",
238 | "@popover-bg": "#fff",
239 | "@popover-max-width": "276px",
240 | "@popover-border-color": "rgba(0,0,0,.2)",
241 | "@popover-fallback-border-color": "#ccc",
242 | "@popover-title-bg": "darken(@popover-bg, 3%)",
243 | "@popover-arrow-width": "10px",
244 | "@popover-arrow-color": "@popover-bg",
245 | "@popover-arrow-outer-width": "(@popover-arrow-width + 1)",
246 | "@popover-arrow-outer-color": "fadein(@popover-border-color, 5%)",
247 | "@popover-arrow-outer-fallback-color": "darken(@popover-fallback-border-color, 20%)",
248 | "@label-default-bg": "@gray-light",
249 | "@label-primary-bg": "@brand-primary",
250 | "@label-success-bg": "@brand-success",
251 | "@label-info-bg": "@brand-info",
252 | "@label-warning-bg": "@brand-warning",
253 | "@label-danger-bg": "@brand-danger",
254 | "@label-color": "#fff",
255 | "@label-link-hover-color": "#fff",
256 | "@modal-inner-padding": "15px",
257 | "@modal-title-padding": "15px",
258 | "@modal-title-line-height": "@line-height-base",
259 | "@modal-content-bg": "#fff",
260 | "@modal-content-border-color": "rgba(0,0,0,.2)",
261 | "@modal-content-fallback-border-color": "#999",
262 | "@modal-backdrop-bg": "#000",
263 | "@modal-backdrop-opacity": ".5",
264 | "@modal-header-border-color": "#e5e5e5",
265 | "@modal-footer-border-color": "@modal-header-border-color",
266 | "@modal-lg": "900px",
267 | "@modal-md": "600px",
268 | "@modal-sm": "300px",
269 | "@alert-padding": "15px",
270 | "@alert-border-radius": "@border-radius-base",
271 | "@alert-link-font-weight": "bold",
272 | "@alert-success-bg": "@state-success-bg",
273 | "@alert-success-text": "@state-success-text",
274 | "@alert-success-border": "@state-success-border",
275 | "@alert-info-bg": "@state-info-bg",
276 | "@alert-info-text": "@state-info-text",
277 | "@alert-info-border": "@state-info-border",
278 | "@alert-warning-bg": "@state-warning-bg",
279 | "@alert-warning-text": "@state-warning-text",
280 | "@alert-warning-border": "@state-warning-border",
281 | "@alert-danger-bg": "@state-danger-bg",
282 | "@alert-danger-text": "@state-danger-text",
283 | "@alert-danger-border": "@state-danger-border",
284 | "@progress-bg": "#f5f5f5",
285 | "@progress-bar-color": "#fff",
286 | "@progress-border-radius": "@border-radius-base",
287 | "@progress-bar-bg": "@brand-primary",
288 | "@progress-bar-success-bg": "@brand-success",
289 | "@progress-bar-warning-bg": "@brand-warning",
290 | "@progress-bar-danger-bg": "@brand-danger",
291 | "@progress-bar-info-bg": "@brand-info",
292 | "@list-group-bg": "#fff",
293 | "@list-group-border": "#ddd",
294 | "@list-group-border-radius": "@border-radius-base",
295 | "@list-group-hover-bg": "#f5f5f5",
296 | "@list-group-active-color": "@component-active-color",
297 | "@list-group-active-bg": "@component-active-bg",
298 | "@list-group-active-border": "@list-group-active-bg",
299 | "@list-group-active-text-color": "lighten(@list-group-active-bg, 40%)",
300 | "@list-group-disabled-color": "@gray-light",
301 | "@list-group-disabled-bg": "@gray-lighter",
302 | "@list-group-disabled-text-color": "@list-group-disabled-color",
303 | "@list-group-link-color": "#555",
304 | "@list-group-link-hover-color": "@list-group-link-color",
305 | "@list-group-link-heading-color": "#333",
306 | "@panel-bg": "#fff",
307 | "@panel-body-padding": "15px",
308 | "@panel-heading-padding": "10px 15px",
309 | "@panel-footer-padding": "@panel-heading-padding",
310 | "@panel-border-radius": "@border-radius-base",
311 | "@panel-inner-border": "#ddd",
312 | "@panel-footer-bg": "#f5f5f5",
313 | "@panel-default-text": "@gray-dark",
314 | "@panel-default-border": "#ddd",
315 | "@panel-default-heading-bg": "#f5f5f5",
316 | "@panel-primary-text": "#fff",
317 | "@panel-primary-border": "@brand-primary",
318 | "@panel-primary-heading-bg": "@brand-primary",
319 | "@panel-success-text": "@state-success-text",
320 | "@panel-success-border": "@state-success-border",
321 | "@panel-success-heading-bg": "@state-success-bg",
322 | "@panel-info-text": "@state-info-text",
323 | "@panel-info-border": "@state-info-border",
324 | "@panel-info-heading-bg": "@state-info-bg",
325 | "@panel-warning-text": "@state-warning-text",
326 | "@panel-warning-border": "@state-warning-border",
327 | "@panel-warning-heading-bg": "@state-warning-bg",
328 | "@panel-danger-text": "@state-danger-text",
329 | "@panel-danger-border": "@state-danger-border",
330 | "@panel-danger-heading-bg": "@state-danger-bg",
331 | "@thumbnail-padding": "4px",
332 | "@thumbnail-bg": "@body-bg",
333 | "@thumbnail-border": "#ddd",
334 | "@thumbnail-border-radius": "@border-radius-base",
335 | "@thumbnail-caption-color": "@text-color",
336 | "@thumbnail-caption-padding": "9px",
337 | "@well-bg": "#f5f5f5",
338 | "@well-border": "darken(@well-bg, 7%)",
339 | "@badge-color": "#fff",
340 | "@badge-link-hover-color": "#fff",
341 | "@badge-bg": "@gray-light",
342 | "@badge-active-color": "@link-color",
343 | "@badge-active-bg": "#fff",
344 | "@badge-font-weight": "bold",
345 | "@badge-line-height": "1",
346 | "@badge-border-radius": "10px",
347 | "@breadcrumb-padding-vertical": "8px",
348 | "@breadcrumb-padding-horizontal": "15px",
349 | "@breadcrumb-bg": "#f5f5f5",
350 | "@breadcrumb-color": "#ccc",
351 | "@breadcrumb-active-color": "@gray-light",
352 | "@breadcrumb-separator": "\"/\"",
353 | "@carousel-text-shadow": "0 1px 2px rgba(0,0,0,.6)",
354 | "@carousel-control-color": "#fff",
355 | "@carousel-control-width": "15%",
356 | "@carousel-control-opacity": ".5",
357 | "@carousel-control-font-size": "20px",
358 | "@carousel-indicator-active-bg": "#fff",
359 | "@carousel-indicator-border-color": "#fff",
360 | "@carousel-caption-color": "#fff",
361 | "@close-font-weight": "bold",
362 | "@close-color": "#000",
363 | "@close-text-shadow": "0 1px 0 #fff",
364 | "@code-color": "#c7254e",
365 | "@code-bg": "#f9f2f4",
366 | "@kbd-color": "#fff",
367 | "@kbd-bg": "#333",
368 | "@pre-bg": "#f5f5f5",
369 | "@pre-color": "@gray-dark",
370 | "@pre-border-color": "#ccc",
371 | "@pre-scrollable-max-height": "340px",
372 | "@component-offset-horizontal": "180px",
373 | "@text-muted": "@gray-light",
374 | "@abbr-border-color": "@gray-light",
375 | "@headings-small-color": "@gray-light",
376 | "@blockquote-small-color": "@gray-light",
377 | "@blockquote-font-size": "(@font-size-base * 1.25)",
378 | "@blockquote-border-color": "@gray-lighter",
379 | "@page-header-border-color": "@gray-lighter",
380 | "@dl-horizontal-offset": "@component-offset-horizontal",
381 | "@hr-border": "@gray-lighter"
382 | },
383 | "css": [
384 | "type.less",
385 | "code.less",
386 | "grid.less",
387 | "forms.less",
388 | "buttons.less",
389 | "responsive-utilities.less",
390 | "button-groups.less",
391 | "input-groups.less",
392 | "labels.less",
393 | "jumbotron.less",
394 | "list-group.less",
395 | "panels.less",
396 | "wells.less"
397 | ],
398 | "js": [],
399 | "customizerUrl": "http://getbootstrap.com/customize/?id=e99cd99e17e9a1353c99"
400 | }
--------------------------------------------------------------------------------
/example/src/bootstrap/css/bootstrap-theme.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.3.5 (http://getbootstrap.com)
3 | * Copyright 2011-2015 Twitter, Inc.
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 | */
6 |
7 | /*!
8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=e99cd99e17e9a1353c99)
9 | * Config saved to config.json and https://gist.github.com/e99cd99e17e9a1353c99
10 | */
11 | /*!
12 | * Bootstrap v3.3.5 (http://getbootstrap.com)
13 | * Copyright 2011-2015 Twitter, Inc.
14 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15 | */
16 | .btn-default,
17 | .btn-primary,
18 | .btn-success,
19 | .btn-info,
20 | .btn-warning,
21 | .btn-danger {
22 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
23 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
24 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
25 | }
26 | .btn-default:active,
27 | .btn-primary:active,
28 | .btn-success:active,
29 | .btn-info:active,
30 | .btn-warning:active,
31 | .btn-danger:active,
32 | .btn-default.active,
33 | .btn-primary.active,
34 | .btn-success.active,
35 | .btn-info.active,
36 | .btn-warning.active,
37 | .btn-danger.active {
38 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
39 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
40 | }
41 | .btn-default.disabled,
42 | .btn-primary.disabled,
43 | .btn-success.disabled,
44 | .btn-info.disabled,
45 | .btn-warning.disabled,
46 | .btn-danger.disabled,
47 | .btn-default[disabled],
48 | .btn-primary[disabled],
49 | .btn-success[disabled],
50 | .btn-info[disabled],
51 | .btn-warning[disabled],
52 | .btn-danger[disabled],
53 | fieldset[disabled] .btn-default,
54 | fieldset[disabled] .btn-primary,
55 | fieldset[disabled] .btn-success,
56 | fieldset[disabled] .btn-info,
57 | fieldset[disabled] .btn-warning,
58 | fieldset[disabled] .btn-danger {
59 | -webkit-box-shadow: none;
60 | box-shadow: none;
61 | }
62 | .btn-default .badge,
63 | .btn-primary .badge,
64 | .btn-success .badge,
65 | .btn-info .badge,
66 | .btn-warning .badge,
67 | .btn-danger .badge {
68 | text-shadow: none;
69 | }
70 | .btn:active,
71 | .btn.active {
72 | background-image: none;
73 | }
74 | .btn-default {
75 | background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
76 | background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
77 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0));
78 | background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);
79 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
80 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
81 | background-repeat: repeat-x;
82 | border-color: #dbdbdb;
83 | text-shadow: 0 1px 0 #fff;
84 | border-color: #ccc;
85 | }
86 | .btn-default:hover,
87 | .btn-default:focus {
88 | background-color: #e0e0e0;
89 | background-position: 0 -15px;
90 | }
91 | .btn-default:active,
92 | .btn-default.active {
93 | background-color: #e0e0e0;
94 | border-color: #dbdbdb;
95 | }
96 | .btn-default.disabled,
97 | .btn-default[disabled],
98 | fieldset[disabled] .btn-default,
99 | .btn-default.disabled:hover,
100 | .btn-default[disabled]:hover,
101 | fieldset[disabled] .btn-default:hover,
102 | .btn-default.disabled:focus,
103 | .btn-default[disabled]:focus,
104 | fieldset[disabled] .btn-default:focus,
105 | .btn-default.disabled.focus,
106 | .btn-default[disabled].focus,
107 | fieldset[disabled] .btn-default.focus,
108 | .btn-default.disabled:active,
109 | .btn-default[disabled]:active,
110 | fieldset[disabled] .btn-default:active,
111 | .btn-default.disabled.active,
112 | .btn-default[disabled].active,
113 | fieldset[disabled] .btn-default.active {
114 | background-color: #e0e0e0;
115 | background-image: none;
116 | }
117 | .btn-primary {
118 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
119 | background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
120 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
121 | background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
122 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
123 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
124 | background-repeat: repeat-x;
125 | border-color: #245580;
126 | }
127 | .btn-primary:hover,
128 | .btn-primary:focus {
129 | background-color: #265a88;
130 | background-position: 0 -15px;
131 | }
132 | .btn-primary:active,
133 | .btn-primary.active {
134 | background-color: #265a88;
135 | border-color: #245580;
136 | }
137 | .btn-primary.disabled,
138 | .btn-primary[disabled],
139 | fieldset[disabled] .btn-primary,
140 | .btn-primary.disabled:hover,
141 | .btn-primary[disabled]:hover,
142 | fieldset[disabled] .btn-primary:hover,
143 | .btn-primary.disabled:focus,
144 | .btn-primary[disabled]:focus,
145 | fieldset[disabled] .btn-primary:focus,
146 | .btn-primary.disabled.focus,
147 | .btn-primary[disabled].focus,
148 | fieldset[disabled] .btn-primary.focus,
149 | .btn-primary.disabled:active,
150 | .btn-primary[disabled]:active,
151 | fieldset[disabled] .btn-primary:active,
152 | .btn-primary.disabled.active,
153 | .btn-primary[disabled].active,
154 | fieldset[disabled] .btn-primary.active {
155 | background-color: #265a88;
156 | background-image: none;
157 | }
158 | .btn-success {
159 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
160 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
161 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
162 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
163 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
164 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
165 | background-repeat: repeat-x;
166 | border-color: #3e8f3e;
167 | }
168 | .btn-success:hover,
169 | .btn-success:focus {
170 | background-color: #419641;
171 | background-position: 0 -15px;
172 | }
173 | .btn-success:active,
174 | .btn-success.active {
175 | background-color: #419641;
176 | border-color: #3e8f3e;
177 | }
178 | .btn-success.disabled,
179 | .btn-success[disabled],
180 | fieldset[disabled] .btn-success,
181 | .btn-success.disabled:hover,
182 | .btn-success[disabled]:hover,
183 | fieldset[disabled] .btn-success:hover,
184 | .btn-success.disabled:focus,
185 | .btn-success[disabled]:focus,
186 | fieldset[disabled] .btn-success:focus,
187 | .btn-success.disabled.focus,
188 | .btn-success[disabled].focus,
189 | fieldset[disabled] .btn-success.focus,
190 | .btn-success.disabled:active,
191 | .btn-success[disabled]:active,
192 | fieldset[disabled] .btn-success:active,
193 | .btn-success.disabled.active,
194 | .btn-success[disabled].active,
195 | fieldset[disabled] .btn-success.active {
196 | background-color: #419641;
197 | background-image: none;
198 | }
199 | .btn-info {
200 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
201 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
202 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
203 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
204 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
205 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
206 | background-repeat: repeat-x;
207 | border-color: #28a4c9;
208 | }
209 | .btn-info:hover,
210 | .btn-info:focus {
211 | background-color: #2aabd2;
212 | background-position: 0 -15px;
213 | }
214 | .btn-info:active,
215 | .btn-info.active {
216 | background-color: #2aabd2;
217 | border-color: #28a4c9;
218 | }
219 | .btn-info.disabled,
220 | .btn-info[disabled],
221 | fieldset[disabled] .btn-info,
222 | .btn-info.disabled:hover,
223 | .btn-info[disabled]:hover,
224 | fieldset[disabled] .btn-info:hover,
225 | .btn-info.disabled:focus,
226 | .btn-info[disabled]:focus,
227 | fieldset[disabled] .btn-info:focus,
228 | .btn-info.disabled.focus,
229 | .btn-info[disabled].focus,
230 | fieldset[disabled] .btn-info.focus,
231 | .btn-info.disabled:active,
232 | .btn-info[disabled]:active,
233 | fieldset[disabled] .btn-info:active,
234 | .btn-info.disabled.active,
235 | .btn-info[disabled].active,
236 | fieldset[disabled] .btn-info.active {
237 | background-color: #2aabd2;
238 | background-image: none;
239 | }
240 | .btn-warning {
241 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
242 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
243 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
244 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
245 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
246 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
247 | background-repeat: repeat-x;
248 | border-color: #e38d13;
249 | }
250 | .btn-warning:hover,
251 | .btn-warning:focus {
252 | background-color: #eb9316;
253 | background-position: 0 -15px;
254 | }
255 | .btn-warning:active,
256 | .btn-warning.active {
257 | background-color: #eb9316;
258 | border-color: #e38d13;
259 | }
260 | .btn-warning.disabled,
261 | .btn-warning[disabled],
262 | fieldset[disabled] .btn-warning,
263 | .btn-warning.disabled:hover,
264 | .btn-warning[disabled]:hover,
265 | fieldset[disabled] .btn-warning:hover,
266 | .btn-warning.disabled:focus,
267 | .btn-warning[disabled]:focus,
268 | fieldset[disabled] .btn-warning:focus,
269 | .btn-warning.disabled.focus,
270 | .btn-warning[disabled].focus,
271 | fieldset[disabled] .btn-warning.focus,
272 | .btn-warning.disabled:active,
273 | .btn-warning[disabled]:active,
274 | fieldset[disabled] .btn-warning:active,
275 | .btn-warning.disabled.active,
276 | .btn-warning[disabled].active,
277 | fieldset[disabled] .btn-warning.active {
278 | background-color: #eb9316;
279 | background-image: none;
280 | }
281 | .btn-danger {
282 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
283 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
284 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
285 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
286 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
287 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
288 | background-repeat: repeat-x;
289 | border-color: #b92c28;
290 | }
291 | .btn-danger:hover,
292 | .btn-danger:focus {
293 | background-color: #c12e2a;
294 | background-position: 0 -15px;
295 | }
296 | .btn-danger:active,
297 | .btn-danger.active {
298 | background-color: #c12e2a;
299 | border-color: #b92c28;
300 | }
301 | .btn-danger.disabled,
302 | .btn-danger[disabled],
303 | fieldset[disabled] .btn-danger,
304 | .btn-danger.disabled:hover,
305 | .btn-danger[disabled]:hover,
306 | fieldset[disabled] .btn-danger:hover,
307 | .btn-danger.disabled:focus,
308 | .btn-danger[disabled]:focus,
309 | fieldset[disabled] .btn-danger:focus,
310 | .btn-danger.disabled.focus,
311 | .btn-danger[disabled].focus,
312 | fieldset[disabled] .btn-danger.focus,
313 | .btn-danger.disabled:active,
314 | .btn-danger[disabled]:active,
315 | fieldset[disabled] .btn-danger:active,
316 | .btn-danger.disabled.active,
317 | .btn-danger[disabled].active,
318 | fieldset[disabled] .btn-danger.active {
319 | background-color: #c12e2a;
320 | background-image: none;
321 | }
322 | .thumbnail,
323 | .img-thumbnail {
324 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
325 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
326 | }
327 | .dropdown-menu > li > a:hover,
328 | .dropdown-menu > li > a:focus {
329 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
330 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
331 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
332 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
333 | background-repeat: repeat-x;
334 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
335 | background-color: #e8e8e8;
336 | }
337 | .dropdown-menu > .active > a,
338 | .dropdown-menu > .active > a:hover,
339 | .dropdown-menu > .active > a:focus {
340 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
341 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
342 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
343 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
344 | background-repeat: repeat-x;
345 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
346 | background-color: #2e6da4;
347 | }
348 | .navbar-default {
349 | background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
350 | background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
351 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));
352 | background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);
353 | background-repeat: repeat-x;
354 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
355 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
356 | border-radius: 4px;
357 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
358 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
359 | }
360 | .navbar-default .navbar-nav > .open > a,
361 | .navbar-default .navbar-nav > .active > a {
362 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
363 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
364 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
365 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
366 | background-repeat: repeat-x;
367 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
368 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
369 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
370 | }
371 | .navbar-brand,
372 | .navbar-nav > li > a {
373 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
374 | }
375 | .navbar-inverse {
376 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);
377 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);
378 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222222));
379 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);
380 | background-repeat: repeat-x;
381 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
382 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
383 | border-radius: 4px;
384 | }
385 | .navbar-inverse .navbar-nav > .open > a,
386 | .navbar-inverse .navbar-nav > .active > a {
387 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
388 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
389 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
390 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
391 | background-repeat: repeat-x;
392 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
393 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
394 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
395 | }
396 | .navbar-inverse .navbar-brand,
397 | .navbar-inverse .navbar-nav > li > a {
398 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
399 | }
400 | .navbar-static-top,
401 | .navbar-fixed-top,
402 | .navbar-fixed-bottom {
403 | border-radius: 0;
404 | }
405 | @media (max-width: 767px) {
406 | .navbar .navbar-nav .open .dropdown-menu > .active > a,
407 | .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
408 | .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
409 | color: #fff;
410 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
411 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
412 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
413 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
414 | background-repeat: repeat-x;
415 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
416 | }
417 | }
418 | .alert {
419 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
420 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
421 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
422 | }
423 | .alert-success {
424 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
425 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
426 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
427 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
428 | background-repeat: repeat-x;
429 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
430 | border-color: #b2dba1;
431 | }
432 | .alert-info {
433 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
434 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
435 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
436 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
437 | background-repeat: repeat-x;
438 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
439 | border-color: #9acfea;
440 | }
441 | .alert-warning {
442 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
443 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
444 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
445 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
446 | background-repeat: repeat-x;
447 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
448 | border-color: #f5e79e;
449 | }
450 | .alert-danger {
451 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
452 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
453 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
454 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
455 | background-repeat: repeat-x;
456 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
457 | border-color: #dca7a7;
458 | }
459 | .progress {
460 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
461 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
462 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
463 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
464 | background-repeat: repeat-x;
465 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
466 | }
467 | .progress-bar {
468 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
469 | background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
470 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
471 | background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
472 | background-repeat: repeat-x;
473 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
474 | }
475 | .progress-bar-success {
476 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
477 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
478 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
479 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
480 | background-repeat: repeat-x;
481 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
482 | }
483 | .progress-bar-info {
484 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
485 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
486 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
487 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
488 | background-repeat: repeat-x;
489 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
490 | }
491 | .progress-bar-warning {
492 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
493 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
494 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
495 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
496 | background-repeat: repeat-x;
497 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
498 | }
499 | .progress-bar-danger {
500 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
501 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
502 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
503 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
504 | background-repeat: repeat-x;
505 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
506 | }
507 | .progress-bar-striped {
508 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
509 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
510 | background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
511 | }
512 | .list-group {
513 | border-radius: 4px;
514 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
515 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
516 | }
517 | .list-group-item.active,
518 | .list-group-item.active:hover,
519 | .list-group-item.active:focus {
520 | text-shadow: 0 -1px 0 #286090;
521 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
522 | background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
523 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
524 | background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
525 | background-repeat: repeat-x;
526 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
527 | border-color: #2b669a;
528 | }
529 | .list-group-item.active .badge,
530 | .list-group-item.active:hover .badge,
531 | .list-group-item.active:focus .badge {
532 | text-shadow: none;
533 | }
534 | .panel {
535 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
536 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
537 | }
538 | .panel-default > .panel-heading {
539 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
540 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
541 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
542 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
543 | background-repeat: repeat-x;
544 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
545 | }
546 | .panel-primary > .panel-heading {
547 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
548 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
549 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
550 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
551 | background-repeat: repeat-x;
552 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
553 | }
554 | .panel-success > .panel-heading {
555 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
556 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
557 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
558 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
559 | background-repeat: repeat-x;
560 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
561 | }
562 | .panel-info > .panel-heading {
563 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
564 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
565 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
566 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
567 | background-repeat: repeat-x;
568 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
569 | }
570 | .panel-warning > .panel-heading {
571 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
572 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
573 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
574 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
575 | background-repeat: repeat-x;
576 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
577 | }
578 | .panel-danger > .panel-heading {
579 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
580 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
581 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
582 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
583 | background-repeat: repeat-x;
584 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
585 | }
586 | .well {
587 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
588 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
589 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
590 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
591 | background-repeat: repeat-x;
592 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
593 | border-color: #dcdcdc;
594 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
595 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
596 | }
597 |
--------------------------------------------------------------------------------
/example/src/bootstrap/css/bootstrap-theme.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.3.5 (http://getbootstrap.com)
3 | * Copyright 2011-2015 Twitter, Inc.
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 | */
6 |
7 | /*!
8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=e99cd99e17e9a1353c99)
9 | * Config saved to config.json and https://gist.github.com/e99cd99e17e9a1353c99
10 | *//*!
11 | * Bootstrap v3.3.5 (http://getbootstrap.com)
12 | * Copyright 2011-2015 Twitter, Inc.
13 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
14 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-default.disabled,.btn-primary.disabled,.btn-success.disabled,.btn-info.disabled,.btn-warning.disabled,.btn-danger.disabled,.btn-default[disabled],.btn-primary[disabled],.btn-success[disabled],.btn-info[disabled],.btn-warning[disabled],.btn-danger[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-info,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-danger{-webkit-box-shadow:none;box-shadow:none}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-o-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#e0e0e0));background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top, #337ab7 0, #265a88 100%);background-image:-o-linear-gradient(top, #337ab7 0, #265a88 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#265a88));background-image:linear-gradient(to bottom, #337ab7 0, #265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#245580}.btn-primary:hover,.btn-primary:focus{background-color:#265a88;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#419641));background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#2aabd2));background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#eb9316));background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c12e2a));background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-o-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#f8f8f8));background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-o-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dbdbdb), to(#e2e2e2));background-image:linear-gradient(to bottom, #dbdbdb 0, #e2e2e2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-o-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #3c3c3c), to(#222));background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-o-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #080808), to(#0f0f0f));background-image:linear-gradient(to bottom, #080808 0, #0f0f0f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#c8e5bc));background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#b9def0));background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#f8efc0));background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-o-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#e7c3c3));background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ebebeb), to(#f5f5f5));background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-o-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#286090));background-image:linear-gradient(to bottom, #337ab7 0, #286090 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#449d44));background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#31b0d5));background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#ec971f));background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c9302c));background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top, #337ab7 0, #2b669a 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2b669a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2b669a));background-image:linear-gradient(to bottom, #337ab7 0, #2b669a 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#d0e9c6));background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#c4e3f3));background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#faf2cc));background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-o-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#ebcccc));background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e8e8e8), to(#f5f5f5));background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}
--------------------------------------------------------------------------------
/example/src/bootstrap/css/bootstrap.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.3.5 (http://getbootstrap.com)
3 | * Copyright 2011-2015 Twitter, Inc.
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 | */
6 |
7 | /*!
8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=e99cd99e17e9a1353c99)
9 | * Config saved to config.json and https://gist.github.com/e99cd99e17e9a1353c99
10 | *//*!
11 | * Bootstrap v3.3.5 (http://getbootstrap.com)
12 | * Copyright 2011-2015 Twitter, Inc.
13 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
14 | *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:790px}}@media (min-width:1200px){.container{width:790px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.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{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.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{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.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{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.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{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;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"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;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}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.333333px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.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:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-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>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.panel-body:before,.panel-body:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.panel-body:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}
--------------------------------------------------------------------------------
/example/src/index.html:
--------------------------------------------------------------------------------
1 |
26 |
27 |
28 |
29 |
30 |
31 | React Readalong Component
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
Readalong
42 |
43 |
44 | A React component that uses the Speech Synthesis API to read text out loud by sentence or word
45 | while the user follows along with their mouse or finger
46 |
47 |
48 |
49 | Github
51 | Talking Bibles
53 |
54 |
55 |
56 |
57 |
60 |
61 |
Installation
62 |
63 | The easiest way to use Readalong is to install it from NPM and include it in your own React build process (using
64 | Browserify , Webpack , etc).
65 |
66 |
67 |
68 | You can also use the standalone build by including dist/react-readalong-component.js in your page.
69 | If you use this, make sure you have already included React, and it is available as a global variable.
70 |
71 |
72 |
73 | npm install react-readalong-component --save
74 |
75 |
76 |
Usage
77 |
78 |
79 | The component provides a single React element, Readalong
, that takes three properties and some text
80 | content. The properties of lang
and delimiter
can be provided as attributes. The property
81 | voiceName
should be passed after the browser registers the available Speech Synthesis voices. The
82 | browser will use its default voice until a valid, different voice is passed. The component will attempt to choose a
83 | default voice based on the passed lang
property, but this is hit-or-miss.
84 |
85 |
86 |
87 | The output of the component receives three classes for use with styling. The outer wrapper has the class,
88 | readalong
. Every readable phrase is wrapped in a span with the readalong-phrase
class.
89 | While a phrase is being spoken, the corresponding span also receives a readalong-active
class. This
90 | can be used, as in the examples below, to keep the phrase highlighted after the user moves off or releases her
91 | finger.
92 |
93 |
94 |
95 | It is advisable to make the font size as large as possible for the contents of a Readalong element. This is
96 | especially true if the delimiter is set to word
.
97 |
98 |
99 |
Compatibility
100 |
101 |
102 | This component depends on two experimental, draft APIs: Pointer
103 | Events and Speech Synthesis .
104 |
105 |
106 |
107 | As of July 12, 2015, the Web Speech API is still an unofficial proposal. As such, right out
108 | of the box this component will only work in about half of all browsers. Those include recent versions of Chrome,
109 | Opera, and Safari. Ostensibly, iOS Safari is supported, but Speech Synthesis seems to work in that browser only
110 | sporadically. All other browsers will need a polyfill. There is no polyfill for Speech Synthesis currently
111 | installed on this demonstration page.
112 |
113 |
114 |
115 | Again, as of the time of this commit, the Pointer Events API is very poorly supported across all browsers. Only
116 | IE and very late version Firefox have implemented it. There's no getting away without a polyfill for Pointer
117 | Events. They power the cursor/finger recognition. Fortunately, Google/jQuery have put together a fantastic
118 | polyfill called PEP , which is providing cross-browser capability for
119 | this page. It does not require jQuery as a dependency.
120 |
121 |
122 |
123 | This component intentionally does not include polyfills. There are many polyfill options, and the one you choose
124 | will depend on the needs of your project. The component also intentionally does check whether the Speech Synthesis
125 | API is available. Readalong assumes that both window.speechSynthesis
and the
126 | SpeechSynthesisUtterance
object are available, and that they are up-to-date with the unofficial
127 | proposal.
128 |
129 |
130 |
License
131 |
132 |
133 | The constants, regular expressions, and punctuation encoding used in this project were originally lifted from
134 | Blast.js , built by Julian Shapiro. These have been modified
135 | to fit the particular requirements of this project, including the addition of the Chinese punctuation.
136 |
137 |
138 |
139 | Blast.js. MIT License. Copyright 2014 Julian Shapiro
140 | Readalong. MIT License. Copyright 2015 Talking Bibles International and Stephen Clay Smith
141 |
142 |
143 |
146 |
147 |
148 | This delimiter and voice selection form that is shown in some of the following examples is not
149 | included in the Readalong component. Consult the DelimitedParagraph
component in the
150 | examples directory for ideas about implementing something similar in your app.
151 |
152 |
153 |
Basic Example
154 |
155 |
156 | Hover over or tap any word to hear it read out loud by your browser. The speech will continue even if the user
157 | moves away or releases her finger.
158 |
159 |
160 |
163 |
164 |
CODE
165 |
166 | <Readalong lang="en-US" delimiter="word">
167 | There once was an old woman who lived in a shoe.
168 | She was underwater on her mortgage. What would she do?
169 | </Readalong>
170 |
171 |
172 |
Example with Silent Element
173 |
174 |
Readalong will ignore any text wrapped in an element with the silent
attribute.
175 |
176 |
179 |
180 |
CODE
181 |
182 | <Readalong lang="en-US" delimiter="word">
183 | <blockquote>
184 | <p>
185 | This sentence has five words. Here are five more words. Five-
186 | word sentences are fine. But several together become monotonous.
187 | Listen to what is happening. The writing is getting boring. The
188 | sound of it drones. It’s like a stuck record. The ear
189 | demands some variety. Now listen. I vary the sentence length,
190 | and I create music. Music. The writing sings. It has a pleasant
191 | rhythm, a lilt, a harmony. I use short sentences. And I use
192 | sentences of medium length. And sometimes, when I am certain the
193 | reader is rested, I will engage him with a sentence of
194 | considerable length, a sentence that burns with energy and
195 | builds with all the impetus of a crescendo, the roll of the
196 | drums, the crash of the cymbals–sounds that say listen to
197 | this, it is important.
198 | </p>
199 |
200 | <footer silent><cite>Gary Provost</cite></footer>
201 | </blockquote>
202 | </Readalong>
203 |
204 |
205 |
206 |
Example with Multiple Elements
207 |
208 |
209 | Readalong can process multiple blocks of text in the same component. Attributes on those inner elements will be
210 | passed through to the final output.
211 |
212 |
213 |
216 |
217 |
CODE
218 |
219 | <Readalong lang="en-US" delimiter="word">
220 | <p>
221 | <span data-verse="1">In the beginning was the Word, and the
222 | Word was with God, and the Word was God.</span> <span data-
223 | <verse="2">The same was in the beginning with God.</span>
224 | <span data-verse="3">All things were made through him.
225 | Without him, nothing was made that has been made.</span>
226 | <span data-verse="4">In him was life, and the life was the
227 | light of men.</span> <span data-verse="5">The light shines in
228 | the darkness, and the darkness hasn’t overcome it.</span>
229 | </p>
230 |
231 | <p>
232 | <span data-verse="6">There came a man, sent from God, whose
233 | name was John.</span> <span data-verse="7">The same came as
234 | a witness, that he might testify about the light, that all
235 | might believe through him.</span> <span data-verse="8">He was
236 | not the light, but was sent that he might testify about the
237 | light.</span> <span data-verse="9">The true light that
238 | enlightens everyone was coming into the world.</span>
239 | </p>
240 | </Readalong>
241 |
242 |
243 |
244 |
Example with Foreign Language
245 |
246 |
Readalong supports any language that uses European or Chinese punctuation marks and is also supported
247 | by the browser's Speech Synthesis API.
248 |
249 |
Spanish
250 |
251 |
254 |
255 |
CODE
256 |
257 | <Readalong lang="es" delimiter="sentence">
258 | <p>
259 | En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
260 | no ha mucho tiempo que vivía un hidalgo de los de lanza en
261 | astillero, adarga antigua, rocín flaco y galgo corredor. Una
262 | olla de algo más vaca que carnero, salpicón las más noches,
263 | duelos y quebrantos los sábados, lentejas los viernes, algún
264 | palomino de añadidura los domingos, consumían las tres partes
265 | de su hacienda. El resto della concluían sayo de velarte,
266 | calzas de velludo para las fiestas con sus pantuflos de lo
267 | mismo, los días de entre semana se honraba con su vellori de
268 | lo más fino. Tenía en su casa una ama que pasaba de los
269 | cuarenta, y una sobrina que no llegaba a los veinte, y un mozo
270 | de campo y plaza, que así ensillaba el rocín como tomaba la
271 | podadera. Frisaba la edad de nuestro hidalgo con los cincuenta
272 | años, era de complexión recia, seco de carnes, enjuto de
273 | rostro; gran madrugador y amigo de la caza. Quieren decir que
274 | tenía el sobrenombre de Quijada o Quesada (que en esto hay
275 | alguna diferencia en los autores que deste caso escriben),
276 | aunque por conjeturas verosímiles se deja entender que se
277 | llama Quijana; pero esto importa poco a nuestro cuento; basta
278 | que en la narración dél no se salga un punto de la verdad.
279 | </p>
280 | </Readalong>
281 |
282 |
283 |
Chinese
284 |
287 |
288 |
CODE
289 |
290 | <Readalong lang="es" delimiter="sentence">
291 | <p>
292 | <i silent>1</i>太 初 有 道 , 道 与 神 同 在 , 道 就 是 神 。
293 | <i silent>2</i>这 道 太 初 与 神 同 在 。 <i silent>3</i>万 物 是
294 | 藉 着 他 造 的 ; 凡 被 造 的 , 没 有 一 样 不 是 藉 着 他 造 的 。
295 | <i silent>4</i>生 命 在 他 里 头 , 这 生 命 就 是 人 的 光 。
296 | <i silent>5</i>光 照 在 黑 暗 里 , 黑 暗 却 不 接 受 光 。
297 | <i silent>6</i>有 一 个 人 , 是 从 神 那 里 差 来 的 , 名 叫 约 翰 。
298 | <i silent>7</i>这 人 来 , 为 要 作 见 证 , 就 是 为 光 作 见 证 ,
299 | 叫 众 人 因 他 可 以 信 。 <i silent>8</i>他 不 是 那 光 , 乃 是 要
300 | 为 光 作 见 证 。 <i silent>9</i>那 光 是 真 光 , 照 亮 一 切 生
301 | 在 世 上 的 人 。
302 | </p>
303 | </Readalong>
304 |
305 |
306 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
--------------------------------------------------------------------------------
/gulpconfig.js:
--------------------------------------------------------------------------------
1 | /*
2 | * This file controls the behaviour of the build tasks in gulpfile.js
3 | */
4 |
5 | var COMPONENT_NAME = 'Readalong';
6 |
7 | // Read the package.json to detect the package name and dependencies
8 | var pkg = JSON.parse(require('fs').readFileSync('./package.json'));
9 |
10 | // Default dependencies from package.json, except reactify (which is used for
11 | // the build). Dependencies can be customised by hard-coding this array.
12 | var dependencies = [];
13 | Object.keys(pkg.peerDependencies).forEach(function(i) {
14 | if (i !== 'reactify') dependencies.push(i);
15 | });
16 |
17 | module.exports = {
18 |
19 | component: {
20 | // This is the source (entry) file for the component
21 | file: COMPONENT_NAME + '.js',
22 | // The component name controls the standalone module name
23 | name: COMPONENT_NAME,
24 | // This is the directory to load the source file from
25 | src: 'src',
26 | // This is the directory to build the distribution to
27 | dist: 'dist',
28 | // This is the name of the package that will be exported
29 | // by the component file. It must match the name of your
30 | // package on npm
31 | pkgName: pkg.name,
32 | // The package dependencies are automatically build into
33 | // a common bundle for the examples and excluded from the
34 | // package build.
35 | dependencies: dependencies
36 | },
37 |
38 | example: {
39 | // This is the directory to load the source files from
40 | src: 'example/src',
41 | // This is the directory to build the distribution to
42 | dist: 'example/dist',
43 | // Files will be copied as-is into the example dist folder
44 | files: [
45 | 'index.html'
46 | ],
47 | // Scripts will be bundled by browserify and reactify
48 | scripts: [
49 | 'app.js'
50 | ],
51 | // Stylesheets will be built by less
52 | stylesheets: [
53 | 'app.less'
54 | ]
55 | }
56 |
57 | };
58 |
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var gulp = require('gulp-help')(require('gulp'));
4 | var initGulpTasks = require('react-component-gulp-tasks');
5 | var ghPages = require('gulp-gh-pages');
6 |
7 |
8 | /**
9 | * Task configuration is loaded from config.js
10 | *
11 | * Make any changes to the source or distribution files
12 | * and directory configuration there
13 | */
14 |
15 | var config = require('./gulpconfig');
16 |
17 |
18 | /**
19 | * Tasks are added by the react-component-gulp-tasks package
20 | *
21 | * See https://github.com/JedWatson/react-component-gulp-tasks
22 | * for documentation.
23 | *
24 | * You can also add your own additional gulp tasks if you like.
25 | */
26 |
27 | initGulpTasks(gulp, config);
28 |
29 | gulp.task('deploy', ['build'], function() {
30 | return gulp.src('./example/dist/**/*')
31 | .pipe(ghPages());
32 | });
33 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-readalong-component",
3 | "description": "A React component that uses the Speech Synthesis API to read text out loud by sentence or word while the user follows along with their mouse or finger",
4 | "homepage": "https://talkingbibles.github.io/react-readalong-component",
5 | "version": "1.1.4",
6 | "license": "MIT",
7 | "main": "src/Readalong.js",
8 | "author": {
9 | "name": "Talking Bibles",
10 | "email": "devops@talkingbibles.org",
11 | "url": "http://www.talkingbibles.org/"
12 | },
13 | "contributors": [
14 | {
15 | "name": "talkingbibles",
16 | "email": "devops@talkingbibles.org",
17 | "url": "http://www.talkingbibles.org/"
18 | },
19 | {
20 | "name": "stphnclysmth",
21 | "email": "s.clay.smith@gmail.com",
22 | "url": "http://janineandclay.com/"
23 | }
24 | ],
25 | "repository": {
26 | "type": "git",
27 | "url": "https://github.com/TalkingBibles/react-readalong-component"
28 | },
29 | "bugs": {
30 | "url": "https://github.com/TalkingBibles/react-readalong-component/issues",
31 | "email": "devops@talkingbibles.org"
32 | },
33 | "peerDependencies": {
34 | "react": "0.13.x"
35 | },
36 | "dependencies": {},
37 | "devDependencies": {
38 | "eslint": "^0.24.1",
39 | "eslint-plugin-react": "^2.7.1",
40 | "gulp": "^3.8.10",
41 | "gulp-gh-pages": "^0.5.2",
42 | "gulp-help": "^1.6.0",
43 | "highlight.js": "^8.6.0",
44 | "jest-cli": "^0.4.15",
45 | "pepjs": "^0.3.0",
46 | "react": "^0.13.3",
47 | "react-component-gulp-tasks": "^0.1.1",
48 | "react-tools": "^0.13.3",
49 | "reactify": "^1.1.1"
50 | },
51 | "browser": "src/Readalong.js",
52 | "browserify": {
53 | "transform": [
54 | "reactify"
55 | ]
56 | },
57 | "browserify-shim": {
58 | "react": "global:React"
59 | },
60 | "jest": {
61 | "unmockedModulePathPatterns": [
62 | "react"
63 | ],
64 | "modulePathIgnorePatterns": [
65 | "/.publish/",
66 | "/dist/",
67 | "/example/"
68 | ],
69 | "testDirectoryName": "tests"
70 | },
71 | "scripts": {
72 | "test": "jest tests"
73 | },
74 | "keywords": [
75 | "react",
76 | "react-component",
77 | "speech synthesis",
78 | "tts",
79 | "text-to-speech",
80 | "web speech"
81 | ],
82 | "engines": {
83 | "node": ">=0.10.32",
84 | "npm": ">=1.4.28"
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/src/Phrase.js:
--------------------------------------------------------------------------------
1 | /**
2 |
3 | The MIT License (MIT)
4 |
5 | Copyright (c) 2015 Talking Bibles International and Stephen Clay Smith
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the "Software"), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 | The above copyright notice and this permission notice shall be included in all
15 | copies or substantial portions of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | SOFTWARE.
24 |
25 | */
26 |
27 | 'use strict';
28 |
29 | var React = require('react');
30 | var PureRenderMixin = require('react/addons').addons.PureRenderMixin;
31 |
32 |
33 | /*************************
34 | React custom attrs shim
35 | *************************/
36 |
37 | var DOMProperty = require('react/lib/ReactInjection').DOMProperty;
38 | DOMProperty.injectDOMPropertyConfig({
39 | Properties: {
40 | 'touchAction': DOMProperty.MUST_USE_ATTRIBUTE
41 | }
42 | });
43 |
44 | /*************************
45 | Constants
46 | *************************/
47 |
48 | var timeoutDelay = 500;
49 | var maxPhraseLength = 180;
50 |
51 |
52 | /*************************
53 | Utilities
54 | *************************/
55 |
56 | function chunkString(str, length) {
57 | return str.match(new RegExp('[\\s\\S]{1,' + length + '}(?:\\s|$)', 'g'));
58 | }
59 |
60 |
61 | /*************************
62 | Component
63 | *************************/
64 |
65 | var Phrase = React.createClass({
66 |
67 | /*
68 | * Component setup
69 | */
70 |
71 | displayName: 'Phrase',
72 |
73 | propTypes: {
74 | children: React.PropTypes.node.isRequired,
75 | lang: React.PropTypes.string.isRequired,
76 | voice: React.PropTypes.object
77 | },
78 |
79 | mixins: [PureRenderMixin],
80 |
81 | getInitialState: function() {
82 | return {
83 | activeClass: ''
84 | };
85 | },
86 |
87 | componentDidMount: function() {
88 | var el = this.getDOMNode();
89 |
90 | this.getDOMNode().setAttribute('touch-action', 'none');
91 |
92 | el.addEventListener('pointerover', this._pointerEnter);
93 | el.addEventListener('pointerout', this._pointerLeave);
94 | },
95 |
96 |
97 | /*
98 | * Variables
99 | */
100 |
101 | _leaveTimeout: null,
102 |
103 |
104 | /*
105 | * User interface
106 | */
107 |
108 | _activatePhrase: function() {
109 | this.setState({
110 | activeClass: 'readalong-active'
111 | });
112 | },
113 |
114 | _deactivatePhrase: function() {
115 | this.setState({
116 | activeClass: ''
117 | });
118 | },
119 |
120 |
121 | /*
122 | * Pointer Events
123 | */
124 |
125 | _pointerEnter: function(e) {
126 | e.stopPropagation();
127 |
128 | // Do not speak again if this is a reentry
129 | if (typeof this._leaveTimeout !== 'number') {
130 | this._speak();
131 | } else {
132 | this._stopWaitingForReentry();
133 | }
134 |
135 | this._activatePhrase();
136 | },
137 |
138 | _pointerLeave: function(e) {
139 | e.stopPropagation();
140 |
141 | if (window.speechSynthesis.speaking) {
142 | if (typeof this._leaveTimeout !== 'number') {
143 | this._leaveTimeout = window.setTimeout(this._stopWaitingForReentry, timeoutDelay);
144 | }
145 |
146 | return;
147 | }
148 |
149 | this._deactivatePhrase();
150 | },
151 |
152 | _stopWaitingForReentry: function() {
153 | delete this._leaveTimeout;
154 | },
155 |
156 |
157 | /*
158 | * Speech Synthesis
159 | */
160 |
161 | _speak: function() {
162 | window.speechSynthesis.cancel();
163 |
164 | var phrases = chunkString(this.props.children, maxPhraseLength);
165 |
166 | var utterances = phrases.map(function(phrase) {
167 | var msg = new SpeechSynthesisUtterance();
168 | msg.text = phrase;
169 | msg.lang = this.props.lang;
170 |
171 | if (typeof this.props.voice === 'object') {
172 | msg.voice = this.props.voice;
173 | }
174 |
175 | msg.addEventListener('end', this._speechDidEnd);
176 | msg.addEventListener('error', this._speechDidError);
177 |
178 | return msg;
179 | }, this);
180 |
181 | utterances.forEach(function (utterance) {
182 | window.speechSynthesis.speak(utterance);
183 | });
184 | },
185 |
186 |
187 | /*
188 | * Speech Synthesis callbacks
189 | */
190 |
191 | _speechDidEnd: function() {
192 | this._stopWaitingForReentry();
193 | this._deactivatePhrase();
194 | },
195 |
196 | _speechDidError: function(error) {
197 | console.error(error);
198 |
199 | this._speechDidEnd();
200 | },
201 |
202 |
203 | /*
204 | * Render
205 | */
206 |
207 | render: function () {
208 | return React.createElement('span', {
209 | ariaHidden: 'true',
210 | touchAction: 'none',
211 | className: 'readalong-phrase ' + this.state.activeClass
212 | },
213 | this.props.children
214 | );
215 | }
216 | });
217 |
218 | module.exports = Phrase;
219 |
--------------------------------------------------------------------------------
/src/Readalong.js:
--------------------------------------------------------------------------------
1 | /**
2 |
3 | The MIT License (MIT)
4 |
5 | Copyright (c) 2015 Talking Bibles International and Stephen Clay Smith
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the 'Software'), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 | The above copyright notice and this permission notice shall be included in all
15 | copies or substantial portions of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | SOFTWARE.
24 |
25 | */
26 |
27 | 'use strict';
28 |
29 | var React = require('react');
30 | var PureRenderMixin = require('react/addons').addons.PureRenderMixin;
31 | var isValidElement = require('react/addons').isValidElement;
32 | var Phrase = require('./Phrase');
33 |
34 |
35 | /*************************
36 | Constants
37 | *************************/
38 |
39 | var characterRanges = {
40 | latinLetters: '\\u0041-\\u005A\\u0061-\\u007A\\u00C0-\\u017F\\u0100-\\u01FF\\u0180-\\u027F'
41 | };
42 |
43 | var regExp = {
44 | abbreviations: new RegExp('[^' + characterRanges.latinLetters + '](e\\.g\\.)|(i\\.e\\.)|(mr\\.)|(mrs\\.)|(ms\\.)|(dr\\.)|(prof\\.)|(esq\\.)|(sr\\.)|(jr\\.)[^' + characterRanges.latinLetters + ']', 'ig'),
45 | innerWordPeriod: new RegExp('[0-9' + characterRanges.latinLetters + ']\\.[0-9' + characterRanges.latinLetters + ']', 'ig')
46 | };
47 |
48 |
49 | /*************************
50 | Punctuation Escaping
51 | *************************/
52 |
53 | /*
54 | Escape likely false-positives of sentence-final periods. Escaping is performed by wrapping a character's ASCII
55 | equivalent in double curly brackets, which is then reversed (deencodcoded) after delimiting.
56 | */
57 | function encodePunctuation(text) {
58 | return text
59 | /* Escape the following Latin abbreviations and English titles: e.g., i.e., Mr., Mrs., Ms., Dr., Prof., Esq., Sr., and Jr. */
60 | .replace(regExp.abbreviations, function (match) {
61 | return match.replace(/\./g, '{{46}}');
62 | })
63 | /* Escape inner-word (non-space-delimited) periods. For example, the period inside 'Blast.js'. */
64 | .replace(regExp.innerWordPeriod, function (match) {
65 | return match.replace(/\./g, '{{46}}');
66 | });
67 | }
68 |
69 | /*
70 | Used to decode both the output of encodePunctuation() and punctuation that has been manually escaped by users.
71 | */
72 | function decodePunctuation(text) {
73 | return text.replace(/{{(\d{1,3})}}/g, function (fullMatch, subMatch) {
74 | return String.fromCharCode(subMatch);
75 | });
76 | }
77 |
78 | /*************************
79 | Delimiter Creation
80 | *************************/
81 |
82 | function getDelimiterRegex(delimiter) {
83 | switch (delimiter) {
84 | case 'word':
85 | /* Matches strings in between space characters. */
86 | /* Note: Matches will include any punctuation that's adjoined to the word, e.g. 'Hey!' will be a full match. */
87 | /* Note: Remember that, with Blast, every HTML element marks the start of a brand new string. Hence, 'insi de' matches as three separate words. */
88 | return /\s*(\S+)\s*/;
89 |
90 | case 'sentence':
91 | /* Matches phrases either ending in Latin alphabet punctuation or located at the end of the text. (Linebreaks are not considered punctuation.) */
92 | /* Note: If you don't want punctuation to demarcate a sentence match, replace the punctuation character with {{ASCII_CODE_FOR_DESIRED_PUNCTUATION}}. ASCII codes: .={{46}}, ?={{63}}, !={{33}} */
93 | return /(?=\S)((?=[.。]{2,})?[^!?]+?[.…!?。!?]+|(?=\s+$)|$(?=\s*[′’'”″“'「『』」)»]+)*)/;
94 | /* RegExp explanation (Tip: Use Regex101.com to play around with this expression and see which strings it matches):
95 | - Expanded view: /(?=\S) ( ([.]{2,})? [^!?]+? ([.…!?]+|(?=\s+$)|$) (\s*[′’'”″“')»]+)* )
96 | - (?=\S) --> Match must contain a non-space character.
97 | - ([.]{2,})? --> Match may begin with a group of periods.
98 | - [^!?]+? --> Grab everything that isn't an unequivocally-terminating punctuation character, but stop at the following condition...
99 | - ([.…!?]+|(?=\s+$)|$) --> Match the last occurrence of sentence-final punctuation or the end of the text (optionally with left-side trailing spaces).
100 | - (\s*[′’'”″“')»]+)* --> After the final punctuation, match any and all pairs of (optionally space-delimited) quotes and parentheses.
101 | */
102 |
103 | case 'element':
104 | /* Matches text between HTML tags. */
105 | /* Note: Wrapping always occurs inside of elements, i.e. Bolded text here . */
106 | return /(?=\S)([\S\s]*\S)/;
107 | default:
108 | break;
109 | }
110 | }
111 |
112 |
113 | /*************************
114 | Speech Synthesis
115 | *************************/
116 |
117 | function getVoiceForName(name) {
118 | var voices = window.speechSynthesis.getVoices();
119 |
120 | var namedVoice = voices.filter(function (voice) {
121 | return voice.name === name;
122 | })[0];
123 |
124 | if (typeof namedVoice === 'object') {
125 | return namedVoice;
126 | }
127 | }
128 |
129 | function getVoiceForLanguage(lang, preferLocal) {
130 | if (typeof preferLocal !== 'boolean') {
131 | preferLocal = true;
132 | }
133 |
134 | var voices = window.speechSynthesis.getVoices();
135 |
136 | var languageVoices = voices.filter(function (voice) {
137 | return voice.lang === lang;
138 | });
139 |
140 | if (preferLocal) {
141 | var localVoices = languageVoices.filter(function (voice) {
142 | return voice.localService === true;
143 | });
144 |
145 | if (typeof localVoices[0] === 'object') {
146 | return localVoices[0];
147 | }
148 | }
149 |
150 | if (typeof languageVoices[0] === 'object') {
151 | return languageVoices[0];
152 | }
153 | }
154 |
155 | function getVoice(name, lang) {
156 | var namedVoice = getVoiceForName(name);
157 | if (typeof namedVoice === 'object') {
158 | return namedVoice;
159 | }
160 |
161 | var languageVoice = getVoiceForLanguage(lang, false);
162 | if (typeof languageVoice === 'object') {
163 | return languageVoice;
164 | }
165 |
166 | var voices = window.speechSynthesis.getVoices();
167 | return voices[0];
168 | }
169 |
170 |
171 | /*************************
172 | Component
173 | *************************/
174 |
175 | var Readalong = React.createClass({
176 |
177 | /*
178 | * Component setup
179 | */
180 |
181 | displayName: 'Readalong',
182 |
183 | propTypes: {
184 | children: React.PropTypes.node.isRequired,
185 | delimiter: React.PropTypes.oneOf(['word', 'sentence', 'element']).isRequired,
186 | lang: React.PropTypes.string.isRequired,
187 | voiceName: React.PropTypes.string
188 | },
189 |
190 | mixins: [PureRenderMixin],
191 |
192 |
193 | /*
194 | * Variables
195 | */
196 |
197 | _voice: null,
198 | _delimiterRegex: null,
199 |
200 |
201 | /*
202 | * Render
203 | */
204 |
205 | _wrapChildren: function (children) {
206 | return React.Children.map(children, this._wrapChild);
207 | },
208 |
209 | _wrapChild: function (child) {
210 | if (isValidElement(child)) {
211 | if (child.props.silent) {
212 | return child;
213 | }
214 |
215 | return React.cloneElement(child, {}, this._wrapChildren(child.props.children));
216 | }
217 |
218 | var phrases = [];
219 |
220 | if (this.props.delimiter === 'sentence') {
221 | child = encodePunctuation(child);
222 | }
223 |
224 | var matches = child.split(this._delimiterRegex);
225 |
226 | for (var i = 0; i < matches.length; i++) {
227 | var matchText = matches[i];
228 |
229 | if (this.props.delimiter === 'sentence') {
230 | matchText = decodePunctuation(matchText);
231 | }
232 |
233 | if (matchText.trim() === '') {
234 | phrases.push(' ');
235 | continue;
236 | }
237 |
238 | phrases.push(
239 | React.createElement(Phrase, {
240 | ref: 'phrase' + i,
241 | voice: this._voice,
242 | lang: this.props.lang
243 | }, matchText)
244 | );
245 | }
246 |
247 | return phrases;
248 | },
249 |
250 | render: function() {
251 | // Enable server-side rendering
252 | if (typeof window === 'object') {
253 | this._voice = getVoice(this.props.voiceName, this.props.lang);
254 | }
255 |
256 | this._delimiterRegex = getDelimiterRegex(this.props.delimiter);
257 |
258 | return React.createElement('div', {
259 | className: 'readalong',
260 | ref: 'readalong'},
261 | this._wrapChildren(this.props.children)
262 | );
263 | }
264 |
265 | });
266 |
267 | module.exports = Readalong;
268 |
269 |
--------------------------------------------------------------------------------
/tests/Readalong-test.js:
--------------------------------------------------------------------------------
1 | /*global jest:false, describe:false, it:false*/
2 |
3 | 'use strict';
4 |
5 | jest.dontMock('../src/Readalong');
6 |
7 | describe('testing', function () {
8 | it('tests a test', function () {
9 | var Readalong = require('../src/Readalong');
10 |
11 | expect(true).toBe(true);
12 | });
13 | });
14 |
--------------------------------------------------------------------------------