The library for web and native user interfaces.
move docs around, add likebutton
petehunt committed
Jul 14, 2013 at 18:31 UTC
b20c2641d4ff219ea56c69fb3ff599e0399b2566
144 files changed
+51180
-251
docs/_config.yml
+13
-13
@@ -1,17 +1,17 @@
1
----
2
-markdown: redcarpet
3
-name: React
4
-description: A JavaScript library for building user interfaces
5
-redcarpet:
6
- extensions:
7
- - fenced_code_blocks
8
-react_version: 0.3.2
9
-pygments: true
10
-exclude:
1
+---
2
+baseurl: /react
3
+url: http://facebook.github.io
4
+permalink: /blog/:year/:month/:day/:title.html
5
+exclude:
6
- Gemfile
7
- Gemfile.lock
8
- README.md
9
- Rakefile
15
-url: http://facebook.github.io
16
-baseurl: /react
17
-permalink: /blog/:year/:month/:day/:title.html
10
+redcarpet:
11
+ extensions:
12
+ - fenced_code_blocks
13
+pygments: true
14
+name: React
15
+markdown: redcarpet
16
+react_version: 0.4.0a
17
+description: A JavaScript library for building user interfaces
docs/_includes/nav_docs.html
+12
-25
@@ -1,31 +1,18 @@
1
-<div class="nav-docs">
2
- <div class="nav-docs-section">
3
- <h3>Getting started</h3>
4
- <ul>
5
- <li><a href="/react/docs/getting-started.html"{% if page.id == 'docs-getting-started' %} class="active"{% endif %}>Getting Started</a></li>
6
- <li><a href="/react/docs/tutorial.html"{% if page.id == 'docs-tutorial' %} class="active"{% endif %}>Tutorial</a></li>
7
- <li><a href="/react/docs/common-questions.html"{% if page.id == 'docs-common-questions' %} class="active"{% endif %}>Common Questions</a></li>
8
- </ul>
9
- </div>
1
2
+<div class="nav-docs">
3
<div class="nav-docs-section">
12
- <h3>Reference</h3>
4
+ <h3>React documentation</h3>
5
<ul>
14
- <li><a href="/react/docs/syntax.html"{% if page.id == 'docs-syntax' %} class="active"{% endif %}>JSX Syntax</a></li>
15
- <li><a href="/react/docs/component-basics.html"{% if page.id == 'docs-component-basics' %} class="active"{% endif %}>Component Basics</a></li>
16
- <li><a href="/react/docs/component-data.html"{% if page.id == 'docs-component-data' %} class="active"{% endif %}>Component Data</a></li>
17
- <li><a href="/react/docs/component-lifecycle.html"{% if page.id == 'docs-component-lifecycle' %} class="active"{% endif %}>Component Lifecycle</a></li>
18
- <li><a href="/react/docs/event-handling.html"{% if page.id == 'docs-event-handling' %} class="active"{% endif %}>Event Handling</a></li>
19
- <li><a href="/react/docs/advanced-components.html"{% if page.id == 'docs-advanced-components' %} class="active"{% endif %}>Advanced Components</a></li>
20
- <li><a href="/react/docs/mixins.html"{% if page.id == 'docs-mixins' %} class="active"{% endif %}>Mixins</a></li>
21
- <li><a href="/react/docs/api.html"{% if page.id == 'docs-api' %} class="active"{% endif %}>API</a></li>
22
- </ul>
23
- </div>
6
+ <li><a href="/react/docs/01-why-react.html"{% if page.id == '01-why-react' %} class="active"{% endif %}>Why React?</a></li>
7
+ <li><a href="/react/docs/02-displaying-data.html"{% if page.id == '02-displaying-data' %} class="active"{% endif %}>Displaying data</a></li>
8
+ <li><a href="/react/docs/03-interactivity-and-dynamic-uis.html"{% if page.id == '03-interactivity-and-dynamic-uis' %} class="active"{% endif %}>Interactivity and dynamic UIs</a></li>
9
+ <li><a href="/react/docs/04-multiple-components.html"{% if page.id == '04-multiple-components' %} class="active"{% endif %}>Multiple components</a></li>
10
+ <li><a href="/react/docs/05-reusable-components.html"{% if page.id == '05-reusable-components' %} class="active"{% endif %}>Reusable components</a></li>
11
+ <li><a href="/react/docs/06-forms.html"{% if page.id == '06-forms' %} class="active"{% endif %}>Forms</a></li>
12
+ <li><a href="/react/docs/07-working-with-the-browser.html"{% if page.id == '07-working-with-the-browser' %} class="active"{% endif %}>Working with the browser</a></li>
13
+ <li><a href="/react/docs/08-tooling-integration.html"{% if page.id == '08-tooling-integration' %} class="active"{% endif %}>Tooling integration</a></li>
14
+ <li><a href="/react/docs/09-reference.html"{% if page.id == '09-reference' %} class="active"{% endif %}>Reference</a></li>
15
25
- <div class="nav-docs-section">
26
- <h3>Appendix</h3>
27
- <ul>
28
- <li><a href="/react/docs/jsx-is-not-html.html"{% if page.id == 'docs-jsx-is-not-html' %} class="active"{% endif %}>JSX is not HTML</a></li>
16
</ul>
17
</div>
31
-</div>
18
+</div>
\ No newline at end of file
docs/docs/01-motivation.md
new
+27
@@ -0,0 +1,27 @@
1
+---
2
+id: 01-motivation
3
+title: Motivation / Why React?
4
+layout: docs
5
+next: 02-displaying-data.html
6
+---
7
+React is a JavaScript library for creating user interfaces by Facebook and Instagram. Many people choose to think of React as the **V** in **[MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)**.
8
+
9
+We built React to solve one problem: **building large applications with data that changes over time**. To do this, React has two main ideas.
10
+
11
+### Stay simple and declarative
12
+
13
+React apps are easy to write. Simply express how the UI should look at any given point in time, and React will manage all UI updates for you when your underlying data changes.
14
+
15
+It's just like writing a server-rendered web app: when the data changes, React conceptually hits the refresh button, except React is very fast and maintains the state of your UI. Because of this, React's API is very small and easy to understand.
16
+
17
+### Build composable components
18
+
19
+React is all about building reusable components. In fact, with React the *only* thing you do is build components. Since they're so encapsulated, components make code reuse, testing, and separation of concerns easy.
20
+
21
+### Give it five minutes
22
+
23
+React challenges a lot of conventional wisdom, and at first glance some of the ideas may seem crazy. We ask that you [give it five minutes](http://37signals.com/svn/posts/3124-give-it-five-minutes) while reading about React; engineers and designers have built thousands of components both inside and outside of Facebook and Instagram, and we hope you'll find it useful!
24
+
25
+### Learn more
26
+
27
+You can learn more about our motivations behind building React in [this blog post](http://facebook.github.io/react/blog/2013/06/05/why-react.html).
\ No newline at end of file
docs/docs/01-why-react.md
renamed
+11
-7
@@ -1,23 +1,27 @@
1
-# Why React?
2
-
1
+---
2
+id: 01-why-react
3
+title: Why React?
4
+layout: docs
5
+next: 02-displaying-data.html
6
+---
7
React is a JavaScript library for creating user interfaces by Facebook and Instagram. Many people choose to think of React as the **V** in **[MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)**.
8
9
We built React to solve one problem: **building large applications with data that changes over time**. To do this, React has two main ideas.
10
7
-## Stay simple and declarative
11
+### Stay simple and declarative
12
13
React apps are easy to write. Simply express how the UI should look at any given point in time, and React will manage all UI updates for you when your underlying data changes.
14
15
It's just like writing a server-rendered web app: when the data changes, React conceptually hits the refresh button, except React is very fast and maintains the state of your UI. Because of this, React's API is very small and easy to understand.
16
13
-## Build composable components
17
+### Build composable components
18
19
React is all about building reusable components. In fact, with React the *only* thing you do is build components. Since they're so encapsulated, components make code reuse, testing, and separation of concerns easy.
20
17
-## Give it five minutes
21
+### Give it five minutes
22
23
React challenges a lot of conventional wisdom, and at first glance some of the ideas may seem crazy. We ask that you [give it five minutes](http://37signals.com/svn/posts/3124-give-it-five-minutes) while reading about React; engineers and designers have built thousands of components both inside and outside of Facebook and Instagram, and we hope you'll find it useful!
24
21
-## Learn more
25
+### Learn more
26
23
-You can learn more about our motivations behind building React in [this blog post](http://facebook.github.io/react/blog/2013/06/05/why-react.html).
27
+You can learn more about our motivations behind building React in [this blog post](http://facebook.github.io/react/blog/2013/06/05/why-react.html).
\ No newline at end of file
docs/docs/02-displaying-data.md
renamed
+12
-7
@@ -1,8 +1,13 @@
1
-# Displaying data
2
-
1
+---
2
+id: 02-displaying-data
3
+title: Displaying data
4
+layout: docs
5
+prev: 01-why-react.html
6
+next: 02.1-jsx-in-depth.html
7
+---
8
The most basic thing you can do with a UI is display some data. React makes it easy to display data, and automatically keeps it up-to-date when the data changes.
9
5
-## Getting started
10
+### Getting started
11
12
Let's look at a really simple example. Create a `hello-react.html` file with the following code:
13
@@ -49,7 +54,7 @@ setInterval(function() {
54
}, 500);
55
```
56
52
-## Reactive updates
57
+### Reactive updates
58
59
View the finished code in a web browser and type your name into the text field. Notice that React is only changing the time string in the UI -- any input you put in the text field remains, even though you haven't written any code to manage this behavior. React figures it out for you and does the right thing.
60
@@ -57,13 +62,13 @@ The way it is able to figure this out is that React does not directly manipulate
62
63
The inputs to this component are called `props` -- short for "properties". They're passed as attributes in JSX syntax. You should think of these as immutable within the component, that is, **never write to this.props**.
64
60
-## Components are just like functions
65
+### Components are just like functions
66
67
React components are very simple. You can think of them as simple function that take in `props` and `state` (discussed later) and render HTML. Because they're so simple, it makes them very easy to reason about.
68
69
**One limitation**: React components can only render a single root node. If you want to return multiple nodes they *must* be wrapped in a single root. This is a limitation we can fix, but we have not identified a pressing reason to do so yet; reach out to our [Google Group](http://groups.google.com/group/reactjs) if you have a compelling case for it.
70
66
-## JSX syntax
71
+### JSX syntax
72
73
We strongly believe that components are the right way to separate concerns rather than "templates" and "display logic." We think that markup and the code that generates it are intimately tied together. Additionally, display logic is often very complex and using template languages to express it becomes cumbersome.
74
@@ -75,4 +80,4 @@ JSX is very small; the "hello, world" example above uses every feature of JSX. T
80
81
JSX is similar to HTML, but not exactly the same. See [JSX gotchas](./02.2-jsx-gotchas.html) for some key differences.
82
78
-The easiest way to get started with JSX is to use the in-browser `JSXTransformer`, but in production you'll want to precompile your code using our command-line [react-tools](http://npmjs.org/package/react-tools) package.
83
+The easiest way to get started with JSX is to use the in-browser `JSXTransformer`, but in production you'll want to precompile your code using our command-line [react-tools](http://npmjs.org/package/react-tools) package.
\ No newline at end of file
docs/docs/02.1-jsx-in-depth.md
renamed
+18
-13
@@ -1,9 +1,14 @@
1
-# JSX in Depth
2
-
1
+---
2
+id: 02.1-jsx-in-depth
3
+title: JSX in Depth
4
+layout: docs
5
+prev: 02-displaying-data.html
6
+next: 02.2-jsx-gotchas.html
7
+---
8
JSX is a JavaScript XML syntax transform recommended (but not required) for use
9
with React.
10
6
-## Why JSX?
11
+### Why JSX?
12
13
First of all, **don't use JSX if you don't like it!**
14
@@ -20,7 +25,7 @@ We recommend using JSX for many reasons:
25
- Designers are more comfortable making changes.
26
- It's familiar for those who have used MXML or XAML.
27
23
-## The Transform
28
+### The Transform
29
30
JSX transforms XML-like syntax into native JavaScript. It turns XML elements and
31
attributes into function calls and objects, respectively.
@@ -56,7 +61,7 @@ how to setup compilation.
61
> Details about the code transform are given here to increase understanding, but
62
> your code should not rely on these implementation details.
63
59
-## React and JSX
64
+### React and JSX
65
66
React and JSX are independent technologies, but JSX was primarily built with
67
React in mind. The two valid uses of JSX are:
@@ -92,7 +97,7 @@ See [Component Basics](component-basics.html) to learn more about components.
97
> as XML attribute names. Instead, React DOM components expect attributes like
98
> `className` and `htmlFor`, respectively.
99
95
-## DOM Convenience
100
+### DOM Convenience
101
102
Having to define variables for every type of DOM element can get tedious
103
(e.g. `var div, span, h1, h2, ...`). JSX provides a convenience to address this
@@ -116,9 +121,9 @@ var tree = Nav(null, React.DOM.span(null, null));
121
> DOM. The docblock parameter is only a convenience to resolve the most commonly
122
> used elements. In general, JSX has no notion of the DOM.
123
119
-## JavaScript Expressions
124
+### JavaScript Expressions
125
121
-#### Attribute Expressions
126
+##### Attribute Expressions
127
128
To use a JavaScript expression as an attribute value, wrap the expression in a
129
pair of curly braces (`{}`) instead of quotes (`""`).
@@ -130,7 +135,7 @@ var person = <Person name={window.isLoggedIn ? window.name : ''} />;
135
var person = Person({name: window.isLoggedIn ? window.name : ''});
136
```
137
133
-#### Child Expressions
138
+##### Child Expressions
139
140
Likewise, JavaScript expressions may be used to express children:
141
@@ -141,14 +146,14 @@ var content = <Container>{window.isLoggedIn ? <Nav /> : <Login />}</Container>;
146
var content = Container(null, window.isLoggedIn ? Nav(null, null) : Login(null, null));
147
```
148
144
-#### Comments
149
+##### Comments
150
151
It's easy to add comments within your JSX; they're just JS expressions:
152
```javascript
153
var content = <Container>{/* this is a comment */}<Nav /></Container>;
154
```
155
151
-## Tooling
156
+### Tooling
157
158
Beyond the compilation step, JSX does not require any special tools.
159
@@ -157,7 +162,7 @@ Beyond the compilation step, JSX does not require any special tools.
162
- Elements use standard scoping so linters can find usage of out-of-scope
163
components.
164
160
-## Prior Work
165
+### Prior Work
166
167
JSX is similar to several other JavaScript embedded XML language
168
proposals/projects. Some of the features of JSX that distinguish it from similar
@@ -167,4 +172,4 @@ efforts include:
172
- JSX neither provides nor requires a runtime library.
173
- JSX does not alter or add to the semantics of JavaScript.
174
170
-JSX is similar to HTML, but not exactly the same. See [JSX gotchas](./02.2-jsx-gotchas.html) for some key differences.
175
+JSX is similar to HTML, but not exactly the same. See [JSX gotchas](./02.2-jsx-gotchas.html) for some key differences.
\ No newline at end of file
docs/docs/02.2-jsx-gotchas.md
renamed
+11
-6
@@ -1,8 +1,13 @@
1
-# JSX gotchas
2
-
1
+---
2
+id: 02.2-jsx-gotchas
3
+title: JSX gotchas
4
+layout: docs
5
+prev: 02.1-jsx-in-depth.html
6
+next: 03-interactivity-and-dynamic-uis.html
7
+---
8
JSX looks like HTML but there are some important differences you may run into.
9
5
-## Whitespace removal
10
+### Whitespace removal
11
12
JSX doesn't follow the same whitespace elimination rules as HTML. JSX removes all whitespace between two curly braces expressions. If you want to have whitespace, simply add `{' '}`.
13
@@ -12,7 +17,7 @@ JSX doesn't follow the same whitespace elimination rules as HTML. JSX removes al
17
18
Follow [Issue #65](https://github.com/facebook/react/issues/65) for discussion on this behavior.
19
15
-## HTML Entities
20
+### HTML Entities
21
22
You can insert HTML entities within literal text in JSX:
23
@@ -52,7 +57,7 @@ As a last resort, you always have the ability to insert raw HTML.
57
<div dangerouslySetInnerHTML={{'{{'}}__html: 'First · Second'}} />
58
```
59
55
-## Custom HTML Attributes
60
+### Custom HTML Attributes
61
62
If you pass properties to native HTML elements that do not exist in the HTML specification, React will not render them. If you want to use a custom attribute, you should prefix it with `data-`.
63
@@ -64,4 +69,4 @@ If you pass properties to native HTML elements that do not exist in the HTML spe
69
70
```javascript
71
<div aria-hidden={true} />
67
-```
72
+```
\ No newline at end of file
docs/docs/03-interactivity-and-dynamic-uis.md
renamed
+16
-11
@@ -1,8 +1,13 @@
1
-# Interactivity and dynamic UIs
2
-
1
+---
2
+id: 03-interactivity-and-dynamic-uis
3
+title: Interactivity and dynamic UIs
4
+layout: docs
5
+prev: 02.2-jsx-gotchas.html
6
+next: 04-multiple-components.html
7
+---
8
You've already [learned how to display data](./02-displaying-data.html) with React. Now let's look at how to make our UIs interactive.
9
5
-## A simple example
10
+### A simple example
11
12
```javascript
13
/** @jsx React.DOM */
@@ -30,13 +35,13 @@ React.renderComponent(
35
);
36
```
37
33
-## Event handling and synthetic events
38
+### Event handling and synthetic events
39
40
With React you simply pass your event handler as a camelCased prop similar to how you'd do it in normal HTML. React ensures that all events behave identically in IE8 and above by implementing a synthetic event system. That is, React knows how to bubble and capture events according to the spec, and the events passed to your event handler are guaranteed to be consistent with [the W3C spec](http://www.w3.org/TR/DOM-Level-3-Events/), regardless of which browser you're using.
41
42
**If you'd like to use React on a touch device** (i.e. a phone or tablet), simply call `React.initializeTouchEvents(true);` to turn them on.
43
39
-## Under the hood: autoBind and event delegation
44
+### Under the hood: autoBind and event delegation
45
46
Under the hood React does a few things to keep your code performant and easy to understand.
47
@@ -44,17 +49,17 @@ Under the hood React does a few things to keep your code performant and easy to
49
50
**Event delegation.** React doesn't actually attach event handlers to the nodes themselves. When React starts up, it starts listening for all events at the top level using a single event listener. When a component is mounted or unmounted, the event handlers are simply added or removed from a fast internal event mapping. When the event occurs, React knows how to dispatch it using this mapping. When there are no event handlers left in the mapping, React's event handlers are simple no-ops. To learn more about why this is fast, see [David Walsh's excellent blog post](http://davidwalsh.name/event-delegate).
51
47
-## Components are just state machines
52
+### Components are just state machines
53
54
React thinks of UIs as simple state machines. By thinking of a UI as being in various states and rendering those states, it's easy to keep your UI consistent.
55
56
In React, you simply update a component's state, and then render a new UI based on this new state. React takes care of updating the DOM for you in the most efficient way.
57
53
-## How state works
58
+### How state works
59
60
A common way to inform React of a data change is by calling `setState(data, callback)`. This method merges `data` into `this.state` and re-renders the component. When the component finishes re-rendering, the optional `callback` is called. Most of the time you'll never need to provide a `callback` since React will take care of keeping your UI up-to-date for you.
61
57
-## What components should have state?
62
+### What components should have state?
63
64
Most of your components should simply take some data from `props` and render it. However, sometimes you need to respond to user input, a server request or the passage of time. For this you use state.
65
@@ -62,13 +67,13 @@ Most of your components should simply take some data from `props` and render it.
67
68
A common pattern is to create several stateless components that just render data, and have a stateful component above them in the hierarchy that passes its state to its children via `props`. The stateful component encapsulates all of the interaction logic, while the stateless components take care of rendering data in a declarative way.
69
65
-## What should go in state?
70
+### What should go in state?
71
72
**State should contain data that the component's event handlers may change to trigger a UI update.** In real apps this data tends to be very small and JSON-serializable. When building a stateful component, think about the minimal possible representation of its state, and only store those properties in `this.state`. Inside of `render()` simply compute any other information you need based on this state. You'll find that thinking about and writing applications in this way tends to lead to the most correct application, since adding redundant or computed values to state means that you need to explicitly keep them in sync rather than rely on React computing them for you.
73
69
-## What *shouldn't* go in state?
74
+### What *shouldn't* go in state?
75
76
`this.state` should only contain the minimal amount of data needed to represent your UI's state. As such, it should not contain:
77
* **Computed data.** Don't worry about precomputing values based on state -- it's easier to ensure that your UI is consistent if you do all computation within `render()`. For example, if you have an array of list items in state and you want to render the count as a string, simply render `this.state.listItems.length + ' list items'` in your `render()` method rather than storing it on state.
78
* **React components.** Build them in `render()` based on underlying props and state.
74
-* **Duplicated data from props.** Try to use props as the source of truth where possible. Because props can change over time, it's appropriate to store props in state to be able to know its previous values.
79
+* **Duplicated data from props.** Try to use props as the source of truth where possible. Because props can change over time, it's appropriate to store props in state to be able to know its previous values.
\ No newline at end of file
docs/docs/04-multiple-components.md
renamed
+17
-12
@@ -1,12 +1,17 @@
1
-# Multiple components
2
-
1
+---
2
+id: 04-multiple-components
3
+title: Multiple components
4
+layout: docs
5
+prev: 03-interactivity-and-dynamic-uis.html
6
+next: 05-reusable-components.html
7
+---
8
So far, we've looked at how to write a single component to display data and handle user input. Next let's examine one of React's finest features: composability.
9
5
-## Motivation: separation of concerns
10
+### Motivation: separation of concerns
11
12
By building modular components that reuse other components with well-defined interfaces, you get much of the same benefits that you get by using functions or classes. Specifically you can *separate the different concerns* of your app however you please simply by building new components. By building a custom component library for your application, you are expressing your UI in a way that best fits your domain.
13
9
-## Composition example
14
+### Composition example
15
16
Let's create a simple Avatar component which shows a profile picture and username using the Facebook Graph API.
17
@@ -48,13 +53,13 @@ React.renderComponent(
53
);
54
```
55
51
-## Ownership
56
+### Ownership
57
58
In the above example, instances of `Avatar` *own* instances of `ProfilePic` and `ProfileLink`. In React, **an owner is the component that sets the `props` of other components**. More formally, if a component `X` is created in component `Y`'s `render()` method, it is said that `X` is *owned by* `Y`. As discussed earlier, a component cannot mutate its `props` -- they are always consistent with what its owner sets them to. This key property leads to UIs that are guaranteed to be consistent.
59
60
It's important to draw a distinciton between the owner-ownee relationship and the parent-child relationship. The owner-ownee relationship is specific to React, while the parent-child relationship is simply the one you know and love from the DOM. In the example above, `Avatar` owns the `div`, `ProfilePic` and `ProfileLink` instances, and `div` is the **parent** (but not owner) of the `ProfilePic` and `ProfileLink` instances.
61
57
-## Children
62
+### Children
63
64
When you create a React component instance, you can include additional React components or JavaScript expressions between the opening and closing tags like this:
65
@@ -64,7 +69,7 @@ When you create a React component instance, you can include additional React com
69
70
`Parent` can read its children by accessing the special `this.props.children` prop.
71
67
-### Child Reconciliation
72
+#### Child Reconciliation
73
74
> Reconciliation is the process by which React updates the DOM with each new render pass.
75
@@ -79,7 +84,7 @@ In general, children are reconciled according to the order in which they are ren
84
85
Intuitively, `<p>Paragraph 1</p>` was removed. Instead, React will reconcile the DOM by changing the text content of the first child and destroying the last child. React reconciles according to the *order* of the children.
86
82
-### Stateful Children
87
+#### Stateful Children
88
89
For most components, this is not a big deal. However, for stateful components that maintain data in `this.state` across render passes, this can be very problematic.
90
@@ -92,7 +97,7 @@ In most cases, this can be sidestepped by hiding elements instead of destroying
97
<Card><p style={{display: 'none'}}>Paragraph 1</p><p>Paragraph 2</p></Card>
98
```
99
95
-### Dynamic Children
100
+#### Dynamic Children
101
102
The situation gets more complicated when the children are shuffled around (as in search results) or if new components are added onto the front of the list (as in streams). In these cases where the identity and state of each child must be maintained across render passes, you can uniquely identify each child by assigning it a `key`:
103
@@ -111,14 +116,14 @@ The situation gets more complicated when the children are shuffled around (as in
116
117
When React reconciles the keyed children, it will ensure that any child with `key` will be reordered (instead of clobbered) or destroyed (instead of reused).
118
114
-## Data flow
119
+### Data flow
120
121
In React, data flows from owner to owned component through `props` as discussed above. This is effectively one-way data binding: owners bind their owned component's props to some value the owner has computed based on its `props` or `state`. Since this process happens recursively, data changes are automatically reflected everywhere they are used.
122
118
-## A note on performance
123
+### A note on performance
124
125
You may be thinking that it's expensive to react to changing data if there are a large number of nodes under an owner. The good news is that JavaScript is fast and `render()` methods tend to be quite simple, so in most applications this is extremely fast. Additionally, the bottleneck is almost always the DOM mutation and not JS execution, and React will optimize this for you using batching and change detection.
126
127
However, sometimes you really want to have fine-grained control over your performance. In that case, simply override `shouldComponentUpdate()` to return false when you want React to skip processing of a subtree. See [the React API docs](./api.html) for more information.
128
124
-**Note:** if `shouldComponentUpdate()` returns false when data has actually changed, React can't keep your UI in sync. Be sure you know what you're doing while using it, and only use this function when you have a noticeable performance problem. Don't underestimate how fast JavaScript is relative to the DOM.
129
+**Note:** if `shouldComponentUpdate()` returns false when data has actually changed, React can't keep your UI in sync. Be sure you know what you're doing while using it, and only use this function when you have a noticeable performance problem. Don't underestimate how fast JavaScript is relative to the DOM.
\ No newline at end of file
docs/docs/04-scaling-up.md
new
+129
@@ -0,0 +1,129 @@
1
+---
2
+id: 04-scaling-up
3
+title: Scaling Up and Using Multiple Components
4
+layout: docs
5
+prev: 03-interactivity-and-dynamic-uis.html
6
+next: 05-building-reusable-components.html
7
+---
8
+So far, we've looked at how to write a single component to display data and handle user input. Next let's examine one of React's finest features: composability.
9
+
10
+### Motivation: separation of concerns
11
+
12
+By building modular components that reuse other components with well-defined interfaces, you get much of the same benefits that you get by using functions or classes. Specifically you can *separate the different concerns* of your app however you please simply by building new components. By building a custom component library for your application, you are expressing your UI in a way that best fits your domain.
13
+
14
+### Composition example
15
+
16
+Let's create a simple Avatar component which shows a profile picture and username using the Facebook Graph API.
17
+
18
+```javascript
19
+/** @jsx React.DOM */
20
+
21
+var Avatar = React.createClass({
22
+ render: function() {
23
+ return (
24
+ <div>
25
+ <ProfilePic username={this.props.username} />
26
+ <ProfileLink username={this.props.username} />
27
+ </div>
28
+ );
29
+ }
30
+});
31
+
32
+var ProfilePic = React.createClass({
33
+ render: function() {
34
+ return (
35
+ <img src={'http://graph.facebook.com/' + this.props.username + '/picture'} />
36
+ );
37
+ }
38
+});
39
+
40
+var ProfileLink = React.createClass({
41
+ render: function() {
42
+ return (
43
+ <a href={'http://www.facebook.com/' + this.props.username}>
44
+ {this.props.username}
45
+ </a>
46
+ );
47
+ }
48
+});
49
+
50
+React.renderComponent(
51
+ <Avatar username="pwh" />,
52
+ document.getElementById('example')
53
+);
54
+```
55
+
56
+### Ownership
57
+
58
+In the above example, instances of `Avatar` *own* instances of `ProfilePic` and `ProfileLink`. In React, **an owner is the component that sets the `props` of other components**. More formally, if a component `X` is created in component `Y`'s `render()` method, it is said that `X` is *owned by* `Y`. As discussed earlier, a component cannot mutate its `props` -- they are always consistent with what its owner sets them to. This key property leads to UIs that are guaranteed to be consistent.
59
+
60
+It's important to draw a distinciton between the owner-ownee relationship and the parent-child relationship. The owner-ownee relationship is specific to React, while the parent-child relationship is simply the one you know and love from the DOM. In the example above, `Avatar` owns the `div`, `ProfilePic` and `ProfileLink` instances, and `div` is the **parent** (but not owner) of the `ProfilePic` and `ProfileLink` instances.
61
+
62
+### Children
63
+
64
+When you create a React component instance, you can include additional React components or JavaScript expressions between the opening and closing tags like this:
65
+
66
+```javascript
67
+<Parent><Child /></Parent>
68
+```
69
+
70
+`Parent` can read its children by accessing the special `this.props.children` prop.
71
+
72
+#### Child Reconciliation
73
+
74
+> Reconciliation is the process by which React updates the DOM with each new render pass.
75
+
76
+In general, children are reconciled according to the order in which they are rendered. For example, suppose two render passes generate the following respective markup:
77
+
78
+```html
79
+// Render Pass 1
80
+<Card><p>Paragraph 1</p><p>Paragraph 2</p></Card>
81
+// Render Pass 2
82
+<Card><p>Paragraph 2</p></Card>
83
+```
84
+
85
+Intuitively, `<p>Paragraph 1</p>` was removed. Instead, React will reconcile the DOM by changing the text content of the first child and destroying the last child. React reconciles according to the *order* of the children.
86
+
87
+#### Stateful Children
88
+
89
+For most components, this is not a big deal. However, for stateful components that maintain data in `this.state` across render passes, this can be very problematic.
90
+
91
+In most cases, this can be sidestepped by hiding elements instead of destroying them:
92
+
93
+```html
94
+// Render Pass 1
95
+<Card><p>Paragraph 1</p><p>Paragraph 2</p></Card>
96
+// Render Pass 2
97
+<Card><p style={{display: 'none'}}>Paragraph 1</p><p>Paragraph 2</p></Card>
98
+```
99
+
100
+#### Dynamic Children
101
+
102
+The situation gets more complicated when the children are shuffled around (as in search results) or if new components are added onto the front of the list (as in streams). In these cases where the identity and state of each child must be maintained across render passes, you can uniquely identify each child by assigning it a `key`:
103
+
104
+```javascript
105
+ render: function() {
106
+ var results = this.props.results;
107
+ return (
108
+ <ol>
109
+ {this.results.map(function(result) {
110
+ return <li key={result.id}>{result.text}</li>;
111
+ })}
112
+ </ol>
113
+ );
114
+ }
115
+```
116
+
117
+When React reconciles the keyed children, it will ensure that any child with `key` will be reordered (instead of clobbered) or destroyed (instead of reused).
118
+
119
+### Data flow
120
+
121
+In React, data flows from owner to owned component through `props` as discussed above. This is effectively one-way data binding: owners bind their owned component's props to some value the owner has computed based on its `props` or `state`. Since this process happens recursively, data changes are automatically reflected everywhere they are used.
122
+
123
+### A note on performance
124
+
125
+You may be thinking that it's expensive to react to changing data if there are a large number of nodes under an owner. The good news is that JavaScript is fast and `render()` methods tend to be quite simple, so in most applications this is extremely fast. Additionally, the bottleneck is almost always the DOM mutation and not JS execution, and React will optimize this for you using batching and change detection.
126
+
127
+However, sometimes you really want to have fine-grained control over your performance. In that case, simply override `shouldComponentUpdate()` to return false when you want React to skip processing of a subtree. See [the React API docs](./api.html) for more information.
128
+
129
+**Note:** if `shouldComponentUpdate()` returns false when data has actually changed, React can't keep your UI in sync. Be sure you know what you're doing while using it, and only use this function when you have a noticeable performance problem. Don't underestimate how fast JavaScript is relative to the DOM.
\ No newline at end of file
docs/docs/05-building-effective-reusable-components.md
new
+90
@@ -0,0 +1,90 @@
1
+---
2
+id: 05-building-effective-reusable-components
3
+title: Build reusable component libraries!
4
+layout: docs
5
+prev: 04-scaling-up.html
6
+next: 06-forms.html
7
+---
8
+When designing interfaces, break down the common design elements (buttons, form fields, layout components, etc) into reusable components with well-defined interfaces. That way, the next time you need to build some UI you can write much less code, which means faster development time, less bugs, and less bytes down the wire.
9
+
10
+### Prop validation
11
+
12
+As your app grows it's helpful to ensure that your components are used correctly. We do this using `propTypes`.
13
+
14
+** TODO zpao **
15
+
16
+### Transferring props: a shortcut
17
+
18
+A common type of React component is one that extends a basic HTML in a simple way. Often you'll want to copy any HTML attributes passed to your component to the underlying HTML element to save typing. React provides `transferPropsTo()` to do just this.
19
+
20
+```javascript
21
+/** @jsx React.DOM */
22
+
23
+var CheckLink = React.createClass({
24
+ render: function() {
25
+ // transferPropsTo() will take any props pased to CheckLink
26
+ // and copy them to <a>
27
+ return this.transferPropsTo(<a>{'√ '}{this.props.children}</a>);
28
+ }
29
+});
30
+
31
+React.renderComponent(
32
+ <CheckLink href="javascript:alert('Hello, world!');">
33
+ Click here!
34
+ </CheckLink>,
35
+ document.getElementById('example')
36
+);
37
+```
38
+
39
+### Mixins
40
+
41
+Components are the best way to reuse code in React, but sometimes very different components may share some common functionality. These are sometimes called [cross-cutting concerns](http://en.wikipedia.org/wiki/Cross-cutting_concern). React provides `mixins` to solve this problem.
42
+
43
+One common use case is a component wanting to update itself on a time interval. It's easy to use `setInterval()`, but it's important to cancel your interval when you don't need it anymore to save memory. React provides [lifecycle methods](./06-working-with-the-browser.html) that let you know when a component is about to be created or destroyed. Let's create a simple mixin that uses these methods to provide an easy `setInterval()` function that will automatically get cleaned up when your component is destroyed.
44
+
45
+```javascript
46
+/** @jsx React.DOM */
47
+
48
+var SetIntervalMixin = {
49
+ componentWillMount: function() {
50
+ this.intervals = [];
51
+ },
52
+ setInterval: function() {
53
+ this.intervals.push(setInterval.apply(null, arguments));
54
+ },
55
+ componentWillUnmount: function() {
56
+ this.intervals.map(clearInterval);
57
+ }
58
+};
59
+
60
+var TickTock = React.createClass({
61
+ mixins: [SetIntervalMixin], // Use the mixin
62
+ getInitialState: function() {
63
+ return {seconds: 0};
64
+ },
65
+ componentDidMount: function() {
66
+ this.setInterval(this.tick, 1000); // Call a method on the mixin
67
+ },
68
+ tick: function() {
69
+ this.setState({seconds: this.state.seconds + 1});
70
+ },
71
+ render: function() {
72
+ return (
73
+ <p>
74
+ React has been running for {this.state.seconds} seconds.
75
+ </p>
76
+ );
77
+ }
78
+});
79
+
80
+React.renderComponent(
81
+ <TickTock />,
82
+ document.getElementById('example')
83
+);
84
+```
85
+
86
+A nice feature of mixins is that if a component is using multiple mixins and several mixins define the same lifecycle method (i.e. several mixins want to do some cleanup when the component is destroyed), all of the lifecycle methods are guaranteed to be called.
87
+
88
+### Testing
89
+
90
+**TODO: benjamn**
\ No newline at end of file
docs/docs/05-building-reusable-components.md
new
+90
@@ -0,0 +1,90 @@
1
+---
2
+id: 05-building-reusable-components
3
+title: Building reusable components
4
+layout: docs
5
+prev: 04-scaling-up.html
6
+next: 06-forms.html
7
+---
8
+When designing interfaces, break down the common design elements (buttons, form fields, layout components, etc) into reusable components with well-defined interfaces. That way, the next time you need to build some UI you can write much less code, which means faster development time, less bugs, and less bytes down the wire.
9
+
10
+### Prop validation
11
+
12
+As your app grows it's helpful to ensure that your components are used correctly. We do this using `propTypes`.
13
+
14
+** TODO zpao **
15
+
16
+### Transferring props: a shortcut
17
+
18
+A common type of React component is one that extends a basic HTML in a simple way. Often you'll want to copy any HTML attributes passed to your component to the underlying HTML element to save typing. React provides `transferPropsTo()` to do just this.
19
+
20
+```javascript
21
+/** @jsx React.DOM */
22
+
23
+var CheckLink = React.createClass({
24
+ render: function() {
25
+ // transferPropsTo() will take any props pased to CheckLink
26
+ // and copy them to <a>
27
+ return this.transferPropsTo(<a>{'√ '}{this.props.children}</a>);
28
+ }
29
+});
30
+
31
+React.renderComponent(
32
+ <CheckLink href="javascript:alert('Hello, world!');">
33
+ Click here!
34
+ </CheckLink>,
35
+ document.getElementById('example')
36
+);
37
+```
38
+
39
+### Mixins
40
+
41
+Components are the best way to reuse code in React, but sometimes very different components may share some common functionality. These are sometimes called [cross-cutting concerns](http://en.wikipedia.org/wiki/Cross-cutting_concern). React provides `mixins` to solve this problem.
42
+
43
+One common use case is a component wanting to update itself on a time interval. It's easy to use `setInterval()`, but it's important to cancel your interval when you don't need it anymore to save memory. React provides [lifecycle methods](./06-working-with-the-browser.html) that let you know when a component is about to be created or destroyed. Let's create a simple mixin that uses these methods to provide an easy `setInterval()` function that will automatically get cleaned up when your component is destroyed.
44
+
45
+```javascript
46
+/** @jsx React.DOM */
47
+
48
+var SetIntervalMixin = {
49
+ componentWillMount: function() {
50
+ this.intervals = [];
51
+ },
52
+ setInterval: function() {
53
+ this.intervals.push(setInterval.apply(null, arguments));
54
+ },
55
+ componentWillUnmount: function() {
56
+ this.intervals.map(clearInterval);
57
+ }
58
+};
59
+
60
+var TickTock = React.createClass({
61
+ mixins: [SetIntervalMixin], // Use the mixin
62
+ getInitialState: function() {
63
+ return {seconds: 0};
64
+ },
65
+ componentDidMount: function() {
66
+ this.setInterval(this.tick, 1000); // Call a method on the mixin
67
+ },
68
+ tick: function() {
69
+ this.setState({seconds: this.state.seconds + 1});
70
+ },
71
+ render: function() {
72
+ return (
73
+ <p>
74
+ React has been running for {this.state.seconds} seconds.
75
+ </p>
76
+ );
77
+ }
78
+});
79
+
80
+React.renderComponent(
81
+ <TickTock />,
82
+ document.getElementById('example')
83
+);
84
+```
85
+
86
+A nice feature of mixins is that if a component is using multiple mixins and several mixins define the same lifecycle method (i.e. several mixins want to do some cleanup when the component is destroyed), all of the lifecycle methods are guaranteed to be called.
87
+
88
+### Testing
89
+
90
+**TODO: benjamn**
\ No newline at end of file
docs/docs/05-reusable-components.md
renamed
+12
-8
@@ -1,14 +1,19 @@
1
-## Reusable components
2
-
1
+---
2
+id: 05-reusable-components
3
+title: Reusable components
4
+layout: docs
5
+prev: 04-multiple-components.html
6
+next: 06-forms.html
7
+---
8
When designing interfaces, break down the common design elements (buttons, form fields, layout components, etc) into reusable components with well-defined interfaces. That way, the next time you need to build some UI you can write much less code, which means faster development time, less bugs, and less bytes down the wire.
9
5
-## Prop validation
10
+### Prop validation
11
12
As your app grows it's helpful to ensure that your components are used correctly. We do this using `propTypes`.
13
14
** TODO zpao **
15
11
-## Transferring props: a shortcut
16
+### Transferring props: a shortcut
17
18
A common type of React component is one that extends a basic HTML in a simple way. Often you'll want to copy any HTML attributes passed to your component to the underlying HTML element to save typing. React provides `transferPropsTo()` to do just this.
19
@@ -31,7 +36,7 @@ React.renderComponent(
36
);
37
```
38
34
-## Mixins
39
+### Mixins
40
41
Components are the best way to reuse code in React, but sometimes very different components may share some common functionality. These are sometimes called [cross-cutting concerns](http://en.wikipedia.org/wiki/Cross-cutting_concern). React provides `mixins` to solve this problem.
42
@@ -80,7 +85,6 @@ React.renderComponent(
85
86
A nice feature of mixins is that if a component is using multiple mixins and several mixins define the same lifecycle method (i.e. several mixins want to do some cleanup when the component is destroyed), all of the lifecycle methods are guaranteed to be called.
87
83
-## Testing
84
-
85
-**TODO: benjamn**
88
+### Testing
89
90
+**TODO: benjamn**
\ No newline at end of file
docs/docs/06-forms.md
renamed
+14
-9
@@ -1,8 +1,13 @@
1
-# Forms
2
-
1
+---
2
+id: 06-forms
3
+title: Forms
4
+layout: docs
5
+prev: 05-reusable-components.html
6
+next: 07-working-with-the-browser.html
7
+---
8
Form components such as `<input>`, `<textarea>`, and `<option>` differ from other native components because they can be mutated via user interactions. These components provide interfaces that make it easier to manage forms in response to user interactions.
9
5
-## Interactive Props
10
+### Interactive Props
11
12
Form components support a few props that are affected via user interactions:
13
@@ -20,7 +25,7 @@ Form components allow listening for changes by setting a callback to the `onChan
25
26
Like all DOM events, the `onChange` prop is supported on all native components and can be used to listen to bubbled change events.
27
23
-## Controlled Components
28
+### Controlled Components
29
30
An `<input>` with `value` set is a *controlled* component. In a controlled `<input>`, the value of the rendered element will always reflect the `value` prop. For example:
31
@@ -55,7 +60,7 @@ In this example, we are simply accepting the newest value provided by the user a
60
61
This would accept user input but truncate the value to the first 140 characters.
62
58
-## Uncontrolled Components
63
+### Uncontrolled Components
64
65
An `<input>` that does not supply a `value` (or sets it to `null`) is an *uncontrolled* component. In an uncontrolled `<input>`, the value of the rendered element will reflect the user's input. For example:
66
@@ -79,9 +84,9 @@ This example will function much like the **Controlled Components** example above
84
85
Likewise, `<input>` supports `defaultChecked` and `<option>` supports `defaultSelected`.
86
82
-## Advanced Topics
87
+### Advanced Topics
88
84
-### Why controlled components?
89
+#### Why controlled components?
90
91
Using form components such as `<input>` in React presents a challenge that is absent when writing traditional form HTML. For example, in HTML:
92
@@ -101,7 +106,7 @@ Unlike HTML, React components must represent the state of the view at any point
106
107
Since this method describes the view at any point in time, the value of the text input should *always* be `Untitled`.
108
104
-### Why textarea value?
109
+#### Why textarea value?
110
111
In HTML, the value of `<textarea>` is usually set using its children:
112
@@ -116,4 +121,4 @@ For HTML, this easily allows developers to supply multiline values. However, sin
121
<textarea name="description" value="This is a description." />
122
```
123
119
-If you *do* decide to use children, they will behave like `defaultValue`.
124
+If you *do* decide to use children, they will behave like `defaultValue`.
\ No newline at end of file
docs/docs/07-working-with-the-browser.md
renamed
+18
-13
@@ -1,8 +1,13 @@
1
-# Working with the browser
2
-
1
+---
2
+id: 07-working-with-the-browser
3
+title: Working with the browser
4
+layout: docs
5
+prev: 06-forms.html
6
+next: 07.1-more-about-refs.html
7
+---
8
React provides powerful abstractions that free you from touching the DOM directly in most cases, but sometimes you simply need to access the underlying API, perhaps to work with a third-party library or existing code.
9
5
-## The mock DOM
10
+### The mock DOM
11
12
React is so fast because it never talks to the DOM directly. React maintains a fast in-memory representation of the DOM. `render()` methods return a *description* of the DOM, and React can diff this description with the in-memory representation to compute the fastest way to update the browser.
13
@@ -10,7 +15,7 @@ Additionally, React implements a full synthetic event system such that all event
15
16
Most of the time you should stay within React's "faked browser" world since it's more performant and easier to reason about. However, sometimes you simply need to access the underlying API, perhaps to work with a third-party library like a jQuery plugin. React provides escape hatches for you to use the underlying DOM API directly.
17
13
-## Refs and getDOMNode()
18
+### Refs and getDOMNode()
19
20
To interact with the browser, you'll need a reference to a DOM node. Every mounted React component has a `getDOMNode()` function which you can call to get a reference to it.
21
@@ -48,11 +53,11 @@ React.renderComponent(
53
);
54
```
55
51
-## More about refs
56
+### More about refs
57
58
To learn more about refs, including ways to use them effectively, see our [more about refs](./07.1-more-about-refs.html) documentation.
59
55
-## Component lifecycle
60
+### Component lifecycle
61
62
Components have three main parts of their lifecycle:
63
- **Mounting:** A component is being inserted into the DOM.
@@ -61,24 +66,24 @@ Components have three main parts of their lifecycle:
66
67
React provides lifecycle methods that you can override to hook into this process. We provide **will** methods, which are called right before something happens, and **did** methods which are called right after something happens.
68
64
-### Mounting
69
+#### Mounting
70
71
- `getInitialState(): object` is invoked before a component is mounted. Stateful components should implement this and return the initial state data.
72
- `componentWillMount()` is invoked immediately before mounting occurs.
73
- `componentDidMount(DOMElement rootNode)` is invoked immediately after mounting occurs. Initialization that requires DOM nodes should go here.
74
70
-### Updating
75
+#### Updating
76
77
- `componentWillReceiveProps(object nextProps)` is invoked when a mounted component receives new props. This method should be used to compare `this.props` and `nextProps` to perform state transitions using `this.setState()`.
78
- `shouldComponentUpdate(object nextProps, object nextState): boolean` is invoked when a component decides whether any changes warrant an update to the DOM. Implement this as an optimization to compare `this.props` with `nextProps` and `this.state` with `nextState` and return false if React should skip updating.
79
- `componentWillUpdate(object nextProps, object nextState)` is invoked immediately before updating occurs. You cannot call `this.setState()` here.
80
- `componentDidUpdate(object prevProps, object prevState, DOMElement rootNode)` is invoked immediately after updating occurs.
81
77
-### Unmounting
82
+#### Unmounting
83
84
- `componentWillUnmount()` is invoked immediately before a component is unmounted and destroyed. Cleanup should go here.
85
81
-### Mounted Methods
86
+#### Mounted Methods
87
88
_Mounted_ composite components also support the following methods:
89
@@ -91,14 +96,14 @@ _Mounted_ composite components also support the following methods:
96
> `componentDidUpdate()` is a convenience. The same node can be obtained by
97
> calling `this.getDOMNode()`.
98
94
-## Browser suppport and polyfills
99
+### Browser suppport and polyfills
100
101
At Facebook, we support older browsers, including IE8. We've had polyfills in place for a long time to allow us to write forward-thinking JS. This means we don't have a bunch of hacks scattered throughout our codebase and we can still expect our code to "just work". For example, instead of seeing `+new Date()`, we can just write `Date.now()`. Since the open source React is the same as what we use internally, we've carried over this philosophy of using forward thinking JS.
102
103
In addition to that philosphy, we've also taken the stance that we, as authors of a JS library, should not be shipping polyfills as a part of our library. If every library did this, there's a good chance you'd be sending down the same polyfill multiple times, which could be a sizable chunk of dead code. If your product needs to support older browsers, chances are you're already using something like [es5-shim](https://github.com/kriskowal/es5-shim).
104
105
101
-### Polyfills needed to support older browsers
106
+#### Polyfills needed to support older browsers
107
108
* `Array.isArray`
109
* `Array.prototype.forEach`
@@ -110,4 +115,4 @@ In addition to that philosphy, we've also taken the stance that we, as authors o
115
All of these can be polyfilled using `es5-shim.js` from [https://github.com/kriskowal/es5-shim](https://github.com/kriskowal/es5-shim).
116
117
* `console.*` - [https://github.com/paulmillr/console-polyfill](https://github.com/paulmillr/console-polyfill)
113
-* `Object.create` - Provided in `es5-sham.js` @ [https://github.com/kriskowal/es5-shim](https://github.com/kriskowal/es5-shim)
118
+* `Object.create` - Provided in `es5-sham.js` @ [https://github.com/kriskowal/es5-shim](https://github.com/kriskowal/es5-shim)
\ No newline at end of file
docs/docs/07.1-more-about-refs.md
renamed
+10
-5
@@ -1,5 +1,10 @@
1
-# More about refs
2
-
1
+---
2
+id: 07.1-more-about-refs
3
+title: More about refs
4
+layout: docs
5
+prev: 07-working-with-the-browser.html
6
+next: 08-tooling-integration.html
7
+---
8
After returning the structure of your UI from the render method, you may find yourself wanting to "reach out" and invoke methods on component instances returned from render. Often, doing something like this isn't necessary for making data flow through your application, because the Reactive data flow always ensures that the most recent `props` are sent to each child that is output from `render()`. However there are a few cases, where it still might be necessary or beneficial.
9
10
Consider the case when you wish to tell an `<input />` element (that exists within your instances sub-hierarchy) to focus after you update its value to be the empty string, `''`.
@@ -58,7 +63,7 @@ In this counterexample, the `<input />` is merely a *description* of an `<input
63
64
So how do we talk to the *real* backing instance of the input?
65
61
-## The `ref` attribute
66
+### The `ref` attribute
67
68
React supports a very special property that you can attach to any component that is output from `render()`. This special property allows you to refer to the corresponding **backing instance** of anything returned from `render()`. It is always guaranteed to be the proper instance, at any point in time.
69
@@ -76,7 +81,7 @@ It's as simple as:
81
this.refs.myInput
82
```
83
79
-## Completing the Example
84
+### Completing the Example
85
86
```javascript
87
var App = React.createClass({
@@ -110,7 +115,7 @@ It's as simple as:
115
In this example, our render function returns a description of an <input /> instance. But the true instance is accessed via `this.refs.theInput`. As long as a child component with `ref="theInput"` is returned from render, `this.refs.theInput` will access the the proper instance. This even works on higher level (non-DOM) components such as <Typeahead ref="myTypeahead" />.
116
117
113
-## Summary
118
+### Summary
119
120
Refs are a great way to send a message to a particular child instance in a way that would be inconvenient to do via streaming Reactive `props` and `state`. They should, however, not be your go-to abstraction for flowing data through your application. By default, use the Reactive data flow and save `ref`s for use cases that are inherently non-reactive.
121
docs/docs/08-tooling-integration.md
renamed
+13
-8
@@ -1,30 +1,35 @@
1
-# Tooling integration
2
-
1
+---
2
+id: 08-tooling-integration
3
+title: Tooling integration
4
+layout: docs
5
+prev: 07.1-more-about-refs.html
6
+next: 09-reference.html
7
+---
8
Every project uses a different system for building and deploying JavaScript. We've tried to make React as environment-agnostic as possible.
9
5
-## CDN-hosted React
10
+### CDN-hosted React
11
12
We provide CDN-hosted versions of React [on our download page](/react/downloads.html). These prebuilt files use the UMD module format. Dropping them in with a simple `<script>` tag will inject a `React` global into your environment. It also works out-of-the-box in CommonJS and AMD environments.
13
9
-## Using master
14
+### Using master
15
16
We have instructions for building from master [in our GitHub repository](https://github.com/facebook/react). We build a tree of CommonJS modules under `build/modules` which you can drop into any environment or packaging tool that supports CommonJS.
17
13
-## In-browser JSX transform
18
+### In-browser JSX transform
19
20
If you like using JSX, we provide an in-browser JSX transformer for development [on our download page](/react/downloads.html). Simply include a `<script type="text/jsx">` tag to engage the JSX transformer. Be sure to include the `/** @jsx React.DOM */` comment as well, otherwise the transformer will not run the transforms.
21
22
**Warning:** the in-browser JSX transformer is fairly large and is extra computation. Do not use it in production -- see the next section.
23
19
-## Productionizing: precompiled JSX
24
+### Productionizing: precompiled JSX
25
26
If you have [npm](http://npmjs.org/), you can simply run `npm install -g react-tools` to install our command-line `jsx` tool. This tool will translate files that use JSX syntax to plain JavaScript files that can run directly in the browser. It will also watch directories for you and automatically transform files when they are changed; for example: `jsx --watch src/ build/`. Run `jsx --help` for more information on how to use this tool.
27
23
-## Helpful open-source projects
28
+### Helpful open-source projects
29
30
The open-source community has built tools that integrate JSX with several build systems.
31
32
* [reactify](https://github.com/andreypopp/reactify) - use JSX with [browserify](http://browserify.org/).
33
* [grunt-react](https://github.com/ericclemmons/grunt-react) - [grunt](http://gruntjs.com/) task for JSX
34
* [require-jsx](https://github.com/seiffert/require-jsx) - use JSX with [require.js](http://requirejs.org/)
30
-* [reactapp](https://github.com/jordwalke/reactapp) - a sample project to get up-and-running with React quickly
35
+* [reactapp](https://github.com/jordwalke/reactapp) - a sample project to get up-and-running with React quickly
\ No newline at end of file
docs/docs/08-working-with-your-environment.md
new
+35
@@ -0,0 +1,35 @@
1
+---
2
+id: 08-working-with-your-environment
3
+title: Working with your environment
4
+layout: docs
5
+prev: 07.1-more-about-refs.html
6
+next: 09-reference.html
7
+---
8
+Every project uses a different system for building and deploying JavaScript. We've tried to make React as environment-agnostic as possible.
9
+
10
+### CDN-hosted React
11
+
12
+We provide CDN-hosted versions of React [on our download page](/react/downloads.html). These prebuilt files use the UMD module format. Dropping them in with a simple `<script>` tag will inject a `React` global into your environment. It also works out-of-the-box in CommonJS and AMD environments.
13
+
14
+### Using master
15
+
16
+We have instructions for building from master [in our GitHub repository](https://github.com/facebook/react). We build a tree of CommonJS modules under `build/modules` which you can drop into any environment or packaging tool that supports CommonJS.
17
+
18
+### In-browser JSX transform
19
+
20
+If you like using JSX, we provide an in-browser JSX transformer for development [on our download page](/react/downloads.html). Simply include a `<script type="text/jsx">` tag to engage the JSX transformer. Be sure to include the `/** @jsx React.DOM */` comment as well, otherwise the transformer will not run the transforms.
21
+
22
+**Warning:** the in-browser JSX transformer is fairly large and is extra computation. Do not use it in production -- see the next section.
23
+
24
+### Productionizing: precompiled JSX
25
+
26
+If you have [npm](http://npmjs.org/), you can simply run `npm install -g react-tools` to install our command-line `jsx` tool. This tool will translate files that use JSX syntax to plain JavaScript files that can run directly in the browser. It will also watch directories for you and automatically transform files when they are changed; for example: `jsx --watch src/ build/`. Run `jsx --help` for more information on how to use this tool.
27
+
28
+### Helpful open-source projects
29
+
30
+The open-source community has built tools that integrate JSX with several build systems.
31
+
32
+* [reactify](https://github.com/andreypopp/reactify) - use JSX with [browserify](http://browserify.org/).
33
+* [grunt-react](https://github.com/ericclemmons/grunt-react) - [grunt](http://gruntjs.com/) task for JSX
34
+* [require-jsx](https://github.com/seiffert/require-jsx) - use JSX with [require.js](http://requirejs.org/)
35
+* [reactapp](https://github.com/jordwalke/reactapp) - a sample project to get up-and-running with React quickly
\ No newline at end of file
docs/docs/09-reference.md
renamed
+30
-25
@@ -1,14 +1,19 @@
1
-# Reference
1
+---
2
+id: 09-reference
3
+title: Reference
4
+layout: docs
5
+prev: 08-tooling-integration.html
6
+next: 09.1-tutorial.html
7
+---
8
+### Examples
9
3
-## Examples
4
-
5
-### Production apps
10
+#### Production apps
11
12
* All of [Instagram.com](http://instagram.com/) is built on React.
13
* Many components on [Facebook.com](http://www.facebook.com/), including the commenting interface, ads creation flows, and page insights.
14
* [Khan Academy](http://khanacademy.org/) is using React for its question editor.
15
11
-### Sample code
16
+#### Sample code
17
18
* We've included **[a step-by-step comment box tutorial](./09.1-tutorial.md)**
19
* There is also [a simple LikeButton tutorial](./likebutton/)
@@ -17,17 +22,17 @@
22
* [React one-hour email](https://github.com/petehunt/react-one-hour-email/commits/master) goes step-by-step from a static HTML mock to an interactive email reader (written in just one hour!)
23
* [Rendr + React app template](https://github.com/petehunt/rendr-react-template/) demonstrates how to use React's server rendering capabilities.
24
20
-## API
25
+### API
26
22
-### React
27
+#### React
28
29
`React` is the entry point to the React framework. If you're using one of the prebuilt packages it's available as a global; if you're using CommonJS modules you can `require()` it.
30
26
-#### React.DOM
31
+##### React.DOM
32
33
`React.DOM` provides all of the standard HTML tags needed to build a React app. You generally don't use it directly; instead, just include it as part of the `/** @jsx React.DOM */` docblock.
34
30
-#### React.initializeTouchEvents
35
+##### React.initializeTouchEvents
36
37
```javascript
38
initializeTouchEvents(boolean shouldUseTouch)
@@ -35,7 +40,7 @@ initializeTouchEvents(boolean shouldUseTouch)
40
41
Configure React's event system to handle touch events on mobile devices.
42
38
-#### React.createClass
43
+##### React.createClass
44
45
```javascript
46
function createClass(object specification)
@@ -43,7 +48,7 @@ function createClass(object specification)
48
49
Creates a component given a specification. A component implements a `render` method which returns **one single** child. That child may have an arbitrarily deep child structure. One thing that makes components different than a standard prototypal classes is that you don't need to call new on them. They are convenience wrappers that construct backing instances (via new) for you.
50
46
-#### React.renderComponent
51
+##### React.renderComponent
52
53
```javascript
54
ReactComponent renderComponent(ReactComponent container, DOMElement container)
@@ -53,7 +58,7 @@ Renders a React component into the DOM in the supplied `container`.
58
59
If the React component was previously rendered into `container`, this will perform an update on it and only mutate the DOM as necessary to reflect the latest React component.
60
56
-#### React.unmountAndReleaseReactRootNode
61
+##### React.unmountAndReleaseReactRootNode
62
63
```javascript
64
unmountAndReleaseReactRootNode(DOMElement container)
@@ -61,7 +66,7 @@ unmountAndReleaseReactRootNode(DOMElement container)
66
67
Remove a mounted React component from the DOM and clean up its event handlers and state.
68
64
-#### React.renderComponentToString
69
+##### React.renderComponentToString
70
71
```javascript
72
renderComponentToString(ReactComponent component, function callback)
@@ -69,17 +74,17 @@ renderComponentToString(ReactComponent component, function callback)
74
75
Render a component to its initial HTML. This should only be used on the server. React will call `callback` with an HTML string when the markup is ready. You can use this method to create static site generators, or you can generate HTML on the server and send it down to have a very fast initial page load. If you call `React.renderComponent()` on a node that already has this server-rendered markup, React will preserve it and only attach event handlers, allowing you to have a very performant first-load experience.
76
72
-### AbstractEvent
77
+#### AbstractEvent
78
79
Your event handlers will be passed instances of `AbstractEvent`, a cross-browser wrapper around the browser's native event. It has the same interface as the browser's native event (such as `stopPropagation()` and `preventDefault()`) except they work exactly the same across all browsers.
80
81
If you find that you need the underlying browser event for some reason, simply use the `nativeEvent` attribute to get it.
82
78
-### ReactComponent
83
+#### ReactComponent
84
85
Component classses created by `createClass()` return instances of `ReactComponent` when called. Most of the time when you're using React you're either creating or consuming `ReactComponent`s.
86
82
-#### getDOMNode
87
+##### getDOMNode
88
89
```javascript
90
DOMElement getDOMNode()
@@ -87,7 +92,7 @@ DOMElement getDOMNode()
92
93
If this component has been mounted into the DOM, this returns the corresponding native browser DOM element. This method is useful for reading values out of the DOM, such as form field values and performing DOM measurements.
94
90
-#### setProps
95
+##### setProps
96
97
```javascript
98
setProps(object nextProps)
@@ -97,7 +102,7 @@ When you're integrating with an external JavaScript application you may want to
102
103
**Note:** This method can only be called on a root-level component. That is, it's only available on the component passed directly to `renderComponent()` and none of its children. If you're inclined to use `setProps()` on a child component, instead take advantage of reactive updates and pass the new prop to the child component when it's created in `render()`.
104
100
-#### replaceProps
105
+##### replaceProps
106
107
```javascript
108
replaceProps(object nextProps)
@@ -105,7 +110,7 @@ replaceProps(object nextProps)
110
111
Like `setProps()` but deletes any pre-existing props that are not in nextProps.
112
108
-#### transferPropsTo
113
+##### transferPropsTo
114
115
```javascript
116
ReactComponent transferPropsTo(ReactComponent targetComponent)
@@ -113,7 +118,7 @@ ReactComponent transferPropsTo(ReactComponent targetComponent)
118
119
Transfer properties from this component to a target component that have not already been set on the target component. This is usually used to pass down properties to the returned root component. `targetComponent`, now updated with some new props is returned as a convenience.
120
116
-#### setState
121
+##### setState
122
123
```javascript
124
setState(object nextState[, function callback])
@@ -127,7 +132,7 @@ Merges nextState with the current state. This is the primary method you use to t
132
133
**Note**: There is no guarantee of synchronous operation of calls to `setState` and calls may be batched for performance gains.
134
130
-#### replaceState
135
+##### replaceState
136
137
```javascript
138
replaceState(object nextState[, function callback])
@@ -135,7 +140,7 @@ replaceState(object nextState[, function callback])
140
141
Like `setState()` but deletes any pre-existing state keys that are not in nextState.
142
138
-#### forceUpdate()
143
+##### forceUpdate()
144
145
```javascript
146
forceUpdate([function callback])
@@ -147,7 +152,7 @@ Normally you should try to avoid all uses of `forceUpdate()` and only read from
152
153
**Note**: There is no guarantee of synchronous operation of calls to `forceUpdate` and calls may be batched for performance gains.
154
150
-#### Lifecycle methods
155
+##### Lifecycle methods
156
157
```javascript
158
object getInitialState()
@@ -163,11 +168,11 @@ componentWillUnmount()
168
169
See the [working with the browser](./07-working-with-the-browser.html) documentation for more details on these lifecycle methods.
170
166
-## DOM differences
171
+### DOM differences
172
173
React has implemented a browser-independent events and DOM system for performance and cross-browser compatibility reasons. We took the opportunity to clean up a few rough edges in browser DOM implementations.
174
175
* All events (including submit) bubble correctly per the W3C spec
176
* All event objects conform to the W3C spec
177
* All DOM properties and attributes (including event handlers) should be camelCased to be consistent with standard JavaScript style. We intentionally break with the spec here, since the spec is inconsistent.
173
-* `onChange` behaves as you would expect it to: whenever a form field is changed this event is fired rather than inconsistently on blur. We intentionally break from existing browser behavior because `onChange` is a misnomer for its behavior and React relies on this event to react to user input in real time.
178
+* `onChange` behaves as you would expect it to: whenever a form field is changed this event is fired rather than inconsistently on blur. We intentionally break from existing browser behavior because `onChange` is a misnomer for its behavior and React relies on this event to react to user input in real time.
\ No newline at end of file
docs/docs/09.1-tutorial.md
renamed
+26
-22
@@ -1,5 +1,9 @@
1
-# Tutorial
2
-
1
+---
2
+id: 09.1-tutorial
3
+title: Tutorial
4
+layout: docs
5
+prev: 09-reference.html
6
+---
7
We'll be building a simple, but realistic comments box that you can drop into a blog, similar to Disqus, LiveFyre or Facebook comments.
8
9
We'll provide:
@@ -14,11 +18,11 @@ It'll also have a few neat features:
18
* **Live updates:** as other users comment we'll pop them into the comment view in real time
19
* **Markdown formatting:** users can use Markdown to format their text
20
17
-## Want to skip all this and just see the source?
21
+### Want to skip all this and just see the source?
22
23
[It's all on GitHub.](https://github.com/petehunt/react-tutorial)
24
21
-## Getting started
25
+### Getting started
26
27
For this tutorial we'll use prebuilt JavaScript files on a CDN. Open up your favorite editor and create a new HTML document:
28
@@ -44,7 +48,7 @@ For this tutorial we'll use prebuilt JavaScript files on a CDN. Open up your fav
48
49
For the remainder of this tutorial, we'll be writing our JavaScript code in this script tag.
50
47
-## Your first component
51
+### Your first component
52
53
React is all about modular, composable components. For our comment box example, we'll have the following component structure:
54
@@ -74,7 +78,7 @@ React.renderComponent(
78
);
79
```
80
77
-### JSX Syntax
81
+#### JSX Syntax
82
83
The first thing you'll notice is the XML-ish syntax in your JavaScript. We have a simple precompiler that translates the syntactic sugar to this plain JavaScript:
84
@@ -98,7 +102,7 @@ React.renderComponent(
102
103
Its use is optional but we've found JSX syntax easier to use than plain JavaScript. Read more on the [JSX Syntax article](syntax.html).
104
101
-### What's going on
105
+#### What's going on
106
107
We pass some methods in a JavaScript object to `React.createClass()` to create a new React component. The most important of these methods is called `render` which returns a tree of React components that will eventually render to HTML.
108
@@ -108,7 +112,7 @@ You do not have to return basic HTML. You can return a tree of components that y
112
113
`React.renderComponent()` instantiates the root component, starts the framework, and injects the markup into a raw DOM element, provided as the second argument.
114
111
-# Composing components
115
+## Composing components
116
117
Let's build skeletons for `CommentList` and `CommentForm` which will, again, be simple `<div>`s:
118
@@ -154,7 +158,7 @@ var CommentBox = React.createClass({
158
159
Notice how we're mixing HTML tags and components we've built. HTML components are regular React components, just like the ones you define, with one difference. The JSX compiler will automatically rewrite HTML tags to "React.DOM.tagName" expressions and leave everything else alone. This is to prevent the pollution of the global namespace.
160
157
-## Component Properties
161
+### Component Properties
162
163
Let's create our third component, `Comment`. We will want to pass it the author name and comment text so we can reuse the same code for each unique comment. First let's add some comments to the `CommentList`:
164
@@ -174,7 +178,7 @@ var CommentList = React.createClass({
178
179
Note that we have passed some data from the parent `CommentList` component to the child `Comment` component as both XML-like children and attributes. Data passed from parent to child is called **props**, short for properties.
180
177
-## Using props
181
+### Using props
182
183
Let's create the Comment component. It will read the data passed to it from the CommentList and render some markup:
184
@@ -196,7 +200,7 @@ var Comment = React.createClass({
200
201
By surrounding a JavaScript expression in braces inside JSX (as either an attribute or child), you can drop text or React components into the tree. We access named attributes passed to the component as keys on `this.props` and any nested elements as `this.props.children`.
202
199
-## Adding Markdown
203
+### Adding Markdown
204
205
Markdown is a simple way to format your text inline. For example, surrounding text with asterisks will make it emphasized.
206
@@ -249,7 +253,7 @@ This is a special API that intentionally makes it difficult to insert raw HTML,
253
254
**Remember:** by using this feature you're relying on Showdown to be secure.
255
252
-## Hook up the data model
256
+### Hook up the data model
257
258
So far we've been inserting the comments directly in the source code. Instead, let's render a blob of JSON data into the comment list. Eventually this will come from the server, but for now, write it in your source:
259
@@ -303,7 +307,7 @@ var CommentList = React.createClass({
307
308
That's it!
309
306
-## Fetching from the server
310
+### Fetching from the server
311
312
Let's replace the hard-coded data with some dynamic data from the server. We will remove the data prop and replace it with a URL to fetch:
313
@@ -317,7 +321,7 @@ React.renderComponent(
321
322
This component is different from the prior components because it will have to re-render itself. The component won't have any data until the request from the server comes back, at which point the component may need to render some new comments.
323
320
-## Reactive state
324
+### Reactive state
325
326
So far, each component has rendered itself once based on its props. `props` are immutable: they are passed from the parent and are "owned" by the parent. To implement interactions, we introduce mutable **state** to the component. `this.state` is private to the component and can be changed by calling `this.setState()`. When the state is updated, the component re-renders itself.
327
@@ -345,7 +349,7 @@ var CommentBox = React.createClass({
349
350
`getInitialState()` executes exactly once during the lifecycle of the component and sets up the initial state of the component.
351
348
-### Updating state
352
+#### Updating state
353
When the component is first created, we want to GET some JSON from the server and update the state to reflect the latest data. In a real application this would be a dynamic endpoint, but for this example, we will use a static JSON file to keep things simple:
354
355
```javascript
@@ -431,7 +435,7 @@ React.renderComponent(
435
436
All we have done here is move the AJAX call to a separate method and call it when the component is first loaded and every 5 seconds after that. Try running this in your browser and changing the `comments.json` file; within 5 seconds, the changes will show!
437
434
-## Adding new comments
438
+### Adding new comments
439
440
Now it's time to build the form. Our `CommentForm` component should ask the user for their name and comment text and send a request to the server to save the comment.
441
@@ -482,17 +486,17 @@ var CommentForm = React.createClass({
486
});
487
```
488
485
-#### Events
489
+##### Events
490
491
React attaches event handlers to components using a camelCase naming convention. We attach an `onSubmit` handler to the form that clears the form fields when the form is submitted with valid input.
492
493
We always return `false` from the event handler to prevent the browser's default action of submitting the form. (If you prefer, you can instead take the event as an argument and call `preventDefault()` on it – read more about [event handling](event-handling.html).)
494
491
-#### Refs
495
+##### Refs
496
497
We use the `ref` attribute to assign a name to a child component and `this.refs` to reference the component. We can call `getDOMNode()` on a component to get the native browser DOM element.
498
495
-#### Callbacks as props
499
+##### Callbacks as props
500
501
When a user submits a comment, we will need to refresh the list of comments to include the new one. It makes sense to do all of this logic in `CommentBox` since `CommentBox` owns the state that represents the list of comments.
502
@@ -617,7 +621,7 @@ var CommentBox = React.createClass({
621
});
622
```
623
620
-## Optimization: optimistic updates
624
+### Optimization: optimistic updates
625
626
Our application is now feature complete but it feels slow to have to wait for the request to complete before your comment appears in the list. We can optimistically add this comment to the list to make the app feel faster.
627
@@ -672,6 +676,6 @@ var CommentBox = React.createClass({
676
});
677
```
678
675
-## Congrats!
679
+### Congrats!
680
677
-You have just built a comment box in a few simple steps. Learn more about React in the [reference](syntax.html) or start hacking! Good luck!
681
+You have just built a comment box in a few simple steps. Learn more about React in the [reference](syntax.html) or start hacking! Good luck!
\ No newline at end of file
docs/docs/OUTLINE.md
renamed
+8
-4
@@ -1,4 +1,9 @@
1
-# Goals of the documentation
1
+---
2
+id: OUTLINE
3
+title: Goals of the documentation
4
+layout: docs
5
+prev: 09.1-tutorial.html
6
+---
7
- Flow of docs should mimic progression of questions a new user would ask
8
- High information density -- assume the reader is adept at JS
9
- Talk about best practices
@@ -6,7 +11,7 @@
11
- Provide background for some of the design decisions
12
- Less words less words less words!
13
9
-# Outline
14
+## Outline
15
16
Motivation / Why React?
17
- Declarative (simple)
@@ -88,5 +93,4 @@ Case studies
93
94
Reference
95
- API
91
-- DOM differences
92
-
96
+- DOM differences
\ No newline at end of file
docs/docs/likebutton/docs/assets/css/bootstrap-responsive.css
new
+817
@@ -0,0 +1,817 @@
1
+/*!
2
+ * Bootstrap Responsive v2.0.4
3
+ *
4
+ * Copyright 2012 Twitter, Inc
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
+ */
10
+
11
+/*spin(@btnPrimaryBackground, 15%);*/
12
+
13
+.clearfix {
14
+ *zoom: 1;
15
+}
16
+
17
+.clearfix:before,
18
+.clearfix:after {
19
+ display: table;
20
+ content: "";
21
+}
22
+
23
+.clearfix:after {
24
+ clear: both;
25
+}
26
+
27
+.hide-text {
28
+ font: 0/0 a;
29
+ color: transparent;
30
+ text-shadow: none;
31
+ background-color: transparent;
32
+ border: 0;
33
+}
34
+
35
+.input-block-level {
36
+ display: block;
37
+ width: 100%;
38
+ min-height: 28px;
39
+ -webkit-box-sizing: border-box;
40
+ -moz-box-sizing: border-box;
41
+ -ms-box-sizing: border-box;
42
+ box-sizing: border-box;
43
+}
44
+
45
+.hidden {
46
+ display: none;
47
+ visibility: hidden;
48
+}
49
+
50
+.visible-phone {
51
+ display: none !important;
52
+}
53
+
54
+.visible-tablet {
55
+ display: none !important;
56
+}
57
+
58
+.hidden-desktop {
59
+ display: none !important;
60
+}
61
+
62
+@media (max-width: 767px) {
63
+ .visible-phone {
64
+ display: inherit !important;
65
+ }
66
+ .hidden-phone {
67
+ display: none !important;
68
+ }
69
+ .hidden-desktop {
70
+ display: inherit !important;
71
+ }
72
+ .visible-desktop {
73
+ display: none !important;
74
+ }
75
+}
76
+
77
+@media (min-width: 768px) and (max-width: 979px) {
78
+ .visible-tablet {
79
+ display: inherit !important;
80
+ }
81
+ .hidden-tablet {
82
+ display: none !important;
83
+ }
84
+ .hidden-desktop {
85
+ display: inherit !important;
86
+ }
87
+ .visible-desktop {
88
+ display: none !important ;
89
+ }
90
+}
91
+
92
+@media (max-width: 480px) {
93
+ .nav-collapse {
94
+ -webkit-transform: translate3d(0, 0, 0);
95
+ }
96
+ .page-header h1 small {
97
+ display: block;
98
+ line-height: 18px;
99
+ }
100
+ input[type="checkbox"],
101
+ input[type="radio"] {
102
+ border: 1px solid #ccc;
103
+ }
104
+ .form-horizontal .control-group > label {
105
+ float: none;
106
+ width: auto;
107
+ padding-top: 0;
108
+ text-align: left;
109
+ }
110
+ .form-horizontal .controls {
111
+ margin-left: 0;
112
+ }
113
+ .form-horizontal .control-list {
114
+ padding-top: 0;
115
+ }
116
+ .form-horizontal .form-actions {
117
+ padding-right: 10px;
118
+ padding-left: 10px;
119
+ }
120
+ .modal {
121
+ position: absolute;
122
+ top: 10px;
123
+ right: 10px;
124
+ left: 10px;
125
+ width: auto;
126
+ margin: 0;
127
+ }
128
+ .modal.fade.in {
129
+ top: auto;
130
+ }
131
+ .modal-header .close {
132
+ padding: 10px;
133
+ margin: -10px;
134
+ }
135
+ .carousel-caption {
136
+ position: static;
137
+ }
138
+}
139
+
140
+@media (max-width: 767px) {
141
+ body {
142
+ padding-right: 20px;
143
+ padding-left: 20px;
144
+ }
145
+ .navbar-fixed-top,
146
+ .navbar-fixed-bottom {
147
+ margin-right: -20px;
148
+ margin-left: -20px;
149
+ }
150
+ .container-fluid {
151
+ padding: 0;
152
+ }
153
+ .dl-horizontal dt {
154
+ float: none;
155
+ width: auto;
156
+ clear: none;
157
+ text-align: left;
158
+ }
159
+ .dl-horizontal dd {
160
+ margin-left: 0;
161
+ }
162
+ .container {
163
+ width: auto;
164
+ }
165
+ .row-fluid {
166
+ width: 100%;
167
+ }
168
+ .row,
169
+ .thumbnails {
170
+ margin-left: 0;
171
+ }
172
+ [class*="span"],
173
+ .row-fluid [class*="span"] {
174
+ display: block;
175
+ float: none;
176
+ width: auto;
177
+ margin-left: 0;
178
+ }
179
+ .input-large,
180
+ .input-xlarge,
181
+ .input-xxlarge,
182
+ input[class*="span"],
183
+ select[class*="span"],
184
+ textarea[class*="span"],
185
+ .uneditable-input {
186
+ display: block;
187
+ width: 100%;
188
+ min-height: 28px;
189
+ -webkit-box-sizing: border-box;
190
+ -moz-box-sizing: border-box;
191
+ -ms-box-sizing: border-box;
192
+ box-sizing: border-box;
193
+ }
194
+ .input-prepend input,
195
+ .input-append input,
196
+ .input-prepend input[class*="span"],
197
+ .input-append input[class*="span"] {
198
+ display: inline-block;
199
+ width: auto;
200
+ }
201
+}
202
+
203
+@media (min-width: 768px) and (max-width: 979px) {
204
+ .row {
205
+ margin-left: -20px;
206
+ *zoom: 1;
207
+ }
208
+ .row:before,
209
+ .row:after {
210
+ display: table;
211
+ content: "";
212
+ }
213
+ .row:after {
214
+ clear: both;
215
+ }
216
+ [class*="span"] {
217
+ float: left;
218
+ margin-left: 20px;
219
+ }
220
+ .container,
221
+ .navbar-fixed-top .container,
222
+ .navbar-fixed-bottom .container {
223
+ width: 724px;
224
+ }
225
+ .span12 {
226
+ width: 724px;
227
+ }
228
+ .span11 {
229
+ width: 662px;
230
+ }
231
+ .span10 {
232
+ width: 600px;
233
+ }
234
+ .span9 {
235
+ width: 538px;
236
+ }
237
+ .span8 {
238
+ width: 476px;
239
+ }
240
+ .span7 {
241
+ width: 414px;
242
+ }
243
+ .span6 {
244
+ width: 352px;
245
+ }
246
+ .span5 {
247
+ width: 290px;
248
+ }
249
+ .span4 {
250
+ width: 228px;
251
+ }
252
+ .span3 {
253
+ width: 166px;
254
+ }
255
+ .span2 {
256
+ width: 104px;
257
+ }
258
+ .span1 {
259
+ width: 42px;
260
+ }
261
+ .offset12 {
262
+ margin-left: 764px;
263
+ }
264
+ .offset11 {
265
+ margin-left: 702px;
266
+ }
267
+ .offset10 {
268
+ margin-left: 640px;
269
+ }
270
+ .offset9 {
271
+ margin-left: 578px;
272
+ }
273
+ .offset8 {
274
+ margin-left: 516px;
275
+ }
276
+ .offset7 {
277
+ margin-left: 454px;
278
+ }
279
+ .offset6 {
280
+ margin-left: 392px;
281
+ }
282
+ .offset5 {
283
+ margin-left: 330px;
284
+ }
285
+ .offset4 {
286
+ margin-left: 268px;
287
+ }
288
+ .offset3 {
289
+ margin-left: 206px;
290
+ }
291
+ .offset2 {
292
+ margin-left: 144px;
293
+ }
294
+ .offset1 {
295
+ margin-left: 82px;
296
+ }
297
+ .row-fluid {
298
+ width: 100%;
299
+ *zoom: 1;
300
+ }
301
+ .row-fluid:before,
302
+ .row-fluid:after {
303
+ display: table;
304
+ content: "";
305
+ }
306
+ .row-fluid:after {
307
+ clear: both;
308
+ }
309
+ .row-fluid [class*="span"] {
310
+ display: block;
311
+ float: left;
312
+ width: 100%;
313
+ min-height: 28px;
314
+ margin-left: 2.762430939%;
315
+ *margin-left: 2.709239449638298%;
316
+ -webkit-box-sizing: border-box;
317
+ -moz-box-sizing: border-box;
318
+ -ms-box-sizing: border-box;
319
+ box-sizing: border-box;
320
+ }
321
+ .row-fluid [class*="span"]:first-child {
322
+ margin-left: 0;
323
+ }
324
+ .row-fluid .span12 {
325
+ width: 99.999999993%;
326
+ *width: 99.9468085036383%;
327
+ }
328
+ .row-fluid .span11 {
329
+ width: 91.436464082%;
330
+ *width: 91.38327259263829%;
331
+ }
332
+ .row-fluid .span10 {
333
+ width: 82.87292817100001%;
334
+ *width: 82.8197366816383%;
335
+ }
336
+ .row-fluid .span9 {
337
+ width: 74.30939226%;
338
+ *width: 74.25620077063829%;
339
+ }
340
+ .row-fluid .span8 {
341
+ width: 65.74585634900001%;
342
+ *width: 65.6926648596383%;
343
+ }
344
+ .row-fluid .span7 {
345
+ width: 57.182320438000005%;
346
+ *width: 57.129128948638304%;
347
+ }
348
+ .row-fluid .span6 {
349
+ width: 48.618784527%;
350
+ *width: 48.5655930376383%;
351
+ }
352
+ .row-fluid .span5 {
353
+ width: 40.055248616%;
354
+ *width: 40.0020571266383%;
355
+ }
356
+ .row-fluid .span4 {
357
+ width: 31.491712705%;
358
+ *width: 31.4385212156383%;
359
+ }
360
+ .row-fluid .span3 {
361
+ width: 22.928176794%;
362
+ *width: 22.874985304638297%;
363
+ }
364
+ .row-fluid .span2 {
365
+ width: 14.364640883%;
366
+ *width: 14.311449393638298%;
367
+ }
368
+ .row-fluid .span1 {
369
+ width: 5.801104972%;
370
+ *width: 5.747913482638298%;
371
+ }
372
+ input,
373
+ textarea,
374
+ .uneditable-input {
375
+ margin-left: 0;
376
+ }
377
+ input.span12,
378
+ textarea.span12,
379
+ .uneditable-input.span12 {
380
+ width: 714px;
381
+ }
382
+ input.span11,
383
+ textarea.span11,
384
+ .uneditable-input.span11 {
385
+ width: 652px;
386
+ }
387
+ input.span10,
388
+ textarea.span10,
389
+ .uneditable-input.span10 {
390
+ width: 590px;
391
+ }
392
+ input.span9,
393
+ textarea.span9,
394
+ .uneditable-input.span9 {
395
+ width: 528px;
396
+ }
397
+ input.span8,
398
+ textarea.span8,
399
+ .uneditable-input.span8 {
400
+ width: 466px;
401
+ }
402
+ input.span7,
403
+ textarea.span7,
404
+ .uneditable-input.span7 {
405
+ width: 404px;
406
+ }
407
+ input.span6,
408
+ textarea.span6,
409
+ .uneditable-input.span6 {
410
+ width: 342px;
411
+ }
412
+ input.span5,
413
+ textarea.span5,
414
+ .uneditable-input.span5 {
415
+ width: 280px;
416
+ }
417
+ input.span4,
418
+ textarea.span4,
419
+ .uneditable-input.span4 {
420
+ width: 218px;
421
+ }
422
+ input.span3,
423
+ textarea.span3,
424
+ .uneditable-input.span3 {
425
+ width: 156px;
426
+ }
427
+ input.span2,
428
+ textarea.span2,
429
+ .uneditable-input.span2 {
430
+ width: 94px;
431
+ }
432
+ input.span1,
433
+ textarea.span1,
434
+ .uneditable-input.span1 {
435
+ width: 32px;
436
+ }
437
+}
438
+
439
+@media (min-width: 1200px) {
440
+ .row {
441
+ margin-left: -30px;
442
+ *zoom: 1;
443
+ }
444
+ .row:before,
445
+ .row:after {
446
+ display: table;
447
+ content: "";
448
+ }
449
+ .row:after {
450
+ clear: both;
451
+ }
452
+ [class*="span"] {
453
+ float: left;
454
+ margin-left: 30px;
455
+ }
456
+ .container,
457
+ .navbar-fixed-top .container,
458
+ .navbar-fixed-bottom .container {
459
+ width: 1170px;
460
+ }
461
+ .span12 {
462
+ width: 1170px;
463
+ }
464
+ .span11 {
465
+ width: 1070px;
466
+ }
467
+ .span10 {
468
+ width: 970px;
469
+ }
470
+ .span9 {
471
+ width: 870px;
472
+ }
473
+ .span8 {
474
+ width: 770px;
475
+ }
476
+ .span7 {
477
+ width: 670px;
478
+ }
479
+ .span6 {
480
+ width: 570px;
481
+ }
482
+ .span5 {
483
+ width: 470px;
484
+ }
485
+ .span4 {
486
+ width: 370px;
487
+ }
488
+ .span3 {
489
+ width: 270px;
490
+ }
491
+ .span2 {
492
+ width: 170px;
493
+ }
494
+ .span1 {
495
+ width: 70px;
496
+ }
497
+ .offset12 {
498
+ margin-left: 1230px;
499
+ }
500
+ .offset11 {
501
+ margin-left: 1130px;
502
+ }
503
+ .offset10 {
504
+ margin-left: 1030px;
505
+ }
506
+ .offset9 {
507
+ margin-left: 930px;
508
+ }
509
+ .offset8 {
510
+ margin-left: 830px;
511
+ }
512
+ .offset7 {
513
+ margin-left: 730px;
514
+ }
515
+ .offset6 {
516
+ margin-left: 630px;
517
+ }
518
+ .offset5 {
519
+ margin-left: 530px;
520
+ }
521
+ .offset4 {
522
+ margin-left: 430px;
523
+ }
524
+ .offset3 {
525
+ margin-left: 330px;
526
+ }
527
+ .offset2 {
528
+ margin-left: 230px;
529
+ }
530
+ .offset1 {
531
+ margin-left: 130px;
532
+ }
533
+ .row-fluid {
534
+ width: 100%;
535
+ *zoom: 1;
536
+ }
537
+ .row-fluid:before,
538
+ .row-fluid:after {
539
+ display: table;
540
+ content: "";
541
+ }
542
+ .row-fluid:after {
543
+ clear: both;
544
+ }
545
+ .row-fluid [class*="span"] {
546
+ display: block;
547
+ float: left;
548
+ width: 100%;
549
+ min-height: 28px;
550
+ margin-left: 2.564102564%;
551
+ *margin-left: 2.510911074638298%;
552
+ -webkit-box-sizing: border-box;
553
+ -moz-box-sizing: border-box;
554
+ -ms-box-sizing: border-box;
555
+ box-sizing: border-box;
556
+ }
557
+ .row-fluid [class*="span"]:first-child {
558
+ margin-left: 0;
559
+ }
560
+ .row-fluid .span12 {
561
+ width: 100%;
562
+ *width: 99.94680851063829%;
563
+ }
564
+ .row-fluid .span11 {
565
+ width: 91.45299145300001%;
566
+ *width: 91.3997999636383%;
567
+ }
568
+ .row-fluid .span10 {
569
+ width: 82.905982906%;
570
+ *width: 82.8527914166383%;
571
+ }
572
+ .row-fluid .span9 {
573
+ width: 74.358974359%;
574
+ *width: 74.30578286963829%;
575
+ }
576
+ .row-fluid .span8 {
577
+ width: 65.81196581200001%;
578
+ *width: 65.7587743226383%;
579
+ }
580
+ .row-fluid .span7 {
581
+ width: 57.264957265%;
582
+ *width: 57.2117657756383%;
583
+ }
584
+ .row-fluid .span6 {
585
+ width: 48.717948718%;
586
+ *width: 48.6647572286383%;
587
+ }
588
+ .row-fluid .span5 {
589
+ width: 40.170940171000005%;
590
+ *width: 40.117748681638304%;
591
+ }
592
+ .row-fluid .span4 {
593
+ width: 31.623931624%;
594
+ *width: 31.5707401346383%;
595
+ }
596
+ .row-fluid .span3 {
597
+ width: 23.076923077%;
598
+ *width: 23.0237315876383%;
599
+ }
600
+ .row-fluid .span2 {
601
+ width: 14.529914530000001%;
602
+ *width: 14.4767230406383%;
603
+ }
604
+ .row-fluid .span1 {
605
+ width: 5.982905983%;
606
+ *width: 5.929714493638298%;
607
+ }
608
+ input,
609
+ textarea,
610
+ .uneditable-input {
611
+ margin-left: 0;
612
+ }
613
+ input.span12,
614
+ textarea.span12,
615
+ .uneditable-input.span12 {
616
+ width: 1160px;
617
+ }
618
+ input.span11,
619
+ textarea.span11,
620
+ .uneditable-input.span11 {
621
+ width: 1060px;
622
+ }
623
+ input.span10,
624
+ textarea.span10,
625
+ .uneditable-input.span10 {
626
+ width: 960px;
627
+ }
628
+ input.span9,
629
+ textarea.span9,
630
+ .uneditable-input.span9 {
631
+ width: 860px;
632
+ }
633
+ input.span8,
634
+ textarea.span8,
635
+ .uneditable-input.span8 {
636
+ width: 760px;
637
+ }
638
+ input.span7,
639
+ textarea.span7,
640
+ .uneditable-input.span7 {
641
+ width: 660px;
642
+ }
643
+ input.span6,
644
+ textarea.span6,
645
+ .uneditable-input.span6 {
646
+ width: 560px;
647
+ }
648
+ input.span5,
649
+ textarea.span5,
650
+ .uneditable-input.span5 {
651
+ width: 460px;
652
+ }
653
+ input.span4,
654
+ textarea.span4,
655
+ .uneditable-input.span4 {
656
+ width: 360px;
657
+ }
658
+ input.span3,
659
+ textarea.span3,
660
+ .uneditable-input.span3 {
661
+ width: 260px;
662
+ }
663
+ input.span2,
664
+ textarea.span2,
665
+ .uneditable-input.span2 {
666
+ width: 160px;
667
+ }
668
+ input.span1,
669
+ textarea.span1,
670
+ .uneditable-input.span1 {
671
+ width: 60px;
672
+ }
673
+ .thumbnails {
674
+ margin-left: -30px;
675
+ }
676
+ .thumbnails > li {
677
+ margin-left: 30px;
678
+ }
679
+ .row-fluid .thumbnails {
680
+ margin-left: 0;
681
+ }
682
+}
683
+
684
+@media (max-width: 979px) {
685
+ body {
686
+ padding-top: 0;
687
+ }
688
+ .navbar-fixed-top,
689
+ .navbar-fixed-bottom {
690
+ position: static;
691
+ }
692
+ .navbar-fixed-top {
693
+ margin-bottom: 18px;
694
+ }
695
+ .navbar-fixed-bottom {
696
+ margin-top: 18px;
697
+ }
698
+ .navbar-fixed-top .navbar-inner,
699
+ .navbar-fixed-bottom .navbar-inner {
700
+ padding: 5px;
701
+ }
702
+ .navbar .container {
703
+ width: auto;
704
+ padding: 0;
705
+ }
706
+ .navbar .brand {
707
+ padding-right: 10px;
708
+ padding-left: 10px;
709
+ margin: 0 0 0 -5px;
710
+ }
711
+ .nav-collapse {
712
+ clear: both;
713
+ }
714
+ .nav-collapse .nav {
715
+ float: none;
716
+ margin: 0 0 9px;
717
+ }
718
+ .nav-collapse .nav > li {
719
+ float: none;
720
+ }
721
+ .nav-collapse .nav > li > a {
722
+ margin-bottom: 2px;
723
+ }
724
+ .nav-collapse .nav > .divider-vertical {
725
+ display: none;
726
+ }
727
+ .nav-collapse .nav .nav-header {
728
+ color: #999999;
729
+ text-shadow: none;
730
+ }
731
+ .nav-collapse .nav > li > a,
732
+ .nav-collapse .dropdown-menu a {
733
+ padding: 6px 15px;
734
+ font-weight: bold;
735
+ color: #999999;
736
+ -webkit-border-radius: 3px;
737
+ -moz-border-radius: 3px;
738
+ border-radius: 3px;
739
+ }
740
+ .nav-collapse .btn {
741
+ padding: 4px 10px 4px;
742
+ font-weight: normal;
743
+ -webkit-border-radius: 4px;
744
+ -moz-border-radius: 4px;
745
+ border-radius: 4px;
746
+ }
747
+ .nav-collapse .dropdown-menu li + li a {
748
+ margin-bottom: 2px;
749
+ }
750
+ .nav-collapse .nav > li > a:hover,
751
+ .nav-collapse .dropdown-menu a:hover {
752
+ background-color: #222222;
753
+ }
754
+ .nav-collapse.in .btn-group {
755
+ padding: 0;
756
+ margin-top: 5px;
757
+ }
758
+ .nav-collapse .dropdown-menu {
759
+ position: static;
760
+ top: auto;
761
+ left: auto;
762
+ display: block;
763
+ float: none;
764
+ max-width: none;
765
+ padding: 0;
766
+ margin: 0 15px;
767
+ background-color: transparent;
768
+ border: none;
769
+ -webkit-border-radius: 0;
770
+ -moz-border-radius: 0;
771
+ border-radius: 0;
772
+ -webkit-box-shadow: none;
773
+ -moz-box-shadow: none;
774
+ box-shadow: none;
775
+ }
776
+ .nav-collapse .dropdown-menu:before,
777
+ .nav-collapse .dropdown-menu:after {
778
+ display: none;
779
+ }
780
+ .nav-collapse .dropdown-menu .divider {
781
+ display: none;
782
+ }
783
+ .nav-collapse .navbar-form,
784
+ .nav-collapse .navbar-search {
785
+ float: none;
786
+ padding: 9px 15px;
787
+ margin: 9px 0;
788
+ border-top: 1px solid #222222;
789
+ border-bottom: 1px solid #222222;
790
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
791
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
792
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
793
+ }
794
+ .navbar .nav-collapse .nav.pull-right {
795
+ float: none;
796
+ margin-left: 0;
797
+ }
798
+ .nav-collapse,
799
+ .nav-collapse.collapse {
800
+ height: 0;
801
+ overflow: hidden;
802
+ }
803
+ .navbar .btn-navbar {
804
+ display: block;
805
+ }
806
+ .navbar-static .navbar-inner {
807
+ padding-right: 10px;
808
+ padding-left: 10px;
809
+ }
810
+}
811
+
812
+@media (min-width: 980px) {
813
+ .nav-collapse.collapse {
814
+ height: auto !important;
815
+ overflow: visible !important;
816
+ }
817
+}
docs/docs/likebutton/docs/assets/css/bootstrap.css
new
+4985
@@ -0,0 +1,4985 @@
1
+/*!
2
+ * Bootstrap v2.0.4
3
+ *
4
+ * Copyright 2012 Twitter, Inc
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
+ */
10
+
11
+article,
12
+aside,
13
+details,
14
+figcaption,
15
+figure,
16
+footer,
17
+header,
18
+hgroup,
19
+nav,
20
+section {
21
+ display: block;
22
+}
23
+
24
+audio,
25
+canvas,
26
+video {
27
+ display: inline-block;
28
+ *display: inline;
29
+ *zoom: 1;
30
+}
31
+
32
+audio:not([controls]) {
33
+ display: none;
34
+}
35
+
36
+html {
37
+ font-size: 100%;
38
+ -webkit-text-size-adjust: 100%;
39
+ -ms-text-size-adjust: 100%;
40
+}
41
+
42
+a:focus {
43
+ outline: thin dotted #333;
44
+ outline: 5px auto -webkit-focus-ring-color;
45
+ outline-offset: -2px;
46
+}
47
+
48
+a:hover,
49
+a:active {
50
+ outline: 0;
51
+}
52
+
53
+sub,
54
+sup {
55
+ position: relative;
56
+ font-size: 75%;
57
+ line-height: 0;
58
+ vertical-align: baseline;
59
+}
60
+
61
+sup {
62
+ top: -0.5em;
63
+}
64
+
65
+sub {
66
+ bottom: -0.25em;
67
+}
68
+
69
+img {
70
+ max-width: 100%;
71
+ vertical-align: middle;
72
+ border: 0;
73
+ -ms-interpolation-mode: bicubic;
74
+}
75
+
76
+#map_canvas img {
77
+ max-width: none;
78
+}
79
+
80
+button,
81
+input,
82
+select,
83
+textarea {
84
+ margin: 0;
85
+ font-size: 100%;
86
+ vertical-align: middle;
87
+}
88
+
89
+button,
90
+input {
91
+ *overflow: visible;
92
+ line-height: normal;
93
+}
94
+
95
+button::-moz-focus-inner,
96
+input::-moz-focus-inner {
97
+ padding: 0;
98
+ border: 0;
99
+}
100
+
101
+button,
102
+input[type="button"],
103
+input[type="reset"],
104
+input[type="submit"] {
105
+ cursor: pointer;
106
+ -webkit-appearance: button;
107
+}
108
+
109
+input[type="search"] {
110
+ -webkit-box-sizing: content-box;
111
+ -moz-box-sizing: content-box;
112
+ box-sizing: content-box;
113
+ -webkit-appearance: textfield;
114
+}
115
+
116
+input[type="search"]::-webkit-search-decoration,
117
+input[type="search"]::-webkit-search-cancel-button {
118
+ -webkit-appearance: none;
119
+}
120
+
121
+textarea {
122
+ overflow: auto;
123
+ vertical-align: top;
124
+}
125
+
126
+/*spin(@btnPrimaryBackground, 15%);*/
127
+
128
+.clearfix {
129
+ *zoom: 1;
130
+}
131
+
132
+.clearfix:before,
133
+.clearfix:after {
134
+ display: table;
135
+ content: "";
136
+}
137
+
138
+.clearfix:after {
139
+ clear: both;
140
+}
141
+
142
+.hide-text {
143
+ font: 0/0 a;
144
+ color: transparent;
145
+ text-shadow: none;
146
+ background-color: transparent;
147
+ border: 0;
148
+}
149
+
150
+.input-block-level {
151
+ display: block;
152
+ width: 100%;
153
+ min-height: 28px;
154
+ -webkit-box-sizing: border-box;
155
+ -moz-box-sizing: border-box;
156
+ -ms-box-sizing: border-box;
157
+ box-sizing: border-box;
158
+}
159
+
160
+body {
161
+ margin: 0;
162
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
163
+ font-size: 13px;
164
+ line-height: 18px;
165
+ color: #333333;
166
+ background-color: #ffffff;
167
+}
168
+
169
+a {
170
+ color: #5b74a8;
171
+ text-decoration: none;
172
+}
173
+
174
+a:hover {
175
+ color: #485d88;
176
+ text-decoration: underline;
177
+}
178
+
179
+.row {
180
+ margin-left: -20px;
181
+ *zoom: 1;
182
+}
183
+
184
+.row:before,
185
+.row:after {
186
+ display: table;
187
+ content: "";
188
+}
189
+
190
+.row:after {
191
+ clear: both;
192
+}
193
+
194
+[class*="span"] {
195
+ float: left;
196
+ margin-left: 20px;
197
+}
198
+
199
+.container,
200
+.navbar-fixed-top .container,
201
+.navbar-fixed-bottom .container {
202
+ width: 940px;
203
+}
204
+
205
+.span12 {
206
+ width: 940px;
207
+}
208
+
209
+.span11 {
210
+ width: 860px;
211
+}
212
+
213
+.span10 {
214
+ width: 780px;
215
+}
216
+
217
+.span9 {
218
+ width: 700px;
219
+}
220
+
221
+.span8 {
222
+ width: 620px;
223
+}
224
+
225
+.span7 {
226
+ width: 540px;
227
+}
228
+
229
+.span6 {
230
+ width: 460px;
231
+}
232
+
233
+.span5 {
234
+ width: 380px;
235
+}
236
+
237
+.span4 {
238
+ width: 300px;
239
+}
240
+
241
+.span3 {
242
+ width: 220px;
243
+}
244
+
245
+.span2 {
246
+ width: 140px;
247
+}
248
+
249
+.span1 {
250
+ width: 60px;
251
+}
252
+
253
+.offset12 {
254
+ margin-left: 980px;
255
+}
256
+
257
+.offset11 {
258
+ margin-left: 900px;
259
+}
260
+
261
+.offset10 {
262
+ margin-left: 820px;
263
+}
264
+
265
+.offset9 {
266
+ margin-left: 740px;
267
+}
268
+
269
+.offset8 {
270
+ margin-left: 660px;
271
+}
272
+
273
+.offset7 {
274
+ margin-left: 580px;
275
+}
276
+
277
+.offset6 {
278
+ margin-left: 500px;
279
+}
280
+
281
+.offset5 {
282
+ margin-left: 420px;
283
+}
284
+
285
+.offset4 {
286
+ margin-left: 340px;
287
+}
288
+
289
+.offset3 {
290
+ margin-left: 260px;
291
+}
292
+
293
+.offset2 {
294
+ margin-left: 180px;
295
+}
296
+
297
+.offset1 {
298
+ margin-left: 100px;
299
+}
300
+
301
+.row-fluid {
302
+ width: 100%;
303
+ *zoom: 1;
304
+}
305
+
306
+.row-fluid:before,
307
+.row-fluid:after {
308
+ display: table;
309
+ content: "";
310
+}
311
+
312
+.row-fluid:after {
313
+ clear: both;
314
+}
315
+
316
+.row-fluid [class*="span"] {
317
+ display: block;
318
+ float: left;
319
+ width: 100%;
320
+ min-height: 28px;
321
+ margin-left: 2.127659574%;
322
+ *margin-left: 2.0744680846382977%;
323
+ -webkit-box-sizing: border-box;
324
+ -moz-box-sizing: border-box;
325
+ -ms-box-sizing: border-box;
326
+ box-sizing: border-box;
327
+}
328
+
329
+.row-fluid [class*="span"]:first-child {
330
+ margin-left: 0;
331
+}
332
+
333
+.row-fluid .span12 {
334
+ width: 99.99999998999999%;
335
+ *width: 99.94680850063828%;
336
+}
337
+
338
+.row-fluid .span11 {
339
+ width: 91.489361693%;
340
+ *width: 91.4361702036383%;
341
+}
342
+
343
+.row-fluid .span10 {
344
+ width: 82.97872339599999%;
345
+ *width: 82.92553190663828%;
346
+}
347
+
348
+.row-fluid .span9 {
349
+ width: 74.468085099%;
350
+ *width: 74.4148936096383%;
351
+}
352
+
353
+.row-fluid .span8 {
354
+ width: 65.95744680199999%;
355
+ *width: 65.90425531263828%;
356
+}
357
+
358
+.row-fluid .span7 {
359
+ width: 57.446808505%;
360
+ *width: 57.3936170156383%;
361
+}
362
+
363
+.row-fluid .span6 {
364
+ width: 48.93617020799999%;
365
+ *width: 48.88297871863829%;
366
+}
367
+
368
+.row-fluid .span5 {
369
+ width: 40.425531911%;
370
+ *width: 40.3723404216383%;
371
+}
372
+
373
+.row-fluid .span4 {
374
+ width: 31.914893614%;
375
+ *width: 31.8617021246383%;
376
+}
377
+
378
+.row-fluid .span3 {
379
+ width: 23.404255317%;
380
+ *width: 23.3510638276383%;
381
+}
382
+
383
+.row-fluid .span2 {
384
+ width: 14.89361702%;
385
+ *width: 14.8404255306383%;
386
+}
387
+
388
+.row-fluid .span1 {
389
+ width: 6.382978723%;
390
+ *width: 6.329787233638298%;
391
+}
392
+
393
+.container {
394
+ margin-right: auto;
395
+ margin-left: auto;
396
+ *zoom: 1;
397
+}
398
+
399
+.container:before,
400
+.container:after {
401
+ display: table;
402
+ content: "";
403
+}
404
+
405
+.container:after {
406
+ clear: both;
407
+}
408
+
409
+.container-fluid {
410
+ padding-right: 20px;
411
+ padding-left: 20px;
412
+ *zoom: 1;
413
+}
414
+
415
+.container-fluid:before,
416
+.container-fluid:after {
417
+ display: table;
418
+ content: "";
419
+}
420
+
421
+.container-fluid:after {
422
+ clear: both;
423
+}
424
+
425
+p {
426
+ margin: 0 0 9px;
427
+}
428
+
429
+p small {
430
+ font-size: 11px;
431
+ color: #999999;
432
+}
433
+
434
+.lead {
435
+ margin-bottom: 18px;
436
+ font-size: 20px;
437
+ font-weight: 200;
438
+ line-height: 27px;
439
+}
440
+
441
+h1,
442
+h2,
443
+h3,
444
+h4,
445
+h5,
446
+h6 {
447
+ margin: 0;
448
+ font-family: inherit;
449
+ font-weight: bold;
450
+ color: inherit;
451
+ text-rendering: optimizelegibility;
452
+}
453
+
454
+h1 small,
455
+h2 small,
456
+h3 small,
457
+h4 small,
458
+h5 small,
459
+h6 small {
460
+ font-weight: normal;
461
+ color: #999999;
462
+}
463
+
464
+h1 {
465
+ font-size: 30px;
466
+ line-height: 36px;
467
+}
468
+
469
+h1 small {
470
+ font-size: 18px;
471
+}
472
+
473
+h2 {
474
+ font-size: 24px;
475
+ line-height: 36px;
476
+}
477
+
478
+h2 small {
479
+ font-size: 18px;
480
+}
481
+
482
+h3 {
483
+ font-size: 18px;
484
+ line-height: 27px;
485
+}
486
+
487
+h3 small {
488
+ font-size: 14px;
489
+}
490
+
491
+h4,
492
+h5,
493
+h6 {
494
+ line-height: 18px;
495
+}
496
+
497
+h4 {
498
+ font-size: 14px;
499
+}
500
+
501
+h4 small {
502
+ font-size: 12px;
503
+}
504
+
505
+h5 {
506
+ font-size: 12px;
507
+}
508
+
509
+h6 {
510
+ font-size: 11px;
511
+ color: #999999;
512
+ text-transform: uppercase;
513
+}
514
+
515
+.page-header {
516
+ padding-bottom: 17px;
517
+ margin: 18px 0;
518
+ border-bottom: 1px solid #eeeeee;
519
+}
520
+
521
+.page-header h1 {
522
+ line-height: 1;
523
+}
524
+
525
+ul,
526
+ol {
527
+ padding: 0;
528
+ margin: 0 0 9px 25px;
529
+}
530
+
531
+ul ul,
532
+ul ol,
533
+ol ol,
534
+ol ul {
535
+ margin-bottom: 0;
536
+}
537
+
538
+ul {
539
+ list-style: disc;
540
+}
541
+
542
+ol {
543
+ list-style: decimal;
544
+}
545
+
546
+li {
547
+ line-height: 18px;
548
+}
549
+
550
+ul.unstyled,
551
+ol.unstyled {
552
+ margin-left: 0;
553
+ list-style: none;
554
+}
555
+
556
+dl {
557
+ margin-bottom: 18px;
558
+}
559
+
560
+dt,
561
+dd {
562
+ line-height: 18px;
563
+}
564
+
565
+dt {
566
+ font-weight: bold;
567
+ line-height: 17px;
568
+}
569
+
570
+dd {
571
+ margin-left: 9px;
572
+}
573
+
574
+.dl-horizontal dt {
575
+ float: left;
576
+ width: 120px;
577
+ overflow: hidden;
578
+ clear: left;
579
+ text-align: right;
580
+ text-overflow: ellipsis;
581
+ white-space: nowrap;
582
+}
583
+
584
+.dl-horizontal dd {
585
+ margin-left: 130px;
586
+}
587
+
588
+hr {
589
+ margin: 18px 0;
590
+ border: 0;
591
+ border-top: 1px solid #eeeeee;
592
+ border-bottom: 1px solid #ffffff;
593
+}
594
+
595
+strong {
596
+ font-weight: bold;
597
+}
598
+
599
+em {
600
+ font-style: italic;
601
+}
602
+
603
+.muted {
604
+ color: #999999;
605
+}
606
+
607
+abbr[title] {
608
+ cursor: help;
609
+ border-bottom: 1px dotted #999999;
610
+}
611
+
612
+abbr.initialism {
613
+ font-size: 90%;
614
+ text-transform: uppercase;
615
+}
616
+
617
+blockquote {
618
+ padding: 0 0 0 15px;
619
+ margin: 0 0 18px;
620
+ border-left: 5px solid #eeeeee;
621
+}
622
+
623
+blockquote p {
624
+ margin-bottom: 0;
625
+ font-size: 16px;
626
+ font-weight: 300;
627
+ line-height: 22.5px;
628
+}
629
+
630
+blockquote small {
631
+ display: block;
632
+ line-height: 18px;
633
+ color: #999999;
634
+}
635
+
636
+blockquote small:before {
637
+ content: '\2014 \00A0';
638
+}
639
+
640
+blockquote.pull-right {
641
+ float: right;
642
+ padding-right: 15px;
643
+ padding-left: 0;
644
+ border-right: 5px solid #eeeeee;
645
+ border-left: 0;
646
+}
647
+
648
+blockquote.pull-right p,
649
+blockquote.pull-right small {
650
+ text-align: right;
651
+}
652
+
653
+q:before,
654
+q:after,
655
+blockquote:before,
656
+blockquote:after {
657
+ content: "";
658
+}
659
+
660
+address {
661
+ display: block;
662
+ margin-bottom: 18px;
663
+ font-style: normal;
664
+ line-height: 18px;
665
+}
666
+
667
+small {
668
+ font-size: 100%;
669
+}
670
+
671
+cite {
672
+ font-style: normal;
673
+}
674
+
675
+code,
676
+pre {
677
+ padding: 0 3px 2px;
678
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
679
+ font-size: 12px;
680
+ color: #333333;
681
+ -webkit-border-radius: 1px;
682
+ -moz-border-radius: 1px;
683
+ border-radius: 1px;
684
+}
685
+
686
+code {
687
+ padding: 2px 4px;
688
+ color: #5b74a8;
689
+ background-color: #fcfaf5;
690
+ border: 1px solid #f1ede2;
691
+}
692
+
693
+pre {
694
+ display: block;
695
+ padding: 8.5px;
696
+ margin: 0 0 9px;
697
+ font-size: 12.025px;
698
+ line-height: 18px;
699
+ word-break: break-all;
700
+ word-wrap: break-word;
701
+ white-space: pre;
702
+ white-space: pre-wrap;
703
+ background-color: #f5f5f5;
704
+ border: 1px solid #ccc;
705
+ border: 1px solid rgba(0, 0, 0, 0.15);
706
+ -webkit-border-radius: 1px;
707
+ -moz-border-radius: 1px;
708
+ border-radius: 1px;
709
+}
710
+
711
+pre.prettyprint {
712
+ margin-bottom: 18px;
713
+}
714
+
715
+pre code {
716
+ padding: 0;
717
+ color: inherit;
718
+ background-color: transparent;
719
+ border: 0;
720
+}
721
+
722
+.pre-scrollable {
723
+ max-height: 340px;
724
+ overflow-y: scroll;
725
+}
726
+
727
+form {
728
+ margin: 0 0 18px;
729
+}
730
+
731
+fieldset {
732
+ padding: 0;
733
+ margin: 0;
734
+ border: 0;
735
+}
736
+
737
+legend {
738
+ display: block;
739
+ width: 100%;
740
+ padding: 0;
741
+ margin-bottom: 27px;
742
+ font-size: 19.5px;
743
+ line-height: 36px;
744
+ color: #333333;
745
+ border: 0;
746
+ border-bottom: 1px solid #e5e5e5;
747
+}
748
+
749
+legend small {
750
+ font-size: 13.5px;
751
+ color: #999999;
752
+}
753
+
754
+label,
755
+input,
756
+button,
757
+select,
758
+textarea {
759
+ font-size: 13px;
760
+ font-weight: normal;
761
+ line-height: 18px;
762
+}
763
+
764
+input,
765
+button,
766
+select,
767
+textarea {
768
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
769
+}
770
+
771
+label {
772
+ display: block;
773
+ margin-bottom: 5px;
774
+}
775
+
776
+select,
777
+textarea,
778
+input[type="text"],
779
+input[type="password"],
780
+input[type="datetime"],
781
+input[type="datetime-local"],
782
+input[type="date"],
783
+input[type="month"],
784
+input[type="time"],
785
+input[type="week"],
786
+input[type="number"],
787
+input[type="email"],
788
+input[type="url"],
789
+input[type="search"],
790
+input[type="tel"],
791
+input[type="color"],
792
+.uneditable-input {
793
+ display: inline-block;
794
+ height: 18px;
795
+ padding: 4px;
796
+ margin-bottom: 9px;
797
+ font-size: 13px;
798
+ line-height: 18px;
799
+ color: #555555;
800
+}
801
+
802
+input,
803
+textarea {
804
+ width: 210px;
805
+}
806
+
807
+textarea {
808
+ height: auto;
809
+}
810
+
811
+textarea,
812
+input[type="text"],
813
+input[type="password"],
814
+input[type="datetime"],
815
+input[type="datetime-local"],
816
+input[type="date"],
817
+input[type="month"],
818
+input[type="time"],
819
+input[type="week"],
820
+input[type="number"],
821
+input[type="email"],
822
+input[type="url"],
823
+input[type="search"],
824
+input[type="tel"],
825
+input[type="color"],
826
+.uneditable-input {
827
+ background-color: #ffffff;
828
+ border: 1px solid #cccccc;
829
+ -webkit-border-radius: 1px;
830
+ -moz-border-radius: 1px;
831
+ border-radius: 1px;
832
+ -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
833
+ -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
834
+ -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
835
+ -o-transition: border linear 0.2s, box-shadow linear 0.2s;
836
+ transition: border linear 0.2s, box-shadow linear 0.2s;
837
+}
838
+
839
+textarea:focus,
840
+input[type="text"]:focus,
841
+input[type="password"]:focus,
842
+input[type="datetime"]:focus,
843
+input[type="datetime-local"]:focus,
844
+input[type="date"]:focus,
845
+input[type="month"]:focus,
846
+input[type="time"]:focus,
847
+input[type="week"]:focus,
848
+input[type="number"]:focus,
849
+input[type="email"]:focus,
850
+input[type="url"]:focus,
851
+input[type="search"]:focus,
852
+input[type="tel"]:focus,
853
+input[type="color"]:focus,
854
+.uneditable-input:focus {
855
+ border-color: rgba(111, 136, 198, 0.6);
856
+ outline: 0;
857
+ outline: thin dotted \9;
858
+ /* IE6-9 */
859
+
860
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(111, 136, 198, 0.3);
861
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(111, 136, 198, 0.3);
862
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(111, 136, 198, 0.3);
863
+}
864
+
865
+input[type="radio"],
866
+input[type="checkbox"] {
867
+ margin: 3px 0;
868
+ *margin-top: 0;
869
+ /* IE7 */
870
+
871
+ line-height: normal;
872
+ cursor: pointer;
873
+}
874
+
875
+input[type="submit"],
876
+input[type="reset"],
877
+input[type="button"],
878
+input[type="radio"],
879
+input[type="checkbox"] {
880
+ width: auto;
881
+}
882
+
883
+.uneditable-textarea {
884
+ width: auto;
885
+ height: auto;
886
+}
887
+
888
+select,
889
+input[type="file"] {
890
+ height: 28px;
891
+ /* In IE7, the height of the select element cannot be changed by height, only font-size */
892
+
893
+ *margin-top: 4px;
894
+ /* For IE7, add top margin to align select with labels */
895
+
896
+ line-height: 28px;
897
+}
898
+
899
+select {
900
+ width: 220px;
901
+ border: 1px solid #bbb;
902
+}
903
+
904
+select[multiple],
905
+select[size] {
906
+ height: auto;
907
+}
908
+
909
+select:focus,
910
+input[type="file"]:focus,
911
+input[type="radio"]:focus,
912
+input[type="checkbox"]:focus {
913
+ outline: thin dotted #333;
914
+ outline: 5px auto -webkit-focus-ring-color;
915
+ outline-offset: -2px;
916
+}
917
+
918
+.radio,
919
+.checkbox {
920
+ min-height: 18px;
921
+ padding-left: 18px;
922
+}
923
+
924
+.radio input[type="radio"],
925
+.checkbox input[type="checkbox"] {
926
+ float: left;
927
+ margin-left: -18px;
928
+}
929
+
930
+.controls > .radio:first-child,
931
+.controls > .checkbox:first-child {
932
+ padding-top: 5px;
933
+}
934
+
935
+.radio.inline,
936
+.checkbox.inline {
937
+ display: inline-block;
938
+ padding-top: 5px;
939
+ margin-bottom: 0;
940
+ vertical-align: middle;
941
+}
942
+
943
+.radio.inline + .radio.inline,
944
+.checkbox.inline + .checkbox.inline {
945
+ margin-left: 10px;
946
+}
947
+
948
+.input-mini {
949
+ width: 60px;
950
+}
951
+
952
+.input-small {
953
+ width: 90px;
954
+}
955
+
956
+.input-medium {
957
+ width: 150px;
958
+}
959
+
960
+.input-large {
961
+ width: 210px;
962
+}
963
+
964
+.input-xlarge {
965
+ width: 270px;
966
+}
967
+
968
+.input-xxlarge {
969
+ width: 530px;
970
+}
971
+
972
+input[class*="span"],
973
+select[class*="span"],
974
+textarea[class*="span"],
975
+.uneditable-input[class*="span"],
976
+.row-fluid input[class*="span"],
977
+.row-fluid select[class*="span"],
978
+.row-fluid textarea[class*="span"],
979
+.row-fluid .uneditable-input[class*="span"] {
980
+ float: none;
981
+ margin-left: 0;
982
+}
983
+
984
+.input-append input[class*="span"],
985
+.input-append .uneditable-input[class*="span"],
986
+.input-prepend input[class*="span"],
987
+.input-prepend .uneditable-input[class*="span"],
988
+.row-fluid .input-prepend [class*="span"],
989
+.row-fluid .input-append [class*="span"] {
990
+ display: inline-block;
991
+}
992
+
993
+input,
994
+textarea,
995
+.uneditable-input {
996
+ margin-left: 0;
997
+}
998
+
999
+input.span12,
1000
+textarea.span12,
1001
+.uneditable-input.span12 {
1002
+ width: 930px;
1003
+}
1004
+
1005
+input.span11,
1006
+textarea.span11,
1007
+.uneditable-input.span11 {
1008
+ width: 850px;
1009
+}
1010
+
1011
+input.span10,
1012
+textarea.span10,
1013
+.uneditable-input.span10 {
1014
+ width: 770px;
1015
+}
1016
+
1017
+input.span9,
1018
+textarea.span9,
1019
+.uneditable-input.span9 {
1020
+ width: 690px;
1021
+}
1022
+
1023
+input.span8,
1024
+textarea.span8,
1025
+.uneditable-input.span8 {
1026
+ width: 610px;
1027
+}
1028
+
1029
+input.span7,
1030
+textarea.span7,
1031
+.uneditable-input.span7 {
1032
+ width: 530px;
1033
+}
1034
+
1035
+input.span6,
1036
+textarea.span6,
1037
+.uneditable-input.span6 {
1038
+ width: 450px;
1039
+}
1040
+
1041
+input.span5,
1042
+textarea.span5,
1043
+.uneditable-input.span5 {
1044
+ width: 370px;
1045
+}
1046
+
1047
+input.span4,
1048
+textarea.span4,
1049
+.uneditable-input.span4 {
1050
+ width: 290px;
1051
+}
1052
+
1053
+input.span3,
1054
+textarea.span3,
1055
+.uneditable-input.span3 {
1056
+ width: 210px;
1057
+}
1058
+
1059
+input.span2,
1060
+textarea.span2,
1061
+.uneditable-input.span2 {
1062
+ width: 130px;
1063
+}
1064
+
1065
+input.span1,
1066
+textarea.span1,
1067
+.uneditable-input.span1 {
1068
+ width: 50px;
1069
+}
1070
+
1071
+input[disabled],
1072
+select[disabled],
1073
+textarea[disabled],
1074
+input[readonly],
1075
+select[readonly],
1076
+textarea[readonly] {
1077
+ cursor: not-allowed;
1078
+ background-color: #eeeeee;
1079
+ border-color: #ddd;
1080
+}
1081
+
1082
+input[type="radio"][disabled],
1083
+input[type="checkbox"][disabled],
1084
+input[type="radio"][readonly],
1085
+input[type="checkbox"][readonly] {
1086
+ background-color: transparent;
1087
+}
1088
+
1089
+.control-group.warning > label,
1090
+.control-group.warning .help-block,
1091
+.control-group.warning .help-inline {
1092
+ color: #c09853;
1093
+}
1094
+
1095
+.control-group.warning .checkbox,
1096
+.control-group.warning .radio,
1097
+.control-group.warning input,
1098
+.control-group.warning select,
1099
+.control-group.warning textarea {
1100
+ color: #c09853;
1101
+ border-color: #c09853;
1102
+}
1103
+
1104
+.control-group.warning .checkbox:focus,
1105
+.control-group.warning .radio:focus,
1106
+.control-group.warning input:focus,
1107
+.control-group.warning select:focus,
1108
+.control-group.warning textarea:focus {
1109
+ border-color: #a47e3c;
1110
+ -webkit-box-shadow: 0 0 6px #dbc59e;
1111
+ -moz-box-shadow: 0 0 6px #dbc59e;
1112
+ box-shadow: 0 0 6px #dbc59e;
1113
+}
1114
+
1115
+.control-group.warning .input-prepend .add-on,
1116
+.control-group.warning .input-append .add-on {
1117
+ color: #c09853;
1118
+ background-color: #fcf8e3;
1119
+ border-color: #c09853;
1120
+}
1121
+
1122
+.control-group.error > label,
1123
+.control-group.error .help-block,
1124
+.control-group.error .help-inline {
1125
+ color: #b94a48;
1126
+}
1127
+
1128
+.control-group.error .checkbox,
1129
+.control-group.error .radio,
1130
+.control-group.error input,
1131
+.control-group.error select,
1132
+.control-group.error textarea {
1133
+ color: #b94a48;
1134
+ border-color: #b94a48;
1135
+}
1136
+
1137
+.control-group.error .checkbox:focus,
1138
+.control-group.error .radio:focus,
1139
+.control-group.error input:focus,
1140
+.control-group.error select:focus,
1141
+.control-group.error textarea:focus {
1142
+ border-color: #953b39;
1143
+ -webkit-box-shadow: 0 0 6px #d59392;
1144
+ -moz-box-shadow: 0 0 6px #d59392;
1145
+ box-shadow: 0 0 6px #d59392;
1146
+}
1147
+
1148
+.control-group.error .input-prepend .add-on,
1149
+.control-group.error .input-append .add-on {
1150
+ color: #b94a48;
1151
+ background-color: #f2dede;
1152
+ border-color: #b94a48;
1153
+}
1154
+
1155
+.control-group.success > label,
1156
+.control-group.success .help-block,
1157
+.control-group.success .help-inline {
1158
+ color: #468847;
1159
+}
1160
+
1161
+.control-group.success .checkbox,
1162
+.control-group.success .radio,
1163
+.control-group.success input,
1164
+.control-group.success select,
1165
+.control-group.success textarea {
1166
+ color: #468847;
1167
+ border-color: #468847;
1168
+}
1169
+
1170
+.control-group.success .checkbox:focus,
1171
+.control-group.success .radio:focus,
1172
+.control-group.success input:focus,
1173
+.control-group.success select:focus,
1174
+.control-group.success textarea:focus {
1175
+ border-color: #356635;
1176
+ -webkit-box-shadow: 0 0 6px #7aba7b;
1177
+ -moz-box-shadow: 0 0 6px #7aba7b;
1178
+ box-shadow: 0 0 6px #7aba7b;
1179
+}
1180
+
1181
+.control-group.success .input-prepend .add-on,
1182
+.control-group.success .input-append .add-on {
1183
+ color: #468847;
1184
+ background-color: #69a74e;
1185
+ border-color: #468847;
1186
+}
1187
+
1188
+input:focus:required:invalid,
1189
+textarea:focus:required:invalid,
1190
+select:focus:required:invalid {
1191
+ color: #b94a48;
1192
+ border-color: #ee5f5b;
1193
+}
1194
+
1195
+input:focus:required:invalid:focus,
1196
+textarea:focus:required:invalid:focus,
1197
+select:focus:required:invalid:focus {
1198
+ border-color: #e9322d;
1199
+ -webkit-box-shadow: 0 0 6px #f8b9b7;
1200
+ -moz-box-shadow: 0 0 6px #f8b9b7;
1201
+ box-shadow: 0 0 6px #f8b9b7;
1202
+}
1203
+
1204
+.form-actions {
1205
+ padding: 17px 20px 18px;
1206
+ margin-top: 18px;
1207
+ margin-bottom: 18px;
1208
+ background-color: #f5f5f5;
1209
+ border-top: 1px solid #e5e5e5;
1210
+ *zoom: 1;
1211
+}
1212
+
1213
+.form-actions:before,
1214
+.form-actions:after {
1215
+ display: table;
1216
+ content: "";
1217
+}
1218
+
1219
+.form-actions:after {
1220
+ clear: both;
1221
+}
1222
+
1223
+.uneditable-input {
1224
+ overflow: hidden;
1225
+ white-space: nowrap;
1226
+ cursor: not-allowed;
1227
+ background-color: #ffffff;
1228
+ border-color: #eee;
1229
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
1230
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
1231
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
1232
+}
1233
+
1234
+:-moz-placeholder {
1235
+ color: #999999;
1236
+}
1237
+
1238
+:-ms-input-placeholder {
1239
+ color: #999999;
1240
+}
1241
+
1242
+::-webkit-input-placeholder {
1243
+ color: #999999;
1244
+}
1245
+
1246
+.help-block,
1247
+.help-inline {
1248
+ color: #555555;
1249
+}
1250
+
1251
+.help-block {
1252
+ display: block;
1253
+ margin-bottom: 9px;
1254
+}
1255
+
1256
+.help-inline {
1257
+ display: inline-block;
1258
+ *display: inline;
1259
+ padding-left: 5px;
1260
+ vertical-align: middle;
1261
+ *zoom: 1;
1262
+}
1263
+
1264
+.input-prepend,
1265
+.input-append {
1266
+ margin-bottom: 5px;
1267
+}
1268
+
1269
+.input-prepend input,
1270
+.input-append input,
1271
+.input-prepend select,
1272
+.input-append select,
1273
+.input-prepend .uneditable-input,
1274
+.input-append .uneditable-input {
1275
+ position: relative;
1276
+ margin-bottom: 0;
1277
+ *margin-left: 0;
1278
+ vertical-align: middle;
1279
+ -webkit-border-radius: 0 1px 1px 0;
1280
+ -moz-border-radius: 0 1px 1px 0;
1281
+ border-radius: 0 1px 1px 0;
1282
+}
1283
+
1284
+.input-prepend input:focus,
1285
+.input-append input:focus,
1286
+.input-prepend select:focus,
1287
+.input-append select:focus,
1288
+.input-prepend .uneditable-input:focus,
1289
+.input-append .uneditable-input:focus {
1290
+ z-index: 2;
1291
+}
1292
+
1293
+.input-prepend .uneditable-input,
1294
+.input-append .uneditable-input {
1295
+ border-left-color: #ccc;
1296
+}
1297
+
1298
+.input-prepend .add-on,
1299
+.input-append .add-on {
1300
+ display: inline-block;
1301
+ width: auto;
1302
+ height: 18px;
1303
+ min-width: 16px;
1304
+ padding: 4px 5px;
1305
+ font-weight: normal;
1306
+ line-height: 18px;
1307
+ text-align: center;
1308
+ text-shadow: 0 1px 0 #ffffff;
1309
+ vertical-align: middle;
1310
+ background-color: #eeeeee;
1311
+ border: 1px solid #ccc;
1312
+}
1313
+
1314
+.input-prepend .add-on,
1315
+.input-append .add-on,
1316
+.input-prepend .btn,
1317
+.input-append .btn {
1318
+ margin-left: -1px;
1319
+ -webkit-border-radius: 0;
1320
+ -moz-border-radius: 0;
1321
+ border-radius: 0;
1322
+}
1323
+
1324
+.input-prepend .active,
1325
+.input-append .active {
1326
+ background-color: #a9dba9;
1327
+ border-color: #46a546;
1328
+}
1329
+
1330
+.input-prepend .add-on,
1331
+.input-prepend .btn {
1332
+ margin-right: -1px;
1333
+}
1334
+
1335
+.input-prepend .add-on:first-child,
1336
+.input-prepend .btn:first-child {
1337
+ -webkit-border-radius: 1px 0 0 1px;
1338
+ -moz-border-radius: 1px 0 0 1px;
1339
+ border-radius: 1px 0 0 1px;
1340
+}
1341
+
1342
+.input-append input,
1343
+.input-append select,
1344
+.input-append .uneditable-input {
1345
+ -webkit-border-radius: 1px 0 0 1px;
1346
+ -moz-border-radius: 1px 0 0 1px;
1347
+ border-radius: 1px 0 0 1px;
1348
+}
1349
+
1350
+.input-append .uneditable-input {
1351
+ border-right-color: #ccc;
1352
+ border-left-color: #eee;
1353
+}
1354
+
1355
+.input-append .add-on:last-child,
1356
+.input-append .btn:last-child {
1357
+ -webkit-border-radius: 0 1px 1px 0;
1358
+ -moz-border-radius: 0 1px 1px 0;
1359
+ border-radius: 0 1px 1px 0;
1360
+}
1361
+
1362
+.input-prepend.input-append input,
1363
+.input-prepend.input-append select,
1364
+.input-prepend.input-append .uneditable-input {
1365
+ -webkit-border-radius: 0;
1366
+ -moz-border-radius: 0;
1367
+ border-radius: 0;
1368
+}
1369
+
1370
+.input-prepend.input-append .add-on:first-child,
1371
+.input-prepend.input-append .btn:first-child {
1372
+ margin-right: -1px;
1373
+ -webkit-border-radius: 1px 0 0 1px;
1374
+ -moz-border-radius: 1px 0 0 1px;
1375
+ border-radius: 1px 0 0 1px;
1376
+}
1377
+
1378
+.input-prepend.input-append .add-on:last-child,
1379
+.input-prepend.input-append .btn:last-child {
1380
+ margin-left: -1px;
1381
+ -webkit-border-radius: 0 1px 1px 0;
1382
+ -moz-border-radius: 0 1px 1px 0;
1383
+ border-radius: 0 1px 1px 0;
1384
+}
1385
+
1386
+.search-query {
1387
+ padding-right: 14px;
1388
+ padding-right: 4px \9;
1389
+ padding-left: 14px;
1390
+ padding-left: 4px \9;
1391
+ /* IE7-8 doesn't have border-radius, so don't indent the padding */
1392
+
1393
+ margin-bottom: 0;
1394
+ -webkit-border-radius: 14px;
1395
+ -moz-border-radius: 14px;
1396
+ border-radius: 14px;
1397
+}
1398
+
1399
+.form-search input,
1400
+.form-inline input,
1401
+.form-horizontal input,
1402
+.form-search textarea,
1403
+.form-inline textarea,
1404
+.form-horizontal textarea,
1405
+.form-search select,
1406
+.form-inline select,
1407
+.form-horizontal select,
1408
+.form-search .help-inline,
1409
+.form-inline .help-inline,
1410
+.form-horizontal .help-inline,
1411
+.form-search .uneditable-input,
1412
+.form-inline .uneditable-input,
1413
+.form-horizontal .uneditable-input,
1414
+.form-search .input-prepend,
1415
+.form-inline .input-prepend,
1416
+.form-horizontal .input-prepend,
1417
+.form-search .input-append,
1418
+.form-inline .input-append,
1419
+.form-horizontal .input-append {
1420
+ display: inline-block;
1421
+ *display: inline;
1422
+ margin-bottom: 0;
1423
+ *zoom: 1;
1424
+}
1425
+
1426
+.form-search .hide,
1427
+.form-inline .hide,
1428
+.form-horizontal .hide {
1429
+ display: none;
1430
+}
1431
+
1432
+.form-search label,
1433
+.form-inline label {
1434
+ display: inline-block;
1435
+}
1436
+
1437
+.form-search .input-append,
1438
+.form-inline .input-append,
1439
+.form-search .input-prepend,
1440
+.form-inline .input-prepend {
1441
+ margin-bottom: 0;
1442
+}
1443
+
1444
+.form-search .radio,
1445
+.form-search .checkbox,
1446
+.form-inline .radio,
1447
+.form-inline .checkbox {
1448
+ padding-left: 0;
1449
+ margin-bottom: 0;
1450
+ vertical-align: middle;
1451
+}
1452
+
1453
+.form-search .radio input[type="radio"],
1454
+.form-search .checkbox input[type="checkbox"],
1455
+.form-inline .radio input[type="radio"],
1456
+.form-inline .checkbox input[type="checkbox"] {
1457
+ float: left;
1458
+ margin-right: 3px;
1459
+ margin-left: 0;
1460
+}
1461
+
1462
+.control-group {
1463
+ margin-bottom: 9px;
1464
+}
1465
+
1466
+legend + .control-group {
1467
+ margin-top: 18px;
1468
+ -webkit-margin-top-collapse: separate;
1469
+}
1470
+
1471
+.form-horizontal .control-group {
1472
+ margin-bottom: 18px;
1473
+ *zoom: 1;
1474
+}
1475
+
1476
+.form-horizontal .control-group:before,
1477
+.form-horizontal .control-group:after {
1478
+ display: table;
1479
+ content: "";
1480
+}
1481
+
1482
+.form-horizontal .control-group:after {
1483
+ clear: both;
1484
+}
1485
+
1486
+.form-horizontal .control-label {
1487
+ float: left;
1488
+ width: 140px;
1489
+ padding-top: 5px;
1490
+ text-align: right;
1491
+}
1492
+
1493
+.form-horizontal .controls {
1494
+ *display: inline-block;
1495
+ *padding-left: 20px;
1496
+ margin-left: 160px;
1497
+ *margin-left: 0;
1498
+}
1499
+
1500
+.form-horizontal .controls:first-child {
1501
+ *padding-left: 160px;
1502
+}
1503
+
1504
+.form-horizontal .help-block {
1505
+ margin-top: 9px;
1506
+ margin-bottom: 0;
1507
+}
1508
+
1509
+.form-horizontal .form-actions {
1510
+ padding-left: 160px;
1511
+}
1512
+
1513
+table {
1514
+ max-width: 100%;
1515
+ background-color: transparent;
1516
+ border-collapse: collapse;
1517
+ border-spacing: 0;
1518
+}
1519
+
1520
+.table {
1521
+ width: 100%;
1522
+ margin-bottom: 18px;
1523
+}
1524
+
1525
+.table th,
1526
+.table td {
1527
+ padding: 8px;
1528
+ line-height: 18px;
1529
+ text-align: left;
1530
+ vertical-align: top;
1531
+ border-top: 1px solid #dddddd;
1532
+}
1533
+
1534
+.table th {
1535
+ font-weight: bold;
1536
+}
1537
+
1538
+.table thead th {
1539
+ vertical-align: bottom;
1540
+}
1541
+
1542
+.table caption + thead tr:first-child th,
1543
+.table caption + thead tr:first-child td,
1544
+.table colgroup + thead tr:first-child th,
1545
+.table colgroup + thead tr:first-child td,
1546
+.table thead:first-child tr:first-child th,
1547
+.table thead:first-child tr:first-child td {
1548
+ border-top: 0;
1549
+}
1550
+
1551
+.table tbody + tbody {
1552
+ border-top: 2px solid #dddddd;
1553
+}
1554
+
1555
+.table-condensed th,
1556
+.table-condensed td {
1557
+ padding: 4px 5px;
1558
+}
1559
+
1560
+.table-bordered {
1561
+ border: 1px solid #dddddd;
1562
+ border-collapse: separate;
1563
+ *border-collapse: collapsed;
1564
+ border-left: 0;
1565
+ -webkit-border-radius: 1px;
1566
+ -moz-border-radius: 1px;
1567
+ border-radius: 1px;
1568
+}
1569
+
1570
+.table-bordered th,
1571
+.table-bordered td {
1572
+ border-left: 1px solid #dddddd;
1573
+}
1574
+
1575
+.table-bordered caption + thead tr:first-child th,
1576
+.table-bordered caption + tbody tr:first-child th,
1577
+.table-bordered caption + tbody tr:first-child td,
1578
+.table-bordered colgroup + thead tr:first-child th,
1579
+.table-bordered colgroup + tbody tr:first-child th,
1580
+.table-bordered colgroup + tbody tr:first-child td,
1581
+.table-bordered thead:first-child tr:first-child th,
1582
+.table-bordered tbody:first-child tr:first-child th,
1583
+.table-bordered tbody:first-child tr:first-child td {
1584
+ border-top: 0;
1585
+}
1586
+
1587
+.table-bordered thead:first-child tr:first-child th:first-child,
1588
+.table-bordered tbody:first-child tr:first-child td:first-child {
1589
+ -webkit-border-top-left-radius: 1px;
1590
+ border-top-left-radius: 1px;
1591
+ -moz-border-radius-topleft: 1px;
1592
+}
1593
+
1594
+.table-bordered thead:first-child tr:first-child th:last-child,
1595
+.table-bordered tbody:first-child tr:first-child td:last-child {
1596
+ -webkit-border-top-right-radius: 1px;
1597
+ border-top-right-radius: 1px;
1598
+ -moz-border-radius-topright: 1px;
1599
+}
1600
+
1601
+.table-bordered thead:last-child tr:last-child th:first-child,
1602
+.table-bordered tbody:last-child tr:last-child td:first-child {
1603
+ -webkit-border-radius: 0 0 0 1px;
1604
+ -moz-border-radius: 0 0 0 1px;
1605
+ border-radius: 0 0 0 1px;
1606
+ -webkit-border-bottom-left-radius: 1px;
1607
+ border-bottom-left-radius: 1px;
1608
+ -moz-border-radius-bottomleft: 1px;
1609
+}
1610
+
1611
+.table-bordered thead:last-child tr:last-child th:last-child,
1612
+.table-bordered tbody:last-child tr:last-child td:last-child {
1613
+ -webkit-border-bottom-right-radius: 1px;
1614
+ border-bottom-right-radius: 1px;
1615
+ -moz-border-radius-bottomright: 1px;
1616
+}
1617
+
1618
+.table-striped tbody tr:nth-child(odd) td,
1619
+.table-striped tbody tr:nth-child(odd) th {
1620
+ background-color: #f9f9f9;
1621
+}
1622
+
1623
+.table tbody tr:hover td,
1624
+.table tbody tr:hover th {
1625
+ background-color: #f5f5f5;
1626
+}
1627
+
1628
+table .span1 {
1629
+ float: none;
1630
+ width: 44px;
1631
+ margin-left: 0;
1632
+}
1633
+
1634
+table .span2 {
1635
+ float: none;
1636
+ width: 124px;
1637
+ margin-left: 0;
1638
+}
1639
+
1640
+table .span3 {
1641
+ float: none;
1642
+ width: 204px;
1643
+ margin-left: 0;
1644
+}
1645
+
1646
+table .span4 {
1647
+ float: none;
1648
+ width: 284px;
1649
+ margin-left: 0;
1650
+}
1651
+
1652
+table .span5 {
1653
+ float: none;
1654
+ width: 364px;
1655
+ margin-left: 0;
1656
+}
1657
+
1658
+table .span6 {
1659
+ float: none;
1660
+ width: 444px;
1661
+ margin-left: 0;
1662
+}
1663
+
1664
+table .span7 {
1665
+ float: none;
1666
+ width: 524px;
1667
+ margin-left: 0;
1668
+}
1669
+
1670
+table .span8 {
1671
+ float: none;
1672
+ width: 604px;
1673
+ margin-left: 0;
1674
+}
1675
+
1676
+table .span9 {
1677
+ float: none;
1678
+ width: 684px;
1679
+ margin-left: 0;
1680
+}
1681
+
1682
+table .span10 {
1683
+ float: none;
1684
+ width: 764px;
1685
+ margin-left: 0;
1686
+}
1687
+
1688
+table .span11 {
1689
+ float: none;
1690
+ width: 844px;
1691
+ margin-left: 0;
1692
+}
1693
+
1694
+table .span12 {
1695
+ float: none;
1696
+ width: 924px;
1697
+ margin-left: 0;
1698
+}
1699
+
1700
+table .span13 {
1701
+ float: none;
1702
+ width: 1004px;
1703
+ margin-left: 0;
1704
+}
1705
+
1706
+table .span14 {
1707
+ float: none;
1708
+ width: 1084px;
1709
+ margin-left: 0;
1710
+}
1711
+
1712
+table .span15 {
1713
+ float: none;
1714
+ width: 1164px;
1715
+ margin-left: 0;
1716
+}
1717
+
1718
+table .span16 {
1719
+ float: none;
1720
+ width: 1244px;
1721
+ margin-left: 0;
1722
+}
1723
+
1724
+table .span17 {
1725
+ float: none;
1726
+ width: 1324px;
1727
+ margin-left: 0;
1728
+}
1729
+
1730
+table .span18 {
1731
+ float: none;
1732
+ width: 1404px;
1733
+ margin-left: 0;
1734
+}
1735
+
1736
+table .span19 {
1737
+ float: none;
1738
+ width: 1484px;
1739
+ margin-left: 0;
1740
+}
1741
+
1742
+table .span20 {
1743
+ float: none;
1744
+ width: 1564px;
1745
+ margin-left: 0;
1746
+}
1747
+
1748
+table .span21 {
1749
+ float: none;
1750
+ width: 1644px;
1751
+ margin-left: 0;
1752
+}
1753
+
1754
+table .span22 {
1755
+ float: none;
1756
+ width: 1724px;
1757
+ margin-left: 0;
1758
+}
1759
+
1760
+table .span23 {
1761
+ float: none;
1762
+ width: 1804px;
1763
+ margin-left: 0;
1764
+}
1765
+
1766
+table .span24 {
1767
+ float: none;
1768
+ width: 1884px;
1769
+ margin-left: 0;
1770
+}
1771
+
1772
+[class^="icon-"],
1773
+[class*=" icon-"] {
1774
+ display: inline-block;
1775
+ width: 14px;
1776
+ height: 14px;
1777
+ *margin-right: .3em;
1778
+ line-height: 14px;
1779
+ vertical-align: text-top;
1780
+ background-image: url("../img/glyphicons-halflings.png");
1781
+ background-position: 14px 14px;
1782
+ background-repeat: no-repeat;
1783
+}
1784
+
1785
+[class^="icon-"]:last-child,
1786
+[class*=" icon-"]:last-child {
1787
+ *margin-left: 0;
1788
+}
1789
+
1790
+.icon-white {
1791
+ background-image: url("../img/glyphicons-halflings-white.png");
1792
+}
1793
+
1794
+.icon-glass {
1795
+ background-position: 0 0;
1796
+}
1797
+
1798
+.icon-music {
1799
+ background-position: -24px 0;
1800
+}
1801
+
1802
+.icon-search {
1803
+ background-position: -48px 0;
1804
+}
1805
+
1806
+.icon-envelope {
1807
+ background-position: -72px 0;
1808
+}
1809
+
1810
+.icon-heart {
1811
+ background-position: -96px 0;
1812
+}
1813
+
1814
+.icon-star {
1815
+ background-position: -120px 0;
1816
+}
1817
+
1818
+.icon-star-empty {
1819
+ background-position: -144px 0;
1820
+}
1821
+
1822
+.icon-user {
1823
+ background-position: -168px 0;
1824
+}
1825
+
1826
+.icon-film {
1827
+ background-position: -192px 0;
1828
+}
1829
+
1830
+.icon-th-large {
1831
+ background-position: -216px 0;
1832
+}
1833
+
1834
+.icon-th {
1835
+ background-position: -240px 0;
1836
+}
1837
+
1838
+.icon-th-list {
1839
+ background-position: -264px 0;
1840
+}
1841
+
1842
+.icon-ok {
1843
+ background-position: -288px 0;
1844
+}
1845
+
1846
+.icon-remove {
1847
+ background-position: -312px 0;
1848
+}
1849
+
1850
+.icon-zoom-in {
1851
+ background-position: -336px 0;
1852
+}
1853
+
1854
+.icon-zoom-out {
1855
+ background-position: -360px 0;
1856
+}
1857
+
1858
+.icon-off {
1859
+ background-position: -384px 0;
1860
+}
1861
+
1862
+.icon-signal {
1863
+ background-position: -408px 0;
1864
+}
1865
+
1866
+.icon-cog {
1867
+ background-position: -432px 0;
1868
+}
1869
+
1870
+.icon-trash {
1871
+ background-position: -456px 0;
1872
+}
1873
+
1874
+.icon-home {
1875
+ background-position: 0 -24px;
1876
+}
1877
+
1878
+.icon-file {
1879
+ background-position: -24px -24px;
1880
+}
1881
+
1882
+.icon-time {
1883
+ background-position: -48px -24px;
1884
+}
1885
+
1886
+.icon-road {
1887
+ background-position: -72px -24px;
1888
+}
1889
+
1890
+.icon-download-alt {
1891
+ background-position: -96px -24px;
1892
+}
1893
+
1894
+.icon-download {
1895
+ background-position: -120px -24px;
1896
+}
1897
+
1898
+.icon-upload {
1899
+ background-position: -144px -24px;
1900
+}
1901
+
1902
+.icon-inbox {
1903
+ background-position: -168px -24px;
1904
+}
1905
+
1906
+.icon-play-circle {
1907
+ background-position: -192px -24px;
1908
+}
1909
+
1910
+.icon-repeat {
1911
+ background-position: -216px -24px;
1912
+}
1913
+
1914
+.icon-refresh {
1915
+ background-position: -240px -24px;
1916
+}
1917
+
1918
+.icon-list-alt {
1919
+ background-position: -264px -24px;
1920
+}
1921
+
1922
+.icon-lock {
1923
+ background-position: -287px -24px;
1924
+}
1925
+
1926
+.icon-flag {
1927
+ background-position: -312px -24px;
1928
+}
1929
+
1930
+.icon-headphones {
1931
+ background-position: -336px -24px;
1932
+}
1933
+
1934
+.icon-volume-off {
1935
+ background-position: -360px -24px;
1936
+}
1937
+
1938
+.icon-volume-down {
1939
+ background-position: -384px -24px;
1940
+}
1941
+
1942
+.icon-volume-up {
1943
+ background-position: -408px -24px;
1944
+}
1945
+
1946
+.icon-qrcode {
1947
+ background-position: -432px -24px;
1948
+}
1949
+
1950
+.icon-barcode {
1951
+ background-position: -456px -24px;
1952
+}
1953
+
1954
+.icon-tag {
1955
+ background-position: 0 -48px;
1956
+}
1957
+
1958
+.icon-tags {
1959
+ background-position: -25px -48px;
1960
+}
1961
+
1962
+.icon-book {
1963
+ background-position: -48px -48px;
1964
+}
1965
+
1966
+.icon-bookmark {
1967
+ background-position: -72px -48px;
1968
+}
1969
+
1970
+.icon-print {
1971
+ background-position: -96px -48px;
1972
+}
1973
+
1974
+.icon-camera {
1975
+ background-position: -120px -48px;
1976
+}
1977
+
1978
+.icon-font {
1979
+ background-position: -144px -48px;
1980
+}
1981
+
1982
+.icon-bold {
1983
+ background-position: -167px -48px;
1984
+}
1985
+
1986
+.icon-italic {
1987
+ background-position: -192px -48px;
1988
+}
1989
+
1990
+.icon-text-height {
1991
+ background-position: -216px -48px;
1992
+}
1993
+
1994
+.icon-text-width {
1995
+ background-position: -240px -48px;
1996
+}
1997
+
1998
+.icon-align-left {
1999
+ background-position: -264px -48px;
2000
+}
2001
+
2002
+.icon-align-center {
2003
+ background-position: -288px -48px;
2004
+}
2005
+
2006
+.icon-align-right {
2007
+ background-position: -312px -48px;
2008
+}
2009
+
2010
+.icon-align-justify {
2011
+ background-position: -336px -48px;
2012
+}
2013
+
2014
+.icon-list {
2015
+ background-position: -360px -48px;
2016
+}
2017
+
2018
+.icon-indent-left {
2019
+ background-position: -384px -48px;
2020
+}
2021
+
2022
+.icon-indent-right {
2023
+ background-position: -408px -48px;
2024
+}
2025
+
2026
+.icon-facetime-video {
2027
+ background-position: -432px -48px;
2028
+}
2029
+
2030
+.icon-picture {
2031
+ background-position: -456px -48px;
2032
+}
2033
+
2034
+.icon-pencil {
2035
+ background-position: 0 -72px;
2036
+}
2037
+
2038
+.icon-map-marker {
2039
+ background-position: -24px -72px;
2040
+}
2041
+
2042
+.icon-adjust {
2043
+ background-position: -48px -72px;
2044
+}
2045
+
2046
+.icon-tint {
2047
+ background-position: -72px -72px;
2048
+}
2049
+
2050
+.icon-edit {
2051
+ background-position: -96px -72px;
2052
+}
2053
+
2054
+.icon-share {
2055
+ background-position: -120px -72px;
2056
+}
2057
+
2058
+.icon-check {
2059
+ background-position: -144px -72px;
2060
+}
2061
+
2062
+.icon-move {
2063
+ background-position: -168px -72px;
2064
+}
2065
+
2066
+.icon-step-backward {
2067
+ background-position: -192px -72px;
2068
+}
2069
+
2070
+.icon-fast-backward {
2071
+ background-position: -216px -72px;
2072
+}
2073
+
2074
+.icon-backward {
2075
+ background-position: -240px -72px;
2076
+}
2077
+
2078
+.icon-play {
2079
+ background-position: -264px -72px;
2080
+}
2081
+
2082
+.icon-pause {
2083
+ background-position: -288px -72px;
2084
+}
2085
+
2086
+.icon-stop {
2087
+ background-position: -312px -72px;
2088
+}
2089
+
2090
+.icon-forward {
2091
+ background-position: -336px -72px;
2092
+}
2093
+
2094
+.icon-fast-forward {
2095
+ background-position: -360px -72px;
2096
+}
2097
+
2098
+.icon-step-forward {
2099
+ background-position: -384px -72px;
2100
+}
2101
+
2102
+.icon-eject {
2103
+ background-position: -408px -72px;
2104
+}
2105
+
2106
+.icon-chevron-left {
2107
+ background-position: -432px -72px;
2108
+}
2109
+
2110
+.icon-chevron-right {
2111
+ background-position: -456px -72px;
2112
+}
2113
+
2114
+.icon-plus-sign {
2115
+ background-position: 0 -96px;
2116
+}
2117
+
2118
+.icon-minus-sign {
2119
+ background-position: -24px -96px;
2120
+}
2121
+
2122
+.icon-remove-sign {
2123
+ background-position: -48px -96px;
2124
+}
2125
+
2126
+.icon-ok-sign {
2127
+ background-position: -72px -96px;
2128
+}
2129
+
2130
+.icon-question-sign {
2131
+ background-position: -96px -96px;
2132
+}
2133
+
2134
+.icon-info-sign {
2135
+ background-position: -120px -96px;
2136
+}
2137
+
2138
+.icon-screenshot {
2139
+ background-position: -144px -96px;
2140
+}
2141
+
2142
+.icon-remove-circle {
2143
+ background-position: -168px -96px;
2144
+}
2145
+
2146
+.icon-ok-circle {
2147
+ background-position: -192px -96px;
2148
+}
2149
+
2150
+.icon-ban-circle {
2151
+ background-position: -216px -96px;
2152
+}
2153
+
2154
+.icon-arrow-left {
2155
+ background-position: -240px -96px;
2156
+}
2157
+
2158
+.icon-arrow-right {
2159
+ background-position: -264px -96px;
2160
+}
2161
+
2162
+.icon-arrow-up {
2163
+ background-position: -289px -96px;
2164
+}
2165
+
2166
+.icon-arrow-down {
2167
+ background-position: -312px -96px;
2168
+}
2169
+
2170
+.icon-share-alt {
2171
+ background-position: -336px -96px;
2172
+}
2173
+
2174
+.icon-resize-full {
2175
+ background-position: -360px -96px;
2176
+}
2177
+
2178
+.icon-resize-small {
2179
+ background-position: -384px -96px;
2180
+}
2181
+
2182
+.icon-plus {
2183
+ background-position: -408px -96px;
2184
+}
2185
+
2186
+.icon-minus {
2187
+ background-position: -433px -96px;
2188
+}
2189
+
2190
+.icon-asterisk {
2191
+ background-position: -456px -96px;
2192
+}
2193
+
2194
+.icon-exclamation-sign {
2195
+ background-position: 0 -120px;
2196
+}
2197
+
2198
+.icon-gift {
2199
+ background-position: -24px -120px;
2200
+}
2201
+
2202
+.icon-leaf {
2203
+ background-position: -48px -120px;
2204
+}
2205
+
2206
+.icon-fire {
2207
+ background-position: -72px -120px;
2208
+}
2209
+
2210
+.icon-eye-open {
2211
+ background-position: -96px -120px;
2212
+}
2213
+
2214
+.icon-eye-close {
2215
+ background-position: -120px -120px;
2216
+}
2217
+
2218
+.icon-warning-sign {
2219
+ background-position: -144px -120px;
2220
+}
2221
+
2222
+.icon-plane {
2223
+ background-position: -168px -120px;
2224
+}
2225
+
2226
+.icon-calendar {
2227
+ background-position: -192px -120px;
2228
+}
2229
+
2230
+.icon-random {
2231
+ background-position: -216px -120px;
2232
+}
2233
+
2234
+.icon-comment {
2235
+ background-position: -240px -120px;
2236
+}
2237
+
2238
+.icon-magnet {
2239
+ background-position: -264px -120px;
2240
+}
2241
+
2242
+.icon-chevron-up {
2243
+ background-position: -288px -120px;
2244
+}
2245
+
2246
+.icon-chevron-down {
2247
+ background-position: -313px -119px;
2248
+}
2249
+
2250
+.icon-retweet {
2251
+ background-position: -336px -120px;
2252
+}
2253
+
2254
+.icon-shopping-cart {
2255
+ background-position: -360px -120px;
2256
+}
2257
+
2258
+.icon-folder-close {
2259
+ background-position: -384px -120px;
2260
+}
2261
+
2262
+.icon-folder-open {
2263
+ background-position: -408px -120px;
2264
+}
2265
+
2266
+.icon-resize-vertical {
2267
+ background-position: -432px -119px;
2268
+}
2269
+
2270
+.icon-resize-horizontal {
2271
+ background-position: -456px -118px;
2272
+}
2273
+
2274
+.icon-hdd {
2275
+ background-position: 0 -144px;
2276
+}
2277
+
2278
+.icon-bullhorn {
2279
+ background-position: -24px -144px;
2280
+}
2281
+
2282
+.icon-bell {
2283
+ background-position: -48px -144px;
2284
+}
2285
+
2286
+.icon-certificate {
2287
+ background-position: -72px -144px;
2288
+}
2289
+
2290
+.icon-thumbs-up {
2291
+ background-position: -96px -144px;
2292
+}
2293
+
2294
+.icon-thumbs-down {
2295
+ background-position: -120px -144px;
2296
+}
2297
+
2298
+.icon-hand-right {
2299
+ background-position: -144px -144px;
2300
+}
2301
+
2302
+.icon-hand-left {
2303
+ background-position: -168px -144px;
2304
+}
2305
+
2306
+.icon-hand-up {
2307
+ background-position: -192px -144px;
2308
+}
2309
+
2310
+.icon-hand-down {
2311
+ background-position: -216px -144px;
2312
+}
2313
+
2314
+.icon-circle-arrow-right {
2315
+ background-position: -240px -144px;
2316
+}
2317
+
2318
+.icon-circle-arrow-left {
2319
+ background-position: -264px -144px;
2320
+}
2321
+
2322
+.icon-circle-arrow-up {
2323
+ background-position: -288px -144px;
2324
+}
2325
+
2326
+.icon-circle-arrow-down {
2327
+ background-position: -312px -144px;
2328
+}
2329
+
2330
+.icon-globe {
2331
+ background-position: -336px -144px;
2332
+}
2333
+
2334
+.icon-wrench {
2335
+ background-position: -360px -144px;
2336
+}
2337
+
2338
+.icon-tasks {
2339
+ background-position: -384px -144px;
2340
+}
2341
+
2342
+.icon-filter {
2343
+ background-position: -408px -144px;
2344
+}
2345
+
2346
+.icon-briefcase {
2347
+ background-position: -432px -144px;
2348
+}
2349
+
2350
+.icon-fullscreen {
2351
+ background-position: -456px -144px;
2352
+}
2353
+
2354
+.dropup,
2355
+.dropdown {
2356
+ position: relative;
2357
+}
2358
+
2359
+.dropdown-toggle {
2360
+ *margin-bottom: -3px;
2361
+}
2362
+
2363
+.dropdown-toggle:active,
2364
+.open .dropdown-toggle {
2365
+ outline: 0;
2366
+}
2367
+
2368
+.caret {
2369
+ display: inline-block;
2370
+ width: 0;
2371
+ height: 0;
2372
+ vertical-align: top;
2373
+ border-top: 4px solid #000000;
2374
+ border-right: 4px solid transparent;
2375
+ border-left: 4px solid transparent;
2376
+ content: "";
2377
+ opacity: 0.3;
2378
+ filter: alpha(opacity=30);
2379
+}
2380
+
2381
+.dropdown .caret {
2382
+ margin-top: 8px;
2383
+ margin-left: 2px;
2384
+}
2385
+
2386
+.dropdown:hover .caret,
2387
+.open .caret {
2388
+ opacity: 1;
2389
+ filter: alpha(opacity=100);
2390
+}
2391
+
2392
+.dropdown-menu {
2393
+ position: absolute;
2394
+ top: 100%;
2395
+ left: 0;
2396
+ z-index: 1000;
2397
+ display: none;
2398
+ float: left;
2399
+ min-width: 160px;
2400
+ padding: 4px 0;
2401
+ margin: 1px 0 0;
2402
+ list-style: none;
2403
+ background-color: #ffffff;
2404
+ border: 1px solid #ccc;
2405
+ border: 1px solid rgba(0, 0, 0, 0.2);
2406
+ *border-right-width: 2px;
2407
+ *border-bottom-width: 2px;
2408
+ -webkit-border-radius: 2px;
2409
+ -moz-border-radius: 2px;
2410
+ border-radius: 2px;
2411
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
2412
+ -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
2413
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
2414
+ -webkit-background-clip: padding-box;
2415
+ -moz-background-clip: padding;
2416
+ background-clip: padding-box;
2417
+}
2418
+
2419
+.dropdown-menu.pull-right {
2420
+ right: 0;
2421
+ left: auto;
2422
+}
2423
+
2424
+.dropdown-menu .divider {
2425
+ *width: 100%;
2426
+ height: 1px;
2427
+ margin: 8px 1px;
2428
+ *margin: -5px 0 5px;
2429
+ overflow: hidden;
2430
+ background-color: #e5e5e5;
2431
+ border-bottom: 1px solid #ffffff;
2432
+}
2433
+
2434
+.dropdown-menu a {
2435
+ display: block;
2436
+ padding: 3px 15px;
2437
+ clear: both;
2438
+ font-weight: normal;
2439
+ line-height: 18px;
2440
+ color: #333333;
2441
+ white-space: nowrap;
2442
+}
2443
+
2444
+.dropdown-menu li > a:hover,
2445
+.dropdown-menu .active > a,
2446
+.dropdown-menu .active > a:hover {
2447
+ color: #ffffff;
2448
+ text-decoration: none;
2449
+ background-color: #7c90ba;
2450
+}
2451
+
2452
+.open {
2453
+ *z-index: 1000;
2454
+}
2455
+
2456
+.open > .dropdown-menu {
2457
+ display: block;
2458
+}
2459
+
2460
+.pull-right > .dropdown-menu {
2461
+ right: 0;
2462
+ left: auto;
2463
+}
2464
+
2465
+.dropup .caret,
2466
+.navbar-fixed-bottom .dropdown .caret {
2467
+ border-top: 0;
2468
+ border-bottom: 4px solid #000000;
2469
+ content: "\2191";
2470
+}
2471
+
2472
+.dropup .dropdown-menu,
2473
+.navbar-fixed-bottom .dropdown .dropdown-menu {
2474
+ top: auto;
2475
+ bottom: 100%;
2476
+ margin-bottom: 1px;
2477
+}
2478
+
2479
+.typeahead {
2480
+ margin-top: 2px;
2481
+ -webkit-border-radius: 2px;
2482
+ -moz-border-radius: 2px;
2483
+ border-radius: 2px;
2484
+}
2485
+
2486
+.well {
2487
+ min-height: 20px;
2488
+ padding: 19px;
2489
+ margin-bottom: 20px;
2490
+ background-color: #f8f8f8;
2491
+ border: 1px solid #E8E8E8;
2492
+ -webkit-border-radius: 0;
2493
+ -moz-border-radius: 0;
2494
+ border-radius: 0;
2495
+}
2496
+
2497
+.well blockquote {
2498
+ border-color: #ddd;
2499
+ border-color: rgba(0, 0, 0, 0.15);
2500
+}
2501
+
2502
+.well-large {
2503
+ padding: 24px;
2504
+ -webkit-border-radius: 0;
2505
+ -moz-border-radius: 0;
2506
+ border-radius: 0;
2507
+}
2508
+
2509
+.well-small {
2510
+ padding: 9px;
2511
+ -webkit-border-radius: 0;
2512
+ -moz-border-radius: 0;
2513
+ border-radius: 0;
2514
+}
2515
+
2516
+.fade {
2517
+ opacity: 0;
2518
+ -webkit-transition: opacity 0.15s linear;
2519
+ -moz-transition: opacity 0.15s linear;
2520
+ -ms-transition: opacity 0.15s linear;
2521
+ -o-transition: opacity 0.15s linear;
2522
+ transition: opacity 0.15s linear;
2523
+}
2524
+
2525
+.fade.in {
2526
+ opacity: 1;
2527
+}
2528
+
2529
+.collapse {
2530
+ position: relative;
2531
+ height: 0;
2532
+ overflow: hidden;
2533
+ -webkit-transition: height 0.35s ease;
2534
+ -moz-transition: height 0.35s ease;
2535
+ -ms-transition: height 0.35s ease;
2536
+ -o-transition: height 0.35s ease;
2537
+ transition: height 0.35s ease;
2538
+}
2539
+
2540
+.collapse.in {
2541
+ height: auto;
2542
+}
2543
+
2544
+.close {
2545
+ float: right;
2546
+ font-size: 20px;
2547
+ font-weight: bold;
2548
+ line-height: 18px;
2549
+ color: #000000;
2550
+ text-shadow: 0 1px 0 #ffffff;
2551
+ opacity: 0.2;
2552
+ filter: alpha(opacity=20);
2553
+}
2554
+
2555
+.close:hover {
2556
+ color: #000000;
2557
+ text-decoration: none;
2558
+ cursor: pointer;
2559
+ opacity: 0.4;
2560
+ filter: alpha(opacity=40);
2561
+}
2562
+
2563
+button.close {
2564
+ padding: 0;
2565
+ cursor: pointer;
2566
+ background: transparent;
2567
+ border: 0;
2568
+ -webkit-appearance: none;
2569
+}
2570
+
2571
+.btn {
2572
+ display: inline-block;
2573
+ *display: inline;
2574
+ padding: 3px 8px 3px;
2575
+ margin-bottom: 0;
2576
+ *margin-left: .3em;
2577
+ font-size: 13px;
2578
+ line-height: 18px;
2579
+ *line-height: 20px;
2580
+ color: #555555;
2581
+ text-align: center;
2582
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
2583
+ vertical-align: middle;
2584
+ cursor: pointer;
2585
+ background-color: #f8f8f8;
2586
+ *background-color: #ededed;
2587
+ background-image: -ms-linear-gradient(top, #ffffff, #ededed);
2588
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ededed));
2589
+ background-image: -webkit-linear-gradient(top, #ffffff, #ededed);
2590
+ background-image: -o-linear-gradient(top, #ffffff, #ededed);
2591
+ background-image: linear-gradient(top, #ffffff, #ededed);
2592
+ background-image: -moz-linear-gradient(top, #ffffff, #ededed);
2593
+ background-repeat: repeat-x;
2594
+ border: 1px solid #cccccc;
2595
+ *border: 0;
2596
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2597
+ border-color: #ededed #ededed #c7c7c7;
2598
+ border-bottom-color: #b3b3b3;
2599
+ -webkit-border-radius: 0;
2600
+ -moz-border-radius: 0;
2601
+ border-radius: 0;
2602
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#ededed', GradientType=0);
2603
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2604
+ *zoom: 1;
2605
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.09);
2606
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.09);
2607
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.09);
2608
+}
2609
+
2610
+.btn:hover,
2611
+.btn:active,
2612
+.btn.active,
2613
+.btn.disabled,
2614
+.btn[disabled] {
2615
+ background-color: #ededed;
2616
+ *background-color: #e0e0e0;
2617
+}
2618
+
2619
+.btn:active,
2620
+.btn.active {
2621
+ background-color: #d4d4d4 \9;
2622
+}
2623
+
2624
+.btn:first-child {
2625
+ *margin-left: 0;
2626
+}
2627
+
2628
+.btn:hover {
2629
+ color: #333333;
2630
+ text-decoration: none;
2631
+ background-color: #e6e6e6;
2632
+ *background-color: #d9d9d9;
2633
+ /* Buttons in IE7 don't get borders, so darken on hover */
2634
+
2635
+ background-position: 0 -15px;
2636
+ -webkit-transition: background-position 0.1s linear;
2637
+ -moz-transition: background-position 0.1s linear;
2638
+ -ms-transition: background-position 0.1s linear;
2639
+ -o-transition: background-position 0.1s linear;
2640
+ transition: background-position 0.1s linear;
2641
+}
2642
+
2643
+.btn:focus {
2644
+ outline: thin dotted #333;
2645
+ outline: 5px auto -webkit-focus-ring-color;
2646
+ outline-offset: -2px;
2647
+}
2648
+
2649
+.btn.active,
2650
+.btn:active {
2651
+ background-color: #e6e6e6;
2652
+ background-color: #d9d9d9 \9;
2653
+ background-image: none;
2654
+ outline: 0;
2655
+ -webkit-box-shadow: inset 0 4px 4px rgba(0, 0, 0, 0), 0 1px 2px rgba(0, 0, 0, 0.05);
2656
+ -moz-box-shadow: inset 0 4px 4px rgba(0, 0, 0, 0), 0 1px 2px rgba(0, 0, 0, 0.05);
2657
+ box-shadow: inset 0 4px 4px rgba(0, 0, 0, 0), 0 1px 2px rgba(0, 0, 0, 0.05);
2658
+}
2659
+
2660
+.btn.disabled,
2661
+.btn[disabled] {
2662
+ cursor: default;
2663
+ background-color: #e6e6e6;
2664
+ background-image: none;
2665
+ opacity: 0.65;
2666
+ filter: alpha(opacity=65);
2667
+ -webkit-box-shadow: none;
2668
+ -moz-box-shadow: none;
2669
+ box-shadow: none;
2670
+}
2671
+
2672
+.btn-large {
2673
+ padding: 6px 11px;
2674
+ font-size: 15px;
2675
+ line-height: normal;
2676
+ -webkit-border-radius: 2px;
2677
+ -moz-border-radius: 2px;
2678
+ border-radius: 2px;
2679
+}
2680
+
2681
+.btn-large [class^="icon-"] {
2682
+ margin-top: 1px;
2683
+}
2684
+
2685
+.btn-small {
2686
+ padding: 4px 8px;
2687
+ font-size: 11px;
2688
+ line-height: 16px;
2689
+}
2690
+
2691
+.btn-small [class^="icon-"] {
2692
+ margin-top: -1px;
2693
+}
2694
+
2695
+.btn-mini {
2696
+ padding: 2px 6px;
2697
+ font-size: 11px;
2698
+ line-height: 14px;
2699
+}
2700
+
2701
+.btn-primary,
2702
+.btn-primary:hover,
2703
+.btn-warning,
2704
+.btn-warning:hover,
2705
+.btn-danger,
2706
+.btn-danger:hover,
2707
+.btn-success,
2708
+.btn-success:hover,
2709
+.btn-info,
2710
+.btn-info:hover,
2711
+.btn-inverse,
2712
+.btn-inverse:hover {
2713
+ color: #ffffff;
2714
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
2715
+}
2716
+
2717
+.btn-primary.active,
2718
+.btn-warning.active,
2719
+.btn-danger.active,
2720
+.btn-success.active,
2721
+.btn-info.active,
2722
+.btn-inverse.active {
2723
+ color: rgba(255, 255, 255, 0.75);
2724
+}
2725
+
2726
+.btn {
2727
+ border-color: #ccc;
2728
+ border-color: rgba(0, 0, 0, 0.17) rgba(0, 0, 0, 0.17) rgba(0, 0, 0, 0.29);
2729
+}
2730
+
2731
+.btn-primary {
2732
+ background-color: #566d9f;
2733
+ *background-color: #4d6492;
2734
+ background-image: -ms-linear-gradient(top, #5b74a8, #4d6492);
2735
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5b74a8), to(#4d6492));
2736
+ background-image: -webkit-linear-gradient(top, #5b74a8, #4d6492);
2737
+ background-image: -o-linear-gradient(top, #5b74a8, #4d6492);
2738
+ background-image: -moz-linear-gradient(top, #5b74a8, #4d6492);
2739
+ background-image: linear-gradient(top, #5b74a8, #4d6492);
2740
+ background-repeat: repeat-x;
2741
+ border-color: #4d6492 #4d6492 #334260;
2742
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2743
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5b74a8', endColorstr='#4d6492', GradientType=0);
2744
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2745
+}
2746
+
2747
+.btn-primary:hover,
2748
+.btn-primary:active,
2749
+.btn-primary.active,
2750
+.btn-primary.disabled,
2751
+.btn-primary[disabled] {
2752
+ background-color: #4d6492;
2753
+ *background-color: #455881;
2754
+}
2755
+
2756
+.btn-primary:active,
2757
+.btn-primary.active {
2758
+ background-color: #3c4d71 \9;
2759
+}
2760
+
2761
+.btn-warning {
2762
+ background-color: #faa732;
2763
+ *background-color: #f89406;
2764
+ background-image: -ms-linear-gradient(top, #fbb450, #f89406);
2765
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
2766
+ background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
2767
+ background-image: -o-linear-gradient(top, #fbb450, #f89406);
2768
+ background-image: -moz-linear-gradient(top, #fbb450, #f89406);
2769
+ background-image: linear-gradient(top, #fbb450, #f89406);
2770
+ background-repeat: repeat-x;
2771
+ border-color: #f89406 #f89406 #ad6704;
2772
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2773
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
2774
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2775
+}
2776
+
2777
+.btn-warning:hover,
2778
+.btn-warning:active,
2779
+.btn-warning.active,
2780
+.btn-warning.disabled,
2781
+.btn-warning[disabled] {
2782
+ background-color: #f89406;
2783
+ *background-color: #df8505;
2784
+}
2785
+
2786
+.btn-warning:active,
2787
+.btn-warning.active {
2788
+ background-color: #c67605 \9;
2789
+}
2790
+
2791
+.btn-danger {
2792
+ background-color: #8f4f3a;
2793
+ *background-color: #844936;
2794
+ background-image: -ms-linear-gradient(top, #96533d, #844936);
2795
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#96533d), to(#844936));
2796
+ background-image: -webkit-linear-gradient(top, #96533d, #844936);
2797
+ background-image: -o-linear-gradient(top, #96533d, #844936);
2798
+ background-image: -moz-linear-gradient(top, #96533d, #844936);
2799
+ background-image: linear-gradient(top, #96533d, #844936);
2800
+ background-repeat: repeat-x;
2801
+ border-color: #844936 #844936 #4d2b20;
2802
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2803
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#96533d', endColorstr='#844936', GradientType=0);
2804
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2805
+}
2806
+
2807
+.btn-danger:hover,
2808
+.btn-danger:active,
2809
+.btn-danger.active,
2810
+.btn-danger.disabled,
2811
+.btn-danger[disabled] {
2812
+ background-color: #844936;
2813
+ *background-color: #723f2e;
2814
+}
2815
+
2816
+.btn-danger:active,
2817
+.btn-danger.active {
2818
+ background-color: #603527 \9;
2819
+}
2820
+
2821
+.btn-success {
2822
+ background-color: #5bb75b;
2823
+ *background-color: #51a351;
2824
+ background-image: -ms-linear-gradient(top, #62c462, #51a351);
2825
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
2826
+ background-image: -webkit-linear-gradient(top, #62c462, #51a351);
2827
+ background-image: -o-linear-gradient(top, #62c462, #51a351);
2828
+ background-image: -moz-linear-gradient(top, #62c462, #51a351);
2829
+ background-image: linear-gradient(top, #62c462, #51a351);
2830
+ background-repeat: repeat-x;
2831
+ border-color: #51a351 #51a351 #387038;
2832
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2833
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);
2834
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2835
+}
2836
+
2837
+.btn-success:hover,
2838
+.btn-success:active,
2839
+.btn-success.active,
2840
+.btn-success.disabled,
2841
+.btn-success[disabled] {
2842
+ background-color: #51a351;
2843
+ *background-color: #499249;
2844
+}
2845
+
2846
+.btn-success:active,
2847
+.btn-success.active {
2848
+ background-color: #408140 \9;
2849
+}
2850
+
2851
+.btn-info {
2852
+ background-color: #49afcd;
2853
+ *background-color: #2f96b4;
2854
+ background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);
2855
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
2856
+ background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
2857
+ background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
2858
+ background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
2859
+ background-image: linear-gradient(top, #5bc0de, #2f96b4);
2860
+ background-repeat: repeat-x;
2861
+ border-color: #2f96b4 #2f96b4 #1f6377;
2862
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2863
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);
2864
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2865
+}
2866
+
2867
+.btn-info:hover,
2868
+.btn-info:active,
2869
+.btn-info.active,
2870
+.btn-info.disabled,
2871
+.btn-info[disabled] {
2872
+ background-color: #2f96b4;
2873
+ *background-color: #2a85a0;
2874
+}
2875
+
2876
+.btn-info:active,
2877
+.btn-info.active {
2878
+ background-color: #24748c \9;
2879
+}
2880
+
2881
+.btn-inverse {
2882
+ background-color: #414141;
2883
+ *background-color: #222222;
2884
+ background-image: -ms-linear-gradient(top, #555555, #222222);
2885
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));
2886
+ background-image: -webkit-linear-gradient(top, #555555, #222222);
2887
+ background-image: -o-linear-gradient(top, #555555, #222222);
2888
+ background-image: -moz-linear-gradient(top, #555555, #222222);
2889
+ background-image: linear-gradient(top, #555555, #222222);
2890
+ background-repeat: repeat-x;
2891
+ border-color: #222222 #222222 #000000;
2892
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2893
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);
2894
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
2895
+}
2896
+
2897
+.btn-inverse:hover,
2898
+.btn-inverse:active,
2899
+.btn-inverse.active,
2900
+.btn-inverse.disabled,
2901
+.btn-inverse[disabled] {
2902
+ background-color: #222222;
2903
+ *background-color: #151515;
2904
+}
2905
+
2906
+.btn-inverse:active,
2907
+.btn-inverse.active {
2908
+ background-color: #080808 \9;
2909
+}
2910
+
2911
+button.btn,
2912
+input[type="submit"].btn {
2913
+ *padding-top: 2px;
2914
+ *padding-bottom: 2px;
2915
+}
2916
+
2917
+button.btn::-moz-focus-inner,
2918
+input[type="submit"].btn::-moz-focus-inner {
2919
+ padding: 0;
2920
+ border: 0;
2921
+}
2922
+
2923
+button.btn.btn-large,
2924
+input[type="submit"].btn.btn-large {
2925
+ *padding-top: 7px;
2926
+ *padding-bottom: 7px;
2927
+}
2928
+
2929
+button.btn.btn-small,
2930
+input[type="submit"].btn.btn-small {
2931
+ *padding-top: 3px;
2932
+ *padding-bottom: 3px;
2933
+}
2934
+
2935
+button.btn.btn-mini,
2936
+input[type="submit"].btn.btn-mini {
2937
+ *padding-top: 1px;
2938
+ *padding-bottom: 1px;
2939
+}
2940
+
2941
+.btn-group {
2942
+ position: relative;
2943
+ *margin-left: .3em;
2944
+ *zoom: 1;
2945
+}
2946
+
2947
+.btn-group:before,
2948
+.btn-group:after {
2949
+ display: table;
2950
+ content: "";
2951
+}
2952
+
2953
+.btn-group:after {
2954
+ clear: both;
2955
+}
2956
+
2957
+.btn-group:first-child {
2958
+ *margin-left: 0;
2959
+}
2960
+
2961
+.btn-group + .btn-group {
2962
+ margin-left: 5px;
2963
+}
2964
+
2965
+.btn-toolbar {
2966
+ margin-top: 9px;
2967
+ margin-bottom: 9px;
2968
+}
2969
+
2970
+.btn-toolbar .btn-group {
2971
+ display: inline-block;
2972
+ *display: inline;
2973
+ /* IE7 inline-block hack */
2974
+
2975
+ *zoom: 1;
2976
+}
2977
+
2978
+.btn-group > .btn {
2979
+ position: relative;
2980
+ float: left;
2981
+ margin-left: -1px;
2982
+ -webkit-border-radius: 0;
2983
+ -moz-border-radius: 0;
2984
+ border-radius: 0;
2985
+}
2986
+
2987
+.btn-group > .btn:first-child {
2988
+ margin-left: 0;
2989
+ -webkit-border-bottom-left-radius: 1px;
2990
+ border-bottom-left-radius: 1px;
2991
+ -webkit-border-top-left-radius: 1px;
2992
+ border-top-left-radius: 1px;
2993
+ -moz-border-radius-bottomleft: 1px;
2994
+ -moz-border-radius-topleft: 1px;
2995
+}
2996
+
2997
+.btn-group > .btn:last-child,
2998
+.btn-group > .dropdown-toggle {
2999
+ -webkit-border-top-right-radius: 1px;
3000
+ border-top-right-radius: 1px;
3001
+ -webkit-border-bottom-right-radius: 1px;
3002
+ border-bottom-right-radius: 1px;
3003
+ -moz-border-radius-topright: 1px;
3004
+ -moz-border-radius-bottomright: 1px;
3005
+}
3006
+
3007
+.btn-group > .btn.large:first-child {
3008
+ margin-left: 0;
3009
+ -webkit-border-bottom-left-radius: 2px;
3010
+ border-bottom-left-radius: 2px;
3011
+ -webkit-border-top-left-radius: 2px;
3012
+ border-top-left-radius: 2px;
3013
+ -moz-border-radius-bottomleft: 2px;
3014
+ -moz-border-radius-topleft: 2px;
3015
+}
3016
+
3017
+.btn-group > .btn.large:last-child,
3018
+.btn-group > .large.dropdown-toggle {
3019
+ -webkit-border-top-right-radius: 2px;
3020
+ border-top-right-radius: 2px;
3021
+ -webkit-border-bottom-right-radius: 2px;
3022
+ border-bottom-right-radius: 2px;
3023
+ -moz-border-radius-topright: 2px;
3024
+ -moz-border-radius-bottomright: 2px;
3025
+}
3026
+
3027
+.btn-group > .btn:hover,
3028
+.btn-group > .btn:focus,
3029
+.btn-group > .btn:active,
3030
+.btn-group > .btn.active {
3031
+ z-index: 2;
3032
+}
3033
+
3034
+.btn-group .dropdown-toggle:active,
3035
+.btn-group.open .dropdown-toggle {
3036
+ outline: 0;
3037
+}
3038
+
3039
+.btn-group > .dropdown-toggle {
3040
+ *padding-top: 4px;
3041
+ padding-right: 8px;
3042
+ *padding-bottom: 4px;
3043
+ padding-left: 8px;
3044
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.09);
3045
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.09);
3046
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.09);
3047
+}
3048
+
3049
+.btn-group > .btn-mini.dropdown-toggle {
3050
+ padding-right: 5px;
3051
+ padding-left: 5px;
3052
+}
3053
+
3054
+.btn-group > .btn-small.dropdown-toggle {
3055
+ *padding-top: 4px;
3056
+ *padding-bottom: 4px;
3057
+}
3058
+
3059
+.btn-group > .btn-large.dropdown-toggle {
3060
+ padding-right: 12px;
3061
+ padding-left: 12px;
3062
+}
3063
+
3064
+.btn-group.open .dropdown-toggle {
3065
+ background-image: none;
3066
+ -webkit-box-shadow: inset 0 4px 4px rgba(0, 0, 0, 0), 0 1px 2px rgba(0, 0, 0, 0.05);
3067
+ -moz-box-shadow: inset 0 4px 4px rgba(0, 0, 0, 0), 0 1px 2px rgba(0, 0, 0, 0.05);
3068
+ box-shadow: inset 0 4px 4px rgba(0, 0, 0, 0), 0 1px 2px rgba(0, 0, 0, 0.05);
3069
+}
3070
+
3071
+.btn-group.open .btn.dropdown-toggle {
3072
+ background-color: #ededed;
3073
+}
3074
+
3075
+.btn-group.open .btn-primary.dropdown-toggle {
3076
+ background-color: #4d6492;
3077
+}
3078
+
3079
+.btn-group.open .btn-warning.dropdown-toggle {
3080
+ background-color: #f89406;
3081
+}
3082
+
3083
+.btn-group.open .btn-danger.dropdown-toggle {
3084
+ background-color: #844936;
3085
+}
3086
+
3087
+.btn-group.open .btn-success.dropdown-toggle {
3088
+ background-color: #51a351;
3089
+}
3090
+
3091
+.btn-group.open .btn-info.dropdown-toggle {
3092
+ background-color: #2f96b4;
3093
+}
3094
+
3095
+.btn-group.open .btn-inverse.dropdown-toggle {
3096
+ background-color: #222222;
3097
+}
3098
+
3099
+.btn .caret {
3100
+ margin-top: 7px;
3101
+ margin-left: 0;
3102
+}
3103
+
3104
+.btn:hover .caret,
3105
+.open.btn-group .caret {
3106
+ opacity: 1;
3107
+ filter: alpha(opacity=100);
3108
+}
3109
+
3110
+.btn-mini .caret {
3111
+ margin-top: 5px;
3112
+}
3113
+
3114
+.btn-small .caret {
3115
+ margin-top: 6px;
3116
+}
3117
+
3118
+.btn-large .caret {
3119
+ margin-top: 6px;
3120
+ border-top-width: 5px;
3121
+ border-right-width: 5px;
3122
+ border-left-width: 5px;
3123
+}
3124
+
3125
+.dropup .btn-large .caret {
3126
+ border-top: 0;
3127
+ border-bottom: 5px solid #000000;
3128
+}
3129
+
3130
+.btn-primary .caret,
3131
+.btn-warning .caret,
3132
+.btn-danger .caret,
3133
+.btn-info .caret,
3134
+.btn-success .caret,
3135
+.btn-inverse .caret {
3136
+ border-top-color: #ffffff;
3137
+ border-bottom-color: #ffffff;
3138
+ opacity: 0.75;
3139
+ filter: alpha(opacity=75);
3140
+}
3141
+
3142
+.alert {
3143
+ padding: 8px 35px 8px 14px;
3144
+ margin-bottom: 18px;
3145
+ color: #c09853;
3146
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
3147
+ background-color: #fcf8e3;
3148
+ border: 1px solid #fbeed5;
3149
+ -webkit-border-radius: 4px;
3150
+ -moz-border-radius: 4px;
3151
+ border-radius: 4px;
3152
+}
3153
+
3154
+.alert-heading {
3155
+ color: inherit;
3156
+}
3157
+
3158
+.alert .close {
3159
+ position: relative;
3160
+ top: -2px;
3161
+ right: -21px;
3162
+ line-height: 18px;
3163
+}
3164
+
3165
+.alert-success {
3166
+ color: #468847;
3167
+ background-color: #69a74e;
3168
+ border-color: #6b9646;
3169
+}
3170
+
3171
+.alert-danger,
3172
+.alert-error {
3173
+ color: #b94a48;
3174
+ background-color: #f2dede;
3175
+ border-color: #eed3d7;
3176
+}
3177
+
3178
+.alert-info {
3179
+ color: #3a87ad;
3180
+ background-color: #d9edf7;
3181
+ border-color: #bce8f1;
3182
+}
3183
+
3184
+.alert-block {
3185
+ padding-top: 14px;
3186
+ padding-bottom: 14px;
3187
+}
3188
+
3189
+.alert-block > p,
3190
+.alert-block > ul {
3191
+ margin-bottom: 0;
3192
+}
3193
+
3194
+.alert-block p + p {
3195
+ margin-top: 5px;
3196
+}
3197
+
3198
+.nav {
3199
+ margin-bottom: 18px;
3200
+ margin-left: 0;
3201
+ list-style: none;
3202
+}
3203
+
3204
+.nav > li > a {
3205
+ display: block;
3206
+}
3207
+
3208
+.nav > li > a:hover {
3209
+ text-decoration: none;
3210
+ background-color: #eeeeee;
3211
+}
3212
+
3213
+.nav > .pull-right {
3214
+ float: right;
3215
+}
3216
+
3217
+.nav .nav-header {
3218
+ display: block;
3219
+ padding: 3px 15px;
3220
+ font-size: 11px;
3221
+ font-weight: bold;
3222
+ line-height: 18px;
3223
+ color: #555555;
3224
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
3225
+ text-transform: uppercase;
3226
+}
3227
+
3228
+.nav li + .nav-header {
3229
+ margin-top: 9px;
3230
+}
3231
+
3232
+.nav-list {
3233
+ padding-right: 15px;
3234
+ padding-left: 15px;
3235
+ margin-bottom: 0;
3236
+}
3237
+
3238
+.nav-list > li > a,
3239
+.nav-list .nav-header {
3240
+ margin-right: -15px;
3241
+ margin-left: -15px;
3242
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
3243
+}
3244
+
3245
+.nav-list > li > a {
3246
+ padding: 3px 15px;
3247
+}
3248
+
3249
+.nav-list > .active > a,
3250
+.nav-list > .active > a:hover {
3251
+ color: #ffffff;
3252
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
3253
+ background-color: #6c83b1;
3254
+ background-image: -moz-linear-gradient(top, #6f85b3, #687faf);
3255
+ background-image: -ms-linear-gradient(top, #6f85b3, #687faf);
3256
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6f85b3), to(#687faf));
3257
+ background-image: -webkit-linear-gradient(top, #6f85b3, #687faf);
3258
+ background-image: -o-linear-gradient(top, #6f85b3, #687faf);
3259
+ background-image: linear-gradient(top, #6f85b3, #687faf);
3260
+ background-repeat: repeat-x;
3261
+ border-color: #687faf #687faf #465b85;
3262
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3263
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#6f85b3', endColorstr='#687faf', GradientType=0);
3264
+}
3265
+
3266
+.nav-list [class^="icon-"] {
3267
+ margin-right: 2px;
3268
+}
3269
+
3270
+.nav-list .divider {
3271
+ *width: 100%;
3272
+ height: 1px;
3273
+ margin: 8px 1px;
3274
+ *margin: -5px 0 5px;
3275
+ overflow: hidden;
3276
+ background-color: #e5e5e5;
3277
+ border-bottom: 1px solid #ffffff;
3278
+}
3279
+
3280
+.nav-tabs,
3281
+.nav-pills {
3282
+ *zoom: 1;
3283
+}
3284
+
3285
+.nav-tabs:before,
3286
+.nav-pills:before,
3287
+.nav-tabs:after,
3288
+.nav-pills:after {
3289
+ display: table;
3290
+ content: "";
3291
+}
3292
+
3293
+.nav-tabs:after,
3294
+.nav-pills:after {
3295
+ clear: both;
3296
+}
3297
+
3298
+.nav-tabs > li,
3299
+.nav-pills > li {
3300
+ float: left;
3301
+}
3302
+
3303
+.nav-tabs > li > a,
3304
+.nav-pills > li > a {
3305
+ padding-right: 12px;
3306
+ padding-left: 12px;
3307
+ margin-right: 2px;
3308
+ line-height: 14px;
3309
+}
3310
+
3311
+.nav-tabs {
3312
+ border-bottom: 1px solid #ddd;
3313
+}
3314
+
3315
+.nav-tabs > li {
3316
+ margin-bottom: -1px;
3317
+}
3318
+
3319
+.nav-tabs > li > a {
3320
+ padding-top: 8px;
3321
+ padding-bottom: 8px;
3322
+ line-height: 18px;
3323
+ border: 1px solid transparent;
3324
+ -webkit-border-radius: 4px 4px 0 0;
3325
+ -moz-border-radius: 4px 4px 0 0;
3326
+ border-radius: 4px 4px 0 0;
3327
+}
3328
+
3329
+.nav-tabs > li > a:hover {
3330
+ border-color: #eeeeee #eeeeee #dddddd;
3331
+}
3332
+
3333
+.nav-tabs > .active > a,
3334
+.nav-tabs > .active > a:hover {
3335
+ color: #555555;
3336
+ cursor: default;
3337
+ background-color: #ffffff;
3338
+ border: 1px solid #ddd;
3339
+ border-bottom-color: transparent;
3340
+}
3341
+
3342
+.nav-pills > li > a {
3343
+ padding-top: 4px;
3344
+ padding-bottom: 4px;
3345
+ margin-top: 2px;
3346
+ margin-bottom: 2px;
3347
+ -webkit-border-radius: 3px;
3348
+ -moz-border-radius: 3px;
3349
+ border-radius: 3px;
3350
+}
3351
+
3352
+.nav-pills > .active > a,
3353
+.nav-pills > .active > a:hover {
3354
+ color: #ffffff;
3355
+ background-color: #5b74a8;
3356
+}
3357
+
3358
+.nav-stacked > li {
3359
+ float: none;
3360
+}
3361
+
3362
+.nav-stacked > li > a {
3363
+ margin-right: 0;
3364
+}
3365
+
3366
+.nav-tabs.nav-stacked {
3367
+ border-bottom: 0;
3368
+}
3369
+
3370
+.nav-tabs.nav-stacked > li > a {
3371
+ border: 1px solid #ddd;
3372
+ -webkit-border-radius: 0;
3373
+ -moz-border-radius: 0;
3374
+ border-radius: 0;
3375
+}
3376
+
3377
+.nav-tabs.nav-stacked > li:first-child > a {
3378
+ -webkit-border-radius: 4px 4px 0 0;
3379
+ -moz-border-radius: 4px 4px 0 0;
3380
+ border-radius: 4px 4px 0 0;
3381
+}
3382
+
3383
+.nav-tabs.nav-stacked > li:last-child > a {
3384
+ -webkit-border-radius: 0 0 4px 4px;
3385
+ -moz-border-radius: 0 0 4px 4px;
3386
+ border-radius: 0 0 4px 4px;
3387
+}
3388
+
3389
+.nav-tabs.nav-stacked > li > a:hover {
3390
+ z-index: 2;
3391
+ border-color: #ddd;
3392
+}
3393
+
3394
+.nav-pills.nav-stacked > li > a {
3395
+ margin-bottom: 3px;
3396
+}
3397
+
3398
+.nav-pills.nav-stacked > li:last-child > a {
3399
+ margin-bottom: 1px;
3400
+}
3401
+
3402
+.nav-tabs .dropdown-menu {
3403
+ -webkit-border-radius: 0 0 5px 5px;
3404
+ -moz-border-radius: 0 0 5px 5px;
3405
+ border-radius: 0 0 5px 5px;
3406
+}
3407
+
3408
+.nav-pills .dropdown-menu {
3409
+ -webkit-border-radius: 2px;
3410
+ -moz-border-radius: 2px;
3411
+ border-radius: 2px;
3412
+}
3413
+
3414
+.nav-tabs .dropdown-toggle .caret,
3415
+.nav-pills .dropdown-toggle .caret {
3416
+ margin-top: 6px;
3417
+ border-top-color: #5b74a8;
3418
+ border-bottom-color: #5b74a8;
3419
+}
3420
+
3421
+.nav-tabs .dropdown-toggle:hover .caret,
3422
+.nav-pills .dropdown-toggle:hover .caret {
3423
+ border-top-color: #485d88;
3424
+ border-bottom-color: #485d88;
3425
+}
3426
+
3427
+.nav-tabs .active .dropdown-toggle .caret,
3428
+.nav-pills .active .dropdown-toggle .caret {
3429
+ border-top-color: #333333;
3430
+ border-bottom-color: #333333;
3431
+}
3432
+
3433
+.nav > .dropdown.active > a:hover {
3434
+ color: #000000;
3435
+ cursor: pointer;
3436
+}
3437
+
3438
+.nav-tabs .open .dropdown-toggle,
3439
+.nav-pills .open .dropdown-toggle,
3440
+.nav > li.dropdown.open.active > a:hover {
3441
+ color: #ffffff;
3442
+ background-color: #999999;
3443
+ border-color: #999999;
3444
+}
3445
+
3446
+.nav li.dropdown.open .caret,
3447
+.nav li.dropdown.open.active .caret,
3448
+.nav li.dropdown.open a:hover .caret {
3449
+ border-top-color: #ffffff;
3450
+ border-bottom-color: #ffffff;
3451
+ opacity: 1;
3452
+ filter: alpha(opacity=100);
3453
+}
3454
+
3455
+.tabs-stacked .open > a:hover {
3456
+ border-color: #999999;
3457
+}
3458
+
3459
+.tabbable {
3460
+ *zoom: 1;
3461
+}
3462
+
3463
+.tabbable:before,
3464
+.tabbable:after {
3465
+ display: table;
3466
+ content: "";
3467
+}
3468
+
3469
+.tabbable:after {
3470
+ clear: both;
3471
+}
3472
+
3473
+.tab-content {
3474
+ overflow: auto;
3475
+}
3476
+
3477
+.tabs-below > .nav-tabs,
3478
+.tabs-right > .nav-tabs,
3479
+.tabs-left > .nav-tabs {
3480
+ border-bottom: 0;
3481
+}
3482
+
3483
+.tab-content > .tab-pane,
3484
+.pill-content > .pill-pane {
3485
+ display: none;
3486
+}
3487
+
3488
+.tab-content > .active,
3489
+.pill-content > .active {
3490
+ display: block;
3491
+}
3492
+
3493
+.tabs-below > .nav-tabs {
3494
+ border-top: 1px solid #ddd;
3495
+}
3496
+
3497
+.tabs-below > .nav-tabs > li {
3498
+ margin-top: -1px;
3499
+ margin-bottom: 0;
3500
+}
3501
+
3502
+.tabs-below > .nav-tabs > li > a {
3503
+ -webkit-border-radius: 0 0 4px 4px;
3504
+ -moz-border-radius: 0 0 4px 4px;
3505
+ border-radius: 0 0 4px 4px;
3506
+}
3507
+
3508
+.tabs-below > .nav-tabs > li > a:hover {
3509
+ border-top-color: #ddd;
3510
+ border-bottom-color: transparent;
3511
+}
3512
+
3513
+.tabs-below > .nav-tabs > .active > a,
3514
+.tabs-below > .nav-tabs > .active > a:hover {
3515
+ border-color: transparent #ddd #ddd #ddd;
3516
+}
3517
+
3518
+.tabs-left > .nav-tabs > li,
3519
+.tabs-right > .nav-tabs > li {
3520
+ float: none;
3521
+}
3522
+
3523
+.tabs-left > .nav-tabs > li > a,
3524
+.tabs-right > .nav-tabs > li > a {
3525
+ min-width: 74px;
3526
+ margin-right: 0;
3527
+ margin-bottom: 3px;
3528
+}
3529
+
3530
+.tabs-left > .nav-tabs {
3531
+ float: left;
3532
+ margin-right: 19px;
3533
+ border-right: 1px solid #ddd;
3534
+}
3535
+
3536
+.tabs-left > .nav-tabs > li > a {
3537
+ margin-right: -1px;
3538
+ -webkit-border-radius: 4px 0 0 4px;
3539
+ -moz-border-radius: 4px 0 0 4px;
3540
+ border-radius: 4px 0 0 4px;
3541
+}
3542
+
3543
+.tabs-left > .nav-tabs > li > a:hover {
3544
+ border-color: #eeeeee #dddddd #eeeeee #eeeeee;
3545
+}
3546
+
3547
+.tabs-left > .nav-tabs .active > a,
3548
+.tabs-left > .nav-tabs .active > a:hover {
3549
+ border-color: #ddd transparent #ddd #ddd;
3550
+ *border-right-color: #ffffff;
3551
+}
3552
+
3553
+.tabs-right > .nav-tabs {
3554
+ float: right;
3555
+ margin-left: 19px;
3556
+ border-left: 1px solid #ddd;
3557
+}
3558
+
3559
+.tabs-right > .nav-tabs > li > a {
3560
+ margin-left: -1px;
3561
+ -webkit-border-radius: 0 4px 4px 0;
3562
+ -moz-border-radius: 0 4px 4px 0;
3563
+ border-radius: 0 4px 4px 0;
3564
+}
3565
+
3566
+.tabs-right > .nav-tabs > li > a:hover {
3567
+ border-color: #eeeeee #eeeeee #eeeeee #dddddd;
3568
+}
3569
+
3570
+.tabs-right > .nav-tabs .active > a,
3571
+.tabs-right > .nav-tabs .active > a:hover {
3572
+ border-color: #ddd #ddd #ddd transparent;
3573
+ *border-left-color: #ffffff;
3574
+}
3575
+
3576
+.navbar {
3577
+ *position: relative;
3578
+ *z-index: 2;
3579
+ margin-bottom: 18px;
3580
+ overflow: visible;
3581
+}
3582
+
3583
+.navbar-inner {
3584
+ min-height: 40px;
3585
+ padding-right: 20px;
3586
+ padding-left: 20px;
3587
+ background-color: #272727;
3588
+ background-image: -moz-linear-gradient(top, #2a2a2a, #222222);
3589
+ background-image: -ms-linear-gradient(top, #2a2a2a, #222222);
3590
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#2a2a2a), to(#222222));
3591
+ background-image: -webkit-linear-gradient(top, #2a2a2a, #222222);
3592
+ background-image: -o-linear-gradient(top, #2a2a2a, #222222);
3593
+ background-image: linear-gradient(top, #2a2a2a, #222222);
3594
+ background-repeat: repeat-x;
3595
+ -webkit-border-radius: 4px;
3596
+ -moz-border-radius: 4px;
3597
+ border-radius: 4px;
3598
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#2a2a2a', endColorstr='#222222', GradientType=0);
3599
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
3600
+ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
3601
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
3602
+}
3603
+
3604
+.navbar .container {
3605
+ width: auto;
3606
+}
3607
+
3608
+.nav-collapse.collapse {
3609
+ height: auto;
3610
+}
3611
+
3612
+.navbar {
3613
+ color: #999999;
3614
+}
3615
+
3616
+.navbar .brand:hover {
3617
+ text-decoration: none;
3618
+}
3619
+
3620
+.navbar .brand {
3621
+ display: block;
3622
+ float: left;
3623
+ padding: 8px 20px 12px;
3624
+ margin-left: -20px;
3625
+ font-size: 20px;
3626
+ font-weight: 200;
3627
+ line-height: 1;
3628
+ color: #999999;
3629
+}
3630
+
3631
+.navbar .navbar-text {
3632
+ margin-bottom: 0;
3633
+ line-height: 40px;
3634
+}
3635
+
3636
+.navbar .navbar-link {
3637
+ color: #999999;
3638
+}
3639
+
3640
+.navbar .navbar-link:hover {
3641
+ color: #ffffff;
3642
+}
3643
+
3644
+.navbar .btn,
3645
+.navbar .btn-group {
3646
+ margin-top: 5px;
3647
+}
3648
+
3649
+.navbar .btn-group .btn {
3650
+ margin: 0;
3651
+}
3652
+
3653
+.navbar-form {
3654
+ margin-bottom: 0;
3655
+ *zoom: 1;
3656
+}
3657
+
3658
+.navbar-form:before,
3659
+.navbar-form:after {
3660
+ display: table;
3661
+ content: "";
3662
+}
3663
+
3664
+.navbar-form:after {
3665
+ clear: both;
3666
+}
3667
+
3668
+.navbar-form input,
3669
+.navbar-form select,
3670
+.navbar-form .radio,
3671
+.navbar-form .checkbox {
3672
+ margin-top: 5px;
3673
+}
3674
+
3675
+.navbar-form input,
3676
+.navbar-form select {
3677
+ display: inline-block;
3678
+ margin-bottom: 0;
3679
+}
3680
+
3681
+.navbar-form input[type="image"],
3682
+.navbar-form input[type="checkbox"],
3683
+.navbar-form input[type="radio"] {
3684
+ margin-top: 3px;
3685
+}
3686
+
3687
+.navbar-form .input-append,
3688
+.navbar-form .input-prepend {
3689
+ margin-top: 6px;
3690
+ white-space: nowrap;
3691
+}
3692
+
3693
+.navbar-form .input-append input,
3694
+.navbar-form .input-prepend input {
3695
+ margin-top: 0;
3696
+}
3697
+
3698
+.navbar-search {
3699
+ position: relative;
3700
+ float: left;
3701
+ margin-top: 6px;
3702
+ margin-bottom: 0;
3703
+}
3704
+
3705
+.navbar-search .search-query {
3706
+ padding: 4px 9px;
3707
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
3708
+ font-size: 13px;
3709
+ font-weight: normal;
3710
+ line-height: 1;
3711
+ color: #ffffff;
3712
+ background-color: #626262;
3713
+ border: 1px solid #151515;
3714
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
3715
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
3716
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
3717
+ -webkit-transition: none;
3718
+ -moz-transition: none;
3719
+ -ms-transition: none;
3720
+ -o-transition: none;
3721
+ transition: none;
3722
+}
3723
+
3724
+.navbar-search .search-query:-moz-placeholder {
3725
+ color: #cccccc;
3726
+}
3727
+
3728
+.navbar-search .search-query:-ms-input-placeholder {
3729
+ color: #cccccc;
3730
+}
3731
+
3732
+.navbar-search .search-query::-webkit-input-placeholder {
3733
+ color: #cccccc;
3734
+}
3735
+
3736
+.navbar-search .search-query:focus,
3737
+.navbar-search .search-query.focused {
3738
+ padding: 5px 10px;
3739
+ color: #333333;
3740
+ text-shadow: 0 1px 0 #ffffff;
3741
+ background-color: #ffffff;
3742
+ border: 0;
3743
+ outline: 0;
3744
+ -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
3745
+ -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
3746
+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
3747
+}
3748
+
3749
+.navbar-fixed-top,
3750
+.navbar-fixed-bottom {
3751
+ position: fixed;
3752
+ right: 0;
3753
+ left: 0;
3754
+ z-index: 1030;
3755
+ margin-bottom: 0;
3756
+}
3757
+
3758
+.navbar-fixed-top .navbar-inner,
3759
+.navbar-fixed-bottom .navbar-inner {
3760
+ padding-right: 0;
3761
+ padding-left: 0;
3762
+ -webkit-border-radius: 0;
3763
+ -moz-border-radius: 0;
3764
+ border-radius: 0;
3765
+}
3766
+
3767
+.navbar-fixed-top .container,
3768
+.navbar-fixed-bottom .container {
3769
+ width: 940px;
3770
+}
3771
+
3772
+.navbar-fixed-top {
3773
+ top: 0;
3774
+}
3775
+
3776
+.navbar-fixed-bottom {
3777
+ bottom: 0;
3778
+}
3779
+
3780
+.navbar .nav {
3781
+ position: relative;
3782
+ left: 0;
3783
+ display: block;
3784
+ float: left;
3785
+ margin: 0 10px 0 0;
3786
+}
3787
+
3788
+.navbar .nav.pull-right {
3789
+ float: right;
3790
+}
3791
+
3792
+.navbar .nav > li {
3793
+ display: block;
3794
+ float: left;
3795
+}
3796
+
3797
+.navbar .nav > li > a {
3798
+ float: none;
3799
+ padding: 9px 10px 11px;
3800
+ line-height: 19px;
3801
+ color: #999999;
3802
+ text-decoration: none;
3803
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
3804
+}
3805
+
3806
+.navbar .btn {
3807
+ display: inline-block;
3808
+ padding: 4px 10px 4px;
3809
+ margin: 5px 5px 6px;
3810
+ line-height: 18px;
3811
+}
3812
+
3813
+.navbar .btn-group {
3814
+ padding: 5px 5px 6px;
3815
+ margin: 0;
3816
+}
3817
+
3818
+.navbar .nav > li > a:hover {
3819
+ color: #ffffff;
3820
+ text-decoration: none;
3821
+ background-color: transparent;
3822
+}
3823
+
3824
+.navbar .nav .active > a,
3825
+.navbar .nav .active > a:hover {
3826
+ color: #ffffff;
3827
+ text-decoration: none;
3828
+ background-color: #222222;
3829
+}
3830
+
3831
+.navbar .divider-vertical {
3832
+ width: 1px;
3833
+ height: 40px;
3834
+ margin: 0 9px;
3835
+ overflow: hidden;
3836
+ background-color: #222222;
3837
+ border-right: 1px solid #2a2a2a;
3838
+}
3839
+
3840
+.navbar .nav.pull-right {
3841
+ margin-right: 0;
3842
+ margin-left: 10px;
3843
+}
3844
+
3845
+.navbar .btn-navbar {
3846
+ display: none;
3847
+ float: right;
3848
+ padding: 7px 10px;
3849
+ margin-right: 5px;
3850
+ margin-left: 5px;
3851
+ background-color: #272727;
3852
+ *background-color: #222222;
3853
+ background-image: -ms-linear-gradient(top, #2a2a2a, #222222);
3854
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#2a2a2a), to(#222222));
3855
+ background-image: -webkit-linear-gradient(top, #2a2a2a, #222222);
3856
+ background-image: -o-linear-gradient(top, #2a2a2a, #222222);
3857
+ background-image: linear-gradient(top, #2a2a2a, #222222);
3858
+ background-image: -moz-linear-gradient(top, #2a2a2a, #222222);
3859
+ background-repeat: repeat-x;
3860
+ border-color: #222222 #222222 #000000;
3861
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3862
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#2a2a2a', endColorstr='#222222', GradientType=0);
3863
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
3864
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
3865
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
3866
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
3867
+}
3868
+
3869
+.navbar .btn-navbar:hover,
3870
+.navbar .btn-navbar:active,
3871
+.navbar .btn-navbar.active,
3872
+.navbar .btn-navbar.disabled,
3873
+.navbar .btn-navbar[disabled] {
3874
+ background-color: #222222;
3875
+ *background-color: #151515;
3876
+}
3877
+
3878
+.navbar .btn-navbar:active,
3879
+.navbar .btn-navbar.active {
3880
+ background-color: #080808 \9;
3881
+}
3882
+
3883
+.navbar .btn-navbar .icon-bar {
3884
+ display: block;
3885
+ width: 18px;
3886
+ height: 2px;
3887
+ background-color: #f5f5f5;
3888
+ -webkit-border-radius: 1px;
3889
+ -moz-border-radius: 1px;
3890
+ border-radius: 1px;
3891
+ -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
3892
+ -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
3893
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
3894
+}
3895
+
3896
+.btn-navbar .icon-bar + .icon-bar {
3897
+ margin-top: 3px;
3898
+}
3899
+
3900
+.navbar .dropdown-menu:before {
3901
+ position: absolute;
3902
+ top: -7px;
3903
+ left: 9px;
3904
+ display: inline-block;
3905
+ border-right: 7px solid transparent;
3906
+ border-bottom: 7px solid #ccc;
3907
+ border-left: 7px solid transparent;
3908
+ border-bottom-color: rgba(0, 0, 0, 0.2);
3909
+ content: '';
3910
+}
3911
+
3912
+.navbar .dropdown-menu:after {
3913
+ position: absolute;
3914
+ top: -6px;
3915
+ left: 10px;
3916
+ display: inline-block;
3917
+ border-right: 6px solid transparent;
3918
+ border-bottom: 6px solid #ffffff;
3919
+ border-left: 6px solid transparent;
3920
+ content: '';
3921
+}
3922
+
3923
+.navbar-fixed-bottom .dropdown-menu:before {
3924
+ top: auto;
3925
+ bottom: -7px;
3926
+ border-top: 7px solid #ccc;
3927
+ border-bottom: 0;
3928
+ border-top-color: rgba(0, 0, 0, 0.2);
3929
+}
3930
+
3931
+.navbar-fixed-bottom .dropdown-menu:after {
3932
+ top: auto;
3933
+ bottom: -6px;
3934
+ border-top: 6px solid #ffffff;
3935
+ border-bottom: 0;
3936
+}
3937
+
3938
+.navbar .nav li.dropdown .dropdown-toggle .caret,
3939
+.navbar .nav li.dropdown.open .caret {
3940
+ border-top-color: #ffffff;
3941
+ border-bottom-color: #ffffff;
3942
+}
3943
+
3944
+.navbar .nav li.dropdown.active .caret {
3945
+ opacity: 1;
3946
+ filter: alpha(opacity=100);
3947
+}
3948
+
3949
+.navbar .nav li.dropdown.open > .dropdown-toggle,
3950
+.navbar .nav li.dropdown.active > .dropdown-toggle,
3951
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
3952
+ background-color: transparent;
3953
+}
3954
+
3955
+.navbar .nav li.dropdown.active > .dropdown-toggle:hover {
3956
+ color: #ffffff;
3957
+}
3958
+
3959
+.navbar .pull-right .dropdown-menu,
3960
+.navbar .dropdown-menu.pull-right {
3961
+ right: 0;
3962
+ left: auto;
3963
+}
3964
+
3965
+.navbar .pull-right .dropdown-menu:before,
3966
+.navbar .dropdown-menu.pull-right:before {
3967
+ right: 12px;
3968
+ left: auto;
3969
+}
3970
+
3971
+.navbar .pull-right .dropdown-menu:after,
3972
+.navbar .dropdown-menu.pull-right:after {
3973
+ right: 13px;
3974
+ left: auto;
3975
+}
3976
+
3977
+.breadcrumb {
3978
+ padding: 7px 14px;
3979
+ margin: 0 0 18px;
3980
+ list-style: none;
3981
+ background-color: #fbfbfb;
3982
+ background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
3983
+ background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
3984
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));
3985
+ background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
3986
+ background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
3987
+ background-image: linear-gradient(top, #ffffff, #f5f5f5);
3988
+ background-repeat: repeat-x;
3989
+ border: 1px solid #ddd;
3990
+ -webkit-border-radius: 3px;
3991
+ -moz-border-radius: 3px;
3992
+ border-radius: 3px;
3993
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
3994
+ -webkit-box-shadow: inset 0 1px 0 #ffffff;
3995
+ -moz-box-shadow: inset 0 1px 0 #ffffff;
3996
+ box-shadow: inset 0 1px 0 #ffffff;
3997
+}
3998
+
3999
+.breadcrumb li {
4000
+ display: inline-block;
4001
+ *display: inline;
4002
+ text-shadow: 0 1px 0 #ffffff;
4003
+ *zoom: 1;
4004
+}
4005
+
4006
+.breadcrumb .divider {
4007
+ padding: 0 5px;
4008
+ color: #999999;
4009
+}
4010
+
4011
+.breadcrumb .active a {
4012
+ color: #333333;
4013
+}
4014
+
4015
+.pagination {
4016
+ height: 36px;
4017
+ margin: 18px 0;
4018
+}
4019
+
4020
+.pagination ul {
4021
+ display: inline-block;
4022
+ *display: inline;
4023
+ margin-bottom: 0;
4024
+ margin-left: 0;
4025
+ -webkit-border-radius: 3px;
4026
+ -moz-border-radius: 3px;
4027
+ border-radius: 3px;
4028
+ *zoom: 1;
4029
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
4030
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
4031
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
4032
+}
4033
+
4034
+.pagination li {
4035
+ display: inline;
4036
+}
4037
+
4038
+.pagination a {
4039
+ float: left;
4040
+ padding: 0 14px;
4041
+ line-height: 34px;
4042
+ text-decoration: none;
4043
+ border: 1px solid #ddd;
4044
+ border-left-width: 0;
4045
+}
4046
+
4047
+.pagination a:hover,
4048
+.pagination .active a {
4049
+ background-color: #f5f5f5;
4050
+}
4051
+
4052
+.pagination .active a {
4053
+ color: #999999;
4054
+ cursor: default;
4055
+}
4056
+
4057
+.pagination .disabled span,
4058
+.pagination .disabled a,
4059
+.pagination .disabled a:hover {
4060
+ color: #999999;
4061
+ cursor: default;
4062
+ background-color: transparent;
4063
+}
4064
+
4065
+.pagination li:first-child a {
4066
+ border-left-width: 1px;
4067
+ -webkit-border-radius: 3px 0 0 3px;
4068
+ -moz-border-radius: 3px 0 0 3px;
4069
+ border-radius: 3px 0 0 3px;
4070
+}
4071
+
4072
+.pagination li:last-child a {
4073
+ -webkit-border-radius: 0 3px 3px 0;
4074
+ -moz-border-radius: 0 3px 3px 0;
4075
+ border-radius: 0 3px 3px 0;
4076
+}
4077
+
4078
+.pagination-centered {
4079
+ text-align: center;
4080
+}
4081
+
4082
+.pagination-right {
4083
+ text-align: right;
4084
+}
4085
+
4086
+.pager {
4087
+ margin-bottom: 18px;
4088
+ margin-left: 0;
4089
+ text-align: center;
4090
+ list-style: none;
4091
+ *zoom: 1;
4092
+}
4093
+
4094
+.pager:before,
4095
+.pager:after {
4096
+ display: table;
4097
+ content: "";
4098
+}
4099
+
4100
+.pager:after {
4101
+ clear: both;
4102
+}
4103
+
4104
+.pager li {
4105
+ display: inline;
4106
+}
4107
+
4108
+.pager a {
4109
+ display: inline-block;
4110
+ padding: 5px 14px;
4111
+ background-color: #fff;
4112
+ border: 1px solid #ddd;
4113
+ -webkit-border-radius: 15px;
4114
+ -moz-border-radius: 15px;
4115
+ border-radius: 15px;
4116
+}
4117
+
4118
+.pager a:hover {
4119
+ text-decoration: none;
4120
+ background-color: #f5f5f5;
4121
+}
4122
+
4123
+.pager .next a {
4124
+ float: right;
4125
+}
4126
+
4127
+.pager .previous a {
4128
+ float: left;
4129
+}
4130
+
4131
+.pager .disabled a,
4132
+.pager .disabled a:hover {
4133
+ color: #999999;
4134
+ cursor: default;
4135
+ background-color: #fff;
4136
+}
4137
+
4138
+.modal-open .dropdown-menu {
4139
+ z-index: 2050;
4140
+}
4141
+
4142
+.modal-open .dropdown.open {
4143
+ *z-index: 2050;
4144
+}
4145
+
4146
+.modal-open .popover {
4147
+ z-index: 2060;
4148
+}
4149
+
4150
+.modal-open .tooltip {
4151
+ z-index: 2070;
4152
+}
4153
+
4154
+.modal-backdrop {
4155
+ position: fixed;
4156
+ top: 0;
4157
+ right: 0;
4158
+ bottom: 0;
4159
+ left: 0;
4160
+ z-index: 1040;
4161
+ background-color: #000000;
4162
+}
4163
+
4164
+.modal-backdrop.fade {
4165
+ opacity: 0;
4166
+}
4167
+
4168
+.modal-backdrop,
4169
+.modal-backdrop.fade.in {
4170
+ opacity: 0.8;
4171
+ filter: alpha(opacity=80);
4172
+}
4173
+
4174
+.modal {
4175
+ position: fixed;
4176
+ top: 50%;
4177
+ left: 50%;
4178
+ z-index: 1050;
4179
+ width: 560px;
4180
+ margin: -250px 0 0 -280px;
4181
+ overflow: auto;
4182
+ background-color: #ffffff;
4183
+ border: 1px solid #999;
4184
+ border: 1px solid rgba(0, 0, 0, 0.3);
4185
+ *border: 1px solid #999;
4186
+ -webkit-border-radius: 3px;
4187
+ -moz-border-radius: 3px;
4188
+ border-radius: 3px;
4189
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
4190
+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
4191
+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
4192
+ -webkit-background-clip: padding-box;
4193
+ -moz-background-clip: padding-box;
4194
+ background-clip: padding-box;
4195
+}
4196
+
4197
+.modal.fade {
4198
+ top: -25%;
4199
+ -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
4200
+ -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
4201
+ -ms-transition: opacity 0.3s linear, top 0.3s ease-out;
4202
+ -o-transition: opacity 0.3s linear, top 0.3s ease-out;
4203
+ transition: opacity 0.3s linear, top 0.3s ease-out;
4204
+}
4205
+
4206
+.modal.fade.in {
4207
+ top: 50%;
4208
+}
4209
+
4210
+.modal-header {
4211
+ padding: 9px 15px;
4212
+ border-bottom: 1px solid #f0f0f0;
4213
+}
4214
+
4215
+.modal-header .close {
4216
+ margin-top: 2px;
4217
+}
4218
+
4219
+.modal-body {
4220
+ max-height: 400px;
4221
+ padding: 15px;
4222
+ overflow-y: auto;
4223
+}
4224
+
4225
+.modal-form {
4226
+ margin-bottom: 0;
4227
+}
4228
+
4229
+.modal-footer {
4230
+ padding: 14px 15px 15px;
4231
+ margin-bottom: 0;
4232
+ text-align: right;
4233
+ background-color: #f4f4f4;
4234
+ border-top: 1px solid #ddd;
4235
+ -webkit-border-radius: 0 0 3px 3px;
4236
+ -moz-border-radius: 0 0 3px 3px;
4237
+ border-radius: 0 0 3px 3px;
4238
+ *zoom: 1;
4239
+}
4240
+
4241
+.modal-footer:before,
4242
+.modal-footer:after {
4243
+ display: table;
4244
+ content: "";
4245
+}
4246
+
4247
+.modal-footer:after {
4248
+ clear: both;
4249
+}
4250
+
4251
+.modal-footer .btn + .btn {
4252
+ margin-bottom: 0;
4253
+ margin-left: 5px;
4254
+}
4255
+
4256
+.modal-footer .btn-group .btn + .btn {
4257
+ margin-left: -1px;
4258
+}
4259
+
4260
+.tooltip {
4261
+ position: absolute;
4262
+ z-index: 1020;
4263
+ display: block;
4264
+ padding: 5px;
4265
+ font-size: 11px;
4266
+ opacity: 0;
4267
+ filter: alpha(opacity=0);
4268
+ visibility: visible;
4269
+}
4270
+
4271
+.tooltip.in {
4272
+ opacity: 0.8;
4273
+ filter: alpha(opacity=80);
4274
+}
4275
+
4276
+.tooltip.top {
4277
+ margin-top: -2px;
4278
+}
4279
+
4280
+.tooltip.right {
4281
+ margin-left: 2px;
4282
+}
4283
+
4284
+.tooltip.bottom {
4285
+ margin-top: 2px;
4286
+}
4287
+
4288
+.tooltip.left {
4289
+ margin-left: -2px;
4290
+}
4291
+
4292
+.tooltip.top .tooltip-arrow {
4293
+ bottom: 0;
4294
+ left: 50%;
4295
+ margin-left: -5px;
4296
+ border-top: 5px solid #000000;
4297
+ border-right: 5px solid transparent;
4298
+ border-left: 5px solid transparent;
4299
+}
4300
+
4301
+.tooltip.left .tooltip-arrow {
4302
+ top: 50%;
4303
+ right: 0;
4304
+ margin-top: -5px;
4305
+ border-top: 5px solid transparent;
4306
+ border-bottom: 5px solid transparent;
4307
+ border-left: 5px solid #000000;
4308
+}
4309
+
4310
+.tooltip.bottom .tooltip-arrow {
4311
+ top: 0;
4312
+ left: 50%;
4313
+ margin-left: -5px;
4314
+ border-right: 5px solid transparent;
4315
+ border-bottom: 5px solid #000000;
4316
+ border-left: 5px solid transparent;
4317
+}
4318
+
4319
+.tooltip.right .tooltip-arrow {
4320
+ top: 50%;
4321
+ left: 0;
4322
+ margin-top: -5px;
4323
+ border-top: 5px solid transparent;
4324
+ border-right: 5px solid #000000;
4325
+ border-bottom: 5px solid transparent;
4326
+}
4327
+
4328
+.tooltip-inner {
4329
+ max-width: 200px;
4330
+ padding: 3px 8px;
4331
+ color: #ffffff;
4332
+ text-align: center;
4333
+ text-decoration: none;
4334
+ background-color: #000000;
4335
+ -webkit-border-radius: 0;
4336
+ -moz-border-radius: 0;
4337
+ border-radius: 0;
4338
+}
4339
+
4340
+.tooltip-arrow {
4341
+ position: absolute;
4342
+ width: 0;
4343
+ height: 0;
4344
+}
4345
+
4346
+.popover {
4347
+ position: absolute;
4348
+ top: 0;
4349
+ left: 0;
4350
+ z-index: 1010;
4351
+ display: none;
4352
+ padding: 5px;
4353
+}
4354
+
4355
+.popover.top {
4356
+ margin-top: -5px;
4357
+}
4358
+
4359
+.popover.right {
4360
+ margin-left: 5px;
4361
+}
4362
+
4363
+.popover.bottom {
4364
+ margin-top: 5px;
4365
+}
4366
+
4367
+.popover.left {
4368
+ margin-left: -5px;
4369
+}
4370
+
4371
+.popover.top .arrow {
4372
+ bottom: 0;
4373
+ left: 50%;
4374
+ margin-left: -5px;
4375
+ border-top: 5px solid #000000;
4376
+ border-right: 5px solid transparent;
4377
+ border-left: 5px solid transparent;
4378
+}
4379
+
4380
+.popover.right .arrow {
4381
+ top: 50%;
4382
+ left: 0;
4383
+ margin-top: -5px;
4384
+ border-top: 5px solid transparent;
4385
+ border-right: 5px solid #000000;
4386
+ border-bottom: 5px solid transparent;
4387
+}
4388
+
4389
+.popover.bottom .arrow {
4390
+ top: 0;
4391
+ left: 50%;
4392
+ margin-left: -5px;
4393
+ border-right: 5px solid transparent;
4394
+ border-bottom: 5px solid #000000;
4395
+ border-left: 5px solid transparent;
4396
+}
4397
+
4398
+.popover.left .arrow {
4399
+ top: 50%;
4400
+ right: 0;
4401
+ margin-top: -5px;
4402
+ border-top: 5px solid transparent;
4403
+ border-bottom: 5px solid transparent;
4404
+ border-left: 5px solid #000000;
4405
+}
4406
+
4407
+.popover .arrow {
4408
+ position: absolute;
4409
+ width: 0;
4410
+ height: 0;
4411
+ opacity: 0.5;
4412
+}
4413
+
4414
+.popover-inner {
4415
+ width: 400px;
4416
+ padding: 6px;
4417
+ overflow: hidden;
4418
+ background: #000000;
4419
+ background: rgba(0, 0, 0, 0.5);
4420
+ -webkit-border-radius: 6px;
4421
+ -moz-border-radius: 6px;
4422
+ border-radius: 6px;
4423
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
4424
+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
4425
+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
4426
+}
4427
+
4428
+.popover-title {
4429
+ padding: 9px 15px;
4430
+ line-height: 1;
4431
+ background-color: #f5f5f5;
4432
+ -webkit-border-radius: 3px 3px 0 0;
4433
+ -moz-border-radius: 3px 3px 0 0;
4434
+ border-radius: 3px 3px 0 0;
4435
+}
4436
+
4437
+.popover-content {
4438
+ padding: 14px;
4439
+ background-color: #ffffff;
4440
+ -webkit-border-radius: 0 0 3px 3px;
4441
+ -moz-border-radius: 0 0 3px 3px;
4442
+ border-radius: 0 0 3px 3px;
4443
+ -webkit-background-clip: padding-box;
4444
+ -moz-background-clip: padding-box;
4445
+ background-clip: padding-box;
4446
+}
4447
+
4448
+.popover-content p,
4449
+.popover-content ul,
4450
+.popover-content ol {
4451
+ margin-bottom: 0;
4452
+}
4453
+
4454
+.thumbnails {
4455
+ margin-left: -20px;
4456
+ list-style: none;
4457
+ *zoom: 1;
4458
+}
4459
+
4460
+.thumbnails:before,
4461
+.thumbnails:after {
4462
+ display: table;
4463
+ content: "";
4464
+}
4465
+
4466
+.thumbnails:after {
4467
+ clear: both;
4468
+}
4469
+
4470
+.row-fluid .thumbnails {
4471
+ margin-left: 0;
4472
+}
4473
+
4474
+.thumbnails > li {
4475
+ float: left;
4476
+ margin-bottom: 18px;
4477
+ margin-left: 20px;
4478
+}
4479
+
4480
+.thumbnail {
4481
+ display: block;
4482
+ padding: 4px;
4483
+ line-height: 1;
4484
+ border: 1px solid #ddd;
4485
+ -webkit-border-radius: 2px;
4486
+ -moz-border-radius: 2px;
4487
+ border-radius: 2px;
4488
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
4489
+ -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
4490
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
4491
+}
4492
+
4493
+a.thumbnail:hover {
4494
+ border-color: #5b74a8;
4495
+ -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
4496
+ -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
4497
+ box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
4498
+}
4499
+
4500
+.thumbnail > img {
4501
+ display: block;
4502
+ max-width: 100%;
4503
+ margin-right: auto;
4504
+ margin-left: auto;
4505
+}
4506
+
4507
+.thumbnail .caption {
4508
+ padding: 9px;
4509
+}
4510
+
4511
+.label,
4512
+.badge {
4513
+ font-size: 10.998px;
4514
+ font-weight: bold;
4515
+ line-height: 14px;
4516
+ color: #ffffff;
4517
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
4518
+ white-space: nowrap;
4519
+ vertical-align: baseline;
4520
+ background-color: #999999;
4521
+}
4522
+
4523
+.label {
4524
+ padding: 1px 4px 2px;
4525
+ -webkit-border-radius: 3px;
4526
+ -moz-border-radius: 3px;
4527
+ border-radius: 3px;
4528
+}
4529
+
4530
+.badge {
4531
+ padding: 1px 9px 2px;
4532
+ -webkit-border-radius: 9px;
4533
+ -moz-border-radius: 9px;
4534
+ border-radius: 9px;
4535
+}
4536
+
4537
+a.label:hover,
4538
+a.badge:hover {
4539
+ color: #ffffff;
4540
+ text-decoration: none;
4541
+ cursor: pointer;
4542
+}
4543
+
4544
+.label-important,
4545
+.badge-important {
4546
+ background-color: #b94a48;
4547
+}
4548
+
4549
+.label-important[href],
4550
+.badge-important[href] {
4551
+ background-color: #953b39;
4552
+}
4553
+
4554
+.label-warning,
4555
+.badge-warning {
4556
+ background-color: #f89406;
4557
+}
4558
+
4559
+.label-warning[href],
4560
+.badge-warning[href] {
4561
+ background-color: #c67605;
4562
+}
4563
+
4564
+.label-success,
4565
+.badge-success {
4566
+ background-color: #468847;
4567
+}
4568
+
4569
+.label-success[href],
4570
+.badge-success[href] {
4571
+ background-color: #356635;
4572
+}
4573
+
4574
+.label-info,
4575
+.badge-info {
4576
+ background-color: #3a87ad;
4577
+}
4578
+
4579
+.label-info[href],
4580
+.badge-info[href] {
4581
+ background-color: #2d6987;
4582
+}
4583
+
4584
+.label-inverse,
4585
+.badge-inverse {
4586
+ background-color: #333333;
4587
+}
4588
+
4589
+.label-inverse[href],
4590
+.badge-inverse[href] {
4591
+ background-color: #1a1a1a;
4592
+}
4593
+
4594
+@-webkit-keyframes progress-bar-stripes {
4595
+ from {
4596
+ background-position: 40px 0;
4597
+ }
4598
+ to {
4599
+ background-position: 0 0;
4600
+ }
4601
+}
4602
+
4603
+@-moz-keyframes progress-bar-stripes {
4604
+ from {
4605
+ background-position: 40px 0;
4606
+ }
4607
+ to {
4608
+ background-position: 0 0;
4609
+ }
4610
+}
4611
+
4612
+@-ms-keyframes progress-bar-stripes {
4613
+ from {
4614
+ background-position: 40px 0;
4615
+ }
4616
+ to {
4617
+ background-position: 0 0;
4618
+ }
4619
+}
4620
+
4621
+@-o-keyframes progress-bar-stripes {
4622
+ from {
4623
+ background-position: 0 0;
4624
+ }
4625
+ to {
4626
+ background-position: 40px 0;
4627
+ }
4628
+}
4629
+
4630
+@keyframes progress-bar-stripes {
4631
+ from {
4632
+ background-position: 40px 0;
4633
+ }
4634
+ to {
4635
+ background-position: 0 0;
4636
+ }
4637
+}
4638
+
4639
+.progress {
4640
+ height: 18px;
4641
+ margin-bottom: 18px;
4642
+ overflow: hidden;
4643
+ background-color: #f7f7f7;
4644
+ background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
4645
+ background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9);
4646
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
4647
+ background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
4648
+ background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
4649
+ background-image: linear-gradient(top, #f5f5f5, #f9f9f9);
4650
+ background-repeat: repeat-x;
4651
+ -webkit-border-radius: 4px;
4652
+ -moz-border-radius: 4px;
4653
+ border-radius: 4px;
4654
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);
4655
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
4656
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
4657
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
4658
+}
4659
+
4660
+.progress .bar {
4661
+ width: 0;
4662
+ height: 18px;
4663
+ font-size: 12px;
4664
+ color: #ffffff;
4665
+ text-align: center;
4666
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
4667
+ background-color: #0e90d2;
4668
+ background-image: -moz-linear-gradient(top, #149bdf, #0480be);
4669
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
4670
+ background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
4671
+ background-image: -o-linear-gradient(top, #149bdf, #0480be);
4672
+ background-image: linear-gradient(top, #149bdf, #0480be);
4673
+ background-image: -ms-linear-gradient(top, #149bdf, #0480be);
4674
+ background-repeat: repeat-x;
4675
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);
4676
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
4677
+ -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
4678
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
4679
+ -webkit-box-sizing: border-box;
4680
+ -moz-box-sizing: border-box;
4681
+ -ms-box-sizing: border-box;
4682
+ box-sizing: border-box;
4683
+ -webkit-transition: width 0.6s ease;
4684
+ -moz-transition: width 0.6s ease;
4685
+ -ms-transition: width 0.6s ease;
4686
+ -o-transition: width 0.6s ease;
4687
+ transition: width 0.6s ease;
4688
+}
4689
+
4690
+.progress-striped .bar {
4691
+ background-color: #149bdf;
4692
+ 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);
4693
+ 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);
4694
+ background-image: -moz-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);
4695
+ background-image: -ms-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);
4696
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
4697
+ 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);
4698
+ -webkit-background-size: 40px 40px;
4699
+ -moz-background-size: 40px 40px;
4700
+ -o-background-size: 40px 40px;
4701
+ background-size: 40px 40px;
4702
+}
4703
+
4704
+.progress.active .bar {
4705
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
4706
+ -moz-animation: progress-bar-stripes 2s linear infinite;
4707
+ -ms-animation: progress-bar-stripes 2s linear infinite;
4708
+ -o-animation: progress-bar-stripes 2s linear infinite;
4709
+ animation: progress-bar-stripes 2s linear infinite;
4710
+}
4711
+
4712
+.progress-danger .bar {
4713
+ background-color: #dd514c;
4714
+ background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
4715
+ background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
4716
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
4717
+ background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
4718
+ background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
4719
+ background-image: linear-gradient(top, #ee5f5b, #c43c35);
4720
+ background-repeat: repeat-x;
4721
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
4722
+}
4723
+
4724
+.progress-danger.progress-striped .bar {
4725
+ background-color: #ee5f5b;
4726
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
4727
+ 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);
4728
+ background-image: -moz-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);
4729
+ background-image: -ms-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);
4730
+ 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);
4731
+ 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);
4732
+}
4733
+
4734
+.progress-success .bar {
4735
+ background-color: #5eb95e;
4736
+ background-image: -moz-linear-gradient(top, #62c462, #57a957);
4737
+ background-image: -ms-linear-gradient(top, #62c462, #57a957);
4738
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
4739
+ background-image: -webkit-linear-gradient(top, #62c462, #57a957);
4740
+ background-image: -o-linear-gradient(top, #62c462, #57a957);
4741
+ background-image: linear-gradient(top, #62c462, #57a957);
4742
+ background-repeat: repeat-x;
4743
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
4744
+}
4745
+
4746
+.progress-success.progress-striped .bar {
4747
+ background-color: #62c462;
4748
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
4749
+ 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);
4750
+ background-image: -moz-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);
4751
+ background-image: -ms-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);
4752
+ 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);
4753
+ 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);
4754
+}
4755
+
4756
+.progress-info .bar {
4757
+ background-color: #4bb1cf;
4758
+ background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
4759
+ background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
4760
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
4761
+ background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
4762
+ background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
4763
+ background-image: linear-gradient(top, #5bc0de, #339bb9);
4764
+ background-repeat: repeat-x;
4765
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
4766
+}
4767
+
4768
+.progress-info.progress-striped .bar {
4769
+ background-color: #5bc0de;
4770
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
4771
+ 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);
4772
+ background-image: -moz-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);
4773
+ background-image: -ms-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);
4774
+ 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);
4775
+ 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);
4776
+}
4777
+
4778
+.progress-warning .bar {
4779
+ background-color: #faa732;
4780
+ background-image: -moz-linear-gradient(top, #fbb450, #f89406);
4781
+ background-image: -ms-linear-gradient(top, #fbb450, #f89406);
4782
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
4783
+ background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
4784
+ background-image: -o-linear-gradient(top, #fbb450, #f89406);
4785
+ background-image: linear-gradient(top, #fbb450, #f89406);
4786
+ background-repeat: repeat-x;
4787
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
4788
+}
4789
+
4790
+.progress-warning.progress-striped .bar {
4791
+ background-color: #fbb450;
4792
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
4793
+ 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);
4794
+ background-image: -moz-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);
4795
+ background-image: -ms-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);
4796
+ 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);
4797
+ 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);
4798
+}
4799
+
4800
+.accordion {
4801
+ margin-bottom: 18px;
4802
+}
4803
+
4804
+.accordion-group {
4805
+ margin-bottom: 2px;
4806
+ border: 1px solid #e5e5e5;
4807
+ -webkit-border-radius: 4px;
4808
+ -moz-border-radius: 4px;
4809
+ border-radius: 4px;
4810
+}
4811
+
4812
+.accordion-heading {
4813
+ border-bottom: 0;
4814
+}
4815
+
4816
+.accordion-heading .accordion-toggle {
4817
+ display: block;
4818
+ padding: 8px 15px;
4819
+}
4820
+
4821
+.accordion-toggle {
4822
+ cursor: pointer;
4823
+}
4824
+
4825
+.accordion-inner {
4826
+ padding: 9px 15px;
4827
+ border-top: 1px solid #e5e5e5;
4828
+}
4829
+
4830
+.carousel {
4831
+ position: relative;
4832
+ margin-bottom: 18px;
4833
+ line-height: 1;
4834
+}
4835
+
4836
+.carousel-inner {
4837
+ position: relative;
4838
+ width: 100%;
4839
+ overflow: hidden;
4840
+}
4841
+
4842
+.carousel .item {
4843
+ position: relative;
4844
+ display: none;
4845
+ -webkit-transition: 0.6s ease-in-out left;
4846
+ -moz-transition: 0.6s ease-in-out left;
4847
+ -ms-transition: 0.6s ease-in-out left;
4848
+ -o-transition: 0.6s ease-in-out left;
4849
+ transition: 0.6s ease-in-out left;
4850
+}
4851
+
4852
+.carousel .item > img {
4853
+ display: block;
4854
+ line-height: 1;
4855
+}
4856
+
4857
+.carousel .active,
4858
+.carousel .next,
4859
+.carousel .prev {
4860
+ display: block;
4861
+}
4862
+
4863
+.carousel .active {
4864
+ left: 0;
4865
+}
4866
+
4867
+.carousel .next,
4868
+.carousel .prev {
4869
+ position: absolute;
4870
+ top: 0;
4871
+ width: 100%;
4872
+}
4873
+
4874
+.carousel .next {
4875
+ left: 100%;
4876
+}
4877
+
4878
+.carousel .prev {
4879
+ left: -100%;
4880
+}
4881
+
4882
+.carousel .next.left,
4883
+.carousel .prev.right {
4884
+ left: 0;
4885
+}
4886
+
4887
+.carousel .active.left {
4888
+ left: -100%;
4889
+}
4890
+
4891
+.carousel .active.right {
4892
+ left: 100%;
4893
+}
4894
+
4895
+.carousel-control {
4896
+ position: absolute;
4897
+ top: 40%;
4898
+ left: 15px;
4899
+ width: 40px;
4900
+ height: 40px;
4901
+ margin-top: -20px;
4902
+ font-size: 60px;
4903
+ font-weight: 100;
4904
+ line-height: 30px;
4905
+ color: #ffffff;
4906
+ text-align: center;
4907
+ background: #222222;
4908
+ border: 3px solid #ffffff;
4909
+ -webkit-border-radius: 23px;
4910
+ -moz-border-radius: 23px;
4911
+ border-radius: 23px;
4912
+ opacity: 0.5;
4913
+ filter: alpha(opacity=50);
4914
+}
4915
+
4916
+.carousel-control.right {
4917
+ right: 15px;
4918
+ left: auto;
4919
+}
4920
+
4921
+.carousel-control:hover {
4922
+ color: #ffffff;
4923
+ text-decoration: none;
4924
+ opacity: 0.9;
4925
+ filter: alpha(opacity=90);
4926
+}
4927
+
4928
+.carousel-caption {
4929
+ position: absolute;
4930
+ right: 0;
4931
+ bottom: 0;
4932
+ left: 0;
4933
+ padding: 10px 15px 5px;
4934
+ background: #333333;
4935
+ background: rgba(0, 0, 0, 0.2);
4936
+}
4937
+
4938
+.carousel-caption h4,
4939
+.carousel-caption p {
4940
+ color: #ffffff;
4941
+}
4942
+
4943
+.hero-unit {
4944
+ padding: 60px;
4945
+ margin-bottom: 30px;
4946
+ background-color: #eeeeee;
4947
+ -webkit-border-radius: 6px;
4948
+ -moz-border-radius: 6px;
4949
+ border-radius: 6px;
4950
+}
4951
+
4952
+.hero-unit h1 {
4953
+ margin-bottom: 0;
4954
+ font-size: 60px;
4955
+ line-height: 1;
4956
+ letter-spacing: -1px;
4957
+ color: inherit;
4958
+}
4959
+
4960
+.hero-unit p {
4961
+ font-size: 18px;
4962
+ font-weight: 200;
4963
+ line-height: 27px;
4964
+ color: inherit;
4965
+}
4966
+
4967
+.pull-right {
4968
+ float: right;
4969
+}
4970
+
4971
+.pull-left {
4972
+ float: left;
4973
+}
4974
+
4975
+.hide {
4976
+ display: none;
4977
+}
4978
+
4979
+.show {
4980
+ display: block;
4981
+}
4982
+
4983
+.invisible {
4984
+ visibility: hidden;
4985
+}
docs/docs/likebutton/docs/assets/css/docs.css
new
+846
@@ -0,0 +1,846 @@
1
+/* Add additional stylesheets below
2
+-------------------------------------------------- */
3
+/*
4
+ Bootstrap's documentation styles
5
+ Special styles for presenting Bootstrap's documentation and examples
6
+*/
7
+
8
+
9
+/* Body and structure
10
+-------------------------------------------------- */
11
+body {
12
+ position: relative;
13
+ padding-top: 90px;
14
+ background-color: #fff;
15
+ background-image: url(../img/grid-18px-masked.png);
16
+ background-repeat: repeat-x;
17
+ background-position: 0 40px;
18
+}
19
+
20
+
21
+/* Tweak navbar brand link to be super sleek
22
+-------------------------------------------------- */
23
+.navbar-fixed-top .brand {
24
+ padding-right: 0;
25
+ padding-left: 0;
26
+ margin-left: 20px;
27
+ float: right;
28
+ font-weight: bold;
29
+ color: #000;
30
+ text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.125);
31
+ -webkit-transition: all .2s linear;
32
+ -moz-transition: all .2s linear;
33
+ transition: all .2s linear;
34
+}
35
+.navbar-fixed-top .brand:hover {
36
+ text-decoration: none;
37
+}
38
+
39
+
40
+/* Space out sub-sections more
41
+-------------------------------------------------- */
42
+section {
43
+ padding-top: 60px;
44
+}
45
+
46
+/* Faded out hr */
47
+hr.soften {
48
+ height: 1px;
49
+ margin: 54px 0;
50
+ background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));
51
+ background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));
52
+ background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));
53
+ background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));
54
+ border: 0;
55
+}
56
+
57
+
58
+/* Jumbotrons
59
+-------------------------------------------------- */
60
+.jumbotron {
61
+ position: relative;
62
+}
63
+.jumbotron h1 {
64
+ margin-bottom: 9px;
65
+ font-size: 81px;
66
+ font-weight: bold;
67
+ letter-spacing: -1px;
68
+ line-height: 1;
69
+}
70
+.jumbotron p {
71
+ margin-bottom: 18px;
72
+ font-weight: 300;
73
+}
74
+.jumbotron .btn-large {
75
+ font-size: 20px;
76
+ font-weight: normal;
77
+ padding: 14px 24px;
78
+ margin-right: 10px;
79
+ -webkit-border-radius: 6px;
80
+ -moz-border-radius: 6px;
81
+ border-radius: 6px;
82
+}
83
+.jumbotron .btn-large small {
84
+ font-size: 14px;
85
+}
86
+
87
+/* Masthead (docs home) */
88
+.masthead {
89
+ padding-top: 36px;
90
+ margin-bottom: 72px;
91
+}
92
+.masthead h1,
93
+.masthead p {
94
+ text-align: center;
95
+}
96
+.masthead h1 {
97
+ margin-bottom: 18px;
98
+}
99
+.masthead p {
100
+ margin-left: 5%;
101
+ margin-right: 5%;
102
+ font-size: 30px;
103
+ line-height: 36px;
104
+}
105
+
106
+
107
+/* Specific jumbotrons
108
+------------------------- */
109
+/* supporting docs pages */
110
+.subhead {
111
+ padding-bottom: 0;
112
+ margin-bottom: 9px;
113
+}
114
+.subhead h1 {
115
+ font-size: 54px;
116
+}
117
+
118
+/* Subnav */
119
+.subnav {
120
+ width: 100%;
121
+ height: 36px;
122
+ background-color: #eeeeee; /* Old browsers */
123
+ background-repeat: repeat-x; /* Repeat the gradient */
124
+ background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* FF3.6+ */
125
+ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#eeeeee)); /* Chrome,Safari4+ */
126
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Chrome 10+,Safari 5.1+ */
127
+ background-image: -ms-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* IE10+ */
128
+ background-image: -o-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Opera 11.10+ */
129
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); /* IE6-9 */
130
+ background-image: linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* W3C */
131
+ border: 1px solid #e5e5e5;
132
+ -webkit-border-radius: 4px;
133
+ -moz-border-radius: 4px;
134
+ border-radius: 4px;
135
+}
136
+.subnav .nav {
137
+ margin-bottom: 0;
138
+}
139
+.subnav .nav > li > a {
140
+ margin: 0;
141
+ padding-top: 11px;
142
+ padding-bottom: 11px;
143
+ border-left: 1px solid #f5f5f5;
144
+ border-right: 1px solid #e5e5e5;
145
+ -webkit-border-radius: 0;
146
+ -moz-border-radius: 0;
147
+ border-radius: 0;
148
+}
149
+.subnav .nav > .active > a,
150
+.subnav .nav > .active > a:hover {
151
+ padding-left: 13px;
152
+ color: #777;
153
+ background-color: #e9e9e9;
154
+ border-right-color: #ddd;
155
+ border-left: 0;
156
+ -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
157
+ -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
158
+ box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
159
+}
160
+.subnav .nav > .active > a .caret,
161
+.subnav .nav > .active > a:hover .caret {
162
+ border-top-color: #777;
163
+}
164
+.subnav .nav > li:first-child > a,
165
+.subnav .nav > li:first-child > a:hover {
166
+ border-left: 0;
167
+ padding-left: 12px;
168
+ -webkit-border-radius: 4px 0 0 4px;
169
+ -moz-border-radius: 4px 0 0 4px;
170
+ border-radius: 4px 0 0 4px;
171
+}
172
+.subnav .nav > li:last-child > a {
173
+ border-right: 0;
174
+}
175
+.subnav .dropdown-menu {
176
+ -webkit-border-radius: 0 0 4px 4px;
177
+ -moz-border-radius: 0 0 4px 4px;
178
+ border-radius: 0 0 4px 4px;
179
+}
180
+
181
+/* Fixed subnav on scroll, but only for 980px and up (sorry IE!) */
182
+@media (min-width: 980px) {
183
+ .subnav-fixed {
184
+ position: fixed;
185
+ top: 40px;
186
+ left: 0;
187
+ right: 0;
188
+ z-index: 1020; /* 10 less than .navbar-fixed to prevent any overlap */
189
+ border-color: #d5d5d5;
190
+ border-width: 0 0 1px; /* drop the border on the fixed edges */
191
+ -webkit-border-radius: 0;
192
+ -moz-border-radius: 0;
193
+ border-radius: 0;
194
+ -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1);
195
+ -moz-box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1);
196
+ box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1);
197
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); /* IE6-9 */
198
+ }
199
+ .subnav-fixed .nav {
200
+ width: 938px;
201
+ margin: 0 auto;
202
+ padding: 0 1px;
203
+ }
204
+ .subnav .nav > li:first-child > a,
205
+ .subnav .nav > li:first-child > a:hover {
206
+ -webkit-border-radius: 0;
207
+ -moz-border-radius: 0;
208
+ border-radius: 0;
209
+ }
210
+}
211
+
212
+
213
+/* Quick links
214
+-------------------------------------------------- */
215
+.bs-links {
216
+ margin: 36px 0;
217
+}
218
+.quick-links {
219
+ min-height: 30px;
220
+ margin: 0;
221
+ padding: 5px 20px;
222
+ list-style: none;
223
+ text-align: center;
224
+ overflow: hidden;
225
+}
226
+.quick-links:first-child {
227
+ min-height: 0;
228
+}
229
+.quick-links li {
230
+ display: inline;
231
+ margin: 0 8px;
232
+ color: #999;
233
+}
234
+.quick-links .github-btn,
235
+.quick-links .tweet-btn,
236
+.quick-links .follow-btn {
237
+ position: relative;
238
+ top: 5px;
239
+}
240
+
241
+
242
+/* Marketing section of Overview
243
+-------------------------------------------------- */
244
+.marketing .row {
245
+ margin-bottom: 9px;
246
+}
247
+.marketing h1 {
248
+ margin: 36px 0 27px;
249
+ font-size: 40px;
250
+ font-weight: 300;
251
+ text-align: center;
252
+}
253
+.marketing h2,
254
+.marketing h3 {
255
+ font-weight: 300;
256
+}
257
+.marketing h2 {
258
+ font-size: 22px;
259
+}
260
+.marketing p {
261
+ margin-right: 10px;
262
+}
263
+.marketing .bs-icon {
264
+ float: left;
265
+ margin: 7px 10px 0 0;
266
+ opacity: .8;
267
+}
268
+.marketing .small-bs-icon {
269
+ float: left;
270
+ margin: 4px 5px 0 0;
271
+}
272
+
273
+
274
+
275
+/* Footer
276
+-------------------------------------------------- */
277
+.footer {
278
+ margin-top: 45px;
279
+ padding: 35px 0 36px;
280
+ border-top: 1px solid #e5e5e5;
281
+}
282
+.footer p {
283
+ margin-bottom: 0;
284
+ color: #555;
285
+}
286
+
287
+
288
+
289
+/* Special grid styles
290
+-------------------------------------------------- */
291
+.show-grid {
292
+ margin-top: 10px;
293
+ margin-bottom: 20px;
294
+}
295
+.show-grid [class*="span"] {
296
+ background-color: #eee;
297
+ text-align: center;
298
+ -webkit-border-radius: 3px;
299
+ -moz-border-radius: 3px;
300
+ border-radius: 3px;
301
+ min-height: 30px;
302
+ line-height: 30px;
303
+}
304
+.show-grid:hover [class*="span"] {
305
+ background: #ddd;
306
+}
307
+.show-grid .show-grid {
308
+ margin-top: 0;
309
+ margin-bottom: 0;
310
+}
311
+.show-grid .show-grid [class*="span"] {
312
+ background-color: #ccc;
313
+}
314
+
315
+
316
+/* Render mini layout previews
317
+-------------------------------------------------- */
318
+.mini-layout {
319
+ border: 1px solid #ddd;
320
+ -webkit-border-radius: 6px;
321
+ -moz-border-radius: 6px;
322
+ border-radius: 6px;
323
+ -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.075);
324
+ -moz-box-shadow: 0 1px 2px rgba(0,0,0,.075);
325
+ box-shadow: 0 1px 2px rgba(0,0,0,.075);
326
+}
327
+.mini-layout {
328
+ height: 240px;
329
+ margin-bottom: 20px;
330
+ padding: 9px;
331
+}
332
+.mini-layout div {
333
+ -webkit-border-radius: 3px;
334
+ -moz-border-radius: 3px;
335
+ border-radius: 3px;
336
+}
337
+.mini-layout .mini-layout-body {
338
+ background-color: #dceaf4;
339
+ margin: 0 auto;
340
+ width: 70%;
341
+ height: 240px;
342
+}
343
+.mini-layout.fluid .mini-layout-sidebar,
344
+.mini-layout.fluid .mini-layout-header,
345
+.mini-layout.fluid .mini-layout-body {
346
+ float: left;
347
+}
348
+.mini-layout.fluid .mini-layout-sidebar {
349
+ background-color: #bbd8e9;
350
+ width: 20%;
351
+ height: 240px;
352
+}
353
+.mini-layout.fluid .mini-layout-body {
354
+ width: 77.5%;
355
+ margin-left: 2.5%;
356
+}
357
+
358
+
359
+/* Popover docs
360
+-------------------------------------------------- */
361
+.popover-well {
362
+ min-height: 160px;
363
+}
364
+.popover-well .popover {
365
+ display: block;
366
+}
367
+.popover-well .popover-wrapper {
368
+ width: 50%;
369
+ height: 160px;
370
+ float: left;
371
+ margin-left: 55px;
372
+ position: relative;
373
+}
374
+.popover-well .popover-menu-wrapper {
375
+ height: 80px;
376
+}
377
+.large-bird {
378
+ margin: 5px 0 0 310px;
379
+ opacity: .1;
380
+}
381
+
382
+
383
+/* Download page
384
+-------------------------------------------------- */
385
+.download .page-header {
386
+ margin-top: 36px;
387
+}
388
+.page-header .toggle-all {
389
+ margin-top: 5px;
390
+}
391
+
392
+/* Space out h3s when following a section */
393
+.download h3 {
394
+ margin-bottom: 5px;
395
+}
396
+.download-builder input + h3,
397
+.download-builder .checkbox + h3 {
398
+ margin-top: 9px;
399
+}
400
+
401
+/* Fields for variables */
402
+.download-builder input[type=text] {
403
+ margin-bottom: 9px;
404
+ font-family: Menlo, Monaco, "Courier New", monospace;
405
+ font-size: 12px;
406
+ color: #d14;
407
+}
408
+.download-builder input[type=text]:focus {
409
+ background-color: #fff;
410
+}
411
+
412
+/* Custom, larger checkbox labels */
413
+.download .checkbox {
414
+ padding: 6px 10px 6px 25px;
415
+ color: #555;
416
+ background-color: #f9f9f9;
417
+ -webkit-border-radius: 3px;
418
+ -moz-border-radius: 3px;
419
+ border-radius: 3px;
420
+ cursor: pointer;
421
+}
422
+.download .checkbox:hover {
423
+ color: #333;
424
+ background-color: #f5f5f5;
425
+}
426
+.download .checkbox small {
427
+ font-size: 12px;
428
+ color: #777;
429
+}
430
+
431
+/* Variables section */
432
+#variables label {
433
+ margin-bottom: 0;
434
+}
435
+
436
+/* Giant download button */
437
+.download-btn {
438
+ margin: 36px 0 108px;
439
+}
440
+#download p,
441
+#download h4 {
442
+ max-width: 50%;
443
+ margin: 0 auto;
444
+ color: #999;
445
+ text-align: center;
446
+}
447
+#download h4 {
448
+ margin-bottom: 0;
449
+}
450
+#download p {
451
+ margin-bottom: 18px;
452
+}
453
+.download-btn .btn {
454
+ display: block;
455
+ width: auto;
456
+ padding: 19px 24px;
457
+ margin-bottom: 27px;
458
+ font-size: 30px;
459
+ line-height: 1;
460
+ text-align: center;
461
+ -webkit-border-radius: 6px;
462
+ -moz-border-radius: 6px;
463
+ border-radius: 6px;
464
+}
465
+
466
+
467
+
468
+/* Color swatches on LESS docs page
469
+-------------------------------------------------- */
470
+/* Sets the width of the td */
471
+.swatch-col {
472
+ width: 30px;
473
+}
474
+/* Le swatch */
475
+.swatch {
476
+ display: inline-block;
477
+ width: 30px;
478
+ height: 20px;
479
+ margin: -6px 0;
480
+ -webkit-border-radius: 3px;
481
+ -moz-border-radius: 3px;
482
+ border-radius: 3px;
483
+}
484
+/* For white swatches, give a border */
485
+.swatch-bordered {
486
+ width: 28px;
487
+ height: 18px;
488
+ border: 1px solid #eee;
489
+}
490
+
491
+
492
+/* Misc
493
+-------------------------------------------------- */
494
+
495
+/* Make tables spaced out a bit more */
496
+h2 + table,
497
+h3 + table,
498
+h4 + table,
499
+h2 + .row {
500
+ margin-top: 5px;
501
+}
502
+
503
+/* Example sites showcase */
504
+.example-sites img {
505
+ max-width: 100%;
506
+ margin: 0 auto;
507
+}
508
+.marketing-byline {
509
+ margin: -18px 0 27px;
510
+ font-size: 18px;
511
+ font-weight: 300;
512
+ line-height: 24px;
513
+ color: #999;
514
+ text-align: center;
515
+}
516
+
517
+.scrollspy-example {
518
+ height: 200px;
519
+ overflow: auto;
520
+ position: relative;
521
+}
522
+
523
+/* Remove bottom margin on example forms in wells */
524
+form.well {
525
+ padding: 14px;
526
+}
527
+
528
+/* Tighten up spacing */
529
+.well hr {
530
+ margin: 18px 0;
531
+}
532
+
533
+/* Fake the :focus state to demo it */
534
+.focused {
535
+ border-color: rgba(82,168,236,.8);
536
+ -webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);
537
+ -moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);
538
+ box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);
539
+ outline: 0;
540
+}
541
+
542
+/* For input sizes, make them display block */
543
+.docs-input-sizes select,
544
+.docs-input-sizes input[type=text] {
545
+ display: block;
546
+ margin-bottom: 9px;
547
+}
548
+
549
+/* Icons
550
+------------------------- */
551
+.the-icons {
552
+ margin-left: 0;
553
+ list-style: none;
554
+}
555
+.the-icons i:hover {
556
+ background-color: rgba(255,0,0,.25);
557
+}
558
+
559
+/* Eaxmples page
560
+------------------------- */
561
+.bootstrap-examples .thumbnail {
562
+ margin-bottom: 9px;
563
+ background-color: #fff;
564
+}
565
+
566
+/* Responsive table
567
+------------------------- */
568
+.responsive-utilities th small {
569
+ display: block;
570
+ font-weight: normal;
571
+ color: #999;
572
+}
573
+.responsive-utilities tbody th {
574
+ font-weight: normal;
575
+}
576
+.responsive-utilities td {
577
+ text-align: center;
578
+}
579
+.responsive-utilities td.is-visible {
580
+ color: #468847;
581
+ background-color: #dff0d8 !important;
582
+}
583
+.responsive-utilities td.is-hidden {
584
+ color: #ccc;
585
+ background-color: #f9f9f9 !important;
586
+}
587
+
588
+/* Responsive tests
589
+------------------------- */
590
+.responsive-utilities-test {
591
+ margin-top: 5px;
592
+ margin-left: 0;
593
+ list-style: none;
594
+ overflow: hidden; /* clear floats */
595
+}
596
+.responsive-utilities-test li {
597
+ position: relative;
598
+ float: left;
599
+ width: 25%;
600
+ height: 43px;
601
+ font-size: 14px;
602
+ font-weight: bold;
603
+ line-height: 43px;
604
+ color: #999;
605
+ text-align: center;
606
+ border: 1px solid #ddd;
607
+ -webkit-border-radius: 4px;
608
+ -moz-border-radius: 4px;
609
+ border-radius: 4px;
610
+}
611
+.responsive-utilities-test li + li {
612
+ margin-left: 10px;
613
+}
614
+.responsive-utilities-test span {
615
+ position: absolute;
616
+ top: -1px;
617
+ left: -1px;
618
+ right: -1px;
619
+ bottom: -1px;
620
+ -webkit-border-radius: 4px;
621
+ -moz-border-radius: 4px;
622
+ border-radius: 4px;
623
+}
624
+.responsive-utilities-test span {
625
+ color: #468847;
626
+ background-color: #dff0d8;
627
+ border: 1px solid #d6e9c6;
628
+}
629
+
630
+
631
+/* Responsive Docs
632
+-------------------------------------------------- */
633
+@media (max-width: 480px) {
634
+
635
+ /* Reduce padding above jumbotron */
636
+ body {
637
+ padding-top: 70px;
638
+ }
639
+
640
+ /* Change up some type stuff */
641
+ h2 {
642
+ margin-top: 27px;
643
+ }
644
+ h2 small {
645
+ display: block;
646
+ line-height: 18px;
647
+ }
648
+ h3 {
649
+ margin-top: 18px;
650
+ }
651
+
652
+ /* icons */
653
+ .marketing .bs-icon {
654
+ margin: 0;
655
+ }
656
+
657
+ /* Adjust the jumbotron */
658
+ .jumbotron h1,
659
+ .jumbotron p {
660
+ text-align: center;
661
+ margin-right: 0;
662
+ }
663
+ .jumbotron h1 {
664
+ font-size: 45px;
665
+ margin-right: 0;
666
+ }
667
+ .jumbotron p {
668
+ margin-right: 0;
669
+ margin-left: 0;
670
+ font-size: 18px;
671
+ line-height: 24px;
672
+ }
673
+ .jumbotron .btn {
674
+ display: block;
675
+ font-size: 18px;
676
+ padding: 10px 14px;
677
+ margin: 0 auto 10px;
678
+ }
679
+ /* Masthead (home page jumbotron) */
680
+ .masthead {
681
+ padding-top: 0;
682
+ }
683
+
684
+ /* Don't space out quick links so much */
685
+ .quick-links {
686
+ margin: 40px 0 0;
687
+ }
688
+ /* hide the bullets on mobile since our horizontal space is limited */
689
+ .quick-links .divider {
690
+ display: none;
691
+ }
692
+
693
+ /* center example sites */
694
+ .example-sites {
695
+ margin-left: 0;
696
+ }
697
+ .example-sites > li {
698
+ float: none;
699
+ display: block;
700
+ max-width: 280px;
701
+ margin: 0 auto 18px;
702
+ text-align: center;
703
+ }
704
+ .example-sites .thumbnail > img {
705
+ max-width: 270px;
706
+ }
707
+
708
+ table code {
709
+ white-space: normal;
710
+ word-wrap: break-word;
711
+ word-break: break-all;
712
+ }
713
+
714
+ /* Modal example */
715
+ .modal-example .modal {
716
+ position: relative;
717
+ top: auto;
718
+ right: auto;
719
+ bottom: auto;
720
+ left: auto;
721
+ }
722
+
723
+}
724
+
725
+
726
+@media (max-width: 768px) {
727
+
728
+ /* Remove any padding from the body */
729
+ body {
730
+ padding-top: 0;
731
+ }
732
+
733
+ /* Jumbotron buttons */
734
+ .jumbotron .btn {
735
+ margin-bottom: 10px;
736
+ }
737
+
738
+ /* Subnav */
739
+ .subnav {
740
+ position: static;
741
+ top: auto;
742
+ z-index: auto;
743
+ width: auto;
744
+ height: auto;
745
+ background: #fff; /* whole background property since we use a background-image for gradient */
746
+ -webkit-box-shadow: none;
747
+ -moz-box-shadow: none;
748
+ box-shadow: none;
749
+ }
750
+ .subnav .nav > li {
751
+ float: none;
752
+ }
753
+ .subnav .nav > li > a {
754
+ border: 0;
755
+ }
756
+ .subnav .nav > li + li > a {
757
+ border-top: 1px solid #e5e5e5;
758
+ }
759
+ .subnav .nav > li:first-child > a,
760
+ .subnav .nav > li:first-child > a:hover {
761
+ -webkit-border-radius: 4px 4px 0 0;
762
+ -moz-border-radius: 4px 4px 0 0;
763
+ border-radius: 4px 4px 0 0;
764
+ }
765
+
766
+ /* Popovers */
767
+ .large-bird {
768
+ display: none;
769
+ }
770
+ .popover-well .popover-wrapper {
771
+ margin-left: 0;
772
+ }
773
+
774
+ /* Space out the show-grid examples */
775
+ .show-grid [class*="span"] {
776
+ margin-bottom: 5px;
777
+ }
778
+
779
+ /* Unfloat the back to top link in footer */
780
+ .footer .pull-right {
781
+ float: none;
782
+ }
783
+ .footer p {
784
+ margin-bottom: 9px;
785
+ }
786
+
787
+}
788
+
789
+
790
+@media (min-width: 480px) and (max-width: 768px) {
791
+
792
+ /* Scale down the jumbotron content */
793
+ .jumbotron h1 {
794
+ font-size: 54px;
795
+ }
796
+ .jumbotron p {
797
+ margin-right: 0;
798
+ margin-left: 0;
799
+ }
800
+
801
+}
802
+
803
+
804
+@media (min-width: 768px) and (max-width: 980px) {
805
+
806
+ /* Remove any padding from the body */
807
+ body {
808
+ padding-top: 0;
809
+ }
810
+
811
+ /* Scale down the jumbotron content */
812
+ .jumbotron h1 {
813
+ font-size: 72px;
814
+ }
815
+
816
+}
817
+
818
+
819
+@media (max-width: 980px) {
820
+
821
+ /* Unfloat brand */
822
+ .navbar-fixed-top .brand {
823
+ float: left;
824
+ margin-left: 0;
825
+ padding-left: 10px;
826
+ padding-right: 10px;
827
+ }
828
+
829
+ /* Inline-block quick links for more spacing */
830
+ .quick-links li {
831
+ display: inline-block;
832
+ margin: 5px;
833
+ }
834
+
835
+}
836
+
837
+
838
+/* LARGE DESKTOP SCREENS */
839
+@media (min-width: 1210px) {
840
+
841
+ /* Update subnav container */
842
+ .subnav-fixed .nav {
843
+ width: 1168px; /* 2px less to account for left/right borders being removed when in fixed mode */
844
+ }
845
+
846
+}
docs/docs/likebutton/docs/assets/ico/apple-touch-icon-114-precomposed.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/ico/apple-touch-icon-114-precomposed.png differ
docs/docs/likebutton/docs/assets/ico/apple-touch-icon-144-precomposed.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/ico/apple-touch-icon-144-precomposed.png differ
docs/docs/likebutton/docs/assets/ico/apple-touch-icon-57-precomposed.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/ico/apple-touch-icon-57-precomposed.png differ
docs/docs/likebutton/docs/assets/ico/apple-touch-icon-72-precomposed.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/ico/apple-touch-icon-72-precomposed.png differ
docs/docs/likebutton/docs/assets/ico/favicon.ico
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/ico/favicon.ico differ
docs/docs/likebutton/docs/assets/img/bird.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/bird.png differ
docs/docs/likebutton/docs/assets/img/bootstrap-mdo-sfmoma-01.jpg
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/bootstrap-mdo-sfmoma-01.jpg differ
docs/docs/likebutton/docs/assets/img/bootstrap-mdo-sfmoma-02.jpg
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/bootstrap-mdo-sfmoma-02.jpg differ
docs/docs/likebutton/docs/assets/img/bootstrap-mdo-sfmoma-03.jpg
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/bootstrap-mdo-sfmoma-03.jpg differ
docs/docs/likebutton/docs/assets/img/browsers.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/browsers.png differ
docs/docs/likebutton/docs/assets/img/example-sites/fleetio.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/example-sites/fleetio.png differ
docs/docs/likebutton/docs/assets/img/example-sites/jshint.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/example-sites/jshint.png differ
docs/docs/likebutton/docs/assets/img/example-sites/kippt.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/example-sites/kippt.png differ
docs/docs/likebutton/docs/assets/img/example-sites/soundready.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/example-sites/soundready.png differ
docs/docs/likebutton/docs/assets/img/examples/bootstrap-example-fluid.jpg
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/examples/bootstrap-example-fluid.jpg differ
docs/docs/likebutton/docs/assets/img/examples/bootstrap-example-hero.jpg
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/examples/bootstrap-example-hero.jpg differ
docs/docs/likebutton/docs/assets/img/examples/bootstrap-example-starter.jpg
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/examples/bootstrap-example-starter.jpg differ
docs/docs/likebutton/docs/assets/img/github-16px.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/github-16px.png differ
docs/docs/likebutton/docs/assets/img/glyphicons-halflings-white.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons-halflings-white.png differ
docs/docs/likebutton/docs/assets/img/glyphicons-halflings.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons-halflings.png differ
docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_009_magic.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_009_magic.png differ
docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_042_group.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_042_group.png differ
docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_079_podium.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_079_podium.png differ
docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_082_roundabout.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_082_roundabout.png differ
docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_155_show_thumbnails.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_155_show_thumbnails.png differ
docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_163_iphone.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_163_iphone.png differ
docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_214_resize_small.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_214_resize_small.png differ
docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_266_book_open.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/glyphicons/glyphicons_266_book_open.png differ
docs/docs/likebutton/docs/assets/img/grid-18px-masked.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/grid-18px-masked.png differ
docs/docs/likebutton/docs/assets/img/icon-css3.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/icon-css3.png differ
docs/docs/likebutton/docs/assets/img/icon-github.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/icon-github.png differ
docs/docs/likebutton/docs/assets/img/icon-html5.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/icon-html5.png differ
docs/docs/likebutton/docs/assets/img/icon-twitter.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/icon-twitter.png differ
docs/docs/likebutton/docs/assets/img/less-logo-large.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/less-logo-large.png differ
docs/docs/likebutton/docs/assets/img/less-small.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/less-small.png differ
docs/docs/likebutton/docs/assets/img/responsive-illustrations.png
Binary files /dev/null and b/docs/docs/likebutton/docs/assets/img/responsive-illustrations.png differ
docs/docs/likebutton/docs/assets/js/README.md
new
+106
@@ -0,0 +1,106 @@
1
+## 2.0 BOOTSTRAP JS PHILOSOPHY
2
+These are the high-level design rules which guide the development of Bootstrap's plugin apis.
3
+
4
+---
5
+
6
+### DATA-ATTRIBUTE API
7
+
8
+We believe you should be able to use all plugins provided by Bootstrap purely through the markup API without writing a single line of javascript.
9
+
10
+We acknowledge that this isn't always the most performant and sometimes it may be desirable to turn this functionality off altogether. Therefore, as of 2.0 we provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this:
11
+
12
+ $('body').off('.data-api')
13
+
14
+To target a specific plugin, just include the plugins name as a namespace along with the data-api namespace like this:
15
+
16
+ $('body').off('.alert.data-api')
17
+
18
+---
19
+
20
+### PROGRAMATIC API
21
+
22
+We also believe you should be able to use all plugins provided by Bootstrap purely through the JS API.
23
+
24
+All public APIs should be single, chainable methods, and return the collection acted upon.
25
+
26
+ $(".btn.danger").button("toggle").addClass("fat")
27
+
28
+All methods should accept an optional options object, a string which targets a particular method, or null which initiates the default behavior:
29
+
30
+ $("#myModal").modal() // initialized with defaults
31
+ $("#myModal").modal({ keyboard: false }) // initialized with now keyboard
32
+ $("#myModal").modal('show') // initializes and invokes show immediately afterqwe2
33
+
34
+---
35
+
36
+### OPTIONS
37
+
38
+Options should be sparse and add universal value. We should pick the right defaults.
39
+
40
+All plugins should have a default object which can be modified to effect all instance's default options. The defaults object should be available via `$.fn.plugin.defaults`.
41
+
42
+ $.fn.modal.defaults = { … }
43
+
44
+An options definition should take the following form:
45
+
46
+ *noun*: *adjective* - describes or modifies a quality of an instance
47
+
48
+examples:
49
+
50
+ backdrop: true
51
+ keyboard: false
52
+ placement: 'top'
53
+
54
+---
55
+
56
+### EVENTS
57
+
58
+All events should have an infinitive and past participle form. The infinitive is fired just before an action takes place, the past participle on completion of the action.
59
+
60
+ show | shown
61
+ hide | hidden
62
+
63
+---
64
+
65
+### CONSTRUCTORS
66
+
67
+Each plugin should expose it's raw constructor on a `Constructor` property -- accessed in the following way:
68
+
69
+
70
+ $.fn.popover.Constructor
71
+
72
+---
73
+
74
+### DATA ACCESSOR
75
+
76
+Each plugin stores a copy of the invoked class on an object. This class instance can be accessed directly through jQuery's data API like this:
77
+
78
+ $('[rel=popover]').data('popover') instanceof $.fn.popover.Constructor
79
+
80
+---
81
+
82
+### DATA ATTRIBUTES
83
+
84
+Data attributes should take the following form:
85
+
86
+- data-{{verb}}={{plugin}} - defines main interaction
87
+- data-target || href^=# - defined on "control" element (if element controls an element other than self)
88
+- data-{{noun}} - defines class instance options
89
+
90
+examples:
91
+
92
+ // control other targets
93
+ data-toggle="modal" data-target="#foo"
94
+ data-toggle="collapse" data-target="#foo" data-parent="#bar"
95
+
96
+ // defined on element they control
97
+ data-spy="scroll"
98
+
99
+ data-dismiss="modal"
100
+ data-dismiss="alert"
101
+
102
+ data-toggle="dropdown"
103
+
104
+ data-toggle="button"
105
+ data-toggle="buttons-checkbox"
106
+ data-toggle="buttons-radio"
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/application.js
new
+184
@@ -0,0 +1,184 @@
1
+// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
2
+// IT'S ALL JUST JUNK FOR OUR DOCS!
3
+// ++++++++++++++++++++++++++++++++++++++++++
4
+
5
+!function ($) {
6
+
7
+ $(function(){
8
+
9
+ // Disable certain links in docs
10
+ $('section [href^=#]').click(function (e) {
11
+ e.preventDefault()
12
+ })
13
+
14
+ // make code pretty
15
+ window.prettyPrint && prettyPrint()
16
+
17
+ // add-ons
18
+ $('.add-on :checkbox').on('click', function () {
19
+ var $this = $(this)
20
+ , method = $this.attr('checked') ? 'addClass' : 'removeClass'
21
+ $(this).parents('.add-on')[method]('active')
22
+ })
23
+
24
+ // position static twipsies for components page
25
+ if ($(".twipsies a").length) {
26
+ $(window).on('load resize', function () {
27
+ $(".twipsies a").each(function () {
28
+ $(this)
29
+ .tooltip({
30
+ placement: $(this).attr('title')
31
+ , trigger: 'manual'
32
+ })
33
+ .tooltip('show')
34
+ })
35
+ })
36
+ }
37
+
38
+ // add tipsies to grid for scaffolding
39
+ if ($('#grid-system').length) {
40
+ $('#grid-system').tooltip({
41
+ selector: '.show-grid > div'
42
+ , title: function () { return $(this).width() + 'px' }
43
+ })
44
+ }
45
+
46
+ // fix sub nav on scroll
47
+ var $win = $(window)
48
+ , $nav = $('.subnav')
49
+ , navTop = $('.subnav').length && $('.subnav').offset().top - 40
50
+ , isFixed = 0
51
+
52
+ processScroll()
53
+
54
+ // hack sad times - holdover until rewrite for 2.1
55
+ $nav.on('click', function () {
56
+ if (!isFixed) setTimeout(function () { $win.scrollTop($win.scrollTop() - 47) }, 10)
57
+ })
58
+
59
+ $win.on('scroll', processScroll)
60
+
61
+ function processScroll() {
62
+ var i, scrollTop = $win.scrollTop()
63
+ if (scrollTop >= navTop && !isFixed) {
64
+ isFixed = 1
65
+ $nav.addClass('subnav-fixed')
66
+ } else if (scrollTop <= navTop && isFixed) {
67
+ isFixed = 0
68
+ $nav.removeClass('subnav-fixed')
69
+ }
70
+ }
71
+
72
+ // tooltip demo
73
+ $('.tooltip-demo.well').tooltip({
74
+ selector: "a[rel=tooltip]"
75
+ })
76
+
77
+ $('.tooltip-test').tooltip()
78
+ $('.popover-test').popover()
79
+
80
+ // popover demo
81
+ $("a[rel=popover]")
82
+ .popover()
83
+ .click(function(e) {
84
+ e.preventDefault()
85
+ })
86
+
87
+ // button state demo
88
+ $('#fat-btn')
89
+ .click(function () {
90
+ var btn = $(this)
91
+ btn.button('loading')
92
+ setTimeout(function () {
93
+ btn.button('reset')
94
+ }, 3000)
95
+ })
96
+
97
+ // carousel demo
98
+ $('#myCarousel').carousel()
99
+
100
+ // javascript build logic
101
+ var inputsComponent = $("#components.download input")
102
+ , inputsPlugin = $("#plugins.download input")
103
+ , inputsVariables = $("#variables.download input")
104
+
105
+ // toggle all plugin checkboxes
106
+ $('#components.download .toggle-all').on('click', function (e) {
107
+ e.preventDefault()
108
+ inputsComponent.attr('checked', !inputsComponent.is(':checked'))
109
+ })
110
+
111
+ $('#plugins.download .toggle-all').on('click', function (e) {
112
+ e.preventDefault()
113
+ inputsPlugin.attr('checked', !inputsPlugin.is(':checked'))
114
+ })
115
+
116
+ $('#variables.download .toggle-all').on('click', function (e) {
117
+ e.preventDefault()
118
+ inputsVariables.val('')
119
+ })
120
+
121
+ // request built javascript
122
+ $('.download-btn').on('click', function () {
123
+
124
+ var css = $("#components.download input:checked")
125
+ .map(function () { return this.value })
126
+ .toArray()
127
+ , js = $("#plugins.download input:checked")
128
+ .map(function () { return this.value })
129
+ .toArray()
130
+ , vars = {}
131
+ , img = ['glyphicons-halflings.png', 'glyphicons-halflings-white.png']
132
+
133
+ $("#variables.download input")
134
+ .each(function () {
135
+ $(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
136
+ })
137
+
138
+ $.ajax({
139
+ type: 'POST'
140
+ , url: /\?dev/.test(window.location) ? 'http://localhost:3000' : 'http://bootstrap.herokuapp.com'
141
+ , dataType: 'jsonpi'
142
+ , params: {
143
+ js: js
144
+ , css: css
145
+ , vars: vars
146
+ , img: img
147
+ }
148
+ })
149
+ })
150
+ })
151
+
152
+// Modified from the original jsonpi https://github.com/benvinegar/jquery-jsonpi
153
+$.ajaxTransport('jsonpi', function(opts, originalOptions, jqXHR) {
154
+ var url = opts.url;
155
+
156
+ return {
157
+ send: function(_, completeCallback) {
158
+ var name = 'jQuery_iframe_' + jQuery.now()
159
+ , iframe, form
160
+
161
+ iframe = $('<iframe>')
162
+ .attr('name', name)
163
+ .appendTo('head')
164
+
165
+ form = $('<form>')
166
+ .attr('method', opts.type) // GET or POST
167
+ .attr('action', url)
168
+ .attr('target', name)
169
+
170
+ $.each(opts.params, function(k, v) {
171
+
172
+ $('<input>')
173
+ .attr('type', 'hidden')
174
+ .attr('name', k)
175
+ .attr('value', typeof v == 'string' ? v : JSON.stringify(v))
176
+ .appendTo(form)
177
+ })
178
+
179
+ form.appendTo('body').submit()
180
+ }
181
+ }
182
+})
183
+
184
+}(window.jQuery)
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-alert.js
new
+90
@@ -0,0 +1,90 @@
1
+/* ==========================================================
2
+ * bootstrap-alert.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
4
+ * ==========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* ALERT CLASS DEFINITION
27
+ * ====================== */
28
+
29
+ var dismiss = '[data-dismiss="alert"]'
30
+ , Alert = function (el) {
31
+ $(el).on('click', dismiss, this.close)
32
+ }
33
+
34
+ Alert.prototype.close = function (e) {
35
+ var $this = $(this)
36
+ , selector = $this.attr('data-target')
37
+ , $parent
38
+
39
+ if (!selector) {
40
+ selector = $this.attr('href')
41
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
42
+ }
43
+
44
+ $parent = $(selector)
45
+
46
+ e && e.preventDefault()
47
+
48
+ $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
49
+
50
+ $parent.trigger(e = $.Event('close'))
51
+
52
+ if (e.isDefaultPrevented()) return
53
+
54
+ $parent.removeClass('in')
55
+
56
+ function removeElement() {
57
+ $parent
58
+ .trigger('closed')
59
+ .remove()
60
+ }
61
+
62
+ $.support.transition && $parent.hasClass('fade') ?
63
+ $parent.on($.support.transition.end, removeElement) :
64
+ removeElement()
65
+ }
66
+
67
+
68
+ /* ALERT PLUGIN DEFINITION
69
+ * ======================= */
70
+
71
+ $.fn.alert = function (option) {
72
+ return this.each(function () {
73
+ var $this = $(this)
74
+ , data = $this.data('alert')
75
+ if (!data) $this.data('alert', (data = new Alert(this)))
76
+ if (typeof option == 'string') data[option].call($this)
77
+ })
78
+ }
79
+
80
+ $.fn.alert.Constructor = Alert
81
+
82
+
83
+ /* ALERT DATA-API
84
+ * ============== */
85
+
86
+ $(function () {
87
+ $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
88
+ })
89
+
90
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-button.js
new
+96
@@ -0,0 +1,96 @@
1
+/* ============================================================
2
+ * bootstrap-button.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
4
+ * ============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================ */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* BUTTON PUBLIC CLASS DEFINITION
27
+ * ============================== */
28
+
29
+ var Button = function (element, options) {
30
+ this.$element = $(element)
31
+ this.options = $.extend({}, $.fn.button.defaults, options)
32
+ }
33
+
34
+ Button.prototype.setState = function (state) {
35
+ var d = 'disabled'
36
+ , $el = this.$element
37
+ , data = $el.data()
38
+ , val = $el.is('input') ? 'val' : 'html'
39
+
40
+ state = state + 'Text'
41
+ data.resetText || $el.data('resetText', $el[val]())
42
+
43
+ $el[val](data[state] || this.options[state])
44
+
45
+ // push to event loop to allow forms to submit
46
+ setTimeout(function () {
47
+ state == 'loadingText' ?
48
+ $el.addClass(d).attr(d, d) :
49
+ $el.removeClass(d).removeAttr(d)
50
+ }, 0)
51
+ }
52
+
53
+ Button.prototype.toggle = function () {
54
+ var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
55
+
56
+ $parent && $parent
57
+ .find('.active')
58
+ .removeClass('active')
59
+
60
+ this.$element.toggleClass('active')
61
+ }
62
+
63
+
64
+ /* BUTTON PLUGIN DEFINITION
65
+ * ======================== */
66
+
67
+ $.fn.button = function (option) {
68
+ return this.each(function () {
69
+ var $this = $(this)
70
+ , data = $this.data('button')
71
+ , options = typeof option == 'object' && option
72
+ if (!data) $this.data('button', (data = new Button(this, options)))
73
+ if (option == 'toggle') data.toggle()
74
+ else if (option) data.setState(option)
75
+ })
76
+ }
77
+
78
+ $.fn.button.defaults = {
79
+ loadingText: 'loading...'
80
+ }
81
+
82
+ $.fn.button.Constructor = Button
83
+
84
+
85
+ /* BUTTON DATA-API
86
+ * =============== */
87
+
88
+ $(function () {
89
+ $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
90
+ var $btn = $(e.target)
91
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
92
+ $btn.button('toggle')
93
+ })
94
+ })
95
+
96
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-carousel.js
new
+169
@@ -0,0 +1,169 @@
1
+/* ==========================================================
2
+ * bootstrap-carousel.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
4
+ * ==========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* CAROUSEL CLASS DEFINITION
27
+ * ========================= */
28
+
29
+ var Carousel = function (element, options) {
30
+ this.$element = $(element)
31
+ this.options = options
32
+ this.options.slide && this.slide(this.options.slide)
33
+ this.options.pause == 'hover' && this.$element
34
+ .on('mouseenter', $.proxy(this.pause, this))
35
+ .on('mouseleave', $.proxy(this.cycle, this))
36
+ }
37
+
38
+ Carousel.prototype = {
39
+
40
+ cycle: function (e) {
41
+ if (!e) this.paused = false
42
+ this.options.interval
43
+ && !this.paused
44
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
45
+ return this
46
+ }
47
+
48
+ , to: function (pos) {
49
+ var $active = this.$element.find('.active')
50
+ , children = $active.parent().children()
51
+ , activePos = children.index($active)
52
+ , that = this
53
+
54
+ if (pos > (children.length - 1) || pos < 0) return
55
+
56
+ if (this.sliding) {
57
+ return this.$element.one('slid', function () {
58
+ that.to(pos)
59
+ })
60
+ }
61
+
62
+ if (activePos == pos) {
63
+ return this.pause().cycle()
64
+ }
65
+
66
+ return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
67
+ }
68
+
69
+ , pause: function (e) {
70
+ if (!e) this.paused = true
71
+ clearInterval(this.interval)
72
+ this.interval = null
73
+ return this
74
+ }
75
+
76
+ , next: function () {
77
+ if (this.sliding) return
78
+ return this.slide('next')
79
+ }
80
+
81
+ , prev: function () {
82
+ if (this.sliding) return
83
+ return this.slide('prev')
84
+ }
85
+
86
+ , slide: function (type, next) {
87
+ var $active = this.$element.find('.active')
88
+ , $next = next || $active[type]()
89
+ , isCycling = this.interval
90
+ , direction = type == 'next' ? 'left' : 'right'
91
+ , fallback = type == 'next' ? 'first' : 'last'
92
+ , that = this
93
+ , e = $.Event('slide')
94
+
95
+ this.sliding = true
96
+
97
+ isCycling && this.pause()
98
+
99
+ $next = $next.length ? $next : this.$element.find('.item')[fallback]()
100
+
101
+ if ($next.hasClass('active')) return
102
+
103
+ if ($.support.transition && this.$element.hasClass('slide')) {
104
+ this.$element.trigger(e)
105
+ if (e.isDefaultPrevented()) return
106
+ $next.addClass(type)
107
+ $next[0].offsetWidth // force reflow
108
+ $active.addClass(direction)
109
+ $next.addClass(direction)
110
+ this.$element.one($.support.transition.end, function () {
111
+ $next.removeClass([type, direction].join(' ')).addClass('active')
112
+ $active.removeClass(['active', direction].join(' '))
113
+ that.sliding = false
114
+ setTimeout(function () { that.$element.trigger('slid') }, 0)
115
+ })
116
+ } else {
117
+ this.$element.trigger(e)
118
+ if (e.isDefaultPrevented()) return
119
+ $active.removeClass('active')
120
+ $next.addClass('active')
121
+ this.sliding = false
122
+ this.$element.trigger('slid')
123
+ }
124
+
125
+ isCycling && this.cycle()
126
+
127
+ return this
128
+ }
129
+
130
+ }
131
+
132
+
133
+ /* CAROUSEL PLUGIN DEFINITION
134
+ * ========================== */
135
+
136
+ $.fn.carousel = function (option) {
137
+ return this.each(function () {
138
+ var $this = $(this)
139
+ , data = $this.data('carousel')
140
+ , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
141
+ if (!data) $this.data('carousel', (data = new Carousel(this, options)))
142
+ if (typeof option == 'number') data.to(option)
143
+ else if (typeof option == 'string' || (option = options.slide)) data[option]()
144
+ else if (options.interval) data.cycle()
145
+ })
146
+ }
147
+
148
+ $.fn.carousel.defaults = {
149
+ interval: 5000
150
+ , pause: 'hover'
151
+ }
152
+
153
+ $.fn.carousel.Constructor = Carousel
154
+
155
+
156
+ /* CAROUSEL DATA-API
157
+ * ================= */
158
+
159
+ $(function () {
160
+ $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
161
+ var $this = $(this), href
162
+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
163
+ , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
164
+ $target.carousel(options)
165
+ e.preventDefault()
166
+ })
167
+ })
168
+
169
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-collapse.js
new
+157
@@ -0,0 +1,157 @@
1
+/* =============================================================
2
+ * bootstrap-collapse.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
4
+ * =============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================ */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* COLLAPSE PUBLIC CLASS DEFINITION
27
+ * ================================ */
28
+
29
+ var Collapse = function (element, options) {
30
+ this.$element = $(element)
31
+ this.options = $.extend({}, $.fn.collapse.defaults, options)
32
+
33
+ if (this.options.parent) {
34
+ this.$parent = $(this.options.parent)
35
+ }
36
+
37
+ this.options.toggle && this.toggle()
38
+ }
39
+
40
+ Collapse.prototype = {
41
+
42
+ constructor: Collapse
43
+
44
+ , dimension: function () {
45
+ var hasWidth = this.$element.hasClass('width')
46
+ return hasWidth ? 'width' : 'height'
47
+ }
48
+
49
+ , show: function () {
50
+ var dimension
51
+ , scroll
52
+ , actives
53
+ , hasData
54
+
55
+ if (this.transitioning) return
56
+
57
+ dimension = this.dimension()
58
+ scroll = $.camelCase(['scroll', dimension].join('-'))
59
+ actives = this.$parent && this.$parent.find('> .accordion-group > .in')
60
+
61
+ if (actives && actives.length) {
62
+ hasData = actives.data('collapse')
63
+ if (hasData && hasData.transitioning) return
64
+ actives.collapse('hide')
65
+ hasData || actives.data('collapse', null)
66
+ }
67
+
68
+ this.$element[dimension](0)
69
+ this.transition('addClass', $.Event('show'), 'shown')
70
+ this.$element[dimension](this.$element[0][scroll])
71
+ }
72
+
73
+ , hide: function () {
74
+ var dimension
75
+ if (this.transitioning) return
76
+ dimension = this.dimension()
77
+ this.reset(this.$element[dimension]())
78
+ this.transition('removeClass', $.Event('hide'), 'hidden')
79
+ this.$element[dimension](0)
80
+ }
81
+
82
+ , reset: function (size) {
83
+ var dimension = this.dimension()
84
+
85
+ this.$element
86
+ .removeClass('collapse')
87
+ [dimension](size || 'auto')
88
+ [0].offsetWidth
89
+
90
+ this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
91
+
92
+ return this
93
+ }
94
+
95
+ , transition: function (method, startEvent, completeEvent) {
96
+ var that = this
97
+ , complete = function () {
98
+ if (startEvent.type == 'show') that.reset()
99
+ that.transitioning = 0
100
+ that.$element.trigger(completeEvent)
101
+ }
102
+
103
+ this.$element.trigger(startEvent)
104
+
105
+ if (startEvent.isDefaultPrevented()) return
106
+
107
+ this.transitioning = 1
108
+
109
+ this.$element[method]('in')
110
+
111
+ $.support.transition && this.$element.hasClass('collapse') ?
112
+ this.$element.one($.support.transition.end, complete) :
113
+ complete()
114
+ }
115
+
116
+ , toggle: function () {
117
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
118
+ }
119
+
120
+ }
121
+
122
+
123
+ /* COLLAPSIBLE PLUGIN DEFINITION
124
+ * ============================== */
125
+
126
+ $.fn.collapse = function (option) {
127
+ return this.each(function () {
128
+ var $this = $(this)
129
+ , data = $this.data('collapse')
130
+ , options = typeof option == 'object' && option
131
+ if (!data) $this.data('collapse', (data = new Collapse(this, options)))
132
+ if (typeof option == 'string') data[option]()
133
+ })
134
+ }
135
+
136
+ $.fn.collapse.defaults = {
137
+ toggle: true
138
+ }
139
+
140
+ $.fn.collapse.Constructor = Collapse
141
+
142
+
143
+ /* COLLAPSIBLE DATA-API
144
+ * ==================== */
145
+
146
+ $(function () {
147
+ $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {
148
+ var $this = $(this), href
149
+ , target = $this.attr('data-target')
150
+ || e.preventDefault()
151
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
152
+ , option = $(target).data('collapse') ? 'toggle' : $this.data()
153
+ $(target).collapse(option)
154
+ })
155
+ })
156
+
157
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-dropdown.js
new
+100
@@ -0,0 +1,100 @@
1
+/* ============================================================
2
+ * bootstrap-dropdown.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
4
+ * ============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================ */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* DROPDOWN CLASS DEFINITION
27
+ * ========================= */
28
+
29
+ var toggle = '[data-toggle="dropdown"]'
30
+ , Dropdown = function (element) {
31
+ var $el = $(element).on('click.dropdown.data-api', this.toggle)
32
+ $('html').on('click.dropdown.data-api', function () {
33
+ $el.parent().removeClass('open')
34
+ })
35
+ }
36
+
37
+ Dropdown.prototype = {
38
+
39
+ constructor: Dropdown
40
+
41
+ , toggle: function (e) {
42
+ var $this = $(this)
43
+ , $parent
44
+ , selector
45
+ , isActive
46
+
47
+ if ($this.is('.disabled, :disabled')) return
48
+
49
+ selector = $this.attr('data-target')
50
+
51
+ if (!selector) {
52
+ selector = $this.attr('href')
53
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
54
+ }
55
+
56
+ $parent = $(selector)
57
+ $parent.length || ($parent = $this.parent())
58
+
59
+ isActive = $parent.hasClass('open')
60
+
61
+ clearMenus()
62
+
63
+ if (!isActive) $parent.toggleClass('open')
64
+
65
+ return false
66
+ }
67
+
68
+ }
69
+
70
+ function clearMenus() {
71
+ $(toggle).parent().removeClass('open')
72
+ }
73
+
74
+
75
+ /* DROPDOWN PLUGIN DEFINITION
76
+ * ========================== */
77
+
78
+ $.fn.dropdown = function (option) {
79
+ return this.each(function () {
80
+ var $this = $(this)
81
+ , data = $this.data('dropdown')
82
+ if (!data) $this.data('dropdown', (data = new Dropdown(this)))
83
+ if (typeof option == 'string') data[option].call($this)
84
+ })
85
+ }
86
+
87
+ $.fn.dropdown.Constructor = Dropdown
88
+
89
+
90
+ /* APPLY TO STANDARD DROPDOWN ELEMENTS
91
+ * =================================== */
92
+
93
+ $(function () {
94
+ $('html').on('click.dropdown.data-api', clearMenus)
95
+ $('body')
96
+ .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
97
+ .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
98
+ })
99
+
100
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-modal.js
new
+218
@@ -0,0 +1,218 @@
1
+/* =========================================================
2
+ * bootstrap-modal.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#modals
4
+ * =========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================= */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* MODAL CLASS DEFINITION
27
+ * ====================== */
28
+
29
+ var Modal = function (content, options) {
30
+ this.options = options
31
+ this.$element = $(content)
32
+ .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
33
+ }
34
+
35
+ Modal.prototype = {
36
+
37
+ constructor: Modal
38
+
39
+ , toggle: function () {
40
+ return this[!this.isShown ? 'show' : 'hide']()
41
+ }
42
+
43
+ , show: function () {
44
+ var that = this
45
+ , e = $.Event('show')
46
+
47
+ this.$element.trigger(e)
48
+
49
+ if (this.isShown || e.isDefaultPrevented()) return
50
+
51
+ $('body').addClass('modal-open')
52
+
53
+ this.isShown = true
54
+
55
+ escape.call(this)
56
+ backdrop.call(this, function () {
57
+ var transition = $.support.transition && that.$element.hasClass('fade')
58
+
59
+ if (!that.$element.parent().length) {
60
+ that.$element.appendTo(document.body) //don't move modals dom position
61
+ }
62
+
63
+ that.$element
64
+ .show()
65
+
66
+ if (transition) {
67
+ that.$element[0].offsetWidth // force reflow
68
+ }
69
+
70
+ that.$element.addClass('in')
71
+
72
+ transition ?
73
+ that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
74
+ that.$element.trigger('shown')
75
+
76
+ })
77
+ }
78
+
79
+ , hide: function (e) {
80
+ e && e.preventDefault()
81
+
82
+ var that = this
83
+
84
+ e = $.Event('hide')
85
+
86
+ this.$element.trigger(e)
87
+
88
+ if (!this.isShown || e.isDefaultPrevented()) return
89
+
90
+ this.isShown = false
91
+
92
+ $('body').removeClass('modal-open')
93
+
94
+ escape.call(this)
95
+
96
+ this.$element.removeClass('in')
97
+
98
+ $.support.transition && this.$element.hasClass('fade') ?
99
+ hideWithTransition.call(this) :
100
+ hideModal.call(this)
101
+ }
102
+
103
+ }
104
+
105
+
106
+ /* MODAL PRIVATE METHODS
107
+ * ===================== */
108
+
109
+ function hideWithTransition() {
110
+ var that = this
111
+ , timeout = setTimeout(function () {
112
+ that.$element.off($.support.transition.end)
113
+ hideModal.call(that)
114
+ }, 500)
115
+
116
+ this.$element.one($.support.transition.end, function () {
117
+ clearTimeout(timeout)
118
+ hideModal.call(that)
119
+ })
120
+ }
121
+
122
+ function hideModal(that) {
123
+ this.$element
124
+ .hide()
125
+ .trigger('hidden')
126
+
127
+ backdrop.call(this)
128
+ }
129
+
130
+ function backdrop(callback) {
131
+ var that = this
132
+ , animate = this.$element.hasClass('fade') ? 'fade' : ''
133
+
134
+ if (this.isShown && this.options.backdrop) {
135
+ var doAnimate = $.support.transition && animate
136
+
137
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
138
+ .appendTo(document.body)
139
+
140
+ if (this.options.backdrop != 'static') {
141
+ this.$backdrop.click($.proxy(this.hide, this))
142
+ }
143
+
144
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
145
+
146
+ this.$backdrop.addClass('in')
147
+
148
+ doAnimate ?
149
+ this.$backdrop.one($.support.transition.end, callback) :
150
+ callback()
151
+
152
+ } else if (!this.isShown && this.$backdrop) {
153
+ this.$backdrop.removeClass('in')
154
+
155
+ $.support.transition && this.$element.hasClass('fade')?
156
+ this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
157
+ removeBackdrop.call(this)
158
+
159
+ } else if (callback) {
160
+ callback()
161
+ }
162
+ }
163
+
164
+ function removeBackdrop() {
165
+ this.$backdrop.remove()
166
+ this.$backdrop = null
167
+ }
168
+
169
+ function escape() {
170
+ var that = this
171
+ if (this.isShown && this.options.keyboard) {
172
+ $(document).on('keyup.dismiss.modal', function ( e ) {
173
+ e.which == 27 && that.hide()
174
+ })
175
+ } else if (!this.isShown) {
176
+ $(document).off('keyup.dismiss.modal')
177
+ }
178
+ }
179
+
180
+
181
+ /* MODAL PLUGIN DEFINITION
182
+ * ======================= */
183
+
184
+ $.fn.modal = function (option) {
185
+ return this.each(function () {
186
+ var $this = $(this)
187
+ , data = $this.data('modal')
188
+ , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
189
+ if (!data) $this.data('modal', (data = new Modal(this, options)))
190
+ if (typeof option == 'string') data[option]()
191
+ else if (options.show) data.show()
192
+ })
193
+ }
194
+
195
+ $.fn.modal.defaults = {
196
+ backdrop: true
197
+ , keyboard: true
198
+ , show: true
199
+ }
200
+
201
+ $.fn.modal.Constructor = Modal
202
+
203
+
204
+ /* MODAL DATA-API
205
+ * ============== */
206
+
207
+ $(function () {
208
+ $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
209
+ var $this = $(this), href
210
+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
211
+ , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())
212
+
213
+ e.preventDefault()
214
+ $target.modal(option)
215
+ })
216
+ })
217
+
218
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-popover.js
new
+98
@@ -0,0 +1,98 @@
1
+/* ===========================================================
2
+ * bootstrap-popover.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
4
+ * ===========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * =========================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* POPOVER PUBLIC CLASS DEFINITION
27
+ * =============================== */
28
+
29
+ var Popover = function ( element, options ) {
30
+ this.init('popover', element, options)
31
+ }
32
+
33
+
34
+ /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
35
+ ========================================== */
36
+
37
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
38
+
39
+ constructor: Popover
40
+
41
+ , setContent: function () {
42
+ var $tip = this.tip()
43
+ , title = this.getTitle()
44
+ , content = this.getContent()
45
+
46
+ $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title)
47
+ $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content)
48
+
49
+ $tip.removeClass('fade top bottom left right in')
50
+ }
51
+
52
+ , hasContent: function () {
53
+ return this.getTitle() || this.getContent()
54
+ }
55
+
56
+ , getContent: function () {
57
+ var content
58
+ , $e = this.$element
59
+ , o = this.options
60
+
61
+ content = $e.attr('data-content')
62
+ || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
63
+
64
+ return content
65
+ }
66
+
67
+ , tip: function () {
68
+ if (!this.$tip) {
69
+ this.$tip = $(this.options.template)
70
+ }
71
+ return this.$tip
72
+ }
73
+
74
+ })
75
+
76
+
77
+ /* POPOVER PLUGIN DEFINITION
78
+ * ======================= */
79
+
80
+ $.fn.popover = function (option) {
81
+ return this.each(function () {
82
+ var $this = $(this)
83
+ , data = $this.data('popover')
84
+ , options = typeof option == 'object' && option
85
+ if (!data) $this.data('popover', (data = new Popover(this, options)))
86
+ if (typeof option == 'string') data[option]()
87
+ })
88
+ }
89
+
90
+ $.fn.popover.Constructor = Popover
91
+
92
+ $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
93
+ placement: 'right'
94
+ , content: ''
95
+ , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
96
+ })
97
+
98
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-scrollspy.js
new
+151
@@ -0,0 +1,151 @@
1
+/* =============================================================
2
+ * bootstrap-scrollspy.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
4
+ * =============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* SCROLLSPY CLASS DEFINITION
27
+ * ========================== */
28
+
29
+ function ScrollSpy( element, options) {
30
+ var process = $.proxy(this.process, this)
31
+ , $element = $(element).is('body') ? $(window) : $(element)
32
+ , href
33
+ this.options = $.extend({}, $.fn.scrollspy.defaults, options)
34
+ this.$scrollElement = $element.on('scroll.scroll.data-api', process)
35
+ this.selector = (this.options.target
36
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
37
+ || '') + ' .nav li > a'
38
+ this.$body = $('body')
39
+ this.refresh()
40
+ this.process()
41
+ }
42
+
43
+ ScrollSpy.prototype = {
44
+
45
+ constructor: ScrollSpy
46
+
47
+ , refresh: function () {
48
+ var self = this
49
+ , $targets
50
+
51
+ this.offsets = $([])
52
+ this.targets = $([])
53
+
54
+ $targets = this.$body
55
+ .find(this.selector)
56
+ .map(function () {
57
+ var $el = $(this)
58
+ , href = $el.data('target') || $el.attr('href')
59
+ , $href = /^#\w/.test(href) && $(href)
60
+ return ( $href
61
+ && href.length
62
+ && [[ $href.position().top, href ]] ) || null
63
+ })
64
+ .sort(function (a, b) { return a[0] - b[0] })
65
+ .each(function () {
66
+ self.offsets.push(this[0])
67
+ self.targets.push(this[1])
68
+ })
69
+ }
70
+
71
+ , process: function () {
72
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
73
+ , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
74
+ , maxScroll = scrollHeight - this.$scrollElement.height()
75
+ , offsets = this.offsets
76
+ , targets = this.targets
77
+ , activeTarget = this.activeTarget
78
+ , i
79
+
80
+ if (scrollTop >= maxScroll) {
81
+ return activeTarget != (i = targets.last()[0])
82
+ && this.activate ( i )
83
+ }
84
+
85
+ for (i = offsets.length; i--;) {
86
+ activeTarget != targets[i]
87
+ && scrollTop >= offsets[i]
88
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
89
+ && this.activate( targets[i] )
90
+ }
91
+ }
92
+
93
+ , activate: function (target) {
94
+ var active
95
+ , selector
96
+
97
+ this.activeTarget = target
98
+
99
+ $(this.selector)
100
+ .parent('.active')
101
+ .removeClass('active')
102
+
103
+ selector = this.selector
104
+ + '[data-target="' + target + '"],'
105
+ + this.selector + '[href="' + target + '"]'
106
+
107
+ active = $(selector)
108
+ .parent('li')
109
+ .addClass('active')
110
+
111
+ if (active.parent('.dropdown-menu')) {
112
+ active = active.closest('li.dropdown').addClass('active')
113
+ }
114
+
115
+ active.trigger('activate')
116
+ }
117
+
118
+ }
119
+
120
+
121
+ /* SCROLLSPY PLUGIN DEFINITION
122
+ * =========================== */
123
+
124
+ $.fn.scrollspy = function ( option ) {
125
+ return this.each(function () {
126
+ var $this = $(this)
127
+ , data = $this.data('scrollspy')
128
+ , options = typeof option == 'object' && option
129
+ if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
130
+ if (typeof option == 'string') data[option]()
131
+ })
132
+ }
133
+
134
+ $.fn.scrollspy.Constructor = ScrollSpy
135
+
136
+ $.fn.scrollspy.defaults = {
137
+ offset: 10
138
+ }
139
+
140
+
141
+ /* SCROLLSPY DATA-API
142
+ * ================== */
143
+
144
+ $(function () {
145
+ $('[data-spy="scroll"]').each(function () {
146
+ var $spy = $(this)
147
+ $spy.scrollspy($spy.data())
148
+ })
149
+ })
150
+
151
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-tab.js
new
+135
@@ -0,0 +1,135 @@
1
+/* ========================================================
2
+ * bootstrap-tab.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
4
+ * ========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ======================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* TAB CLASS DEFINITION
27
+ * ==================== */
28
+
29
+ var Tab = function ( element ) {
30
+ this.element = $(element)
31
+ }
32
+
33
+ Tab.prototype = {
34
+
35
+ constructor: Tab
36
+
37
+ , show: function () {
38
+ var $this = this.element
39
+ , $ul = $this.closest('ul:not(.dropdown-menu)')
40
+ , selector = $this.attr('data-target')
41
+ , previous
42
+ , $target
43
+ , e
44
+
45
+ if (!selector) {
46
+ selector = $this.attr('href')
47
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
48
+ }
49
+
50
+ if ( $this.parent('li').hasClass('active') ) return
51
+
52
+ previous = $ul.find('.active a').last()[0]
53
+
54
+ e = $.Event('show', {
55
+ relatedTarget: previous
56
+ })
57
+
58
+ $this.trigger(e)
59
+
60
+ if (e.isDefaultPrevented()) return
61
+
62
+ $target = $(selector)
63
+
64
+ this.activate($this.parent('li'), $ul)
65
+ this.activate($target, $target.parent(), function () {
66
+ $this.trigger({
67
+ type: 'shown'
68
+ , relatedTarget: previous
69
+ })
70
+ })
71
+ }
72
+
73
+ , activate: function ( element, container, callback) {
74
+ var $active = container.find('> .active')
75
+ , transition = callback
76
+ && $.support.transition
77
+ && $active.hasClass('fade')
78
+
79
+ function next() {
80
+ $active
81
+ .removeClass('active')
82
+ .find('> .dropdown-menu > .active')
83
+ .removeClass('active')
84
+
85
+ element.addClass('active')
86
+
87
+ if (transition) {
88
+ element[0].offsetWidth // reflow for transition
89
+ element.addClass('in')
90
+ } else {
91
+ element.removeClass('fade')
92
+ }
93
+
94
+ if ( element.parent('.dropdown-menu') ) {
95
+ element.closest('li.dropdown').addClass('active')
96
+ }
97
+
98
+ callback && callback()
99
+ }
100
+
101
+ transition ?
102
+ $active.one($.support.transition.end, next) :
103
+ next()
104
+
105
+ $active.removeClass('in')
106
+ }
107
+ }
108
+
109
+
110
+ /* TAB PLUGIN DEFINITION
111
+ * ===================== */
112
+
113
+ $.fn.tab = function ( option ) {
114
+ return this.each(function () {
115
+ var $this = $(this)
116
+ , data = $this.data('tab')
117
+ if (!data) $this.data('tab', (data = new Tab(this)))
118
+ if (typeof option == 'string') data[option]()
119
+ })
120
+ }
121
+
122
+ $.fn.tab.Constructor = Tab
123
+
124
+
125
+ /* TAB DATA-API
126
+ * ============ */
127
+
128
+ $(function () {
129
+ $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
130
+ e.preventDefault()
131
+ $(this).tab('show')
132
+ })
133
+ })
134
+
135
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-tooltip.js
new
+275
@@ -0,0 +1,275 @@
1
+/* ===========================================================
2
+ * bootstrap-tooltip.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
4
+ * Inspired by the original jQuery.tipsy by Jason Frame
5
+ * ===========================================================
6
+ * Copyright 2012 Twitter, Inc.
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ * ========================================================== */
20
+
21
+
22
+!function ($) {
23
+
24
+ "use strict"; // jshint ;_;
25
+
26
+
27
+ /* TOOLTIP PUBLIC CLASS DEFINITION
28
+ * =============================== */
29
+
30
+ var Tooltip = function (element, options) {
31
+ this.init('tooltip', element, options)
32
+ }
33
+
34
+ Tooltip.prototype = {
35
+
36
+ constructor: Tooltip
37
+
38
+ , init: function (type, element, options) {
39
+ var eventIn
40
+ , eventOut
41
+
42
+ this.type = type
43
+ this.$element = $(element)
44
+ this.options = this.getOptions(options)
45
+ this.enabled = true
46
+
47
+ if (this.options.trigger != 'manual') {
48
+ eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
49
+ eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
50
+ this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
51
+ this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
52
+ }
53
+
54
+ this.options.selector ?
55
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
56
+ this.fixTitle()
57
+ }
58
+
59
+ , getOptions: function (options) {
60
+ options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
61
+
62
+ if (options.delay && typeof options.delay == 'number') {
63
+ options.delay = {
64
+ show: options.delay
65
+ , hide: options.delay
66
+ }
67
+ }
68
+
69
+ return options
70
+ }
71
+
72
+ , enter: function (e) {
73
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
74
+
75
+ if (!self.options.delay || !self.options.delay.show) return self.show()
76
+
77
+ clearTimeout(this.timeout)
78
+ self.hoverState = 'in'
79
+ this.timeout = setTimeout(function() {
80
+ if (self.hoverState == 'in') self.show()
81
+ }, self.options.delay.show)
82
+ }
83
+
84
+ , leave: function (e) {
85
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
86
+
87
+ if (this.timeout) clearTimeout(this.timeout)
88
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
89
+
90
+ self.hoverState = 'out'
91
+ this.timeout = setTimeout(function() {
92
+ if (self.hoverState == 'out') self.hide()
93
+ }, self.options.delay.hide)
94
+ }
95
+
96
+ , show: function () {
97
+ var $tip
98
+ , inside
99
+ , pos
100
+ , actualWidth
101
+ , actualHeight
102
+ , placement
103
+ , tp
104
+
105
+ if (this.hasContent() && this.enabled) {
106
+ $tip = this.tip()
107
+ this.setContent()
108
+
109
+ if (this.options.animation) {
110
+ $tip.addClass('fade')
111
+ }
112
+
113
+ placement = typeof this.options.placement == 'function' ?
114
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
115
+ this.options.placement
116
+
117
+ inside = /in/.test(placement)
118
+
119
+ $tip
120
+ .remove()
121
+ .css({ top: 0, left: 0, display: 'block' })
122
+ .appendTo(inside ? this.$element : document.body)
123
+
124
+ pos = this.getPosition(inside)
125
+
126
+ actualWidth = $tip[0].offsetWidth
127
+ actualHeight = $tip[0].offsetHeight
128
+
129
+ switch (inside ? placement.split(' ')[1] : placement) {
130
+ case 'bottom':
131
+ tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
132
+ break
133
+ case 'top':
134
+ tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
135
+ break
136
+ case 'left':
137
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
138
+ break
139
+ case 'right':
140
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
141
+ break
142
+ }
143
+
144
+ $tip
145
+ .css(tp)
146
+ .addClass(placement)
147
+ .addClass('in')
148
+ }
149
+ }
150
+
151
+ , isHTML: function(text) {
152
+ // html string detection logic adapted from jQuery
153
+ return typeof text != 'string'
154
+ || ( text.charAt(0) === "<"
155
+ && text.charAt( text.length - 1 ) === ">"
156
+ && text.length >= 3
157
+ ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text)
158
+ }
159
+
160
+ , setContent: function () {
161
+ var $tip = this.tip()
162
+ , title = this.getTitle()
163
+
164
+ $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title)
165
+ $tip.removeClass('fade in top bottom left right')
166
+ }
167
+
168
+ , hide: function () {
169
+ var that = this
170
+ , $tip = this.tip()
171
+
172
+ $tip.removeClass('in')
173
+
174
+ function removeWithAnimation() {
175
+ var timeout = setTimeout(function () {
176
+ $tip.off($.support.transition.end).remove()
177
+ }, 500)
178
+
179
+ $tip.one($.support.transition.end, function () {
180
+ clearTimeout(timeout)
181
+ $tip.remove()
182
+ })
183
+ }
184
+
185
+ $.support.transition && this.$tip.hasClass('fade') ?
186
+ removeWithAnimation() :
187
+ $tip.remove()
188
+ }
189
+
190
+ , fixTitle: function () {
191
+ var $e = this.$element
192
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
193
+ $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
194
+ }
195
+ }
196
+
197
+ , hasContent: function () {
198
+ return this.getTitle()
199
+ }
200
+
201
+ , getPosition: function (inside) {
202
+ return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
203
+ width: this.$element[0].offsetWidth
204
+ , height: this.$element[0].offsetHeight
205
+ })
206
+ }
207
+
208
+ , getTitle: function () {
209
+ var title
210
+ , $e = this.$element
211
+ , o = this.options
212
+
213
+ title = $e.attr('data-original-title')
214
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
215
+
216
+ return title
217
+ }
218
+
219
+ , tip: function () {
220
+ return this.$tip = this.$tip || $(this.options.template)
221
+ }
222
+
223
+ , validate: function () {
224
+ if (!this.$element[0].parentNode) {
225
+ this.hide()
226
+ this.$element = null
227
+ this.options = null
228
+ }
229
+ }
230
+
231
+ , enable: function () {
232
+ this.enabled = true
233
+ }
234
+
235
+ , disable: function () {
236
+ this.enabled = false
237
+ }
238
+
239
+ , toggleEnabled: function () {
240
+ this.enabled = !this.enabled
241
+ }
242
+
243
+ , toggle: function () {
244
+ this[this.tip().hasClass('in') ? 'hide' : 'show']()
245
+ }
246
+
247
+ }
248
+
249
+
250
+ /* TOOLTIP PLUGIN DEFINITION
251
+ * ========================= */
252
+
253
+ $.fn.tooltip = function ( option ) {
254
+ return this.each(function () {
255
+ var $this = $(this)
256
+ , data = $this.data('tooltip')
257
+ , options = typeof option == 'object' && option
258
+ if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
259
+ if (typeof option == 'string') data[option]()
260
+ })
261
+ }
262
+
263
+ $.fn.tooltip.Constructor = Tooltip
264
+
265
+ $.fn.tooltip.defaults = {
266
+ animation: true
267
+ , placement: 'top'
268
+ , selector: false
269
+ , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
270
+ , trigger: 'hover'
271
+ , title: ''
272
+ , delay: 0
273
+ }
274
+
275
+}(window.jQuery);
docs/docs/likebutton/docs/assets/js/bootstrap-transition.js
new
+61
@@ -0,0 +1,61 @@
1
+/* ===================================================
2
+ * bootstrap-transition.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
4
+ * ===================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ $(function () {
24
+
25
+ "use strict"; // jshint ;_;
26
+
27
+
28
+ /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
29
+ * ======================================================= */
30
+
31
+ $.support.transition = (function () {
32
+
33
+ var transitionEnd = (function () {
34
+
35
+ var el = document.createElement('bootstrap')
36
+ , transEndEventNames = {
37
+ 'WebkitTransition' : 'webkitTransitionEnd'
38
+ , 'MozTransition' : 'transitionend'
39
+ , 'OTransition' : 'oTransitionEnd'
40
+ , 'msTransition' : 'MSTransitionEnd'
41
+ , 'transition' : 'transitionend'
42
+ }
43
+ , name
44
+
45
+ for (name in transEndEventNames){
46
+ if (el.style[name] !== undefined) {
47
+ return transEndEventNames[name]
48
+ }
49
+ }
50
+
51
+ }())
52
+
53
+ return transitionEnd && {
54
+ end: transitionEnd
55
+ }
56
+
57
+ })()
58
+
59
+ })
60
+
61
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap-typeahead.js
new
+285
@@ -0,0 +1,285 @@
1
+/* =============================================================
2
+ * bootstrap-typeahead.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
4
+ * =============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================ */
19
+
20
+
21
+!function($){
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
27
+ * ================================= */
28
+
29
+ var Typeahead = function (element, options) {
30
+ this.$element = $(element)
31
+ this.options = $.extend({}, $.fn.typeahead.defaults, options)
32
+ this.matcher = this.options.matcher || this.matcher
33
+ this.sorter = this.options.sorter || this.sorter
34
+ this.highlighter = this.options.highlighter || this.highlighter
35
+ this.updater = this.options.updater || this.updater
36
+ this.$menu = $(this.options.menu).appendTo('body')
37
+ this.source = this.options.source
38
+ this.shown = false
39
+ this.listen()
40
+ }
41
+
42
+ Typeahead.prototype = {
43
+
44
+ constructor: Typeahead
45
+
46
+ , select: function () {
47
+ var val = this.$menu.find('.active').attr('data-value')
48
+ this.$element
49
+ .val(this.updater(val))
50
+ .change()
51
+ return this.hide()
52
+ }
53
+
54
+ , updater: function (item) {
55
+ return item
56
+ }
57
+
58
+ , show: function () {
59
+ var pos = $.extend({}, this.$element.offset(), {
60
+ height: this.$element[0].offsetHeight
61
+ })
62
+
63
+ this.$menu.css({
64
+ top: pos.top + pos.height
65
+ , left: pos.left
66
+ })
67
+
68
+ this.$menu.show()
69
+ this.shown = true
70
+ return this
71
+ }
72
+
73
+ , hide: function () {
74
+ this.$menu.hide()
75
+ this.shown = false
76
+ return this
77
+ }
78
+
79
+ , lookup: function (event) {
80
+ var that = this
81
+ , items
82
+ , q
83
+
84
+ this.query = this.$element.val()
85
+
86
+ if (!this.query) {
87
+ return this.shown ? this.hide() : this
88
+ }
89
+
90
+ items = $.grep(this.source, function (item) {
91
+ return that.matcher(item)
92
+ })
93
+
94
+ items = this.sorter(items)
95
+
96
+ if (!items.length) {
97
+ return this.shown ? this.hide() : this
98
+ }
99
+
100
+ return this.render(items.slice(0, this.options.items)).show()
101
+ }
102
+
103
+ , matcher: function (item) {
104
+ return ~item.toLowerCase().indexOf(this.query.toLowerCase())
105
+ }
106
+
107
+ , sorter: function (items) {
108
+ var beginswith = []
109
+ , caseSensitive = []
110
+ , caseInsensitive = []
111
+ , item
112
+
113
+ while (item = items.shift()) {
114
+ if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
115
+ else if (~item.indexOf(this.query)) caseSensitive.push(item)
116
+ else caseInsensitive.push(item)
117
+ }
118
+
119
+ return beginswith.concat(caseSensitive, caseInsensitive)
120
+ }
121
+
122
+ , highlighter: function (item) {
123
+ var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
124
+ return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
125
+ return '<strong>' + match + '</strong>'
126
+ })
127
+ }
128
+
129
+ , render: function (items) {
130
+ var that = this
131
+
132
+ items = $(items).map(function (i, item) {
133
+ i = $(that.options.item).attr('data-value', item)
134
+ i.find('a').html(that.highlighter(item))
135
+ return i[0]
136
+ })
137
+
138
+ items.first().addClass('active')
139
+ this.$menu.html(items)
140
+ return this
141
+ }
142
+
143
+ , next: function (event) {
144
+ var active = this.$menu.find('.active').removeClass('active')
145
+ , next = active.next()
146
+
147
+ if (!next.length) {
148
+ next = $(this.$menu.find('li')[0])
149
+ }
150
+
151
+ next.addClass('active')
152
+ }
153
+
154
+ , prev: function (event) {
155
+ var active = this.$menu.find('.active').removeClass('active')
156
+ , prev = active.prev()
157
+
158
+ if (!prev.length) {
159
+ prev = this.$menu.find('li').last()
160
+ }
161
+
162
+ prev.addClass('active')
163
+ }
164
+
165
+ , listen: function () {
166
+ this.$element
167
+ .on('blur', $.proxy(this.blur, this))
168
+ .on('keypress', $.proxy(this.keypress, this))
169
+ .on('keyup', $.proxy(this.keyup, this))
170
+
171
+ if ($.browser.webkit || $.browser.msie) {
172
+ this.$element.on('keydown', $.proxy(this.keypress, this))
173
+ }
174
+
175
+ this.$menu
176
+ .on('click', $.proxy(this.click, this))
177
+ .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
178
+ }
179
+
180
+ , keyup: function (e) {
181
+ switch(e.keyCode) {
182
+ case 40: // down arrow
183
+ case 38: // up arrow
184
+ break
185
+
186
+ case 9: // tab
187
+ case 13: // enter
188
+ if (!this.shown) return
189
+ this.select()
190
+ break
191
+
192
+ case 27: // escape
193
+ if (!this.shown) return
194
+ this.hide()
195
+ break
196
+
197
+ default:
198
+ this.lookup()
199
+ }
200
+
201
+ e.stopPropagation()
202
+ e.preventDefault()
203
+ }
204
+
205
+ , keypress: function (e) {
206
+ if (!this.shown) return
207
+
208
+ switch(e.keyCode) {
209
+ case 9: // tab
210
+ case 13: // enter
211
+ case 27: // escape
212
+ e.preventDefault()
213
+ break
214
+
215
+ case 38: // up arrow
216
+ if (e.type != 'keydown') break
217
+ e.preventDefault()
218
+ this.prev()
219
+ break
220
+
221
+ case 40: // down arrow
222
+ if (e.type != 'keydown') break
223
+ e.preventDefault()
224
+ this.next()
225
+ break
226
+ }
227
+
228
+ e.stopPropagation()
229
+ }
230
+
231
+ , blur: function (e) {
232
+ var that = this
233
+ setTimeout(function () { that.hide() }, 150)
234
+ }
235
+
236
+ , click: function (e) {
237
+ e.stopPropagation()
238
+ e.preventDefault()
239
+ this.select()
240
+ }
241
+
242
+ , mouseenter: function (e) {
243
+ this.$menu.find('.active').removeClass('active')
244
+ $(e.currentTarget).addClass('active')
245
+ }
246
+
247
+ }
248
+
249
+
250
+ /* TYPEAHEAD PLUGIN DEFINITION
251
+ * =========================== */
252
+
253
+ $.fn.typeahead = function (option) {
254
+ return this.each(function () {
255
+ var $this = $(this)
256
+ , data = $this.data('typeahead')
257
+ , options = typeof option == 'object' && option
258
+ if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
259
+ if (typeof option == 'string') data[option]()
260
+ })
261
+ }
262
+
263
+ $.fn.typeahead.defaults = {
264
+ source: []
265
+ , items: 8
266
+ , menu: '<ul class="typeahead dropdown-menu"></ul>'
267
+ , item: '<li><a href="#"></a></li>'
268
+ }
269
+
270
+ $.fn.typeahead.Constructor = Typeahead
271
+
272
+
273
+ /* TYPEAHEAD DATA-API
274
+ * ================== */
275
+
276
+ $(function () {
277
+ $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
278
+ var $this = $(this)
279
+ if ($this.data('typeahead')) return
280
+ e.preventDefault()
281
+ $this.typeahead($this.data())
282
+ })
283
+ })
284
+
285
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap.js
new
+1825
@@ -0,0 +1,1825 @@
1
+/* ===================================================
2
+ * bootstrap-transition.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
4
+ * ===================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ $(function () {
24
+
25
+ "use strict"; // jshint ;_;
26
+
27
+
28
+ /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
29
+ * ======================================================= */
30
+
31
+ $.support.transition = (function () {
32
+
33
+ var transitionEnd = (function () {
34
+
35
+ var el = document.createElement('bootstrap')
36
+ , transEndEventNames = {
37
+ 'WebkitTransition' : 'webkitTransitionEnd'
38
+ , 'MozTransition' : 'transitionend'
39
+ , 'OTransition' : 'oTransitionEnd'
40
+ , 'msTransition' : 'MSTransitionEnd'
41
+ , 'transition' : 'transitionend'
42
+ }
43
+ , name
44
+
45
+ for (name in transEndEventNames){
46
+ if (el.style[name] !== undefined) {
47
+ return transEndEventNames[name]
48
+ }
49
+ }
50
+
51
+ }())
52
+
53
+ return transitionEnd && {
54
+ end: transitionEnd
55
+ }
56
+
57
+ })()
58
+
59
+ })
60
+
61
+}(window.jQuery);/* ==========================================================
62
+ * bootstrap-alert.js v2.0.4
63
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
64
+ * ==========================================================
65
+ * Copyright 2012 Twitter, Inc.
66
+ *
67
+ * Licensed under the Apache License, Version 2.0 (the "License");
68
+ * you may not use this file except in compliance with the License.
69
+ * You may obtain a copy of the License at
70
+ *
71
+ * http://www.apache.org/licenses/LICENSE-2.0
72
+ *
73
+ * Unless required by applicable law or agreed to in writing, software
74
+ * distributed under the License is distributed on an "AS IS" BASIS,
75
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76
+ * See the License for the specific language governing permissions and
77
+ * limitations under the License.
78
+ * ========================================================== */
79
+
80
+
81
+!function ($) {
82
+
83
+ "use strict"; // jshint ;_;
84
+
85
+
86
+ /* ALERT CLASS DEFINITION
87
+ * ====================== */
88
+
89
+ var dismiss = '[data-dismiss="alert"]'
90
+ , Alert = function (el) {
91
+ $(el).on('click', dismiss, this.close)
92
+ }
93
+
94
+ Alert.prototype.close = function (e) {
95
+ var $this = $(this)
96
+ , selector = $this.attr('data-target')
97
+ , $parent
98
+
99
+ if (!selector) {
100
+ selector = $this.attr('href')
101
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
102
+ }
103
+
104
+ $parent = $(selector)
105
+
106
+ e && e.preventDefault()
107
+
108
+ $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
109
+
110
+ $parent.trigger(e = $.Event('close'))
111
+
112
+ if (e.isDefaultPrevented()) return
113
+
114
+ $parent.removeClass('in')
115
+
116
+ function removeElement() {
117
+ $parent
118
+ .trigger('closed')
119
+ .remove()
120
+ }
121
+
122
+ $.support.transition && $parent.hasClass('fade') ?
123
+ $parent.on($.support.transition.end, removeElement) :
124
+ removeElement()
125
+ }
126
+
127
+
128
+ /* ALERT PLUGIN DEFINITION
129
+ * ======================= */
130
+
131
+ $.fn.alert = function (option) {
132
+ return this.each(function () {
133
+ var $this = $(this)
134
+ , data = $this.data('alert')
135
+ if (!data) $this.data('alert', (data = new Alert(this)))
136
+ if (typeof option == 'string') data[option].call($this)
137
+ })
138
+ }
139
+
140
+ $.fn.alert.Constructor = Alert
141
+
142
+
143
+ /* ALERT DATA-API
144
+ * ============== */
145
+
146
+ $(function () {
147
+ $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
148
+ })
149
+
150
+}(window.jQuery);/* ============================================================
151
+ * bootstrap-button.js v2.0.4
152
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
153
+ * ============================================================
154
+ * Copyright 2012 Twitter, Inc.
155
+ *
156
+ * Licensed under the Apache License, Version 2.0 (the "License");
157
+ * you may not use this file except in compliance with the License.
158
+ * You may obtain a copy of the License at
159
+ *
160
+ * http://www.apache.org/licenses/LICENSE-2.0
161
+ *
162
+ * Unless required by applicable law or agreed to in writing, software
163
+ * distributed under the License is distributed on an "AS IS" BASIS,
164
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
165
+ * See the License for the specific language governing permissions and
166
+ * limitations under the License.
167
+ * ============================================================ */
168
+
169
+
170
+!function ($) {
171
+
172
+ "use strict"; // jshint ;_;
173
+
174
+
175
+ /* BUTTON PUBLIC CLASS DEFINITION
176
+ * ============================== */
177
+
178
+ var Button = function (element, options) {
179
+ this.$element = $(element)
180
+ this.options = $.extend({}, $.fn.button.defaults, options)
181
+ }
182
+
183
+ Button.prototype.setState = function (state) {
184
+ var d = 'disabled'
185
+ , $el = this.$element
186
+ , data = $el.data()
187
+ , val = $el.is('input') ? 'val' : 'html'
188
+
189
+ state = state + 'Text'
190
+ data.resetText || $el.data('resetText', $el[val]())
191
+
192
+ $el[val](data[state] || this.options[state])
193
+
194
+ // push to event loop to allow forms to submit
195
+ setTimeout(function () {
196
+ state == 'loadingText' ?
197
+ $el.addClass(d).attr(d, d) :
198
+ $el.removeClass(d).removeAttr(d)
199
+ }, 0)
200
+ }
201
+
202
+ Button.prototype.toggle = function () {
203
+ var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
204
+
205
+ $parent && $parent
206
+ .find('.active')
207
+ .removeClass('active')
208
+
209
+ this.$element.toggleClass('active')
210
+ }
211
+
212
+
213
+ /* BUTTON PLUGIN DEFINITION
214
+ * ======================== */
215
+
216
+ $.fn.button = function (option) {
217
+ return this.each(function () {
218
+ var $this = $(this)
219
+ , data = $this.data('button')
220
+ , options = typeof option == 'object' && option
221
+ if (!data) $this.data('button', (data = new Button(this, options)))
222
+ if (option == 'toggle') data.toggle()
223
+ else if (option) data.setState(option)
224
+ })
225
+ }
226
+
227
+ $.fn.button.defaults = {
228
+ loadingText: 'loading...'
229
+ }
230
+
231
+ $.fn.button.Constructor = Button
232
+
233
+
234
+ /* BUTTON DATA-API
235
+ * =============== */
236
+
237
+ $(function () {
238
+ $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
239
+ var $btn = $(e.target)
240
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
241
+ $btn.button('toggle')
242
+ })
243
+ })
244
+
245
+}(window.jQuery);/* ==========================================================
246
+ * bootstrap-carousel.js v2.0.4
247
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
248
+ * ==========================================================
249
+ * Copyright 2012 Twitter, Inc.
250
+ *
251
+ * Licensed under the Apache License, Version 2.0 (the "License");
252
+ * you may not use this file except in compliance with the License.
253
+ * You may obtain a copy of the License at
254
+ *
255
+ * http://www.apache.org/licenses/LICENSE-2.0
256
+ *
257
+ * Unless required by applicable law or agreed to in writing, software
258
+ * distributed under the License is distributed on an "AS IS" BASIS,
259
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
260
+ * See the License for the specific language governing permissions and
261
+ * limitations under the License.
262
+ * ========================================================== */
263
+
264
+
265
+!function ($) {
266
+
267
+ "use strict"; // jshint ;_;
268
+
269
+
270
+ /* CAROUSEL CLASS DEFINITION
271
+ * ========================= */
272
+
273
+ var Carousel = function (element, options) {
274
+ this.$element = $(element)
275
+ this.options = options
276
+ this.options.slide && this.slide(this.options.slide)
277
+ this.options.pause == 'hover' && this.$element
278
+ .on('mouseenter', $.proxy(this.pause, this))
279
+ .on('mouseleave', $.proxy(this.cycle, this))
280
+ }
281
+
282
+ Carousel.prototype = {
283
+
284
+ cycle: function (e) {
285
+ if (!e) this.paused = false
286
+ this.options.interval
287
+ && !this.paused
288
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
289
+ return this
290
+ }
291
+
292
+ , to: function (pos) {
293
+ var $active = this.$element.find('.active')
294
+ , children = $active.parent().children()
295
+ , activePos = children.index($active)
296
+ , that = this
297
+
298
+ if (pos > (children.length - 1) || pos < 0) return
299
+
300
+ if (this.sliding) {
301
+ return this.$element.one('slid', function () {
302
+ that.to(pos)
303
+ })
304
+ }
305
+
306
+ if (activePos == pos) {
307
+ return this.pause().cycle()
308
+ }
309
+
310
+ return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
311
+ }
312
+
313
+ , pause: function (e) {
314
+ if (!e) this.paused = true
315
+ clearInterval(this.interval)
316
+ this.interval = null
317
+ return this
318
+ }
319
+
320
+ , next: function () {
321
+ if (this.sliding) return
322
+ return this.slide('next')
323
+ }
324
+
325
+ , prev: function () {
326
+ if (this.sliding) return
327
+ return this.slide('prev')
328
+ }
329
+
330
+ , slide: function (type, next) {
331
+ var $active = this.$element.find('.active')
332
+ , $next = next || $active[type]()
333
+ , isCycling = this.interval
334
+ , direction = type == 'next' ? 'left' : 'right'
335
+ , fallback = type == 'next' ? 'first' : 'last'
336
+ , that = this
337
+ , e = $.Event('slide')
338
+
339
+ this.sliding = true
340
+
341
+ isCycling && this.pause()
342
+
343
+ $next = $next.length ? $next : this.$element.find('.item')[fallback]()
344
+
345
+ if ($next.hasClass('active')) return
346
+
347
+ if ($.support.transition && this.$element.hasClass('slide')) {
348
+ this.$element.trigger(e)
349
+ if (e.isDefaultPrevented()) return
350
+ $next.addClass(type)
351
+ $next[0].offsetWidth // force reflow
352
+ $active.addClass(direction)
353
+ $next.addClass(direction)
354
+ this.$element.one($.support.transition.end, function () {
355
+ $next.removeClass([type, direction].join(' ')).addClass('active')
356
+ $active.removeClass(['active', direction].join(' '))
357
+ that.sliding = false
358
+ setTimeout(function () { that.$element.trigger('slid') }, 0)
359
+ })
360
+ } else {
361
+ this.$element.trigger(e)
362
+ if (e.isDefaultPrevented()) return
363
+ $active.removeClass('active')
364
+ $next.addClass('active')
365
+ this.sliding = false
366
+ this.$element.trigger('slid')
367
+ }
368
+
369
+ isCycling && this.cycle()
370
+
371
+ return this
372
+ }
373
+
374
+ }
375
+
376
+
377
+ /* CAROUSEL PLUGIN DEFINITION
378
+ * ========================== */
379
+
380
+ $.fn.carousel = function (option) {
381
+ return this.each(function () {
382
+ var $this = $(this)
383
+ , data = $this.data('carousel')
384
+ , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
385
+ if (!data) $this.data('carousel', (data = new Carousel(this, options)))
386
+ if (typeof option == 'number') data.to(option)
387
+ else if (typeof option == 'string' || (option = options.slide)) data[option]()
388
+ else if (options.interval) data.cycle()
389
+ })
390
+ }
391
+
392
+ $.fn.carousel.defaults = {
393
+ interval: 5000
394
+ , pause: 'hover'
395
+ }
396
+
397
+ $.fn.carousel.Constructor = Carousel
398
+
399
+
400
+ /* CAROUSEL DATA-API
401
+ * ================= */
402
+
403
+ $(function () {
404
+ $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
405
+ var $this = $(this), href
406
+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
407
+ , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
408
+ $target.carousel(options)
409
+ e.preventDefault()
410
+ })
411
+ })
412
+
413
+}(window.jQuery);/* =============================================================
414
+ * bootstrap-collapse.js v2.0.4
415
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
416
+ * =============================================================
417
+ * Copyright 2012 Twitter, Inc.
418
+ *
419
+ * Licensed under the Apache License, Version 2.0 (the "License");
420
+ * you may not use this file except in compliance with the License.
421
+ * You may obtain a copy of the License at
422
+ *
423
+ * http://www.apache.org/licenses/LICENSE-2.0
424
+ *
425
+ * Unless required by applicable law or agreed to in writing, software
426
+ * distributed under the License is distributed on an "AS IS" BASIS,
427
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
428
+ * See the License for the specific language governing permissions and
429
+ * limitations under the License.
430
+ * ============================================================ */
431
+
432
+
433
+!function ($) {
434
+
435
+ "use strict"; // jshint ;_;
436
+
437
+
438
+ /* COLLAPSE PUBLIC CLASS DEFINITION
439
+ * ================================ */
440
+
441
+ var Collapse = function (element, options) {
442
+ this.$element = $(element)
443
+ this.options = $.extend({}, $.fn.collapse.defaults, options)
444
+
445
+ if (this.options.parent) {
446
+ this.$parent = $(this.options.parent)
447
+ }
448
+
449
+ this.options.toggle && this.toggle()
450
+ }
451
+
452
+ Collapse.prototype = {
453
+
454
+ constructor: Collapse
455
+
456
+ , dimension: function () {
457
+ var hasWidth = this.$element.hasClass('width')
458
+ return hasWidth ? 'width' : 'height'
459
+ }
460
+
461
+ , show: function () {
462
+ var dimension
463
+ , scroll
464
+ , actives
465
+ , hasData
466
+
467
+ if (this.transitioning) return
468
+
469
+ dimension = this.dimension()
470
+ scroll = $.camelCase(['scroll', dimension].join('-'))
471
+ actives = this.$parent && this.$parent.find('> .accordion-group > .in')
472
+
473
+ if (actives && actives.length) {
474
+ hasData = actives.data('collapse')
475
+ if (hasData && hasData.transitioning) return
476
+ actives.collapse('hide')
477
+ hasData || actives.data('collapse', null)
478
+ }
479
+
480
+ this.$element[dimension](0)
481
+ this.transition('addClass', $.Event('show'), 'shown')
482
+ this.$element[dimension](this.$element[0][scroll])
483
+ }
484
+
485
+ , hide: function () {
486
+ var dimension
487
+ if (this.transitioning) return
488
+ dimension = this.dimension()
489
+ this.reset(this.$element[dimension]())
490
+ this.transition('removeClass', $.Event('hide'), 'hidden')
491
+ this.$element[dimension](0)
492
+ }
493
+
494
+ , reset: function (size) {
495
+ var dimension = this.dimension()
496
+
497
+ this.$element
498
+ .removeClass('collapse')
499
+ [dimension](size || 'auto')
500
+ [0].offsetWidth
501
+
502
+ this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
503
+
504
+ return this
505
+ }
506
+
507
+ , transition: function (method, startEvent, completeEvent) {
508
+ var that = this
509
+ , complete = function () {
510
+ if (startEvent.type == 'show') that.reset()
511
+ that.transitioning = 0
512
+ that.$element.trigger(completeEvent)
513
+ }
514
+
515
+ this.$element.trigger(startEvent)
516
+
517
+ if (startEvent.isDefaultPrevented()) return
518
+
519
+ this.transitioning = 1
520
+
521
+ this.$element[method]('in')
522
+
523
+ $.support.transition && this.$element.hasClass('collapse') ?
524
+ this.$element.one($.support.transition.end, complete) :
525
+ complete()
526
+ }
527
+
528
+ , toggle: function () {
529
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
530
+ }
531
+
532
+ }
533
+
534
+
535
+ /* COLLAPSIBLE PLUGIN DEFINITION
536
+ * ============================== */
537
+
538
+ $.fn.collapse = function (option) {
539
+ return this.each(function () {
540
+ var $this = $(this)
541
+ , data = $this.data('collapse')
542
+ , options = typeof option == 'object' && option
543
+ if (!data) $this.data('collapse', (data = new Collapse(this, options)))
544
+ if (typeof option == 'string') data[option]()
545
+ })
546
+ }
547
+
548
+ $.fn.collapse.defaults = {
549
+ toggle: true
550
+ }
551
+
552
+ $.fn.collapse.Constructor = Collapse
553
+
554
+
555
+ /* COLLAPSIBLE DATA-API
556
+ * ==================== */
557
+
558
+ $(function () {
559
+ $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {
560
+ var $this = $(this), href
561
+ , target = $this.attr('data-target')
562
+ || e.preventDefault()
563
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
564
+ , option = $(target).data('collapse') ? 'toggle' : $this.data()
565
+ $(target).collapse(option)
566
+ })
567
+ })
568
+
569
+}(window.jQuery);/* ============================================================
570
+ * bootstrap-dropdown.js v2.0.4
571
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
572
+ * ============================================================
573
+ * Copyright 2012 Twitter, Inc.
574
+ *
575
+ * Licensed under the Apache License, Version 2.0 (the "License");
576
+ * you may not use this file except in compliance with the License.
577
+ * You may obtain a copy of the License at
578
+ *
579
+ * http://www.apache.org/licenses/LICENSE-2.0
580
+ *
581
+ * Unless required by applicable law or agreed to in writing, software
582
+ * distributed under the License is distributed on an "AS IS" BASIS,
583
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
584
+ * See the License for the specific language governing permissions and
585
+ * limitations under the License.
586
+ * ============================================================ */
587
+
588
+
589
+!function ($) {
590
+
591
+ "use strict"; // jshint ;_;
592
+
593
+
594
+ /* DROPDOWN CLASS DEFINITION
595
+ * ========================= */
596
+
597
+ var toggle = '[data-toggle="dropdown"]'
598
+ , Dropdown = function (element) {
599
+ var $el = $(element).on('click.dropdown.data-api', this.toggle)
600
+ $('html').on('click.dropdown.data-api', function () {
601
+ $el.parent().removeClass('open')
602
+ })
603
+ }
604
+
605
+ Dropdown.prototype = {
606
+
607
+ constructor: Dropdown
608
+
609
+ , toggle: function (e) {
610
+ var $this = $(this)
611
+ , $parent
612
+ , selector
613
+ , isActive
614
+
615
+ if ($this.is('.disabled, :disabled')) return
616
+
617
+ selector = $this.attr('data-target')
618
+
619
+ if (!selector) {
620
+ selector = $this.attr('href')
621
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
622
+ }
623
+
624
+ $parent = $(selector)
625
+ $parent.length || ($parent = $this.parent())
626
+
627
+ isActive = $parent.hasClass('open')
628
+
629
+ clearMenus()
630
+
631
+ if (!isActive) $parent.toggleClass('open')
632
+
633
+ return false
634
+ }
635
+
636
+ }
637
+
638
+ function clearMenus() {
639
+ $(toggle).parent().removeClass('open')
640
+ }
641
+
642
+
643
+ /* DROPDOWN PLUGIN DEFINITION
644
+ * ========================== */
645
+
646
+ $.fn.dropdown = function (option) {
647
+ return this.each(function () {
648
+ var $this = $(this)
649
+ , data = $this.data('dropdown')
650
+ if (!data) $this.data('dropdown', (data = new Dropdown(this)))
651
+ if (typeof option == 'string') data[option].call($this)
652
+ })
653
+ }
654
+
655
+ $.fn.dropdown.Constructor = Dropdown
656
+
657
+
658
+ /* APPLY TO STANDARD DROPDOWN ELEMENTS
659
+ * =================================== */
660
+
661
+ $(function () {
662
+ $('html').on('click.dropdown.data-api', clearMenus)
663
+ $('body')
664
+ .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
665
+ .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
666
+ })
667
+
668
+}(window.jQuery);/* =========================================================
669
+ * bootstrap-modal.js v2.0.4
670
+ * http://twitter.github.com/bootstrap/javascript.html#modals
671
+ * =========================================================
672
+ * Copyright 2012 Twitter, Inc.
673
+ *
674
+ * Licensed under the Apache License, Version 2.0 (the "License");
675
+ * you may not use this file except in compliance with the License.
676
+ * You may obtain a copy of the License at
677
+ *
678
+ * http://www.apache.org/licenses/LICENSE-2.0
679
+ *
680
+ * Unless required by applicable law or agreed to in writing, software
681
+ * distributed under the License is distributed on an "AS IS" BASIS,
682
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
683
+ * See the License for the specific language governing permissions and
684
+ * limitations under the License.
685
+ * ========================================================= */
686
+
687
+
688
+!function ($) {
689
+
690
+ "use strict"; // jshint ;_;
691
+
692
+
693
+ /* MODAL CLASS DEFINITION
694
+ * ====================== */
695
+
696
+ var Modal = function (content, options) {
697
+ this.options = options
698
+ this.$element = $(content)
699
+ .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
700
+ }
701
+
702
+ Modal.prototype = {
703
+
704
+ constructor: Modal
705
+
706
+ , toggle: function () {
707
+ return this[!this.isShown ? 'show' : 'hide']()
708
+ }
709
+
710
+ , show: function () {
711
+ var that = this
712
+ , e = $.Event('show')
713
+
714
+ this.$element.trigger(e)
715
+
716
+ if (this.isShown || e.isDefaultPrevented()) return
717
+
718
+ $('body').addClass('modal-open')
719
+
720
+ this.isShown = true
721
+
722
+ escape.call(this)
723
+ backdrop.call(this, function () {
724
+ var transition = $.support.transition && that.$element.hasClass('fade')
725
+
726
+ if (!that.$element.parent().length) {
727
+ that.$element.appendTo(document.body) //don't move modals dom position
728
+ }
729
+
730
+ that.$element
731
+ .show()
732
+
733
+ if (transition) {
734
+ that.$element[0].offsetWidth // force reflow
735
+ }
736
+
737
+ that.$element.addClass('in')
738
+
739
+ transition ?
740
+ that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
741
+ that.$element.trigger('shown')
742
+
743
+ })
744
+ }
745
+
746
+ , hide: function (e) {
747
+ e && e.preventDefault()
748
+
749
+ var that = this
750
+
751
+ e = $.Event('hide')
752
+
753
+ this.$element.trigger(e)
754
+
755
+ if (!this.isShown || e.isDefaultPrevented()) return
756
+
757
+ this.isShown = false
758
+
759
+ $('body').removeClass('modal-open')
760
+
761
+ escape.call(this)
762
+
763
+ this.$element.removeClass('in')
764
+
765
+ $.support.transition && this.$element.hasClass('fade') ?
766
+ hideWithTransition.call(this) :
767
+ hideModal.call(this)
768
+ }
769
+
770
+ }
771
+
772
+
773
+ /* MODAL PRIVATE METHODS
774
+ * ===================== */
775
+
776
+ function hideWithTransition() {
777
+ var that = this
778
+ , timeout = setTimeout(function () {
779
+ that.$element.off($.support.transition.end)
780
+ hideModal.call(that)
781
+ }, 500)
782
+
783
+ this.$element.one($.support.transition.end, function () {
784
+ clearTimeout(timeout)
785
+ hideModal.call(that)
786
+ })
787
+ }
788
+
789
+ function hideModal(that) {
790
+ this.$element
791
+ .hide()
792
+ .trigger('hidden')
793
+
794
+ backdrop.call(this)
795
+ }
796
+
797
+ function backdrop(callback) {
798
+ var that = this
799
+ , animate = this.$element.hasClass('fade') ? 'fade' : ''
800
+
801
+ if (this.isShown && this.options.backdrop) {
802
+ var doAnimate = $.support.transition && animate
803
+
804
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
805
+ .appendTo(document.body)
806
+
807
+ if (this.options.backdrop != 'static') {
808
+ this.$backdrop.click($.proxy(this.hide, this))
809
+ }
810
+
811
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
812
+
813
+ this.$backdrop.addClass('in')
814
+
815
+ doAnimate ?
816
+ this.$backdrop.one($.support.transition.end, callback) :
817
+ callback()
818
+
819
+ } else if (!this.isShown && this.$backdrop) {
820
+ this.$backdrop.removeClass('in')
821
+
822
+ $.support.transition && this.$element.hasClass('fade')?
823
+ this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
824
+ removeBackdrop.call(this)
825
+
826
+ } else if (callback) {
827
+ callback()
828
+ }
829
+ }
830
+
831
+ function removeBackdrop() {
832
+ this.$backdrop.remove()
833
+ this.$backdrop = null
834
+ }
835
+
836
+ function escape() {
837
+ var that = this
838
+ if (this.isShown && this.options.keyboard) {
839
+ $(document).on('keyup.dismiss.modal', function ( e ) {
840
+ e.which == 27 && that.hide()
841
+ })
842
+ } else if (!this.isShown) {
843
+ $(document).off('keyup.dismiss.modal')
844
+ }
845
+ }
846
+
847
+
848
+ /* MODAL PLUGIN DEFINITION
849
+ * ======================= */
850
+
851
+ $.fn.modal = function (option) {
852
+ return this.each(function () {
853
+ var $this = $(this)
854
+ , data = $this.data('modal')
855
+ , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
856
+ if (!data) $this.data('modal', (data = new Modal(this, options)))
857
+ if (typeof option == 'string') data[option]()
858
+ else if (options.show) data.show()
859
+ })
860
+ }
861
+
862
+ $.fn.modal.defaults = {
863
+ backdrop: true
864
+ , keyboard: true
865
+ , show: true
866
+ }
867
+
868
+ $.fn.modal.Constructor = Modal
869
+
870
+
871
+ /* MODAL DATA-API
872
+ * ============== */
873
+
874
+ $(function () {
875
+ $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
876
+ var $this = $(this), href
877
+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
878
+ , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())
879
+
880
+ e.preventDefault()
881
+ $target.modal(option)
882
+ })
883
+ })
884
+
885
+}(window.jQuery);/* ===========================================================
886
+ * bootstrap-tooltip.js v2.0.4
887
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
888
+ * Inspired by the original jQuery.tipsy by Jason Frame
889
+ * ===========================================================
890
+ * Copyright 2012 Twitter, Inc.
891
+ *
892
+ * Licensed under the Apache License, Version 2.0 (the "License");
893
+ * you may not use this file except in compliance with the License.
894
+ * You may obtain a copy of the License at
895
+ *
896
+ * http://www.apache.org/licenses/LICENSE-2.0
897
+ *
898
+ * Unless required by applicable law or agreed to in writing, software
899
+ * distributed under the License is distributed on an "AS IS" BASIS,
900
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
901
+ * See the License for the specific language governing permissions and
902
+ * limitations under the License.
903
+ * ========================================================== */
904
+
905
+
906
+!function ($) {
907
+
908
+ "use strict"; // jshint ;_;
909
+
910
+
911
+ /* TOOLTIP PUBLIC CLASS DEFINITION
912
+ * =============================== */
913
+
914
+ var Tooltip = function (element, options) {
915
+ this.init('tooltip', element, options)
916
+ }
917
+
918
+ Tooltip.prototype = {
919
+
920
+ constructor: Tooltip
921
+
922
+ , init: function (type, element, options) {
923
+ var eventIn
924
+ , eventOut
925
+
926
+ this.type = type
927
+ this.$element = $(element)
928
+ this.options = this.getOptions(options)
929
+ this.enabled = true
930
+
931
+ if (this.options.trigger != 'manual') {
932
+ eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
933
+ eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
934
+ this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
935
+ this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
936
+ }
937
+
938
+ this.options.selector ?
939
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
940
+ this.fixTitle()
941
+ }
942
+
943
+ , getOptions: function (options) {
944
+ options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
945
+
946
+ if (options.delay && typeof options.delay == 'number') {
947
+ options.delay = {
948
+ show: options.delay
949
+ , hide: options.delay
950
+ }
951
+ }
952
+
953
+ return options
954
+ }
955
+
956
+ , enter: function (e) {
957
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
958
+
959
+ if (!self.options.delay || !self.options.delay.show) return self.show()
960
+
961
+ clearTimeout(this.timeout)
962
+ self.hoverState = 'in'
963
+ this.timeout = setTimeout(function() {
964
+ if (self.hoverState == 'in') self.show()
965
+ }, self.options.delay.show)
966
+ }
967
+
968
+ , leave: function (e) {
969
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
970
+
971
+ if (this.timeout) clearTimeout(this.timeout)
972
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
973
+
974
+ self.hoverState = 'out'
975
+ this.timeout = setTimeout(function() {
976
+ if (self.hoverState == 'out') self.hide()
977
+ }, self.options.delay.hide)
978
+ }
979
+
980
+ , show: function () {
981
+ var $tip
982
+ , inside
983
+ , pos
984
+ , actualWidth
985
+ , actualHeight
986
+ , placement
987
+ , tp
988
+
989
+ if (this.hasContent() && this.enabled) {
990
+ $tip = this.tip()
991
+ this.setContent()
992
+
993
+ if (this.options.animation) {
994
+ $tip.addClass('fade')
995
+ }
996
+
997
+ placement = typeof this.options.placement == 'function' ?
998
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
999
+ this.options.placement
1000
+
1001
+ inside = /in/.test(placement)
1002
+
1003
+ $tip
1004
+ .remove()
1005
+ .css({ top: 0, left: 0, display: 'block' })
1006
+ .appendTo(inside ? this.$element : document.body)
1007
+
1008
+ pos = this.getPosition(inside)
1009
+
1010
+ actualWidth = $tip[0].offsetWidth
1011
+ actualHeight = $tip[0].offsetHeight
1012
+
1013
+ switch (inside ? placement.split(' ')[1] : placement) {
1014
+ case 'bottom':
1015
+ tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
1016
+ break
1017
+ case 'top':
1018
+ tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
1019
+ break
1020
+ case 'left':
1021
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
1022
+ break
1023
+ case 'right':
1024
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
1025
+ break
1026
+ }
1027
+
1028
+ $tip
1029
+ .css(tp)
1030
+ .addClass(placement)
1031
+ .addClass('in')
1032
+ }
1033
+ }
1034
+
1035
+ , isHTML: function(text) {
1036
+ // html string detection logic adapted from jQuery
1037
+ return typeof text != 'string'
1038
+ || ( text.charAt(0) === "<"
1039
+ && text.charAt( text.length - 1 ) === ">"
1040
+ && text.length >= 3
1041
+ ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text)
1042
+ }
1043
+
1044
+ , setContent: function () {
1045
+ var $tip = this.tip()
1046
+ , title = this.getTitle()
1047
+
1048
+ $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title)
1049
+ $tip.removeClass('fade in top bottom left right')
1050
+ }
1051
+
1052
+ , hide: function () {
1053
+ var that = this
1054
+ , $tip = this.tip()
1055
+
1056
+ $tip.removeClass('in')
1057
+
1058
+ function removeWithAnimation() {
1059
+ var timeout = setTimeout(function () {
1060
+ $tip.off($.support.transition.end).remove()
1061
+ }, 500)
1062
+
1063
+ $tip.one($.support.transition.end, function () {
1064
+ clearTimeout(timeout)
1065
+ $tip.remove()
1066
+ })
1067
+ }
1068
+
1069
+ $.support.transition && this.$tip.hasClass('fade') ?
1070
+ removeWithAnimation() :
1071
+ $tip.remove()
1072
+ }
1073
+
1074
+ , fixTitle: function () {
1075
+ var $e = this.$element
1076
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
1077
+ $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
1078
+ }
1079
+ }
1080
+
1081
+ , hasContent: function () {
1082
+ return this.getTitle()
1083
+ }
1084
+
1085
+ , getPosition: function (inside) {
1086
+ return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
1087
+ width: this.$element[0].offsetWidth
1088
+ , height: this.$element[0].offsetHeight
1089
+ })
1090
+ }
1091
+
1092
+ , getTitle: function () {
1093
+ var title
1094
+ , $e = this.$element
1095
+ , o = this.options
1096
+
1097
+ title = $e.attr('data-original-title')
1098
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1099
+
1100
+ return title
1101
+ }
1102
+
1103
+ , tip: function () {
1104
+ return this.$tip = this.$tip || $(this.options.template)
1105
+ }
1106
+
1107
+ , validate: function () {
1108
+ if (!this.$element[0].parentNode) {
1109
+ this.hide()
1110
+ this.$element = null
1111
+ this.options = null
1112
+ }
1113
+ }
1114
+
1115
+ , enable: function () {
1116
+ this.enabled = true
1117
+ }
1118
+
1119
+ , disable: function () {
1120
+ this.enabled = false
1121
+ }
1122
+
1123
+ , toggleEnabled: function () {
1124
+ this.enabled = !this.enabled
1125
+ }
1126
+
1127
+ , toggle: function () {
1128
+ this[this.tip().hasClass('in') ? 'hide' : 'show']()
1129
+ }
1130
+
1131
+ }
1132
+
1133
+
1134
+ /* TOOLTIP PLUGIN DEFINITION
1135
+ * ========================= */
1136
+
1137
+ $.fn.tooltip = function ( option ) {
1138
+ return this.each(function () {
1139
+ var $this = $(this)
1140
+ , data = $this.data('tooltip')
1141
+ , options = typeof option == 'object' && option
1142
+ if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
1143
+ if (typeof option == 'string') data[option]()
1144
+ })
1145
+ }
1146
+
1147
+ $.fn.tooltip.Constructor = Tooltip
1148
+
1149
+ $.fn.tooltip.defaults = {
1150
+ animation: true
1151
+ , placement: 'top'
1152
+ , selector: false
1153
+ , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
1154
+ , trigger: 'hover'
1155
+ , title: ''
1156
+ , delay: 0
1157
+ }
1158
+
1159
+}(window.jQuery);
1160
+/* ===========================================================
1161
+ * bootstrap-popover.js v2.0.4
1162
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
1163
+ * ===========================================================
1164
+ * Copyright 2012 Twitter, Inc.
1165
+ *
1166
+ * Licensed under the Apache License, Version 2.0 (the "License");
1167
+ * you may not use this file except in compliance with the License.
1168
+ * You may obtain a copy of the License at
1169
+ *
1170
+ * http://www.apache.org/licenses/LICENSE-2.0
1171
+ *
1172
+ * Unless required by applicable law or agreed to in writing, software
1173
+ * distributed under the License is distributed on an "AS IS" BASIS,
1174
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1175
+ * See the License for the specific language governing permissions and
1176
+ * limitations under the License.
1177
+ * =========================================================== */
1178
+
1179
+
1180
+!function ($) {
1181
+
1182
+ "use strict"; // jshint ;_;
1183
+
1184
+
1185
+ /* POPOVER PUBLIC CLASS DEFINITION
1186
+ * =============================== */
1187
+
1188
+ var Popover = function ( element, options ) {
1189
+ this.init('popover', element, options)
1190
+ }
1191
+
1192
+
1193
+ /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
1194
+ ========================================== */
1195
+
1196
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
1197
+
1198
+ constructor: Popover
1199
+
1200
+ , setContent: function () {
1201
+ var $tip = this.tip()
1202
+ , title = this.getTitle()
1203
+ , content = this.getContent()
1204
+
1205
+ $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title)
1206
+ $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content)
1207
+
1208
+ $tip.removeClass('fade top bottom left right in')
1209
+ }
1210
+
1211
+ , hasContent: function () {
1212
+ return this.getTitle() || this.getContent()
1213
+ }
1214
+
1215
+ , getContent: function () {
1216
+ var content
1217
+ , $e = this.$element
1218
+ , o = this.options
1219
+
1220
+ content = $e.attr('data-content')
1221
+ || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
1222
+
1223
+ return content
1224
+ }
1225
+
1226
+ , tip: function () {
1227
+ if (!this.$tip) {
1228
+ this.$tip = $(this.options.template)
1229
+ }
1230
+ return this.$tip
1231
+ }
1232
+
1233
+ })
1234
+
1235
+
1236
+ /* POPOVER PLUGIN DEFINITION
1237
+ * ======================= */
1238
+
1239
+ $.fn.popover = function (option) {
1240
+ return this.each(function () {
1241
+ var $this = $(this)
1242
+ , data = $this.data('popover')
1243
+ , options = typeof option == 'object' && option
1244
+ if (!data) $this.data('popover', (data = new Popover(this, options)))
1245
+ if (typeof option == 'string') data[option]()
1246
+ })
1247
+ }
1248
+
1249
+ $.fn.popover.Constructor = Popover
1250
+
1251
+ $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
1252
+ placement: 'right'
1253
+ , content: ''
1254
+ , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
1255
+ })
1256
+
1257
+}(window.jQuery);/* =============================================================
1258
+ * bootstrap-scrollspy.js v2.0.4
1259
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
1260
+ * =============================================================
1261
+ * Copyright 2012 Twitter, Inc.
1262
+ *
1263
+ * Licensed under the Apache License, Version 2.0 (the "License");
1264
+ * you may not use this file except in compliance with the License.
1265
+ * You may obtain a copy of the License at
1266
+ *
1267
+ * http://www.apache.org/licenses/LICENSE-2.0
1268
+ *
1269
+ * Unless required by applicable law or agreed to in writing, software
1270
+ * distributed under the License is distributed on an "AS IS" BASIS,
1271
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1272
+ * See the License for the specific language governing permissions and
1273
+ * limitations under the License.
1274
+ * ============================================================== */
1275
+
1276
+
1277
+!function ($) {
1278
+
1279
+ "use strict"; // jshint ;_;
1280
+
1281
+
1282
+ /* SCROLLSPY CLASS DEFINITION
1283
+ * ========================== */
1284
+
1285
+ function ScrollSpy( element, options) {
1286
+ var process = $.proxy(this.process, this)
1287
+ , $element = $(element).is('body') ? $(window) : $(element)
1288
+ , href
1289
+ this.options = $.extend({}, $.fn.scrollspy.defaults, options)
1290
+ this.$scrollElement = $element.on('scroll.scroll.data-api', process)
1291
+ this.selector = (this.options.target
1292
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1293
+ || '') + ' .nav li > a'
1294
+ this.$body = $('body')
1295
+ this.refresh()
1296
+ this.process()
1297
+ }
1298
+
1299
+ ScrollSpy.prototype = {
1300
+
1301
+ constructor: ScrollSpy
1302
+
1303
+ , refresh: function () {
1304
+ var self = this
1305
+ , $targets
1306
+
1307
+ this.offsets = $([])
1308
+ this.targets = $([])
1309
+
1310
+ $targets = this.$body
1311
+ .find(this.selector)
1312
+ .map(function () {
1313
+ var $el = $(this)
1314
+ , href = $el.data('target') || $el.attr('href')
1315
+ , $href = /^#\w/.test(href) && $(href)
1316
+ return ( $href
1317
+ && href.length
1318
+ && [[ $href.position().top, href ]] ) || null
1319
+ })
1320
+ .sort(function (a, b) { return a[0] - b[0] })
1321
+ .each(function () {
1322
+ self.offsets.push(this[0])
1323
+ self.targets.push(this[1])
1324
+ })
1325
+ }
1326
+
1327
+ , process: function () {
1328
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1329
+ , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
1330
+ , maxScroll = scrollHeight - this.$scrollElement.height()
1331
+ , offsets = this.offsets
1332
+ , targets = this.targets
1333
+ , activeTarget = this.activeTarget
1334
+ , i
1335
+
1336
+ if (scrollTop >= maxScroll) {
1337
+ return activeTarget != (i = targets.last()[0])
1338
+ && this.activate ( i )
1339
+ }
1340
+
1341
+ for (i = offsets.length; i--;) {
1342
+ activeTarget != targets[i]
1343
+ && scrollTop >= offsets[i]
1344
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1345
+ && this.activate( targets[i] )
1346
+ }
1347
+ }
1348
+
1349
+ , activate: function (target) {
1350
+ var active
1351
+ , selector
1352
+
1353
+ this.activeTarget = target
1354
+
1355
+ $(this.selector)
1356
+ .parent('.active')
1357
+ .removeClass('active')
1358
+
1359
+ selector = this.selector
1360
+ + '[data-target="' + target + '"],'
1361
+ + this.selector + '[href="' + target + '"]'
1362
+
1363
+ active = $(selector)
1364
+ .parent('li')
1365
+ .addClass('active')
1366
+
1367
+ if (active.parent('.dropdown-menu')) {
1368
+ active = active.closest('li.dropdown').addClass('active')
1369
+ }
1370
+
1371
+ active.trigger('activate')
1372
+ }
1373
+
1374
+ }
1375
+
1376
+
1377
+ /* SCROLLSPY PLUGIN DEFINITION
1378
+ * =========================== */
1379
+
1380
+ $.fn.scrollspy = function ( option ) {
1381
+ return this.each(function () {
1382
+ var $this = $(this)
1383
+ , data = $this.data('scrollspy')
1384
+ , options = typeof option == 'object' && option
1385
+ if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
1386
+ if (typeof option == 'string') data[option]()
1387
+ })
1388
+ }
1389
+
1390
+ $.fn.scrollspy.Constructor = ScrollSpy
1391
+
1392
+ $.fn.scrollspy.defaults = {
1393
+ offset: 10
1394
+ }
1395
+
1396
+
1397
+ /* SCROLLSPY DATA-API
1398
+ * ================== */
1399
+
1400
+ $(function () {
1401
+ $('[data-spy="scroll"]').each(function () {
1402
+ var $spy = $(this)
1403
+ $spy.scrollspy($spy.data())
1404
+ })
1405
+ })
1406
+
1407
+}(window.jQuery);/* ========================================================
1408
+ * bootstrap-tab.js v2.0.4
1409
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
1410
+ * ========================================================
1411
+ * Copyright 2012 Twitter, Inc.
1412
+ *
1413
+ * Licensed under the Apache License, Version 2.0 (the "License");
1414
+ * you may not use this file except in compliance with the License.
1415
+ * You may obtain a copy of the License at
1416
+ *
1417
+ * http://www.apache.org/licenses/LICENSE-2.0
1418
+ *
1419
+ * Unless required by applicable law or agreed to in writing, software
1420
+ * distributed under the License is distributed on an "AS IS" BASIS,
1421
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1422
+ * See the License for the specific language governing permissions and
1423
+ * limitations under the License.
1424
+ * ======================================================== */
1425
+
1426
+
1427
+!function ($) {
1428
+
1429
+ "use strict"; // jshint ;_;
1430
+
1431
+
1432
+ /* TAB CLASS DEFINITION
1433
+ * ==================== */
1434
+
1435
+ var Tab = function ( element ) {
1436
+ this.element = $(element)
1437
+ }
1438
+
1439
+ Tab.prototype = {
1440
+
1441
+ constructor: Tab
1442
+
1443
+ , show: function () {
1444
+ var $this = this.element
1445
+ , $ul = $this.closest('ul:not(.dropdown-menu)')
1446
+ , selector = $this.attr('data-target')
1447
+ , previous
1448
+ , $target
1449
+ , e
1450
+
1451
+ if (!selector) {
1452
+ selector = $this.attr('href')
1453
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1454
+ }
1455
+
1456
+ if ( $this.parent('li').hasClass('active') ) return
1457
+
1458
+ previous = $ul.find('.active a').last()[0]
1459
+
1460
+ e = $.Event('show', {
1461
+ relatedTarget: previous
1462
+ })
1463
+
1464
+ $this.trigger(e)
1465
+
1466
+ if (e.isDefaultPrevented()) return
1467
+
1468
+ $target = $(selector)
1469
+
1470
+ this.activate($this.parent('li'), $ul)
1471
+ this.activate($target, $target.parent(), function () {
1472
+ $this.trigger({
1473
+ type: 'shown'
1474
+ , relatedTarget: previous
1475
+ })
1476
+ })
1477
+ }
1478
+
1479
+ , activate: function ( element, container, callback) {
1480
+ var $active = container.find('> .active')
1481
+ , transition = callback
1482
+ && $.support.transition
1483
+ && $active.hasClass('fade')
1484
+
1485
+ function next() {
1486
+ $active
1487
+ .removeClass('active')
1488
+ .find('> .dropdown-menu > .active')
1489
+ .removeClass('active')
1490
+
1491
+ element.addClass('active')
1492
+
1493
+ if (transition) {
1494
+ element[0].offsetWidth // reflow for transition
1495
+ element.addClass('in')
1496
+ } else {
1497
+ element.removeClass('fade')
1498
+ }
1499
+
1500
+ if ( element.parent('.dropdown-menu') ) {
1501
+ element.closest('li.dropdown').addClass('active')
1502
+ }
1503
+
1504
+ callback && callback()
1505
+ }
1506
+
1507
+ transition ?
1508
+ $active.one($.support.transition.end, next) :
1509
+ next()
1510
+
1511
+ $active.removeClass('in')
1512
+ }
1513
+ }
1514
+
1515
+
1516
+ /* TAB PLUGIN DEFINITION
1517
+ * ===================== */
1518
+
1519
+ $.fn.tab = function ( option ) {
1520
+ return this.each(function () {
1521
+ var $this = $(this)
1522
+ , data = $this.data('tab')
1523
+ if (!data) $this.data('tab', (data = new Tab(this)))
1524
+ if (typeof option == 'string') data[option]()
1525
+ })
1526
+ }
1527
+
1528
+ $.fn.tab.Constructor = Tab
1529
+
1530
+
1531
+ /* TAB DATA-API
1532
+ * ============ */
1533
+
1534
+ $(function () {
1535
+ $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1536
+ e.preventDefault()
1537
+ $(this).tab('show')
1538
+ })
1539
+ })
1540
+
1541
+}(window.jQuery);/* =============================================================
1542
+ * bootstrap-typeahead.js v2.0.4
1543
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
1544
+ * =============================================================
1545
+ * Copyright 2012 Twitter, Inc.
1546
+ *
1547
+ * Licensed under the Apache License, Version 2.0 (the "License");
1548
+ * you may not use this file except in compliance with the License.
1549
+ * You may obtain a copy of the License at
1550
+ *
1551
+ * http://www.apache.org/licenses/LICENSE-2.0
1552
+ *
1553
+ * Unless required by applicable law or agreed to in writing, software
1554
+ * distributed under the License is distributed on an "AS IS" BASIS,
1555
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1556
+ * See the License for the specific language governing permissions and
1557
+ * limitations under the License.
1558
+ * ============================================================ */
1559
+
1560
+
1561
+!function($){
1562
+
1563
+ "use strict"; // jshint ;_;
1564
+
1565
+
1566
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
1567
+ * ================================= */
1568
+
1569
+ var Typeahead = function (element, options) {
1570
+ this.$element = $(element)
1571
+ this.options = $.extend({}, $.fn.typeahead.defaults, options)
1572
+ this.matcher = this.options.matcher || this.matcher
1573
+ this.sorter = this.options.sorter || this.sorter
1574
+ this.highlighter = this.options.highlighter || this.highlighter
1575
+ this.updater = this.options.updater || this.updater
1576
+ this.$menu = $(this.options.menu).appendTo('body')
1577
+ this.source = this.options.source
1578
+ this.shown = false
1579
+ this.listen()
1580
+ }
1581
+
1582
+ Typeahead.prototype = {
1583
+
1584
+ constructor: Typeahead
1585
+
1586
+ , select: function () {
1587
+ var val = this.$menu.find('.active').attr('data-value')
1588
+ this.$element
1589
+ .val(this.updater(val))
1590
+ .change()
1591
+ return this.hide()
1592
+ }
1593
+
1594
+ , updater: function (item) {
1595
+ return item
1596
+ }
1597
+
1598
+ , show: function () {
1599
+ var pos = $.extend({}, this.$element.offset(), {
1600
+ height: this.$element[0].offsetHeight
1601
+ })
1602
+
1603
+ this.$menu.css({
1604
+ top: pos.top + pos.height
1605
+ , left: pos.left
1606
+ })
1607
+
1608
+ this.$menu.show()
1609
+ this.shown = true
1610
+ return this
1611
+ }
1612
+
1613
+ , hide: function () {
1614
+ this.$menu.hide()
1615
+ this.shown = false
1616
+ return this
1617
+ }
1618
+
1619
+ , lookup: function (event) {
1620
+ var that = this
1621
+ , items
1622
+ , q
1623
+
1624
+ this.query = this.$element.val()
1625
+
1626
+ if (!this.query) {
1627
+ return this.shown ? this.hide() : this
1628
+ }
1629
+
1630
+ items = $.grep(this.source, function (item) {
1631
+ return that.matcher(item)
1632
+ })
1633
+
1634
+ items = this.sorter(items)
1635
+
1636
+ if (!items.length) {
1637
+ return this.shown ? this.hide() : this
1638
+ }
1639
+
1640
+ return this.render(items.slice(0, this.options.items)).show()
1641
+ }
1642
+
1643
+ , matcher: function (item) {
1644
+ return ~item.toLowerCase().indexOf(this.query.toLowerCase())
1645
+ }
1646
+
1647
+ , sorter: function (items) {
1648
+ var beginswith = []
1649
+ , caseSensitive = []
1650
+ , caseInsensitive = []
1651
+ , item
1652
+
1653
+ while (item = items.shift()) {
1654
+ if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
1655
+ else if (~item.indexOf(this.query)) caseSensitive.push(item)
1656
+ else caseInsensitive.push(item)
1657
+ }
1658
+
1659
+ return beginswith.concat(caseSensitive, caseInsensitive)
1660
+ }
1661
+
1662
+ , highlighter: function (item) {
1663
+ var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
1664
+ return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
1665
+ return '<strong>' + match + '</strong>'
1666
+ })
1667
+ }
1668
+
1669
+ , render: function (items) {
1670
+ var that = this
1671
+
1672
+ items = $(items).map(function (i, item) {
1673
+ i = $(that.options.item).attr('data-value', item)
1674
+ i.find('a').html(that.highlighter(item))
1675
+ return i[0]
1676
+ })
1677
+
1678
+ items.first().addClass('active')
1679
+ this.$menu.html(items)
1680
+ return this
1681
+ }
1682
+
1683
+ , next: function (event) {
1684
+ var active = this.$menu.find('.active').removeClass('active')
1685
+ , next = active.next()
1686
+
1687
+ if (!next.length) {
1688
+ next = $(this.$menu.find('li')[0])
1689
+ }
1690
+
1691
+ next.addClass('active')
1692
+ }
1693
+
1694
+ , prev: function (event) {
1695
+ var active = this.$menu.find('.active').removeClass('active')
1696
+ , prev = active.prev()
1697
+
1698
+ if (!prev.length) {
1699
+ prev = this.$menu.find('li').last()
1700
+ }
1701
+
1702
+ prev.addClass('active')
1703
+ }
1704
+
1705
+ , listen: function () {
1706
+ this.$element
1707
+ .on('blur', $.proxy(this.blur, this))
1708
+ .on('keypress', $.proxy(this.keypress, this))
1709
+ .on('keyup', $.proxy(this.keyup, this))
1710
+
1711
+ if ($.browser.webkit || $.browser.msie) {
1712
+ this.$element.on('keydown', $.proxy(this.keypress, this))
1713
+ }
1714
+
1715
+ this.$menu
1716
+ .on('click', $.proxy(this.click, this))
1717
+ .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
1718
+ }
1719
+
1720
+ , keyup: function (e) {
1721
+ switch(e.keyCode) {
1722
+ case 40: // down arrow
1723
+ case 38: // up arrow
1724
+ break
1725
+
1726
+ case 9: // tab
1727
+ case 13: // enter
1728
+ if (!this.shown) return
1729
+ this.select()
1730
+ break
1731
+
1732
+ case 27: // escape
1733
+ if (!this.shown) return
1734
+ this.hide()
1735
+ break
1736
+
1737
+ default:
1738
+ this.lookup()
1739
+ }
1740
+
1741
+ e.stopPropagation()
1742
+ e.preventDefault()
1743
+ }
1744
+
1745
+ , keypress: function (e) {
1746
+ if (!this.shown) return
1747
+
1748
+ switch(e.keyCode) {
1749
+ case 9: // tab
1750
+ case 13: // enter
1751
+ case 27: // escape
1752
+ e.preventDefault()
1753
+ break
1754
+
1755
+ case 38: // up arrow
1756
+ if (e.type != 'keydown') break
1757
+ e.preventDefault()
1758
+ this.prev()
1759
+ break
1760
+
1761
+ case 40: // down arrow
1762
+ if (e.type != 'keydown') break
1763
+ e.preventDefault()
1764
+ this.next()
1765
+ break
1766
+ }
1767
+
1768
+ e.stopPropagation()
1769
+ }
1770
+
1771
+ , blur: function (e) {
1772
+ var that = this
1773
+ setTimeout(function () { that.hide() }, 150)
1774
+ }
1775
+
1776
+ , click: function (e) {
1777
+ e.stopPropagation()
1778
+ e.preventDefault()
1779
+ this.select()
1780
+ }
1781
+
1782
+ , mouseenter: function (e) {
1783
+ this.$menu.find('.active').removeClass('active')
1784
+ $(e.currentTarget).addClass('active')
1785
+ }
1786
+
1787
+ }
1788
+
1789
+
1790
+ /* TYPEAHEAD PLUGIN DEFINITION
1791
+ * =========================== */
1792
+
1793
+ $.fn.typeahead = function (option) {
1794
+ return this.each(function () {
1795
+ var $this = $(this)
1796
+ , data = $this.data('typeahead')
1797
+ , options = typeof option == 'object' && option
1798
+ if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
1799
+ if (typeof option == 'string') data[option]()
1800
+ })
1801
+ }
1802
+
1803
+ $.fn.typeahead.defaults = {
1804
+ source: []
1805
+ , items: 8
1806
+ , menu: '<ul class="typeahead dropdown-menu"></ul>'
1807
+ , item: '<li><a href="#"></a></li>'
1808
+ }
1809
+
1810
+ $.fn.typeahead.Constructor = Typeahead
1811
+
1812
+
1813
+ /* TYPEAHEAD DATA-API
1814
+ * ================== */
1815
+
1816
+ $(function () {
1817
+ $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
1818
+ var $this = $(this)
1819
+ if ($this.data('typeahead')) return
1820
+ e.preventDefault()
1821
+ $this.typeahead($this.data())
1822
+ })
1823
+ })
1824
+
1825
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/bootstrap.min.js
new
+6
@@ -0,0 +1,6 @@
1
+/**
2
+* Bootstrap.js by @fat & @mdo
3
+* Copyright 2012 Twitter, Inc.
4
+* http://www.apache.org/licenses/LICENSE-2.0.txt
5
+*/
6
+!function(e){e(function(){"use strict";e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",msTransition:"MSTransitionEnd",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(function(){e("body").on("click.alert.data-api",t,n.prototype.close)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.parent('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(function(){e("body").on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(e){return e||(this.paused=!0),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f=e.Event("slide");this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u]();if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n);i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):typeof n=="string"||(n=s.slide)?i[n]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(function(){e("body").on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=!i.data("modal")&&e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(function(){e("body").on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();e(i).collapse(s)})})}(window.jQuery),!function(e){"use strict";function r(){e(t).parent().removeClass("open")}var t='[data-toggle="dropdown"]',n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),i,s,o;if(n.is(".disabled, :disabled"))return;return s=n.attr("data-target"),s||(s=n.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,"")),i=e(s),i.length||(i=n.parent()),o=i.hasClass("open"),r(),o||i.toggleClass("open"),!1}},e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e(function(){e("html").on("click.dropdown.data-api",r),e("body").on("click.dropdown",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle)})}(window.jQuery),!function(e){"use strict";function n(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),r.call(t)},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),r.call(t)})}function r(e){this.$element.hide().trigger("hidden"),i.call(this)}function i(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(s,this)):s.call(this)):t&&t()}function s(){this.$backdrop.remove(),this.$backdrop=null}function o(){var t=this;this.isShown&&this.options.keyboard?e(document).on("keyup.dismiss.modal",function(e){e.which==27&&t.hide()}):this.isShown||e(document).off("keyup.dismiss.modal")}var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this))};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;e("body").addClass("modal-open"),this.isShown=!0,o.call(this),i.call(this,function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in"),n?t.$element.one(e.support.transition.end,function(){t.$element.trigger("shown")}):t.$element.trigger("shown")})},hide:function(t){t&&t.preventDefault();var i=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,e("body").removeClass("modal-open"),o.call(this),this.$element.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?n.call(this):r.call(this)}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(function(){e("body").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({},i.data(),n.data());t.preventDefault(),i.modal(s)})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},isHTML:function(e){return typeof e!="string"||e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3||/^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(e)},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.isHTML(t)?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.remove()})}var t=this,n=this.tip();n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.remove()},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.isHTML(t)?"html":"text"](t),e.find(".popover-content > *")[this.isHTML(n)?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&n.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu")&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active a").last()[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(function(){e("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n=this,r,i;return this.query=this.$element.val(),this.query?(r=e.grep(this.source,function(e){return n.matcher(e)}),r=this.sorter(r),r.length?this.render(r.slice(0,this.options.items)).show():this.shown?this.hide():this):this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),(e.browser.webkit||e.browser.msie)&&this.$element.on("keydown",e.proxy(this.keypress,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},keyup:function(e){switch(e.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},keypress:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:if(e.type!="keydown")break;e.preventDefault(),this.prev();break;case 40:if(e.type!="keydown")break;e.preventDefault(),this.next()}e.stopPropagation()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>'},e.fn.typeahead.Constructor=t,e(function(){e("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})})}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/docs/assets/js/google-code-prettify/prettify.css
new
+115
@@ -0,0 +1,115 @@
1
+/* .com { color: #93a1a1; } */
2
+/* .lit { color: #195f91; } */
3
+/* .pun, .opn, .clo { color: #93a1a1; } */
4
+/* .fun { color: #dc322f; } */
5
+/* .str, .atv { color: #D14; } */
6
+/* .kwd, .linenums .tag { color: #1e347b; } */
7
+/* .typ, .atn, .dec, .var { color: teal; } */
8
+/* .pln { color: #48484c; } */
9
+
10
+/* .prettyprint { */
11
+/* padding: 8px; */
12
+/* background-color: #f9f9f9; */
13
+/* border: 1px solid #e1e1e8; */
14
+/* } */
15
+/* .prettyprint.linenums { */
16
+/* -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; */
17
+/* -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; */
18
+/* box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; */
19
+/* } */
20
+
21
+/* /1* Specify class=linenums on a pre to get line numbering *1/ */
22
+/* ol.linenums { */
23
+/* margin: 0 0 0 33px; /1* IE indents via margin-left *1/ */
24
+/* } */
25
+/* ol.linenums li { */
26
+/* padding-left: 12px; */
27
+/* color: #bebec5; */
28
+/* line-height: 18px; */
29
+/* text-shadow: 0 1px 0 #fff; */
30
+/* } */
31
+
32
+
33
+
34
+/* Jordow's theme */
35
+/* .com { */
36
+/* color: rgba(90, 117, 200, 1); */
37
+/* } */
38
+/* .lit { color: #195f91; } */
39
+/* .pun, .opn, .clo { color: #90908e; } */
40
+/* .fun { color: #dc322f; } */
41
+/* .str, .atv { color: #9a9; } */
42
+/* .kwd, .linenums .tag { color: rgba(90, 117, 200, 1)} */
43
+/* .typ, .atn, .dec, .var { color: #b86050; } */
44
+/* .pln { color: #555550; } */
45
+
46
+/* .prettyprint { */
47
+/* padding: 8px; */
48
+/* background-color: rgb(253,253,253); */
49
+/* border: 1px solid #e0e0e7; */
50
+/* } */
51
+/* .prettyprint.linenums { */
52
+/* -webkit-box-shadow: inset 40px 0 0 #f9f9f9, inset 41px 0 0 #E8E8EE; */
53
+/* -moz-box-shadow: inset 40px 0 0 #f9f9f9, inset 41px 0 0 #E8E8EE; */
54
+/* box-shadow: inset 40px 0 0 #f9f9f9, inset 41px 0 0 #E8E8EE; */
55
+/* } */
56
+
57
+/* /1* Specify class=linenums on a pre to get line numbering *1/ */
58
+/* ol.linenums { */
59
+/* margin: 0 0 0 33px; /1* IE indents via margin-left *1/ */
60
+/* } */
61
+/* ol.linenums li { */
62
+/* padding-left: 12px; */
63
+/* color: #ceced5; */
64
+/* line-height: 18px; */
65
+/* text-shadow: 0 1px 0 #fff; */
66
+/* } */
67
+
68
+/* code { */
69
+/* /*border: 1px solid #E8E8EE;*/ */
70
+/* box-sizing: border-box; */
71
+/* padding: 1px 2px; */
72
+/* background-color: #f7f7f7; */
73
+/* color: rgba(90, 117, 200, 1); */
74
+/* border: 1px solid #E8E8EE; */
75
+/* } */
76
+
77
+
78
+/** USE THE YELLOW THEME: */
79
+/* http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html */
80
+.lit { color: #195f91; }
81
+.pun, .opn, .clo { color: #93a1a1; }
82
+.fun { color: #dc322f; }
83
+.str, .atv { color: #268bd2; }
84
+.kwd, .tag { color: #195f91; }
85
+.typ, .atn, .dec, .var { color: #CB4B16; }
86
+.pln { color: #555 /*color: #93a1a1;*/ }
87
+pre.prettyprint {
88
+ background: #fefbf3;
89
+ padding: 9px;
90
+ border: 1px solid rgba(0,0,0,.2);
91
+ -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.1);
92
+ -moz-box-shadow: 0 1px 2px rgba(0,0,0,.1);
93
+ box-shadow: 0 1px 2px rgba(0,0,0,.1);
94
+}
95
+.com {
96
+ color: rgb(110, 130, 117);
97
+}
98
+
99
+/* Specify class=linenums on a pre to get line numbering */
100
+ol.linenums {
101
+ margin: 0 0 0 33px; /* IE indents via margin-left */
102
+}
103
+ol.linenums li {
104
+ padding-left: 12px;
105
+ color: #ceced5;
106
+ line-height: 18px;
107
+ text-shadow: 0 1px 0 #fff;
108
+}
109
+
110
+
111
+/* Alternate shading for lines */
112
+li.L1, li.L3, li.L5, li.L7, li.L9 { }
113
+
114
+
115
+
docs/docs/likebutton/docs/assets/js/google-code-prettify/prettify.js
new
+28
@@ -0,0 +1,28 @@
1
+var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
2
+(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
3
+[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
4
+f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
5
+(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
6
+{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
7
+t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
8
+"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
9
+l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
10
+q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
11
+q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
12
+"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
13
+a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
14
+for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
15
+m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
16
+a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
17
+j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
18
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
19
+H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
20
+J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
21
+I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
22
+["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
23
+/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
24
+["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
25
+hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
26
+!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
27
+250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
28
+PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
docs/docs/likebutton/docs/assets/js/jquery.js
new
+9252
@@ -0,0 +1,9252 @@
1
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
2
+(function( window, undefined ) {
3
+
4
+// Use the correct document accordingly with window argument (sandbox)
5
+var document = window.document,
6
+ navigator = window.navigator,
7
+ location = window.location;
8
+var jQuery = (function() {
9
+
10
+// Define a local copy of jQuery
11
+var jQuery = function( selector, context ) {
12
+ // The jQuery object is actually just the init constructor 'enhanced'
13
+ return new jQuery.fn.init( selector, context, rootjQuery );
14
+ },
15
+
16
+ // Map over jQuery in case of overwrite
17
+ _jQuery = window.jQuery,
18
+
19
+ // Map over the $ in case of overwrite
20
+ _$ = window.$,
21
+
22
+ // A central reference to the root jQuery(document)
23
+ rootjQuery,
24
+
25
+ // A simple way to check for HTML strings or ID strings
26
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
27
+ quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
28
+
29
+ // Check if a string has a non-whitespace character in it
30
+ rnotwhite = /\S/,
31
+
32
+ // Used for trimming whitespace
33
+ trimLeft = /^\s+/,
34
+ trimRight = /\s+$/,
35
+
36
+ // Match a standalone tag
37
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
38
+
39
+ // JSON RegExp
40
+ rvalidchars = /^[\],:{}\s]*$/,
41
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
42
+ rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
43
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
44
+
45
+ // Useragent RegExp
46
+ rwebkit = /(webkit)[ \/]([\w.]+)/,
47
+ ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
48
+ rmsie = /(msie) ([\w.]+)/,
49
+ rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
50
+
51
+ // Matches dashed string for camelizing
52
+ rdashAlpha = /-([a-z]|[0-9])/ig,
53
+ rmsPrefix = /^-ms-/,
54
+
55
+ // Used by jQuery.camelCase as callback to replace()
56
+ fcamelCase = function( all, letter ) {
57
+ return ( letter + "" ).toUpperCase();
58
+ },
59
+
60
+ // Keep a UserAgent string for use with jQuery.browser
61
+ userAgent = navigator.userAgent,
62
+
63
+ // For matching the engine and version of the browser
64
+ browserMatch,
65
+
66
+ // The deferred used on DOM ready
67
+ readyList,
68
+
69
+ // The ready event handler
70
+ DOMContentLoaded,
71
+
72
+ // Save a reference to some core methods
73
+ toString = Object.prototype.toString,
74
+ hasOwn = Object.prototype.hasOwnProperty,
75
+ push = Array.prototype.push,
76
+ slice = Array.prototype.slice,
77
+ trim = String.prototype.trim,
78
+ indexOf = Array.prototype.indexOf,
79
+
80
+ // [[Class]] -> type pairs
81
+ class2type = {};
82
+
83
+jQuery.fn = jQuery.prototype = {
84
+ constructor: jQuery,
85
+ init: function( selector, context, rootjQuery ) {
86
+ var match, elem, ret, doc;
87
+
88
+ // Handle $(""), $(null), or $(undefined)
89
+ if ( !selector ) {
90
+ return this;
91
+ }
92
+
93
+ // Handle $(DOMElement)
94
+ if ( selector.nodeType ) {
95
+ this.context = this[0] = selector;
96
+ this.length = 1;
97
+ return this;
98
+ }
99
+
100
+ // The body element only exists once, optimize finding it
101
+ if ( selector === "body" && !context && document.body ) {
102
+ this.context = document;
103
+ this[0] = document.body;
104
+ this.selector = selector;
105
+ this.length = 1;
106
+ return this;
107
+ }
108
+
109
+ // Handle HTML strings
110
+ if ( typeof selector === "string" ) {
111
+ // Are we dealing with HTML string or an ID?
112
+ if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
113
+ // Assume that strings that start and end with <> are HTML and skip the regex check
114
+ match = [ null, selector, null ];
115
+
116
+ } else {
117
+ match = quickExpr.exec( selector );
118
+ }
119
+
120
+ // Verify a match, and that no context was specified for #id
121
+ if ( match && (match[1] || !context) ) {
122
+
123
+ // HANDLE: $(html) -> $(array)
124
+ if ( match[1] ) {
125
+ context = context instanceof jQuery ? context[0] : context;
126
+ doc = ( context ? context.ownerDocument || context : document );
127
+
128
+ // If a single string is passed in and it's a single tag
129
+ // just do a createElement and skip the rest
130
+ ret = rsingleTag.exec( selector );
131
+
132
+ if ( ret ) {
133
+ if ( jQuery.isPlainObject( context ) ) {
134
+ selector = [ document.createElement( ret[1] ) ];
135
+ jQuery.fn.attr.call( selector, context, true );
136
+
137
+ } else {
138
+ selector = [ doc.createElement( ret[1] ) ];
139
+ }
140
+
141
+ } else {
142
+ ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
143
+ selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
144
+ }
145
+
146
+ return jQuery.merge( this, selector );
147
+
148
+ // HANDLE: $("#id")
149
+ } else {
150
+ elem = document.getElementById( match[2] );
151
+
152
+ // Check parentNode to catch when Blackberry 4.6 returns
153
+ // nodes that are no longer in the document #6963
154
+ if ( elem && elem.parentNode ) {
155
+ // Handle the case where IE and Opera return items
156
+ // by name instead of ID
157
+ if ( elem.id !== match[2] ) {
158
+ return rootjQuery.find( selector );
159
+ }
160
+
161
+ // Otherwise, we inject the element directly into the jQuery object
162
+ this.length = 1;
163
+ this[0] = elem;
164
+ }
165
+
166
+ this.context = document;
167
+ this.selector = selector;
168
+ return this;
169
+ }
170
+
171
+ // HANDLE: $(expr, $(...))
172
+ } else if ( !context || context.jquery ) {
173
+ return ( context || rootjQuery ).find( selector );
174
+
175
+ // HANDLE: $(expr, context)
176
+ // (which is just equivalent to: $(context).find(expr)
177
+ } else {
178
+ return this.constructor( context ).find( selector );
179
+ }
180
+
181
+ // HANDLE: $(function)
182
+ // Shortcut for document ready
183
+ } else if ( jQuery.isFunction( selector ) ) {
184
+ return rootjQuery.ready( selector );
185
+ }
186
+
187
+ if ( selector.selector !== undefined ) {
188
+ this.selector = selector.selector;
189
+ this.context = selector.context;
190
+ }
191
+
192
+ return jQuery.makeArray( selector, this );
193
+ },
194
+
195
+ // Start with an empty selector
196
+ selector: "",
197
+
198
+ // The current version of jQuery being used
199
+ jquery: "1.7.1",
200
+
201
+ // The default length of a jQuery object is 0
202
+ length: 0,
203
+
204
+ // The number of elements contained in the matched element set
205
+ size: function() {
206
+ return this.length;
207
+ },
208
+
209
+ toArray: function() {
210
+ return slice.call( this, 0 );
211
+ },
212
+
213
+ // Get the Nth element in the matched element set OR
214
+ // Get the whole matched element set as a clean array
215
+ get: function( num ) {
216
+ return num == null ?
217
+
218
+ // Return a 'clean' array
219
+ this.toArray() :
220
+
221
+ // Return just the object
222
+ ( num < 0 ? this[ this.length + num ] : this[ num ] );
223
+ },
224
+
225
+ // Take an array of elements and push it onto the stack
226
+ // (returning the new matched element set)
227
+ pushStack: function( elems, name, selector ) {
228
+ // Build a new jQuery matched element set
229
+ var ret = this.constructor();
230
+
231
+ if ( jQuery.isArray( elems ) ) {
232
+ push.apply( ret, elems );
233
+
234
+ } else {
235
+ jQuery.merge( ret, elems );
236
+ }
237
+
238
+ // Add the old object onto the stack (as a reference)
239
+ ret.prevObject = this;
240
+
241
+ ret.context = this.context;
242
+
243
+ if ( name === "find" ) {
244
+ ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
245
+ } else if ( name ) {
246
+ ret.selector = this.selector + "." + name + "(" + selector + ")";
247
+ }
248
+
249
+ // Return the newly-formed element set
250
+ return ret;
251
+ },
252
+
253
+ // Execute a callback for every element in the matched set.
254
+ // (You can seed the arguments with an array of args, but this is
255
+ // only used internally.)
256
+ each: function( callback, args ) {
257
+ return jQuery.each( this, callback, args );
258
+ },
259
+
260
+ ready: function( fn ) {
261
+ // Attach the listeners
262
+ jQuery.bindReady();
263
+
264
+ // Add the callback
265
+ readyList.add( fn );
266
+
267
+ return this;
268
+ },
269
+
270
+ eq: function( i ) {
271
+ i = +i;
272
+ return i === -1 ?
273
+ this.slice( i ) :
274
+ this.slice( i, i + 1 );
275
+ },
276
+
277
+ first: function() {
278
+ return this.eq( 0 );
279
+ },
280
+
281
+ last: function() {
282
+ return this.eq( -1 );
283
+ },
284
+
285
+ slice: function() {
286
+ return this.pushStack( slice.apply( this, arguments ),
287
+ "slice", slice.call(arguments).join(",") );
288
+ },
289
+
290
+ map: function( callback ) {
291
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
292
+ return callback.call( elem, i, elem );
293
+ }));
294
+ },
295
+
296
+ end: function() {
297
+ return this.prevObject || this.constructor(null);
298
+ },
299
+
300
+ // For internal use only.
301
+ // Behaves like an Array's method, not like a jQuery method.
302
+ push: push,
303
+ sort: [].sort,
304
+ splice: [].splice
305
+};
306
+
307
+// Give the init function the jQuery prototype for later instantiation
308
+jQuery.fn.init.prototype = jQuery.fn;
309
+
310
+jQuery.extend = jQuery.fn.extend = function() {
311
+ var options, name, src, copy, copyIsArray, clone,
312
+ target = arguments[0] || {},
313
+ i = 1,
314
+ length = arguments.length,
315
+ deep = false;
316
+
317
+ // Handle a deep copy situation
318
+ if ( typeof target === "boolean" ) {
319
+ deep = target;
320
+ target = arguments[1] || {};
321
+ // skip the boolean and the target
322
+ i = 2;
323
+ }
324
+
325
+ // Handle case when target is a string or something (possible in deep copy)
326
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
327
+ target = {};
328
+ }
329
+
330
+ // extend jQuery itself if only one argument is passed
331
+ if ( length === i ) {
332
+ target = this;
333
+ --i;
334
+ }
335
+
336
+ for ( ; i < length; i++ ) {
337
+ // Only deal with non-null/undefined values
338
+ if ( (options = arguments[ i ]) != null ) {
339
+ // Extend the base object
340
+ for ( name in options ) {
341
+ src = target[ name ];
342
+ copy = options[ name ];
343
+
344
+ // Prevent never-ending loop
345
+ if ( target === copy ) {
346
+ continue;
347
+ }
348
+
349
+ // Recurse if we're merging plain objects or arrays
350
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
351
+ if ( copyIsArray ) {
352
+ copyIsArray = false;
353
+ clone = src && jQuery.isArray(src) ? src : [];
354
+
355
+ } else {
356
+ clone = src && jQuery.isPlainObject(src) ? src : {};
357
+ }
358
+
359
+ // Never move original objects, clone them
360
+ target[ name ] = jQuery.extend( deep, clone, copy );
361
+
362
+ // Don't bring in undefined values
363
+ } else if ( copy !== undefined ) {
364
+ target[ name ] = copy;
365
+ }
366
+ }
367
+ }
368
+ }
369
+
370
+ // Return the modified object
371
+ return target;
372
+};
373
+
374
+jQuery.extend({
375
+ noConflict: function( deep ) {
376
+ if ( window.$ === jQuery ) {
377
+ window.$ = _$;
378
+ }
379
+
380
+ if ( deep && window.jQuery === jQuery ) {
381
+ window.jQuery = _jQuery;
382
+ }
383
+
384
+ return jQuery;
385
+ },
386
+
387
+ // Is the DOM ready to be used? Set to true once it occurs.
388
+ isReady: false,
389
+
390
+ // A counter to track how many items to wait for before
391
+ // the ready event fires. See #6781
392
+ readyWait: 1,
393
+
394
+ // Hold (or release) the ready event
395
+ holdReady: function( hold ) {
396
+ if ( hold ) {
397
+ jQuery.readyWait++;
398
+ } else {
399
+ jQuery.ready( true );
400
+ }
401
+ },
402
+
403
+ // Handle when the DOM is ready
404
+ ready: function( wait ) {
405
+ // Either a released hold or an DOMready/load event and not yet ready
406
+ if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
407
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
408
+ if ( !document.body ) {
409
+ return setTimeout( jQuery.ready, 1 );
410
+ }
411
+
412
+ // Remember that the DOM is ready
413
+ jQuery.isReady = true;
414
+
415
+ // If a normal DOM Ready event fired, decrement, and wait if need be
416
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
417
+ return;
418
+ }
419
+
420
+ // If there are functions bound, to execute
421
+ readyList.fireWith( document, [ jQuery ] );
422
+
423
+ // Trigger any bound ready events
424
+ if ( jQuery.fn.trigger ) {
425
+ jQuery( document ).trigger( "ready" ).off( "ready" );
426
+ }
427
+ }
428
+ },
429
+
430
+ bindReady: function() {
431
+ if ( readyList ) {
432
+ return;
433
+ }
434
+
435
+ readyList = jQuery.Callbacks( "once memory" );
436
+
437
+ // Catch cases where $(document).ready() is called after the
438
+ // browser event has already occurred.
439
+ if ( document.readyState === "complete" ) {
440
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
441
+ return setTimeout( jQuery.ready, 1 );
442
+ }
443
+
444
+ // Mozilla, Opera and webkit nightlies currently support this event
445
+ if ( document.addEventListener ) {
446
+ // Use the handy event callback
447
+ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
448
+
449
+ // A fallback to window.onload, that will always work
450
+ window.addEventListener( "load", jQuery.ready, false );
451
+
452
+ // If IE event model is used
453
+ } else if ( document.attachEvent ) {
454
+ // ensure firing before onload,
455
+ // maybe late but safe also for iframes
456
+ document.attachEvent( "onreadystatechange", DOMContentLoaded );
457
+
458
+ // A fallback to window.onload, that will always work
459
+ window.attachEvent( "onload", jQuery.ready );
460
+
461
+ // If IE and not a frame
462
+ // continually check to see if the document is ready
463
+ var toplevel = false;
464
+
465
+ try {
466
+ toplevel = window.frameElement == null;
467
+ } catch(e) {}
468
+
469
+ if ( document.documentElement.doScroll && toplevel ) {
470
+ doScrollCheck();
471
+ }
472
+ }
473
+ },
474
+
475
+ // See test/unit/core.js for details concerning isFunction.
476
+ // Since version 1.3, DOM methods and functions like alert
477
+ // aren't supported. They return false on IE (#2968).
478
+ isFunction: function( obj ) {
479
+ return jQuery.type(obj) === "function";
480
+ },
481
+
482
+ isArray: Array.isArray || function( obj ) {
483
+ return jQuery.type(obj) === "array";
484
+ },
485
+
486
+ // A crude way of determining if an object is a window
487
+ isWindow: function( obj ) {
488
+ return obj && typeof obj === "object" && "setInterval" in obj;
489
+ },
490
+
491
+ isNumeric: function( obj ) {
492
+ return !isNaN( parseFloat(obj) ) && isFinite( obj );
493
+ },
494
+
495
+ type: function( obj ) {
496
+ return obj == null ?
497
+ String( obj ) :
498
+ class2type[ toString.call(obj) ] || "object";
499
+ },
500
+
501
+ isPlainObject: function( obj ) {
502
+ // Must be an Object.
503
+ // Because of IE, we also have to check the presence of the constructor property.
504
+ // Make sure that DOM nodes and window objects don't pass through, as well
505
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
506
+ return false;
507
+ }
508
+
509
+ try {
510
+ // Not own constructor property must be Object
511
+ if ( obj.constructor &&
512
+ !hasOwn.call(obj, "constructor") &&
513
+ !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
514
+ return false;
515
+ }
516
+ } catch ( e ) {
517
+ // IE8,9 Will throw exceptions on certain host objects #9897
518
+ return false;
519
+ }
520
+
521
+ // Own properties are enumerated firstly, so to speed up,
522
+ // if last one is own, then all properties are own.
523
+
524
+ var key;
525
+ for ( key in obj ) {}
526
+
527
+ return key === undefined || hasOwn.call( obj, key );
528
+ },
529
+
530
+ isEmptyObject: function( obj ) {
531
+ for ( var name in obj ) {
532
+ return false;
533
+ }
534
+ return true;
535
+ },
536
+
537
+ error: function( msg ) {
538
+ throw new Error( msg );
539
+ },
540
+
541
+ parseJSON: function( data ) {
542
+ if ( typeof data !== "string" || !data ) {
543
+ return null;
544
+ }
545
+
546
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
547
+ data = jQuery.trim( data );
548
+
549
+ // Attempt to parse using the native JSON parser first
550
+ if ( window.JSON && window.JSON.parse ) {
551
+ return window.JSON.parse( data );
552
+ }
553
+
554
+ // Make sure the incoming data is actual JSON
555
+ // Logic borrowed from http://json.org/json2.js
556
+ if ( rvalidchars.test( data.replace( rvalidescape, "@" )
557
+ .replace( rvalidtokens, "]" )
558
+ .replace( rvalidbraces, "")) ) {
559
+
560
+ return ( new Function( "return " + data ) )();
561
+
562
+ }
563
+ jQuery.error( "Invalid JSON: " + data );
564
+ },
565
+
566
+ // Cross-browser xml parsing
567
+ parseXML: function( data ) {
568
+ var xml, tmp;
569
+ try {
570
+ if ( window.DOMParser ) { // Standard
571
+ tmp = new DOMParser();
572
+ xml = tmp.parseFromString( data , "text/xml" );
573
+ } else { // IE
574
+ xml = new ActiveXObject( "Microsoft.XMLDOM" );
575
+ xml.async = "false";
576
+ xml.loadXML( data );
577
+ }
578
+ } catch( e ) {
579
+ xml = undefined;
580
+ }
581
+ if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
582
+ jQuery.error( "Invalid XML: " + data );
583
+ }
584
+ return xml;
585
+ },
586
+
587
+ noop: function() {},
588
+
589
+ // Evaluates a script in a global context
590
+ // Workarounds based on findings by Jim Driscoll
591
+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
592
+ globalEval: function( data ) {
593
+ if ( data && rnotwhite.test( data ) ) {
594
+ // We use execScript on Internet Explorer
595
+ // We use an anonymous function so that context is window
596
+ // rather than jQuery in Firefox
597
+ ( window.execScript || function( data ) {
598
+ window[ "eval" ].call( window, data );
599
+ } )( data );
600
+ }
601
+ },
602
+
603
+ // Convert dashed to camelCase; used by the css and data modules
604
+ // Microsoft forgot to hump their vendor prefix (#9572)
605
+ camelCase: function( string ) {
606
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
607
+ },
608
+
609
+ nodeName: function( elem, name ) {
610
+ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
611
+ },
612
+
613
+ // args is for internal usage only
614
+ each: function( object, callback, args ) {
615
+ var name, i = 0,
616
+ length = object.length,
617
+ isObj = length === undefined || jQuery.isFunction( object );
618
+
619
+ if ( args ) {
620
+ if ( isObj ) {
621
+ for ( name in object ) {
622
+ if ( callback.apply( object[ name ], args ) === false ) {
623
+ break;
624
+ }
625
+ }
626
+ } else {
627
+ for ( ; i < length; ) {
628
+ if ( callback.apply( object[ i++ ], args ) === false ) {
629
+ break;
630
+ }
631
+ }
632
+ }
633
+
634
+ // A special, fast, case for the most common use of each
635
+ } else {
636
+ if ( isObj ) {
637
+ for ( name in object ) {
638
+ if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
639
+ break;
640
+ }
641
+ }
642
+ } else {
643
+ for ( ; i < length; ) {
644
+ if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
645
+ break;
646
+ }
647
+ }
648
+ }
649
+ }
650
+
651
+ return object;
652
+ },
653
+
654
+ // Use native String.trim function wherever possible
655
+ trim: trim ?
656
+ function( text ) {
657
+ return text == null ?
658
+ "" :
659
+ trim.call( text );
660
+ } :
661
+
662
+ // Otherwise use our own trimming functionality
663
+ function( text ) {
664
+ return text == null ?
665
+ "" :
666
+ text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
667
+ },
668
+
669
+ // results is for internal usage only
670
+ makeArray: function( array, results ) {
671
+ var ret = results || [];
672
+
673
+ if ( array != null ) {
674
+ // The window, strings (and functions) also have 'length'
675
+ // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
676
+ var type = jQuery.type( array );
677
+
678
+ if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
679
+ push.call( ret, array );
680
+ } else {
681
+ jQuery.merge( ret, array );
682
+ }
683
+ }
684
+
685
+ return ret;
686
+ },
687
+
688
+ inArray: function( elem, array, i ) {
689
+ var len;
690
+
691
+ if ( array ) {
692
+ if ( indexOf ) {
693
+ return indexOf.call( array, elem, i );
694
+ }
695
+
696
+ len = array.length;
697
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
698
+
699
+ for ( ; i < len; i++ ) {
700
+ // Skip accessing in sparse arrays
701
+ if ( i in array && array[ i ] === elem ) {
702
+ return i;
703
+ }
704
+ }
705
+ }
706
+
707
+ return -1;
708
+ },
709
+
710
+ merge: function( first, second ) {
711
+ var i = first.length,
712
+ j = 0;
713
+
714
+ if ( typeof second.length === "number" ) {
715
+ for ( var l = second.length; j < l; j++ ) {
716
+ first[ i++ ] = second[ j ];
717
+ }
718
+
719
+ } else {
720
+ while ( second[j] !== undefined ) {
721
+ first[ i++ ] = second[ j++ ];
722
+ }
723
+ }
724
+
725
+ first.length = i;
726
+
727
+ return first;
728
+ },
729
+
730
+ grep: function( elems, callback, inv ) {
731
+ var ret = [], retVal;
732
+ inv = !!inv;
733
+
734
+ // Go through the array, only saving the items
735
+ // that pass the validator function
736
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
737
+ retVal = !!callback( elems[ i ], i );
738
+ if ( inv !== retVal ) {
739
+ ret.push( elems[ i ] );
740
+ }
741
+ }
742
+
743
+ return ret;
744
+ },
745
+
746
+ // arg is for internal usage only
747
+ map: function( elems, callback, arg ) {
748
+ var value, key, ret = [],
749
+ i = 0,
750
+ length = elems.length,
751
+ // jquery objects are treated as arrays
752
+ isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
753
+
754
+ // Go through the array, translating each of the items to their
755
+ if ( isArray ) {
756
+ for ( ; i < length; i++ ) {
757
+ value = callback( elems[ i ], i, arg );
758
+
759
+ if ( value != null ) {
760
+ ret[ ret.length ] = value;
761
+ }
762
+ }
763
+
764
+ // Go through every key on the object
765
+ } else {
766
+ for ( key in elems ) {
767
+ value = callback( elems[ key ], key, arg );
768
+
769
+ if ( value != null ) {
770
+ ret[ ret.length ] = value;
771
+ }
772
+ }
773
+ }
774
+
775
+ // Flatten any nested arrays
776
+ return ret.concat.apply( [], ret );
777
+ },
778
+
779
+ // A global GUID counter for objects
780
+ guid: 1,
781
+
782
+ // Bind a function to a context, optionally partially applying any
783
+ // arguments.
784
+ proxy: function( fn, context ) {
785
+ if ( typeof context === "string" ) {
786
+ var tmp = fn[ context ];
787
+ context = fn;
788
+ fn = tmp;
789
+ }
790
+
791
+ // Quick check to determine if target is callable, in the spec
792
+ // this throws a TypeError, but we will just return undefined.
793
+ if ( !jQuery.isFunction( fn ) ) {
794
+ return undefined;
795
+ }
796
+
797
+ // Simulated bind
798
+ var args = slice.call( arguments, 2 ),
799
+ proxy = function() {
800
+ return fn.apply( context, args.concat( slice.call( arguments ) ) );
801
+ };
802
+
803
+ // Set the guid of unique handler to the same of original handler, so it can be removed
804
+ proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
805
+
806
+ return proxy;
807
+ },
808
+
809
+ // Mutifunctional method to get and set values to a collection
810
+ // The value/s can optionally be executed if it's a function
811
+ access: function( elems, key, value, exec, fn, pass ) {
812
+ var length = elems.length;
813
+
814
+ // Setting many attributes
815
+ if ( typeof key === "object" ) {
816
+ for ( var k in key ) {
817
+ jQuery.access( elems, k, key[k], exec, fn, value );
818
+ }
819
+ return elems;
820
+ }
821
+
822
+ // Setting one attribute
823
+ if ( value !== undefined ) {
824
+ // Optionally, function values get executed if exec is true
825
+ exec = !pass && exec && jQuery.isFunction(value);
826
+
827
+ for ( var i = 0; i < length; i++ ) {
828
+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
829
+ }
830
+
831
+ return elems;
832
+ }
833
+
834
+ // Getting an attribute
835
+ return length ? fn( elems[0], key ) : undefined;
836
+ },
837
+
838
+ now: function() {
839
+ return ( new Date() ).getTime();
840
+ },
841
+
842
+ // Use of jQuery.browser is frowned upon.
843
+ // More details: http://docs.jquery.com/Utilities/jQuery.browser
844
+ uaMatch: function( ua ) {
845
+ ua = ua.toLowerCase();
846
+
847
+ var match = rwebkit.exec( ua ) ||
848
+ ropera.exec( ua ) ||
849
+ rmsie.exec( ua ) ||
850
+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
851
+ [];
852
+
853
+ return { browser: match[1] || "", version: match[2] || "0" };
854
+ },
855
+
856
+ sub: function() {
857
+ function jQuerySub( selector, context ) {
858
+ return new jQuerySub.fn.init( selector, context );
859
+ }
860
+ jQuery.extend( true, jQuerySub, this );
861
+ jQuerySub.superclass = this;
862
+ jQuerySub.fn = jQuerySub.prototype = this();
863
+ jQuerySub.fn.constructor = jQuerySub;
864
+ jQuerySub.sub = this.sub;
865
+ jQuerySub.fn.init = function init( selector, context ) {
866
+ if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
867
+ context = jQuerySub( context );
868
+ }
869
+
870
+ return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
871
+ };
872
+ jQuerySub.fn.init.prototype = jQuerySub.fn;
873
+ var rootjQuerySub = jQuerySub(document);
874
+ return jQuerySub;
875
+ },
876
+
877
+ browser: {}
878
+});
879
+
880
+// Populate the class2type map
881
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
882
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
883
+});
884
+
885
+browserMatch = jQuery.uaMatch( userAgent );
886
+if ( browserMatch.browser ) {
887
+ jQuery.browser[ browserMatch.browser ] = true;
888
+ jQuery.browser.version = browserMatch.version;
889
+}
890
+
891
+// Deprecated, use jQuery.browser.webkit instead
892
+if ( jQuery.browser.webkit ) {
893
+ jQuery.browser.safari = true;
894
+}
895
+
896
+// IE doesn't match non-breaking spaces with \s
897
+if ( rnotwhite.test( "\xA0" ) ) {
898
+ trimLeft = /^[\s\xA0]+/;
899
+ trimRight = /[\s\xA0]+$/;
900
+}
901
+
902
+// All jQuery objects should point back to these
903
+rootjQuery = jQuery(document);
904
+
905
+// Cleanup functions for the document ready method
906
+if ( document.addEventListener ) {
907
+ DOMContentLoaded = function() {
908
+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
909
+ jQuery.ready();
910
+ };
911
+
912
+} else if ( document.attachEvent ) {
913
+ DOMContentLoaded = function() {
914
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
915
+ if ( document.readyState === "complete" ) {
916
+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
917
+ jQuery.ready();
918
+ }
919
+ };
920
+}
921
+
922
+// The DOM ready check for Internet Explorer
923
+function doScrollCheck() {
924
+ if ( jQuery.isReady ) {
925
+ return;
926
+ }
927
+
928
+ try {
929
+ // If IE is used, use the trick by Diego Perini
930
+ // http://javascript.nwbox.com/IEContentLoaded/
931
+ document.documentElement.doScroll("left");
932
+ } catch(e) {
933
+ setTimeout( doScrollCheck, 1 );
934
+ return;
935
+ }
936
+
937
+ // and execute any waiting functions
938
+ jQuery.ready();
939
+}
940
+
941
+return jQuery;
942
+
943
+})();
944
+
945
+
946
+// String to Object flags format cache
947
+var flagsCache = {};
948
+
949
+// Convert String-formatted flags into Object-formatted ones and store in cache
950
+function createFlags( flags ) {
951
+ var object = flagsCache[ flags ] = {},
952
+ i, length;
953
+ flags = flags.split( /\s+/ );
954
+ for ( i = 0, length = flags.length; i < length; i++ ) {
955
+ object[ flags[i] ] = true;
956
+ }
957
+ return object;
958
+}
959
+
960
+/*
961
+ * Create a callback list using the following parameters:
962
+ *
963
+ * flags: an optional list of space-separated flags that will change how
964
+ * the callback list behaves
965
+ *
966
+ * By default a callback list will act like an event callback list and can be
967
+ * "fired" multiple times.
968
+ *
969
+ * Possible flags:
970
+ *
971
+ * once: will ensure the callback list can only be fired once (like a Deferred)
972
+ *
973
+ * memory: will keep track of previous values and will call any callback added
974
+ * after the list has been fired right away with the latest "memorized"
975
+ * values (like a Deferred)
976
+ *
977
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
978
+ *
979
+ * stopOnFalse: interrupt callings when a callback returns false
980
+ *
981
+ */
982
+jQuery.Callbacks = function( flags ) {
983
+
984
+ // Convert flags from String-formatted to Object-formatted
985
+ // (we check in cache first)
986
+ flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
987
+
988
+ var // Actual callback list
989
+ list = [],
990
+ // Stack of fire calls for repeatable lists
991
+ stack = [],
992
+ // Last fire value (for non-forgettable lists)
993
+ memory,
994
+ // Flag to know if list is currently firing
995
+ firing,
996
+ // First callback to fire (used internally by add and fireWith)
997
+ firingStart,
998
+ // End of the loop when firing
999
+ firingLength,
1000
+ // Index of currently firing callback (modified by remove if needed)
1001
+ firingIndex,
1002
+ // Add one or several callbacks to the list
1003
+ add = function( args ) {
1004
+ var i,
1005
+ length,
1006
+ elem,
1007
+ type,
1008
+ actual;
1009
+ for ( i = 0, length = args.length; i < length; i++ ) {
1010
+ elem = args[ i ];
1011
+ type = jQuery.type( elem );
1012
+ if ( type === "array" ) {
1013
+ // Inspect recursively
1014
+ add( elem );
1015
+ } else if ( type === "function" ) {
1016
+ // Add if not in unique mode and callback is not in
1017
+ if ( !flags.unique || !self.has( elem ) ) {
1018
+ list.push( elem );
1019
+ }
1020
+ }
1021
+ }
1022
+ },
1023
+ // Fire callbacks
1024
+ fire = function( context, args ) {
1025
+ args = args || [];
1026
+ memory = !flags.memory || [ context, args ];
1027
+ firing = true;
1028
+ firingIndex = firingStart || 0;
1029
+ firingStart = 0;
1030
+ firingLength = list.length;
1031
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
1032
+ if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
1033
+ memory = true; // Mark as halted
1034
+ break;
1035
+ }
1036
+ }
1037
+ firing = false;
1038
+ if ( list ) {
1039
+ if ( !flags.once ) {
1040
+ if ( stack && stack.length ) {
1041
+ memory = stack.shift();
1042
+ self.fireWith( memory[ 0 ], memory[ 1 ] );
1043
+ }
1044
+ } else if ( memory === true ) {
1045
+ self.disable();
1046
+ } else {
1047
+ list = [];
1048
+ }
1049
+ }
1050
+ },
1051
+ // Actual Callbacks object
1052
+ self = {
1053
+ // Add a callback or a collection of callbacks to the list
1054
+ add: function() {
1055
+ if ( list ) {
1056
+ var length = list.length;
1057
+ add( arguments );
1058
+ // Do we need to add the callbacks to the
1059
+ // current firing batch?
1060
+ if ( firing ) {
1061
+ firingLength = list.length;
1062
+ // With memory, if we're not firing then
1063
+ // we should call right away, unless previous
1064
+ // firing was halted (stopOnFalse)
1065
+ } else if ( memory && memory !== true ) {
1066
+ firingStart = length;
1067
+ fire( memory[ 0 ], memory[ 1 ] );
1068
+ }
1069
+ }
1070
+ return this;
1071
+ },
1072
+ // Remove a callback from the list
1073
+ remove: function() {
1074
+ if ( list ) {
1075
+ var args = arguments,
1076
+ argIndex = 0,
1077
+ argLength = args.length;
1078
+ for ( ; argIndex < argLength ; argIndex++ ) {
1079
+ for ( var i = 0; i < list.length; i++ ) {
1080
+ if ( args[ argIndex ] === list[ i ] ) {
1081
+ // Handle firingIndex and firingLength
1082
+ if ( firing ) {
1083
+ if ( i <= firingLength ) {
1084
+ firingLength--;
1085
+ if ( i <= firingIndex ) {
1086
+ firingIndex--;
1087
+ }
1088
+ }
1089
+ }
1090
+ // Remove the element
1091
+ list.splice( i--, 1 );
1092
+ // If we have some unicity property then
1093
+ // we only need to do this once
1094
+ if ( flags.unique ) {
1095
+ break;
1096
+ }
1097
+ }
1098
+ }
1099
+ }
1100
+ }
1101
+ return this;
1102
+ },
1103
+ // Control if a given callback is in the list
1104
+ has: function( fn ) {
1105
+ if ( list ) {
1106
+ var i = 0,
1107
+ length = list.length;
1108
+ for ( ; i < length; i++ ) {
1109
+ if ( fn === list[ i ] ) {
1110
+ return true;
1111
+ }
1112
+ }
1113
+ }
1114
+ return false;
1115
+ },
1116
+ // Remove all callbacks from the list
1117
+ empty: function() {
1118
+ list = [];
1119
+ return this;
1120
+ },
1121
+ // Have the list do nothing anymore
1122
+ disable: function() {
1123
+ list = stack = memory = undefined;
1124
+ return this;
1125
+ },
1126
+ // Is it disabled?
1127
+ disabled: function() {
1128
+ return !list;
1129
+ },
1130
+ // Lock the list in its current state
1131
+ lock: function() {
1132
+ stack = undefined;
1133
+ if ( !memory || memory === true ) {
1134
+ self.disable();
1135
+ }
1136
+ return this;
1137
+ },
1138
+ // Is it locked?
1139
+ locked: function() {
1140
+ return !stack;
1141
+ },
1142
+ // Call all callbacks with the given context and arguments
1143
+ fireWith: function( context, args ) {
1144
+ if ( stack ) {
1145
+ if ( firing ) {
1146
+ if ( !flags.once ) {
1147
+ stack.push( [ context, args ] );
1148
+ }
1149
+ } else if ( !( flags.once && memory ) ) {
1150
+ fire( context, args );
1151
+ }
1152
+ }
1153
+ return this;
1154
+ },
1155
+ // Call all the callbacks with the given arguments
1156
+ fire: function() {
1157
+ self.fireWith( this, arguments );
1158
+ return this;
1159
+ },
1160
+ // To know if the callbacks have already been called at least once
1161
+ fired: function() {
1162
+ return !!memory;
1163
+ }
1164
+ };
1165
+
1166
+ return self;
1167
+};
1168
+
1169
+
1170
+
1171
+
1172
+var // Static reference to slice
1173
+ sliceDeferred = [].slice;
1174
+
1175
+jQuery.extend({
1176
+
1177
+ Deferred: function( func ) {
1178
+ var doneList = jQuery.Callbacks( "once memory" ),
1179
+ failList = jQuery.Callbacks( "once memory" ),
1180
+ progressList = jQuery.Callbacks( "memory" ),
1181
+ state = "pending",
1182
+ lists = {
1183
+ resolve: doneList,
1184
+ reject: failList,
1185
+ notify: progressList
1186
+ },
1187
+ promise = {
1188
+ done: doneList.add,
1189
+ fail: failList.add,
1190
+ progress: progressList.add,
1191
+
1192
+ state: function() {
1193
+ return state;
1194
+ },
1195
+
1196
+ // Deprecated
1197
+ isResolved: doneList.fired,
1198
+ isRejected: failList.fired,
1199
+
1200
+ then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
1201
+ deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
1202
+ return this;
1203
+ },
1204
+ always: function() {
1205
+ deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
1206
+ return this;
1207
+ },
1208
+ pipe: function( fnDone, fnFail, fnProgress ) {
1209
+ return jQuery.Deferred(function( newDefer ) {
1210
+ jQuery.each( {
1211
+ done: [ fnDone, "resolve" ],
1212
+ fail: [ fnFail, "reject" ],
1213
+ progress: [ fnProgress, "notify" ]
1214
+ }, function( handler, data ) {
1215
+ var fn = data[ 0 ],
1216
+ action = data[ 1 ],
1217
+ returned;
1218
+ if ( jQuery.isFunction( fn ) ) {
1219
+ deferred[ handler ](function() {
1220
+ returned = fn.apply( this, arguments );
1221
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
1222
+ returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
1223
+ } else {
1224
+ newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
1225
+ }
1226
+ });
1227
+ } else {
1228
+ deferred[ handler ]( newDefer[ action ] );
1229
+ }
1230
+ });
1231
+ }).promise();
1232
+ },
1233
+ // Get a promise for this deferred
1234
+ // If obj is provided, the promise aspect is added to the object
1235
+ promise: function( obj ) {
1236
+ if ( obj == null ) {
1237
+ obj = promise;
1238
+ } else {
1239
+ for ( var key in promise ) {
1240
+ obj[ key ] = promise[ key ];
1241
+ }
1242
+ }
1243
+ return obj;
1244
+ }
1245
+ },
1246
+ deferred = promise.promise({}),
1247
+ key;
1248
+
1249
+ for ( key in lists ) {
1250
+ deferred[ key ] = lists[ key ].fire;
1251
+ deferred[ key + "With" ] = lists[ key ].fireWith;
1252
+ }
1253
+
1254
+ // Handle state
1255
+ deferred.done( function() {
1256
+ state = "resolved";
1257
+ }, failList.disable, progressList.lock ).fail( function() {
1258
+ state = "rejected";
1259
+ }, doneList.disable, progressList.lock );
1260
+
1261
+ // Call given func if any
1262
+ if ( func ) {
1263
+ func.call( deferred, deferred );
1264
+ }
1265
+
1266
+ // All done!
1267
+ return deferred;
1268
+ },
1269
+
1270
+ // Deferred helper
1271
+ when: function( firstParam ) {
1272
+ var args = sliceDeferred.call( arguments, 0 ),
1273
+ i = 0,
1274
+ length = args.length,
1275
+ pValues = new Array( length ),
1276
+ count = length,
1277
+ pCount = length,
1278
+ deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
1279
+ firstParam :
1280
+ jQuery.Deferred(),
1281
+ promise = deferred.promise();
1282
+ function resolveFunc( i ) {
1283
+ return function( value ) {
1284
+ args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1285
+ if ( !( --count ) ) {
1286
+ deferred.resolveWith( deferred, args );
1287
+ }
1288
+ };
1289
+ }
1290
+ function progressFunc( i ) {
1291
+ return function( value ) {
1292
+ pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1293
+ deferred.notifyWith( promise, pValues );
1294
+ };
1295
+ }
1296
+ if ( length > 1 ) {
1297
+ for ( ; i < length; i++ ) {
1298
+ if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
1299
+ args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
1300
+ } else {
1301
+ --count;
1302
+ }
1303
+ }
1304
+ if ( !count ) {
1305
+ deferred.resolveWith( deferred, args );
1306
+ }
1307
+ } else if ( deferred !== firstParam ) {
1308
+ deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
1309
+ }
1310
+ return promise;
1311
+ }
1312
+});
1313
+
1314
+
1315
+
1316
+
1317
+jQuery.support = (function() {
1318
+
1319
+ var support,
1320
+ all,
1321
+ a,
1322
+ select,
1323
+ opt,
1324
+ input,
1325
+ marginDiv,
1326
+ fragment,
1327
+ tds,
1328
+ events,
1329
+ eventName,
1330
+ i,
1331
+ isSupported,
1332
+ div = document.createElement( "div" ),
1333
+ documentElement = document.documentElement;
1334
+
1335
+ // Preliminary tests
1336
+ div.setAttribute("className", "t");
1337
+ div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1338
+
1339
+ all = div.getElementsByTagName( "*" );
1340
+ a = div.getElementsByTagName( "a" )[ 0 ];
1341
+
1342
+ // Can't get basic test support
1343
+ if ( !all || !all.length || !a ) {
1344
+ return {};
1345
+ }
1346
+
1347
+ // First batch of supports tests
1348
+ select = document.createElement( "select" );
1349
+ opt = select.appendChild( document.createElement("option") );
1350
+ input = div.getElementsByTagName( "input" )[ 0 ];
1351
+
1352
+ support = {
1353
+ // IE strips leading whitespace when .innerHTML is used
1354
+ leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1355
+
1356
+ // Make sure that tbody elements aren't automatically inserted
1357
+ // IE will insert them into empty tables
1358
+ tbody: !div.getElementsByTagName("tbody").length,
1359
+
1360
+ // Make sure that link elements get serialized correctly by innerHTML
1361
+ // This requires a wrapper element in IE
1362
+ htmlSerialize: !!div.getElementsByTagName("link").length,
1363
+
1364
+ // Get the style information from getAttribute
1365
+ // (IE uses .cssText instead)
1366
+ style: /top/.test( a.getAttribute("style") ),
1367
+
1368
+ // Make sure that URLs aren't manipulated
1369
+ // (IE normalizes it by default)
1370
+ hrefNormalized: ( a.getAttribute("href") === "/a" ),
1371
+
1372
+ // Make sure that element opacity exists
1373
+ // (IE uses filter instead)
1374
+ // Use a regex to work around a WebKit issue. See #5145
1375
+ opacity: /^0.55/.test( a.style.opacity ),
1376
+
1377
+ // Verify style float existence
1378
+ // (IE uses styleFloat instead of cssFloat)
1379
+ cssFloat: !!a.style.cssFloat,
1380
+
1381
+ // Make sure that if no value is specified for a checkbox
1382
+ // that it defaults to "on".
1383
+ // (WebKit defaults to "" instead)
1384
+ checkOn: ( input.value === "on" ),
1385
+
1386
+ // Make sure that a selected-by-default option has a working selected property.
1387
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1388
+ optSelected: opt.selected,
1389
+
1390
+ // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1391
+ getSetAttribute: div.className !== "t",
1392
+
1393
+ // Tests for enctype support on a form(#6743)
1394
+ enctype: !!document.createElement("form").enctype,
1395
+
1396
+ // Makes sure cloning an html5 element does not cause problems
1397
+ // Where outerHTML is undefined, this still works
1398
+ html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
1399
+
1400
+ // Will be defined later
1401
+ submitBubbles: true,
1402
+ changeBubbles: true,
1403
+ focusinBubbles: false,
1404
+ deleteExpando: true,
1405
+ noCloneEvent: true,
1406
+ inlineBlockNeedsLayout: false,
1407
+ shrinkWrapBlocks: false,
1408
+ reliableMarginRight: true
1409
+ };
1410
+
1411
+ // Make sure checked status is properly cloned
1412
+ input.checked = true;
1413
+ support.noCloneChecked = input.cloneNode( true ).checked;
1414
+
1415
+ // Make sure that the options inside disabled selects aren't marked as disabled
1416
+ // (WebKit marks them as disabled)
1417
+ select.disabled = true;
1418
+ support.optDisabled = !opt.disabled;
1419
+
1420
+ // Test to see if it's possible to delete an expando from an element
1421
+ // Fails in Internet Explorer
1422
+ try {
1423
+ delete div.test;
1424
+ } catch( e ) {
1425
+ support.deleteExpando = false;
1426
+ }
1427
+
1428
+ if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1429
+ div.attachEvent( "onclick", function() {
1430
+ // Cloning a node shouldn't copy over any
1431
+ // bound event handlers (IE does this)
1432
+ support.noCloneEvent = false;
1433
+ });
1434
+ div.cloneNode( true ).fireEvent( "onclick" );
1435
+ }
1436
+
1437
+ // Check if a radio maintains its value
1438
+ // after being appended to the DOM
1439
+ input = document.createElement("input");
1440
+ input.value = "t";
1441
+ input.setAttribute("type", "radio");
1442
+ support.radioValue = input.value === "t";
1443
+
1444
+ input.setAttribute("checked", "checked");
1445
+ div.appendChild( input );
1446
+ fragment = document.createDocumentFragment();
1447
+ fragment.appendChild( div.lastChild );
1448
+
1449
+ // WebKit doesn't clone checked state correctly in fragments
1450
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1451
+
1452
+ // Check if a disconnected checkbox will retain its checked
1453
+ // value of true after appended to the DOM (IE6/7)
1454
+ support.appendChecked = input.checked;
1455
+
1456
+ fragment.removeChild( input );
1457
+ fragment.appendChild( div );
1458
+
1459
+ div.innerHTML = "";
1460
+
1461
+ // Check if div with explicit width and no margin-right incorrectly
1462
+ // gets computed margin-right based on width of container. For more
1463
+ // info see bug #3333
1464
+ // Fails in WebKit before Feb 2011 nightlies
1465
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1466
+ if ( window.getComputedStyle ) {
1467
+ marginDiv = document.createElement( "div" );
1468
+ marginDiv.style.width = "0";
1469
+ marginDiv.style.marginRight = "0";
1470
+ div.style.width = "2px";
1471
+ div.appendChild( marginDiv );
1472
+ support.reliableMarginRight =
1473
+ ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
1474
+ }
1475
+
1476
+ // Technique from Juriy Zaytsev
1477
+ // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
1478
+ // We only care about the case where non-standard event systems
1479
+ // are used, namely in IE. Short-circuiting here helps us to
1480
+ // avoid an eval call (in setAttribute) which can cause CSP
1481
+ // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1482
+ if ( div.attachEvent ) {
1483
+ for( i in {
1484
+ submit: 1,
1485
+ change: 1,
1486
+ focusin: 1
1487
+ }) {
1488
+ eventName = "on" + i;
1489
+ isSupported = ( eventName in div );
1490
+ if ( !isSupported ) {
1491
+ div.setAttribute( eventName, "return;" );
1492
+ isSupported = ( typeof div[ eventName ] === "function" );
1493
+ }
1494
+ support[ i + "Bubbles" ] = isSupported;
1495
+ }
1496
+ }
1497
+
1498
+ fragment.removeChild( div );
1499
+
1500
+ // Null elements to avoid leaks in IE
1501
+ fragment = select = opt = marginDiv = div = input = null;
1502
+
1503
+ // Run tests that need a body at doc ready
1504
+ jQuery(function() {
1505
+ var container, outer, inner, table, td, offsetSupport,
1506
+ conMarginTop, ptlm, vb, style, html,
1507
+ body = document.getElementsByTagName("body")[0];
1508
+
1509
+ if ( !body ) {
1510
+ // Return for frameset docs that don't have a body
1511
+ return;
1512
+ }
1513
+
1514
+ conMarginTop = 1;
1515
+ ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
1516
+ vb = "visibility:hidden;border:0;";
1517
+ style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
1518
+ html = "<div " + style + "><div></div></div>" +
1519
+ "<table " + style + " cellpadding='0' cellspacing='0'>" +
1520
+ "<tr><td></td></tr></table>";
1521
+
1522
+ container = document.createElement("div");
1523
+ container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
1524
+ body.insertBefore( container, body.firstChild );
1525
+
1526
+ // Construct the test element
1527
+ div = document.createElement("div");
1528
+ container.appendChild( div );
1529
+
1530
+ // Check if table cells still have offsetWidth/Height when they are set
1531
+ // to display:none and there are still other visible table cells in a
1532
+ // table row; if so, offsetWidth/Height are not reliable for use when
1533
+ // determining if an element has been hidden directly using
1534
+ // display:none (it is still safe to use offsets if a parent element is
1535
+ // hidden; don safety goggles and see bug #4512 for more information).
1536
+ // (only IE 8 fails this test)
1537
+ div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1538
+ tds = div.getElementsByTagName( "td" );
1539
+ isSupported = ( tds[ 0 ].offsetHeight === 0 );
1540
+
1541
+ tds[ 0 ].style.display = "";
1542
+ tds[ 1 ].style.display = "none";
1543
+
1544
+ // Check if empty table cells still have offsetWidth/Height
1545
+ // (IE <= 8 fail this test)
1546
+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1547
+
1548
+ // Figure out if the W3C box model works as expected
1549
+ div.innerHTML = "";
1550
+ div.style.width = div.style.paddingLeft = "1px";
1551
+ jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
1552
+
1553
+ if ( typeof div.style.zoom !== "undefined" ) {
1554
+ // Check if natively block-level elements act like inline-block
1555
+ // elements when setting their display to 'inline' and giving
1556
+ // them layout
1557
+ // (IE < 8 does this)
1558
+ div.style.display = "inline";
1559
+ div.style.zoom = 1;
1560
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
1561
+
1562
+ // Check if elements with layout shrink-wrap their children
1563
+ // (IE 6 does this)
1564
+ div.style.display = "";
1565
+ div.innerHTML = "<div style='width:4px;'></div>";
1566
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
1567
+ }
1568
+
1569
+ div.style.cssText = ptlm + vb;
1570
+ div.innerHTML = html;
1571
+
1572
+ outer = div.firstChild;
1573
+ inner = outer.firstChild;
1574
+ td = outer.nextSibling.firstChild.firstChild;
1575
+
1576
+ offsetSupport = {
1577
+ doesNotAddBorder: ( inner.offsetTop !== 5 ),
1578
+ doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
1579
+ };
1580
+
1581
+ inner.style.position = "fixed";
1582
+ inner.style.top = "20px";
1583
+
1584
+ // safari subtracts parent border width here which is 5px
1585
+ offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
1586
+ inner.style.position = inner.style.top = "";
1587
+
1588
+ outer.style.overflow = "hidden";
1589
+ outer.style.position = "relative";
1590
+
1591
+ offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
1592
+ offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
1593
+
1594
+ body.removeChild( container );
1595
+ div = container = null;
1596
+
1597
+ jQuery.extend( support, offsetSupport );
1598
+ });
1599
+
1600
+ return support;
1601
+})();
1602
+
1603
+
1604
+
1605
+
1606
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
1607
+ rmultiDash = /([A-Z])/g;
1608
+
1609
+jQuery.extend({
1610
+ cache: {},
1611
+
1612
+ // Please use with caution
1613
+ uuid: 0,
1614
+
1615
+ // Unique for each copy of jQuery on the page
1616
+ // Non-digits removed to match rinlinejQuery
1617
+ expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1618
+
1619
+ // The following elements throw uncatchable exceptions if you
1620
+ // attempt to add expando properties to them.
1621
+ noData: {
1622
+ "embed": true,
1623
+ // Ban all objects except for Flash (which handle expandos)
1624
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1625
+ "applet": true
1626
+ },
1627
+
1628
+ hasData: function( elem ) {
1629
+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1630
+ return !!elem && !isEmptyDataObject( elem );
1631
+ },
1632
+
1633
+ data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1634
+ if ( !jQuery.acceptData( elem ) ) {
1635
+ return;
1636
+ }
1637
+
1638
+ var privateCache, thisCache, ret,
1639
+ internalKey = jQuery.expando,
1640
+ getByName = typeof name === "string",
1641
+
1642
+ // We have to handle DOM nodes and JS objects differently because IE6-7
1643
+ // can't GC object references properly across the DOM-JS boundary
1644
+ isNode = elem.nodeType,
1645
+
1646
+ // Only DOM nodes need the global jQuery cache; JS object data is
1647
+ // attached directly to the object so GC can occur automatically
1648
+ cache = isNode ? jQuery.cache : elem,
1649
+
1650
+ // Only defining an ID for JS objects if its cache already exists allows
1651
+ // the code to shortcut on the same path as a DOM node with no cache
1652
+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
1653
+ isEvents = name === "events";
1654
+
1655
+ // Avoid doing any more work than we need to when trying to get data on an
1656
+ // object that has no data at all
1657
+ if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
1658
+ return;
1659
+ }
1660
+
1661
+ if ( !id ) {
1662
+ // Only DOM nodes need a new unique ID for each element since their data
1663
+ // ends up in the global cache
1664
+ if ( isNode ) {
1665
+ elem[ internalKey ] = id = ++jQuery.uuid;
1666
+ } else {
1667
+ id = internalKey;
1668
+ }
1669
+ }
1670
+
1671
+ if ( !cache[ id ] ) {
1672
+ cache[ id ] = {};
1673
+
1674
+ // Avoids exposing jQuery metadata on plain JS objects when the object
1675
+ // is serialized using JSON.stringify
1676
+ if ( !isNode ) {
1677
+ cache[ id ].toJSON = jQuery.noop;
1678
+ }
1679
+ }
1680
+
1681
+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
1682
+ // shallow copied over onto the existing cache
1683
+ if ( typeof name === "object" || typeof name === "function" ) {
1684
+ if ( pvt ) {
1685
+ cache[ id ] = jQuery.extend( cache[ id ], name );
1686
+ } else {
1687
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
1688
+ }
1689
+ }
1690
+
1691
+ privateCache = thisCache = cache[ id ];
1692
+
1693
+ // jQuery data() is stored in a separate object inside the object's internal data
1694
+ // cache in order to avoid key collisions between internal data and user-defined
1695
+ // data.
1696
+ if ( !pvt ) {
1697
+ if ( !thisCache.data ) {
1698
+ thisCache.data = {};
1699
+ }
1700
+
1701
+ thisCache = thisCache.data;
1702
+ }
1703
+
1704
+ if ( data !== undefined ) {
1705
+ thisCache[ jQuery.camelCase( name ) ] = data;
1706
+ }
1707
+
1708
+ // Users should not attempt to inspect the internal events object using jQuery.data,
1709
+ // it is undocumented and subject to change. But does anyone listen? No.
1710
+ if ( isEvents && !thisCache[ name ] ) {
1711
+ return privateCache.events;
1712
+ }
1713
+
1714
+ // Check for both converted-to-camel and non-converted data property names
1715
+ // If a data property was specified
1716
+ if ( getByName ) {
1717
+
1718
+ // First Try to find as-is property data
1719
+ ret = thisCache[ name ];
1720
+
1721
+ // Test for null|undefined property data
1722
+ if ( ret == null ) {
1723
+
1724
+ // Try to find the camelCased property
1725
+ ret = thisCache[ jQuery.camelCase( name ) ];
1726
+ }
1727
+ } else {
1728
+ ret = thisCache;
1729
+ }
1730
+
1731
+ return ret;
1732
+ },
1733
+
1734
+ removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1735
+ if ( !jQuery.acceptData( elem ) ) {
1736
+ return;
1737
+ }
1738
+
1739
+ var thisCache, i, l,
1740
+
1741
+ // Reference to internal data cache key
1742
+ internalKey = jQuery.expando,
1743
+
1744
+ isNode = elem.nodeType,
1745
+
1746
+ // See jQuery.data for more information
1747
+ cache = isNode ? jQuery.cache : elem,
1748
+
1749
+ // See jQuery.data for more information
1750
+ id = isNode ? elem[ internalKey ] : internalKey;
1751
+
1752
+ // If there is already no cache entry for this object, there is no
1753
+ // purpose in continuing
1754
+ if ( !cache[ id ] ) {
1755
+ return;
1756
+ }
1757
+
1758
+ if ( name ) {
1759
+
1760
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
1761
+
1762
+ if ( thisCache ) {
1763
+
1764
+ // Support array or space separated string names for data keys
1765
+ if ( !jQuery.isArray( name ) ) {
1766
+
1767
+ // try the string as a key before any manipulation
1768
+ if ( name in thisCache ) {
1769
+ name = [ name ];
1770
+ } else {
1771
+
1772
+ // split the camel cased version by spaces unless a key with the spaces exists
1773
+ name = jQuery.camelCase( name );
1774
+ if ( name in thisCache ) {
1775
+ name = [ name ];
1776
+ } else {
1777
+ name = name.split( " " );
1778
+ }
1779
+ }
1780
+ }
1781
+
1782
+ for ( i = 0, l = name.length; i < l; i++ ) {
1783
+ delete thisCache[ name[i] ];
1784
+ }
1785
+
1786
+ // If there is no data left in the cache, we want to continue
1787
+ // and let the cache object itself get destroyed
1788
+ if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
1789
+ return;
1790
+ }
1791
+ }
1792
+ }
1793
+
1794
+ // See jQuery.data for more information
1795
+ if ( !pvt ) {
1796
+ delete cache[ id ].data;
1797
+
1798
+ // Don't destroy the parent cache unless the internal data object
1799
+ // had been the only thing left in it
1800
+ if ( !isEmptyDataObject(cache[ id ]) ) {
1801
+ return;
1802
+ }
1803
+ }
1804
+
1805
+ // Browsers that fail expando deletion also refuse to delete expandos on
1806
+ // the window, but it will allow it on all other JS objects; other browsers
1807
+ // don't care
1808
+ // Ensure that `cache` is not a window object #10080
1809
+ if ( jQuery.support.deleteExpando || !cache.setInterval ) {
1810
+ delete cache[ id ];
1811
+ } else {
1812
+ cache[ id ] = null;
1813
+ }
1814
+
1815
+ // We destroyed the cache and need to eliminate the expando on the node to avoid
1816
+ // false lookups in the cache for entries that no longer exist
1817
+ if ( isNode ) {
1818
+ // IE does not allow us to delete expando properties from nodes,
1819
+ // nor does it have a removeAttribute function on Document nodes;
1820
+ // we must handle all of these cases
1821
+ if ( jQuery.support.deleteExpando ) {
1822
+ delete elem[ internalKey ];
1823
+ } else if ( elem.removeAttribute ) {
1824
+ elem.removeAttribute( internalKey );
1825
+ } else {
1826
+ elem[ internalKey ] = null;
1827
+ }
1828
+ }
1829
+ },
1830
+
1831
+ // For internal use only.
1832
+ _data: function( elem, name, data ) {
1833
+ return jQuery.data( elem, name, data, true );
1834
+ },
1835
+
1836
+ // A method for determining if a DOM node can handle the data expando
1837
+ acceptData: function( elem ) {
1838
+ if ( elem.nodeName ) {
1839
+ var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1840
+
1841
+ if ( match ) {
1842
+ return !(match === true || elem.getAttribute("classid") !== match);
1843
+ }
1844
+ }
1845
+
1846
+ return true;
1847
+ }
1848
+});
1849
+
1850
+jQuery.fn.extend({
1851
+ data: function( key, value ) {
1852
+ var parts, attr, name,
1853
+ data = null;
1854
+
1855
+ if ( typeof key === "undefined" ) {
1856
+ if ( this.length ) {
1857
+ data = jQuery.data( this[0] );
1858
+
1859
+ if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
1860
+ attr = this[0].attributes;
1861
+ for ( var i = 0, l = attr.length; i < l; i++ ) {
1862
+ name = attr[i].name;
1863
+
1864
+ if ( name.indexOf( "data-" ) === 0 ) {
1865
+ name = jQuery.camelCase( name.substring(5) );
1866
+
1867
+ dataAttr( this[0], name, data[ name ] );
1868
+ }
1869
+ }
1870
+ jQuery._data( this[0], "parsedAttrs", true );
1871
+ }
1872
+ }
1873
+
1874
+ return data;
1875
+
1876
+ } else if ( typeof key === "object" ) {
1877
+ return this.each(function() {
1878
+ jQuery.data( this, key );
1879
+ });
1880
+ }
1881
+
1882
+ parts = key.split(".");
1883
+ parts[1] = parts[1] ? "." + parts[1] : "";
1884
+
1885
+ if ( value === undefined ) {
1886
+ data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1887
+
1888
+ // Try to fetch any internally stored data first
1889
+ if ( data === undefined && this.length ) {
1890
+ data = jQuery.data( this[0], key );
1891
+ data = dataAttr( this[0], key, data );
1892
+ }
1893
+
1894
+ return data === undefined && parts[1] ?
1895
+ this.data( parts[0] ) :
1896
+ data;
1897
+
1898
+ } else {
1899
+ return this.each(function() {
1900
+ var self = jQuery( this ),
1901
+ args = [ parts[0], value ];
1902
+
1903
+ self.triggerHandler( "setData" + parts[1] + "!", args );
1904
+ jQuery.data( this, key, value );
1905
+ self.triggerHandler( "changeData" + parts[1] + "!", args );
1906
+ });
1907
+ }
1908
+ },
1909
+
1910
+ removeData: function( key ) {
1911
+ return this.each(function() {
1912
+ jQuery.removeData( this, key );
1913
+ });
1914
+ }
1915
+});
1916
+
1917
+function dataAttr( elem, key, data ) {
1918
+ // If nothing was found internally, try to fetch any
1919
+ // data from the HTML5 data-* attribute
1920
+ if ( data === undefined && elem.nodeType === 1 ) {
1921
+
1922
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
1923
+
1924
+ data = elem.getAttribute( name );
1925
+
1926
+ if ( typeof data === "string" ) {
1927
+ try {
1928
+ data = data === "true" ? true :
1929
+ data === "false" ? false :
1930
+ data === "null" ? null :
1931
+ jQuery.isNumeric( data ) ? parseFloat( data ) :
1932
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
1933
+ data;
1934
+ } catch( e ) {}
1935
+
1936
+ // Make sure we set the data so it isn't changed later
1937
+ jQuery.data( elem, key, data );
1938
+
1939
+ } else {
1940
+ data = undefined;
1941
+ }
1942
+ }
1943
+
1944
+ return data;
1945
+}
1946
+
1947
+// checks a cache object for emptiness
1948
+function isEmptyDataObject( obj ) {
1949
+ for ( var name in obj ) {
1950
+
1951
+ // if the public data object is empty, the private is still empty
1952
+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
1953
+ continue;
1954
+ }
1955
+ if ( name !== "toJSON" ) {
1956
+ return false;
1957
+ }
1958
+ }
1959
+
1960
+ return true;
1961
+}
1962
+
1963
+
1964
+
1965
+
1966
+function handleQueueMarkDefer( elem, type, src ) {
1967
+ var deferDataKey = type + "defer",
1968
+ queueDataKey = type + "queue",
1969
+ markDataKey = type + "mark",
1970
+ defer = jQuery._data( elem, deferDataKey );
1971
+ if ( defer &&
1972
+ ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
1973
+ ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
1974
+ // Give room for hard-coded callbacks to fire first
1975
+ // and eventually mark/queue something else on the element
1976
+ setTimeout( function() {
1977
+ if ( !jQuery._data( elem, queueDataKey ) &&
1978
+ !jQuery._data( elem, markDataKey ) ) {
1979
+ jQuery.removeData( elem, deferDataKey, true );
1980
+ defer.fire();
1981
+ }
1982
+ }, 0 );
1983
+ }
1984
+}
1985
+
1986
+jQuery.extend({
1987
+
1988
+ _mark: function( elem, type ) {
1989
+ if ( elem ) {
1990
+ type = ( type || "fx" ) + "mark";
1991
+ jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
1992
+ }
1993
+ },
1994
+
1995
+ _unmark: function( force, elem, type ) {
1996
+ if ( force !== true ) {
1997
+ type = elem;
1998
+ elem = force;
1999
+ force = false;
2000
+ }
2001
+ if ( elem ) {
2002
+ type = type || "fx";
2003
+ var key = type + "mark",
2004
+ count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
2005
+ if ( count ) {
2006
+ jQuery._data( elem, key, count );
2007
+ } else {
2008
+ jQuery.removeData( elem, key, true );
2009
+ handleQueueMarkDefer( elem, type, "mark" );
2010
+ }
2011
+ }
2012
+ },
2013
+
2014
+ queue: function( elem, type, data ) {
2015
+ var q;
2016
+ if ( elem ) {
2017
+ type = ( type || "fx" ) + "queue";
2018
+ q = jQuery._data( elem, type );
2019
+
2020
+ // Speed up dequeue by getting out quickly if this is just a lookup
2021
+ if ( data ) {
2022
+ if ( !q || jQuery.isArray(data) ) {
2023
+ q = jQuery._data( elem, type, jQuery.makeArray(data) );
2024
+ } else {
2025
+ q.push( data );
2026
+ }
2027
+ }
2028
+ return q || [];
2029
+ }
2030
+ },
2031
+
2032
+ dequeue: function( elem, type ) {
2033
+ type = type || "fx";
2034
+
2035
+ var queue = jQuery.queue( elem, type ),
2036
+ fn = queue.shift(),
2037
+ hooks = {};
2038
+
2039
+ // If the fx queue is dequeued, always remove the progress sentinel
2040
+ if ( fn === "inprogress" ) {
2041
+ fn = queue.shift();
2042
+ }
2043
+
2044
+ if ( fn ) {
2045
+ // Add a progress sentinel to prevent the fx queue from being
2046
+ // automatically dequeued
2047
+ if ( type === "fx" ) {
2048
+ queue.unshift( "inprogress" );
2049
+ }
2050
+
2051
+ jQuery._data( elem, type + ".run", hooks );
2052
+ fn.call( elem, function() {
2053
+ jQuery.dequeue( elem, type );
2054
+ }, hooks );
2055
+ }
2056
+
2057
+ if ( !queue.length ) {
2058
+ jQuery.removeData( elem, type + "queue " + type + ".run", true );
2059
+ handleQueueMarkDefer( elem, type, "queue" );
2060
+ }
2061
+ }
2062
+});
2063
+
2064
+jQuery.fn.extend({
2065
+ queue: function( type, data ) {
2066
+ if ( typeof type !== "string" ) {
2067
+ data = type;
2068
+ type = "fx";
2069
+ }
2070
+
2071
+ if ( data === undefined ) {
2072
+ return jQuery.queue( this[0], type );
2073
+ }
2074
+ return this.each(function() {
2075
+ var queue = jQuery.queue( this, type, data );
2076
+
2077
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
2078
+ jQuery.dequeue( this, type );
2079
+ }
2080
+ });
2081
+ },
2082
+ dequeue: function( type ) {
2083
+ return this.each(function() {
2084
+ jQuery.dequeue( this, type );
2085
+ });
2086
+ },
2087
+ // Based off of the plugin by Clint Helfers, with permission.
2088
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
2089
+ delay: function( time, type ) {
2090
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
2091
+ type = type || "fx";
2092
+
2093
+ return this.queue( type, function( next, hooks ) {
2094
+ var timeout = setTimeout( next, time );
2095
+ hooks.stop = function() {
2096
+ clearTimeout( timeout );
2097
+ };
2098
+ });
2099
+ },
2100
+ clearQueue: function( type ) {
2101
+ return this.queue( type || "fx", [] );
2102
+ },
2103
+ // Get a promise resolved when queues of a certain type
2104
+ // are emptied (fx is the type by default)
2105
+ promise: function( type, object ) {
2106
+ if ( typeof type !== "string" ) {
2107
+ object = type;
2108
+ type = undefined;
2109
+ }
2110
+ type = type || "fx";
2111
+ var defer = jQuery.Deferred(),
2112
+ elements = this,
2113
+ i = elements.length,
2114
+ count = 1,
2115
+ deferDataKey = type + "defer",
2116
+ queueDataKey = type + "queue",
2117
+ markDataKey = type + "mark",
2118
+ tmp;
2119
+ function resolve() {
2120
+ if ( !( --count ) ) {
2121
+ defer.resolveWith( elements, [ elements ] );
2122
+ }
2123
+ }
2124
+ while( i-- ) {
2125
+ if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
2126
+ ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
2127
+ jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
2128
+ jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
2129
+ count++;
2130
+ tmp.add( resolve );
2131
+ }
2132
+ }
2133
+ resolve();
2134
+ return defer.promise();
2135
+ }
2136
+});
2137
+
2138
+
2139
+
2140
+
2141
+var rclass = /[\n\t\r]/g,
2142
+ rspace = /\s+/,
2143
+ rreturn = /\r/g,
2144
+ rtype = /^(?:button|input)$/i,
2145
+ rfocusable = /^(?:button|input|object|select|textarea)$/i,
2146
+ rclickable = /^a(?:rea)?$/i,
2147
+ rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
2148
+ getSetAttribute = jQuery.support.getSetAttribute,
2149
+ nodeHook, boolHook, fixSpecified;
2150
+
2151
+jQuery.fn.extend({
2152
+ attr: function( name, value ) {
2153
+ return jQuery.access( this, name, value, true, jQuery.attr );
2154
+ },
2155
+
2156
+ removeAttr: function( name ) {
2157
+ return this.each(function() {
2158
+ jQuery.removeAttr( this, name );
2159
+ });
2160
+ },
2161
+
2162
+ prop: function( name, value ) {
2163
+ return jQuery.access( this, name, value, true, jQuery.prop );
2164
+ },
2165
+
2166
+ removeProp: function( name ) {
2167
+ name = jQuery.propFix[ name ] || name;
2168
+ return this.each(function() {
2169
+ // try/catch handles cases where IE balks (such as removing a property on window)
2170
+ try {
2171
+ this[ name ] = undefined;
2172
+ delete this[ name ];
2173
+ } catch( e ) {}
2174
+ });
2175
+ },
2176
+
2177
+ addClass: function( value ) {
2178
+ var classNames, i, l, elem,
2179
+ setClass, c, cl;
2180
+
2181
+ if ( jQuery.isFunction( value ) ) {
2182
+ return this.each(function( j ) {
2183
+ jQuery( this ).addClass( value.call(this, j, this.className) );
2184
+ });
2185
+ }
2186
+
2187
+ if ( value && typeof value === "string" ) {
2188
+ classNames = value.split( rspace );
2189
+
2190
+ for ( i = 0, l = this.length; i < l; i++ ) {
2191
+ elem = this[ i ];
2192
+
2193
+ if ( elem.nodeType === 1 ) {
2194
+ if ( !elem.className && classNames.length === 1 ) {
2195
+ elem.className = value;
2196
+
2197
+ } else {
2198
+ setClass = " " + elem.className + " ";
2199
+
2200
+ for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2201
+ if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
2202
+ setClass += classNames[ c ] + " ";
2203
+ }
2204
+ }
2205
+ elem.className = jQuery.trim( setClass );
2206
+ }
2207
+ }
2208
+ }
2209
+ }
2210
+
2211
+ return this;
2212
+ },
2213
+
2214
+ removeClass: function( value ) {
2215
+ var classNames, i, l, elem, className, c, cl;
2216
+
2217
+ if ( jQuery.isFunction( value ) ) {
2218
+ return this.each(function( j ) {
2219
+ jQuery( this ).removeClass( value.call(this, j, this.className) );
2220
+ });
2221
+ }
2222
+
2223
+ if ( (value && typeof value === "string") || value === undefined ) {
2224
+ classNames = ( value || "" ).split( rspace );
2225
+
2226
+ for ( i = 0, l = this.length; i < l; i++ ) {
2227
+ elem = this[ i ];
2228
+
2229
+ if ( elem.nodeType === 1 && elem.className ) {
2230
+ if ( value ) {
2231
+ className = (" " + elem.className + " ").replace( rclass, " " );
2232
+ for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2233
+ className = className.replace(" " + classNames[ c ] + " ", " ");
2234
+ }
2235
+ elem.className = jQuery.trim( className );
2236
+
2237
+ } else {
2238
+ elem.className = "";
2239
+ }
2240
+ }
2241
+ }
2242
+ }
2243
+
2244
+ return this;
2245
+ },
2246
+
2247
+ toggleClass: function( value, stateVal ) {
2248
+ var type = typeof value,
2249
+ isBool = typeof stateVal === "boolean";
2250
+
2251
+ if ( jQuery.isFunction( value ) ) {
2252
+ return this.each(function( i ) {
2253
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2254
+ });
2255
+ }
2256
+
2257
+ return this.each(function() {
2258
+ if ( type === "string" ) {
2259
+ // toggle individual class names
2260
+ var className,
2261
+ i = 0,
2262
+ self = jQuery( this ),
2263
+ state = stateVal,
2264
+ classNames = value.split( rspace );
2265
+
2266
+ while ( (className = classNames[ i++ ]) ) {
2267
+ // check each className given, space seperated list
2268
+ state = isBool ? state : !self.hasClass( className );
2269
+ self[ state ? "addClass" : "removeClass" ]( className );
2270
+ }
2271
+
2272
+ } else if ( type === "undefined" || type === "boolean" ) {
2273
+ if ( this.className ) {
2274
+ // store className if set
2275
+ jQuery._data( this, "__className__", this.className );
2276
+ }
2277
+
2278
+ // toggle whole className
2279
+ this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2280
+ }
2281
+ });
2282
+ },
2283
+
2284
+ hasClass: function( selector ) {
2285
+ var className = " " + selector + " ",
2286
+ i = 0,
2287
+ l = this.length;
2288
+ for ( ; i < l; i++ ) {
2289
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
2290
+ return true;
2291
+ }
2292
+ }
2293
+
2294
+ return false;
2295
+ },
2296
+
2297
+ val: function( value ) {
2298
+ var hooks, ret, isFunction,
2299
+ elem = this[0];
2300
+
2301
+ if ( !arguments.length ) {
2302
+ if ( elem ) {
2303
+ hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
2304
+
2305
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2306
+ return ret;
2307
+ }
2308
+
2309
+ ret = elem.value;
2310
+
2311
+ return typeof ret === "string" ?
2312
+ // handle most common string cases
2313
+ ret.replace(rreturn, "") :
2314
+ // handle cases where value is null/undef or number
2315
+ ret == null ? "" : ret;
2316
+ }
2317
+
2318
+ return;
2319
+ }
2320
+
2321
+ isFunction = jQuery.isFunction( value );
2322
+
2323
+ return this.each(function( i ) {
2324
+ var self = jQuery(this), val;
2325
+
2326
+ if ( this.nodeType !== 1 ) {
2327
+ return;
2328
+ }
2329
+
2330
+ if ( isFunction ) {
2331
+ val = value.call( this, i, self.val() );
2332
+ } else {
2333
+ val = value;
2334
+ }
2335
+
2336
+ // Treat null/undefined as ""; convert numbers to string
2337
+ if ( val == null ) {
2338
+ val = "";
2339
+ } else if ( typeof val === "number" ) {
2340
+ val += "";
2341
+ } else if ( jQuery.isArray( val ) ) {
2342
+ val = jQuery.map(val, function ( value ) {
2343
+ return value == null ? "" : value + "";
2344
+ });
2345
+ }
2346
+
2347
+ hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
2348
+
2349
+ // If set returns undefined, fall back to normal setting
2350
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2351
+ this.value = val;
2352
+ }
2353
+ });
2354
+ }
2355
+});
2356
+
2357
+jQuery.extend({
2358
+ valHooks: {
2359
+ option: {
2360
+ get: function( elem ) {
2361
+ // attributes.value is undefined in Blackberry 4.7 but
2362
+ // uses .value. See #6932
2363
+ var val = elem.attributes.value;
2364
+ return !val || val.specified ? elem.value : elem.text;
2365
+ }
2366
+ },
2367
+ select: {
2368
+ get: function( elem ) {
2369
+ var value, i, max, option,
2370
+ index = elem.selectedIndex,
2371
+ values = [],
2372
+ options = elem.options,
2373
+ one = elem.type === "select-one";
2374
+
2375
+ // Nothing was selected
2376
+ if ( index < 0 ) {
2377
+ return null;
2378
+ }
2379
+
2380
+ // Loop through all the selected options
2381
+ i = one ? index : 0;
2382
+ max = one ? index + 1 : options.length;
2383
+ for ( ; i < max; i++ ) {
2384
+ option = options[ i ];
2385
+
2386
+ // Don't return options that are disabled or in a disabled optgroup
2387
+ if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
2388
+ (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
2389
+
2390
+ // Get the specific value for the option
2391
+ value = jQuery( option ).val();
2392
+
2393
+ // We don't need an array for one selects
2394
+ if ( one ) {
2395
+ return value;
2396
+ }
2397
+
2398
+ // Multi-Selects return an array
2399
+ values.push( value );
2400
+ }
2401
+ }
2402
+
2403
+ // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
2404
+ if ( one && !values.length && options.length ) {
2405
+ return jQuery( options[ index ] ).val();
2406
+ }
2407
+
2408
+ return values;
2409
+ },
2410
+
2411
+ set: function( elem, value ) {
2412
+ var values = jQuery.makeArray( value );
2413
+
2414
+ jQuery(elem).find("option").each(function() {
2415
+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2416
+ });
2417
+
2418
+ if ( !values.length ) {
2419
+ elem.selectedIndex = -1;
2420
+ }
2421
+ return values;
2422
+ }
2423
+ }
2424
+ },
2425
+
2426
+ attrFn: {
2427
+ val: true,
2428
+ css: true,
2429
+ html: true,
2430
+ text: true,
2431
+ data: true,
2432
+ width: true,
2433
+ height: true,
2434
+ offset: true
2435
+ },
2436
+
2437
+ attr: function( elem, name, value, pass ) {
2438
+ var ret, hooks, notxml,
2439
+ nType = elem.nodeType;
2440
+
2441
+ // don't get/set attributes on text, comment and attribute nodes
2442
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2443
+ return;
2444
+ }
2445
+
2446
+ if ( pass && name in jQuery.attrFn ) {
2447
+ return jQuery( elem )[ name ]( value );
2448
+ }
2449
+
2450
+ // Fallback to prop when attributes are not supported
2451
+ if ( typeof elem.getAttribute === "undefined" ) {
2452
+ return jQuery.prop( elem, name, value );
2453
+ }
2454
+
2455
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2456
+
2457
+ // All attributes are lowercase
2458
+ // Grab necessary hook if one is defined
2459
+ if ( notxml ) {
2460
+ name = name.toLowerCase();
2461
+ hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
2462
+ }
2463
+
2464
+ if ( value !== undefined ) {
2465
+
2466
+ if ( value === null ) {
2467
+ jQuery.removeAttr( elem, name );
2468
+ return;
2469
+
2470
+ } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2471
+ return ret;
2472
+
2473
+ } else {
2474
+ elem.setAttribute( name, "" + value );
2475
+ return value;
2476
+ }
2477
+
2478
+ } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
2479
+ return ret;
2480
+
2481
+ } else {
2482
+
2483
+ ret = elem.getAttribute( name );
2484
+
2485
+ // Non-existent attributes return null, we normalize to undefined
2486
+ return ret === null ?
2487
+ undefined :
2488
+ ret;
2489
+ }
2490
+ },
2491
+
2492
+ removeAttr: function( elem, value ) {
2493
+ var propName, attrNames, name, l,
2494
+ i = 0;
2495
+
2496
+ if ( value && elem.nodeType === 1 ) {
2497
+ attrNames = value.toLowerCase().split( rspace );
2498
+ l = attrNames.length;
2499
+
2500
+ for ( ; i < l; i++ ) {
2501
+ name = attrNames[ i ];
2502
+
2503
+ if ( name ) {
2504
+ propName = jQuery.propFix[ name ] || name;
2505
+
2506
+ // See #9699 for explanation of this approach (setting first, then removal)
2507
+ jQuery.attr( elem, name, "" );
2508
+ elem.removeAttribute( getSetAttribute ? name : propName );
2509
+
2510
+ // Set corresponding property to false for boolean attributes
2511
+ if ( rboolean.test( name ) && propName in elem ) {
2512
+ elem[ propName ] = false;
2513
+ }
2514
+ }
2515
+ }
2516
+ }
2517
+ },
2518
+
2519
+ attrHooks: {
2520
+ type: {
2521
+ set: function( elem, value ) {
2522
+ // We can't allow the type property to be changed (since it causes problems in IE)
2523
+ if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2524
+ jQuery.error( "type property can't be changed" );
2525
+ } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2526
+ // Setting the type on a radio button after the value resets the value in IE6-9
2527
+ // Reset value to it's default in case type is set after value
2528
+ // This is for element creation
2529
+ var val = elem.value;
2530
+ elem.setAttribute( "type", value );
2531
+ if ( val ) {
2532
+ elem.value = val;
2533
+ }
2534
+ return value;
2535
+ }
2536
+ }
2537
+ },
2538
+ // Use the value property for back compat
2539
+ // Use the nodeHook for button elements in IE6/7 (#1954)
2540
+ value: {
2541
+ get: function( elem, name ) {
2542
+ if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2543
+ return nodeHook.get( elem, name );
2544
+ }
2545
+ return name in elem ?
2546
+ elem.value :
2547
+ null;
2548
+ },
2549
+ set: function( elem, value, name ) {
2550
+ if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2551
+ return nodeHook.set( elem, value, name );
2552
+ }
2553
+ // Does not return so that setAttribute is also used
2554
+ elem.value = value;
2555
+ }
2556
+ }
2557
+ },
2558
+
2559
+ propFix: {
2560
+ tabindex: "tabIndex",
2561
+ readonly: "readOnly",
2562
+ "for": "htmlFor",
2563
+ "class": "className",
2564
+ maxlength: "maxLength",
2565
+ cellspacing: "cellSpacing",
2566
+ cellpadding: "cellPadding",
2567
+ rowspan: "rowSpan",
2568
+ colspan: "colSpan",
2569
+ usemap: "useMap",
2570
+ frameborder: "frameBorder",
2571
+ contenteditable: "contentEditable"
2572
+ },
2573
+
2574
+ prop: function( elem, name, value ) {
2575
+ var ret, hooks, notxml,
2576
+ nType = elem.nodeType;
2577
+
2578
+ // don't get/set properties on text, comment and attribute nodes
2579
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2580
+ return;
2581
+ }
2582
+
2583
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2584
+
2585
+ if ( notxml ) {
2586
+ // Fix name and attach hooks
2587
+ name = jQuery.propFix[ name ] || name;
2588
+ hooks = jQuery.propHooks[ name ];
2589
+ }
2590
+
2591
+ if ( value !== undefined ) {
2592
+ if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2593
+ return ret;
2594
+
2595
+ } else {
2596
+ return ( elem[ name ] = value );
2597
+ }
2598
+
2599
+ } else {
2600
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2601
+ return ret;
2602
+
2603
+ } else {
2604
+ return elem[ name ];
2605
+ }
2606
+ }
2607
+ },
2608
+
2609
+ propHooks: {
2610
+ tabIndex: {
2611
+ get: function( elem ) {
2612
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2613
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2614
+ var attributeNode = elem.getAttributeNode("tabindex");
2615
+
2616
+ return attributeNode && attributeNode.specified ?
2617
+ parseInt( attributeNode.value, 10 ) :
2618
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2619
+ 0 :
2620
+ undefined;
2621
+ }
2622
+ }
2623
+ }
2624
+});
2625
+
2626
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
2627
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
2628
+
2629
+// Hook for boolean attributes
2630
+boolHook = {
2631
+ get: function( elem, name ) {
2632
+ // Align boolean attributes with corresponding properties
2633
+ // Fall back to attribute presence where some booleans are not supported
2634
+ var attrNode,
2635
+ property = jQuery.prop( elem, name );
2636
+ return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
2637
+ name.toLowerCase() :
2638
+ undefined;
2639
+ },
2640
+ set: function( elem, value, name ) {
2641
+ var propName;
2642
+ if ( value === false ) {
2643
+ // Remove boolean attributes when set to false
2644
+ jQuery.removeAttr( elem, name );
2645
+ } else {
2646
+ // value is true since we know at this point it's type boolean and not false
2647
+ // Set boolean attributes to the same name and set the DOM property
2648
+ propName = jQuery.propFix[ name ] || name;
2649
+ if ( propName in elem ) {
2650
+ // Only set the IDL specifically if it already exists on the element
2651
+ elem[ propName ] = true;
2652
+ }
2653
+
2654
+ elem.setAttribute( name, name.toLowerCase() );
2655
+ }
2656
+ return name;
2657
+ }
2658
+};
2659
+
2660
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
2661
+if ( !getSetAttribute ) {
2662
+
2663
+ fixSpecified = {
2664
+ name: true,
2665
+ id: true
2666
+ };
2667
+
2668
+ // Use this for any attribute in IE6/7
2669
+ // This fixes almost every IE6/7 issue
2670
+ nodeHook = jQuery.valHooks.button = {
2671
+ get: function( elem, name ) {
2672
+ var ret;
2673
+ ret = elem.getAttributeNode( name );
2674
+ return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
2675
+ ret.nodeValue :
2676
+ undefined;
2677
+ },
2678
+ set: function( elem, value, name ) {
2679
+ // Set the existing or create a new attribute node
2680
+ var ret = elem.getAttributeNode( name );
2681
+ if ( !ret ) {
2682
+ ret = document.createAttribute( name );
2683
+ elem.setAttributeNode( ret );
2684
+ }
2685
+ return ( ret.nodeValue = value + "" );
2686
+ }
2687
+ };
2688
+
2689
+ // Apply the nodeHook to tabindex
2690
+ jQuery.attrHooks.tabindex.set = nodeHook.set;
2691
+
2692
+ // Set width and height to auto instead of 0 on empty string( Bug #8150 )
2693
+ // This is for removals
2694
+ jQuery.each([ "width", "height" ], function( i, name ) {
2695
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2696
+ set: function( elem, value ) {
2697
+ if ( value === "" ) {
2698
+ elem.setAttribute( name, "auto" );
2699
+ return value;
2700
+ }
2701
+ }
2702
+ });
2703
+ });
2704
+
2705
+ // Set contenteditable to false on removals(#10429)
2706
+ // Setting to empty string throws an error as an invalid value
2707
+ jQuery.attrHooks.contenteditable = {
2708
+ get: nodeHook.get,
2709
+ set: function( elem, value, name ) {
2710
+ if ( value === "" ) {
2711
+ value = "false";
2712
+ }
2713
+ nodeHook.set( elem, value, name );
2714
+ }
2715
+ };
2716
+}
2717
+
2718
+
2719
+// Some attributes require a special call on IE
2720
+if ( !jQuery.support.hrefNormalized ) {
2721
+ jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2722
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2723
+ get: function( elem ) {
2724
+ var ret = elem.getAttribute( name, 2 );
2725
+ return ret === null ? undefined : ret;
2726
+ }
2727
+ });
2728
+ });
2729
+}
2730
+
2731
+if ( !jQuery.support.style ) {
2732
+ jQuery.attrHooks.style = {
2733
+ get: function( elem ) {
2734
+ // Return undefined in the case of empty string
2735
+ // Normalize to lowercase since IE uppercases css property names
2736
+ return elem.style.cssText.toLowerCase() || undefined;
2737
+ },
2738
+ set: function( elem, value ) {
2739
+ return ( elem.style.cssText = "" + value );
2740
+ }
2741
+ };
2742
+}
2743
+
2744
+// Safari mis-reports the default selected property of an option
2745
+// Accessing the parent's selectedIndex property fixes it
2746
+if ( !jQuery.support.optSelected ) {
2747
+ jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2748
+ get: function( elem ) {
2749
+ var parent = elem.parentNode;
2750
+
2751
+ if ( parent ) {
2752
+ parent.selectedIndex;
2753
+
2754
+ // Make sure that it also works with optgroups, see #5701
2755
+ if ( parent.parentNode ) {
2756
+ parent.parentNode.selectedIndex;
2757
+ }
2758
+ }
2759
+ return null;
2760
+ }
2761
+ });
2762
+}
2763
+
2764
+// IE6/7 call enctype encoding
2765
+if ( !jQuery.support.enctype ) {
2766
+ jQuery.propFix.enctype = "encoding";
2767
+}
2768
+
2769
+// Radios and checkboxes getter/setter
2770
+if ( !jQuery.support.checkOn ) {
2771
+ jQuery.each([ "radio", "checkbox" ], function() {
2772
+ jQuery.valHooks[ this ] = {
2773
+ get: function( elem ) {
2774
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2775
+ return elem.getAttribute("value") === null ? "on" : elem.value;
2776
+ }
2777
+ };
2778
+ });
2779
+}
2780
+jQuery.each([ "radio", "checkbox" ], function() {
2781
+ jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2782
+ set: function( elem, value ) {
2783
+ if ( jQuery.isArray( value ) ) {
2784
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
2785
+ }
2786
+ }
2787
+ });
2788
+});
2789
+
2790
+
2791
+
2792
+
2793
+var rformElems = /^(?:textarea|input|select)$/i,
2794
+ rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
2795
+ rhoverHack = /\bhover(\.\S+)?\b/,
2796
+ rkeyEvent = /^key/,
2797
+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
2798
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
2799
+ rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
2800
+ quickParse = function( selector ) {
2801
+ var quick = rquickIs.exec( selector );
2802
+ if ( quick ) {
2803
+ // 0 1 2 3
2804
+ // [ _, tag, id, class ]
2805
+ quick[1] = ( quick[1] || "" ).toLowerCase();
2806
+ quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
2807
+ }
2808
+ return quick;
2809
+ },
2810
+ quickIs = function( elem, m ) {
2811
+ var attrs = elem.attributes || {};
2812
+ return (
2813
+ (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
2814
+ (!m[2] || (attrs.id || {}).value === m[2]) &&
2815
+ (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
2816
+ );
2817
+ },
2818
+ hoverHack = function( events ) {
2819
+ return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
2820
+ };
2821
+
2822
+/*
2823
+ * Helper functions for managing events -- not part of the public interface.
2824
+ * Props to Dean Edwards' addEvent library for many of the ideas.
2825
+ */
2826
+jQuery.event = {
2827
+
2828
+ add: function( elem, types, handler, data, selector ) {
2829
+
2830
+ var elemData, eventHandle, events,
2831
+ t, tns, type, namespaces, handleObj,
2832
+ handleObjIn, quick, handlers, special;
2833
+
2834
+ // Don't attach events to noData or text/comment nodes (allow plain objects tho)
2835
+ if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
2836
+ return;
2837
+ }
2838
+
2839
+ // Caller can pass in an object of custom data in lieu of the handler
2840
+ if ( handler.handler ) {
2841
+ handleObjIn = handler;
2842
+ handler = handleObjIn.handler;
2843
+ }
2844
+
2845
+ // Make sure that the handler has a unique ID, used to find/remove it later
2846
+ if ( !handler.guid ) {
2847
+ handler.guid = jQuery.guid++;
2848
+ }
2849
+
2850
+ // Init the element's event structure and main handler, if this is the first
2851
+ events = elemData.events;
2852
+ if ( !events ) {
2853
+ elemData.events = events = {};
2854
+ }
2855
+ eventHandle = elemData.handle;
2856
+ if ( !eventHandle ) {
2857
+ elemData.handle = eventHandle = function( e ) {
2858
+ // Discard the second event of a jQuery.event.trigger() and
2859
+ // when an event is called after a page has unloaded
2860
+ return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2861
+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2862
+ undefined;
2863
+ };
2864
+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
2865
+ eventHandle.elem = elem;
2866
+ }
2867
+
2868
+ // Handle multiple events separated by a space
2869
+ // jQuery(...).bind("mouseover mouseout", fn);
2870
+ types = jQuery.trim( hoverHack(types) ).split( " " );
2871
+ for ( t = 0; t < types.length; t++ ) {
2872
+
2873
+ tns = rtypenamespace.exec( types[t] ) || [];
2874
+ type = tns[1];
2875
+ namespaces = ( tns[2] || "" ).split( "." ).sort();
2876
+
2877
+ // If event changes its type, use the special event handlers for the changed type
2878
+ special = jQuery.event.special[ type ] || {};
2879
+
2880
+ // If selector defined, determine special event api type, otherwise given type
2881
+ type = ( selector ? special.delegateType : special.bindType ) || type;
2882
+
2883
+ // Update special based on newly reset type
2884
+ special = jQuery.event.special[ type ] || {};
2885
+
2886
+ // handleObj is passed to all event handlers
2887
+ handleObj = jQuery.extend({
2888
+ type: type,
2889
+ origType: tns[1],
2890
+ data: data,
2891
+ handler: handler,
2892
+ guid: handler.guid,
2893
+ selector: selector,
2894
+ quick: quickParse( selector ),
2895
+ namespace: namespaces.join(".")
2896
+ }, handleObjIn );
2897
+
2898
+ // Init the event handler queue if we're the first
2899
+ handlers = events[ type ];
2900
+ if ( !handlers ) {
2901
+ handlers = events[ type ] = [];
2902
+ handlers.delegateCount = 0;
2903
+
2904
+ // Only use addEventListener/attachEvent if the special events handler returns false
2905
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2906
+ // Bind the global event handler to the element
2907
+ if ( elem.addEventListener ) {
2908
+ elem.addEventListener( type, eventHandle, false );
2909
+
2910
+ } else if ( elem.attachEvent ) {
2911
+ elem.attachEvent( "on" + type, eventHandle );
2912
+ }
2913
+ }
2914
+ }
2915
+
2916
+ if ( special.add ) {
2917
+ special.add.call( elem, handleObj );
2918
+
2919
+ if ( !handleObj.handler.guid ) {
2920
+ handleObj.handler.guid = handler.guid;
2921
+ }
2922
+ }
2923
+
2924
+ // Add to the element's handler list, delegates in front
2925
+ if ( selector ) {
2926
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
2927
+ } else {
2928
+ handlers.push( handleObj );
2929
+ }
2930
+
2931
+ // Keep track of which events have ever been used, for event optimization
2932
+ jQuery.event.global[ type ] = true;
2933
+ }
2934
+
2935
+ // Nullify elem to prevent memory leaks in IE
2936
+ elem = null;
2937
+ },
2938
+
2939
+ global: {},
2940
+
2941
+ // Detach an event or set of events from an element
2942
+ remove: function( elem, types, handler, selector, mappedTypes ) {
2943
+
2944
+ var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
2945
+ t, tns, type, origType, namespaces, origCount,
2946
+ j, events, special, handle, eventType, handleObj;
2947
+
2948
+ if ( !elemData || !(events = elemData.events) ) {
2949
+ return;
2950
+ }
2951
+
2952
+ // Once for each type.namespace in types; type may be omitted
2953
+ types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
2954
+ for ( t = 0; t < types.length; t++ ) {
2955
+ tns = rtypenamespace.exec( types[t] ) || [];
2956
+ type = origType = tns[1];
2957
+ namespaces = tns[2];
2958
+
2959
+ // Unbind all events (on this namespace, if provided) for the element
2960
+ if ( !type ) {
2961
+ for ( type in events ) {
2962
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
2963
+ }
2964
+ continue;
2965
+ }
2966
+
2967
+ special = jQuery.event.special[ type ] || {};
2968
+ type = ( selector? special.delegateType : special.bindType ) || type;
2969
+ eventType = events[ type ] || [];
2970
+ origCount = eventType.length;
2971
+ namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
2972
+
2973
+ // Remove matching events
2974
+ for ( j = 0; j < eventType.length; j++ ) {
2975
+ handleObj = eventType[ j ];
2976
+
2977
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
2978
+ ( !handler || handler.guid === handleObj.guid ) &&
2979
+ ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
2980
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
2981
+ eventType.splice( j--, 1 );
2982
+
2983
+ if ( handleObj.selector ) {
2984
+ eventType.delegateCount--;
2985
+ }
2986
+ if ( special.remove ) {
2987
+ special.remove.call( elem, handleObj );
2988
+ }
2989
+ }
2990
+ }
2991
+
2992
+ // Remove generic event handler if we removed something and no more handlers exist
2993
+ // (avoids potential for endless recursion during removal of special event handlers)
2994
+ if ( eventType.length === 0 && origCount !== eventType.length ) {
2995
+ if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
2996
+ jQuery.removeEvent( elem, type, elemData.handle );
2997
+ }
2998
+
2999
+ delete events[ type ];
3000
+ }
3001
+ }
3002
+
3003
+ // Remove the expando if it's no longer used
3004
+ if ( jQuery.isEmptyObject( events ) ) {
3005
+ handle = elemData.handle;
3006
+ if ( handle ) {
3007
+ handle.elem = null;
3008
+ }
3009
+
3010
+ // removeData also checks for emptiness and clears the expando if empty
3011
+ // so use it instead of delete
3012
+ jQuery.removeData( elem, [ "events", "handle" ], true );
3013
+ }
3014
+ },
3015
+
3016
+ // Events that are safe to short-circuit if no handlers are attached.
3017
+ // Native DOM events should not be added, they may have inline handlers.
3018
+ customEvent: {
3019
+ "getData": true,
3020
+ "setData": true,
3021
+ "changeData": true
3022
+ },
3023
+
3024
+ trigger: function( event, data, elem, onlyHandlers ) {
3025
+ // Don't do events on text and comment nodes
3026
+ if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
3027
+ return;
3028
+ }
3029
+
3030
+ // Event object or event type
3031
+ var type = event.type || event,
3032
+ namespaces = [],
3033
+ cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
3034
+
3035
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
3036
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
3037
+ return;
3038
+ }
3039
+
3040
+ if ( type.indexOf( "!" ) >= 0 ) {
3041
+ // Exclusive events trigger only for the exact event (no namespaces)
3042
+ type = type.slice(0, -1);
3043
+ exclusive = true;
3044
+ }
3045
+
3046
+ if ( type.indexOf( "." ) >= 0 ) {
3047
+ // Namespaced trigger; create a regexp to match event type in handle()
3048
+ namespaces = type.split(".");
3049
+ type = namespaces.shift();
3050
+ namespaces.sort();
3051
+ }
3052
+
3053
+ if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
3054
+ // No jQuery handlers for this event type, and it can't have inline handlers
3055
+ return;
3056
+ }
3057
+
3058
+ // Caller can pass in an Event, Object, or just an event type string
3059
+ event = typeof event === "object" ?
3060
+ // jQuery.Event object
3061
+ event[ jQuery.expando ] ? event :
3062
+ // Object literal
3063
+ new jQuery.Event( type, event ) :
3064
+ // Just the event type (string)
3065
+ new jQuery.Event( type );
3066
+
3067
+ event.type = type;
3068
+ event.isTrigger = true;
3069
+ event.exclusive = exclusive;
3070
+ event.namespace = namespaces.join( "." );
3071
+ event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
3072
+ ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
3073
+
3074
+ // Handle a global trigger
3075
+ if ( !elem ) {
3076
+
3077
+ // TODO: Stop taunting the data cache; remove global events and always attach to document
3078
+ cache = jQuery.cache;
3079
+ for ( i in cache ) {
3080
+ if ( cache[ i ].events && cache[ i ].events[ type ] ) {
3081
+ jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
3082
+ }
3083
+ }
3084
+ return;
3085
+ }
3086
+
3087
+ // Clean up the event in case it is being reused
3088
+ event.result = undefined;
3089
+ if ( !event.target ) {
3090
+ event.target = elem;
3091
+ }
3092
+
3093
+ // Clone any incoming data and prepend the event, creating the handler arg list
3094
+ data = data != null ? jQuery.makeArray( data ) : [];
3095
+ data.unshift( event );
3096
+
3097
+ // Allow special events to draw outside the lines
3098
+ special = jQuery.event.special[ type ] || {};
3099
+ if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
3100
+ return;
3101
+ }
3102
+
3103
+ // Determine event propagation path in advance, per W3C events spec (#9951)
3104
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
3105
+ eventPath = [[ elem, special.bindType || type ]];
3106
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
3107
+
3108
+ bubbleType = special.delegateType || type;
3109
+ cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
3110
+ old = null;
3111
+ for ( ; cur; cur = cur.parentNode ) {
3112
+ eventPath.push([ cur, bubbleType ]);
3113
+ old = cur;
3114
+ }
3115
+
3116
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
3117
+ if ( old && old === elem.ownerDocument ) {
3118
+ eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
3119
+ }
3120
+ }
3121
+
3122
+ // Fire handlers on the event path
3123
+ for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
3124
+
3125
+ cur = eventPath[i][0];
3126
+ event.type = eventPath[i][1];
3127
+
3128
+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
3129
+ if ( handle ) {
3130
+ handle.apply( cur, data );
3131
+ }
3132
+ // Note that this is a bare JS function and not a jQuery handler
3133
+ handle = ontype && cur[ ontype ];
3134
+ if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
3135
+ event.preventDefault();
3136
+ }
3137
+ }
3138
+ event.type = type;
3139
+
3140
+ // If nobody prevented the default action, do it now
3141
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
3142
+
3143
+ if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
3144
+ !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
3145
+
3146
+ // Call a native DOM method on the target with the same name name as the event.
3147
+ // Can't use an .isFunction() check here because IE6/7 fails that test.
3148
+ // Don't do default actions on window, that's where global variables be (#6170)
3149
+ // IE<9 dies on focus/blur to hidden element (#1486)
3150
+ if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
3151
+
3152
+ // Don't re-trigger an onFOO event when we call its FOO() method
3153
+ old = elem[ ontype ];
3154
+
3155
+ if ( old ) {
3156
+ elem[ ontype ] = null;
3157
+ }
3158
+
3159
+ // Prevent re-triggering of the same event, since we already bubbled it above
3160
+ jQuery.event.triggered = type;
3161
+ elem[ type ]();
3162
+ jQuery.event.triggered = undefined;
3163
+
3164
+ if ( old ) {
3165
+ elem[ ontype ] = old;
3166
+ }
3167
+ }
3168
+ }
3169
+ }
3170
+
3171
+ return event.result;
3172
+ },
3173
+
3174
+ dispatch: function( event ) {
3175
+
3176
+ // Make a writable jQuery.Event from the native event object
3177
+ event = jQuery.event.fix( event || window.event );
3178
+
3179
+ var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
3180
+ delegateCount = handlers.delegateCount,
3181
+ args = [].slice.call( arguments, 0 ),
3182
+ run_all = !event.exclusive && !event.namespace,
3183
+ handlerQueue = [],
3184
+ i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
3185
+
3186
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
3187
+ args[0] = event;
3188
+ event.delegateTarget = this;
3189
+
3190
+ // Determine handlers that should run if there are delegated events
3191
+ // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
3192
+ if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
3193
+
3194
+ // Pregenerate a single jQuery object for reuse with .is()
3195
+ jqcur = jQuery(this);
3196
+ jqcur.context = this.ownerDocument || this;
3197
+
3198
+ for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
3199
+ selMatch = {};
3200
+ matches = [];
3201
+ jqcur[0] = cur;
3202
+ for ( i = 0; i < delegateCount; i++ ) {
3203
+ handleObj = handlers[ i ];
3204
+ sel = handleObj.selector;
3205
+
3206
+ if ( selMatch[ sel ] === undefined ) {
3207
+ selMatch[ sel ] = (
3208
+ handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
3209
+ );
3210
+ }
3211
+ if ( selMatch[ sel ] ) {
3212
+ matches.push( handleObj );
3213
+ }
3214
+ }
3215
+ if ( matches.length ) {
3216
+ handlerQueue.push({ elem: cur, matches: matches });
3217
+ }
3218
+ }
3219
+ }
3220
+
3221
+ // Add the remaining (directly-bound) handlers
3222
+ if ( handlers.length > delegateCount ) {
3223
+ handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
3224
+ }
3225
+
3226
+ // Run delegates first; they may want to stop propagation beneath us
3227
+ for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
3228
+ matched = handlerQueue[ i ];
3229
+ event.currentTarget = matched.elem;
3230
+
3231
+ for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
3232
+ handleObj = matched.matches[ j ];
3233
+
3234
+ // Triggered event must either 1) be non-exclusive and have no namespace, or
3235
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
3236
+ if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
3237
+
3238
+ event.data = handleObj.data;
3239
+ event.handleObj = handleObj;
3240
+
3241
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
3242
+ .apply( matched.elem, args );
3243
+
3244
+ if ( ret !== undefined ) {
3245
+ event.result = ret;
3246
+ if ( ret === false ) {
3247
+ event.preventDefault();
3248
+ event.stopPropagation();
3249
+ }
3250
+ }
3251
+ }
3252
+ }
3253
+ }
3254
+
3255
+ return event.result;
3256
+ },
3257
+
3258
+ // Includes some event props shared by KeyEvent and MouseEvent
3259
+ // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
3260
+ props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
3261
+
3262
+ fixHooks: {},
3263
+
3264
+ keyHooks: {
3265
+ props: "char charCode key keyCode".split(" "),
3266
+ filter: function( event, original ) {
3267
+
3268
+ // Add which for key events
3269
+ if ( event.which == null ) {
3270
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
3271
+ }
3272
+
3273
+ return event;
3274
+ }
3275
+ },
3276
+
3277
+ mouseHooks: {
3278
+ props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
3279
+ filter: function( event, original ) {
3280
+ var eventDoc, doc, body,
3281
+ button = original.button,
3282
+ fromElement = original.fromElement;
3283
+
3284
+ // Calculate pageX/Y if missing and clientX/Y available
3285
+ if ( event.pageX == null && original.clientX != null ) {
3286
+ eventDoc = event.target.ownerDocument || document;
3287
+ doc = eventDoc.documentElement;
3288
+ body = eventDoc.body;
3289
+
3290
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
3291
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
3292
+ }
3293
+
3294
+ // Add relatedTarget, if necessary
3295
+ if ( !event.relatedTarget && fromElement ) {
3296
+ event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
3297
+ }
3298
+
3299
+ // Add which for click: 1 === left; 2 === middle; 3 === right
3300
+ // Note: button is not normalized, so don't use it
3301
+ if ( !event.which && button !== undefined ) {
3302
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
3303
+ }
3304
+
3305
+ return event;
3306
+ }
3307
+ },
3308
+
3309
+ fix: function( event ) {
3310
+ if ( event[ jQuery.expando ] ) {
3311
+ return event;
3312
+ }
3313
+
3314
+ // Create a writable copy of the event object and normalize some properties
3315
+ var i, prop,
3316
+ originalEvent = event,
3317
+ fixHook = jQuery.event.fixHooks[ event.type ] || {},
3318
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3319
+
3320
+ event = jQuery.Event( originalEvent );
3321
+
3322
+ for ( i = copy.length; i; ) {
3323
+ prop = copy[ --i ];
3324
+ event[ prop ] = originalEvent[ prop ];
3325
+ }
3326
+
3327
+ // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
3328
+ if ( !event.target ) {
3329
+ event.target = originalEvent.srcElement || document;
3330
+ }
3331
+
3332
+ // Target should not be a text node (#504, Safari)
3333
+ if ( event.target.nodeType === 3 ) {
3334
+ event.target = event.target.parentNode;
3335
+ }
3336
+
3337
+ // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
3338
+ if ( event.metaKey === undefined ) {
3339
+ event.metaKey = event.ctrlKey;
3340
+ }
3341
+
3342
+ return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
3343
+ },
3344
+
3345
+ special: {
3346
+ ready: {
3347
+ // Make sure the ready event is setup
3348
+ setup: jQuery.bindReady
3349
+ },
3350
+
3351
+ load: {
3352
+ // Prevent triggered image.load events from bubbling to window.load
3353
+ noBubble: true
3354
+ },
3355
+
3356
+ focus: {
3357
+ delegateType: "focusin"
3358
+ },
3359
+ blur: {
3360
+ delegateType: "focusout"
3361
+ },
3362
+
3363
+ beforeunload: {
3364
+ setup: function( data, namespaces, eventHandle ) {
3365
+ // We only want to do this special case on windows
3366
+ if ( jQuery.isWindow( this ) ) {
3367
+ this.onbeforeunload = eventHandle;
3368
+ }
3369
+ },
3370
+
3371
+ teardown: function( namespaces, eventHandle ) {
3372
+ if ( this.onbeforeunload === eventHandle ) {
3373
+ this.onbeforeunload = null;
3374
+ }
3375
+ }
3376
+ }
3377
+ },
3378
+
3379
+ simulate: function( type, elem, event, bubble ) {
3380
+ // Piggyback on a donor event to simulate a different one.
3381
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
3382
+ // simulated event prevents default then we do the same on the donor.
3383
+ var e = jQuery.extend(
3384
+ new jQuery.Event(),
3385
+ event,
3386
+ { type: type,
3387
+ isSimulated: true,
3388
+ originalEvent: {}
3389
+ }
3390
+ );
3391
+ if ( bubble ) {
3392
+ jQuery.event.trigger( e, null, elem );
3393
+ } else {
3394
+ jQuery.event.dispatch.call( elem, e );
3395
+ }
3396
+ if ( e.isDefaultPrevented() ) {
3397
+ event.preventDefault();
3398
+ }
3399
+ }
3400
+};
3401
+
3402
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
3403
+// The 1.7 special event interface should provide all the hooks needed now.
3404
+jQuery.event.handle = jQuery.event.dispatch;
3405
+
3406
+jQuery.removeEvent = document.removeEventListener ?
3407
+ function( elem, type, handle ) {
3408
+ if ( elem.removeEventListener ) {
3409
+ elem.removeEventListener( type, handle, false );
3410
+ }
3411
+ } :
3412
+ function( elem, type, handle ) {
3413
+ if ( elem.detachEvent ) {
3414
+ elem.detachEvent( "on" + type, handle );
3415
+ }
3416
+ };
3417
+
3418
+jQuery.Event = function( src, props ) {
3419
+ // Allow instantiation without the 'new' keyword
3420
+ if ( !(this instanceof jQuery.Event) ) {
3421
+ return new jQuery.Event( src, props );
3422
+ }
3423
+
3424
+ // Event object
3425
+ if ( src && src.type ) {
3426
+ this.originalEvent = src;
3427
+ this.type = src.type;
3428
+
3429
+ // Events bubbling up the document may have been marked as prevented
3430
+ // by a handler lower down the tree; reflect the correct value.
3431
+ this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
3432
+ src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
3433
+
3434
+ // Event type
3435
+ } else {
3436
+ this.type = src;
3437
+ }
3438
+
3439
+ // Put explicitly provided properties onto the event object
3440
+ if ( props ) {
3441
+ jQuery.extend( this, props );
3442
+ }
3443
+
3444
+ // Create a timestamp if incoming event doesn't have one
3445
+ this.timeStamp = src && src.timeStamp || jQuery.now();
3446
+
3447
+ // Mark it as fixed
3448
+ this[ jQuery.expando ] = true;
3449
+};
3450
+
3451
+function returnFalse() {
3452
+ return false;
3453
+}
3454
+function returnTrue() {
3455
+ return true;
3456
+}
3457
+
3458
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3459
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3460
+jQuery.Event.prototype = {
3461
+ preventDefault: function() {
3462
+ this.isDefaultPrevented = returnTrue;
3463
+
3464
+ var e = this.originalEvent;
3465
+ if ( !e ) {
3466
+ return;
3467
+ }
3468
+
3469
+ // if preventDefault exists run it on the original event
3470
+ if ( e.preventDefault ) {
3471
+ e.preventDefault();
3472
+
3473
+ // otherwise set the returnValue property of the original event to false (IE)
3474
+ } else {
3475
+ e.returnValue = false;
3476
+ }
3477
+ },
3478
+ stopPropagation: function() {
3479
+ this.isPropagationStopped = returnTrue;
3480
+
3481
+ var e = this.originalEvent;
3482
+ if ( !e ) {
3483
+ return;
3484
+ }
3485
+ // if stopPropagation exists run it on the original event
3486
+ if ( e.stopPropagation ) {
3487
+ e.stopPropagation();
3488
+ }
3489
+ // otherwise set the cancelBubble property of the original event to true (IE)
3490
+ e.cancelBubble = true;
3491
+ },
3492
+ stopImmediatePropagation: function() {
3493
+ this.isImmediatePropagationStopped = returnTrue;
3494
+ this.stopPropagation();
3495
+ },
3496
+ isDefaultPrevented: returnFalse,
3497
+ isPropagationStopped: returnFalse,
3498
+ isImmediatePropagationStopped: returnFalse
3499
+};
3500
+
3501
+// Create mouseenter/leave events using mouseover/out and event-time checks
3502
+jQuery.each({
3503
+ mouseenter: "mouseover",
3504
+ mouseleave: "mouseout"
3505
+}, function( orig, fix ) {
3506
+ jQuery.event.special[ orig ] = {
3507
+ delegateType: fix,
3508
+ bindType: fix,
3509
+
3510
+ handle: function( event ) {
3511
+ var target = this,
3512
+ related = event.relatedTarget,
3513
+ handleObj = event.handleObj,
3514
+ selector = handleObj.selector,
3515
+ ret;
3516
+
3517
+ // For mousenter/leave call the handler if related is outside the target.
3518
+ // NB: No relatedTarget if the mouse left/entered the browser window
3519
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
3520
+ event.type = handleObj.origType;
3521
+ ret = handleObj.handler.apply( this, arguments );
3522
+ event.type = fix;
3523
+ }
3524
+ return ret;
3525
+ }
3526
+ };
3527
+});
3528
+
3529
+// IE submit delegation
3530
+if ( !jQuery.support.submitBubbles ) {
3531
+
3532
+ jQuery.event.special.submit = {
3533
+ setup: function() {
3534
+ // Only need this for delegated form submit events
3535
+ if ( jQuery.nodeName( this, "form" ) ) {
3536
+ return false;
3537
+ }
3538
+
3539
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
3540
+ jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
3541
+ // Node name check avoids a VML-related crash in IE (#9807)
3542
+ var elem = e.target,
3543
+ form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
3544
+ if ( form && !form._submit_attached ) {
3545
+ jQuery.event.add( form, "submit._submit", function( event ) {
3546
+ // If form was submitted by the user, bubble the event up the tree
3547
+ if ( this.parentNode && !event.isTrigger ) {
3548
+ jQuery.event.simulate( "submit", this.parentNode, event, true );
3549
+ }
3550
+ });
3551
+ form._submit_attached = true;
3552
+ }
3553
+ });
3554
+ // return undefined since we don't need an event listener
3555
+ },
3556
+
3557
+ teardown: function() {
3558
+ // Only need this for delegated form submit events
3559
+ if ( jQuery.nodeName( this, "form" ) ) {
3560
+ return false;
3561
+ }
3562
+
3563
+ // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
3564
+ jQuery.event.remove( this, "._submit" );
3565
+ }
3566
+ };
3567
+}
3568
+
3569
+// IE change delegation and checkbox/radio fix
3570
+if ( !jQuery.support.changeBubbles ) {
3571
+
3572
+ jQuery.event.special.change = {
3573
+
3574
+ setup: function() {
3575
+
3576
+ if ( rformElems.test( this.nodeName ) ) {
3577
+ // IE doesn't fire change on a check/radio until blur; trigger it on click
3578
+ // after a propertychange. Eat the blur-change in special.change.handle.
3579
+ // This still fires onchange a second time for check/radio after blur.
3580
+ if ( this.type === "checkbox" || this.type === "radio" ) {
3581
+ jQuery.event.add( this, "propertychange._change", function( event ) {
3582
+ if ( event.originalEvent.propertyName === "checked" ) {
3583
+ this._just_changed = true;
3584
+ }
3585
+ });
3586
+ jQuery.event.add( this, "click._change", function( event ) {
3587
+ if ( this._just_changed && !event.isTrigger ) {
3588
+ this._just_changed = false;
3589
+ jQuery.event.simulate( "change", this, event, true );
3590
+ }
3591
+ });
3592
+ }
3593
+ return false;
3594
+ }
3595
+ // Delegated event; lazy-add a change handler on descendant inputs
3596
+ jQuery.event.add( this, "beforeactivate._change", function( e ) {
3597
+ var elem = e.target;
3598
+
3599
+ if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
3600
+ jQuery.event.add( elem, "change._change", function( event ) {
3601
+ if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
3602
+ jQuery.event.simulate( "change", this.parentNode, event, true );
3603
+ }
3604
+ });
3605
+ elem._change_attached = true;
3606
+ }
3607
+ });
3608
+ },
3609
+
3610
+ handle: function( event ) {
3611
+ var elem = event.target;
3612
+
3613
+ // Swallow native change events from checkbox/radio, we already triggered them above
3614
+ if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
3615
+ return event.handleObj.handler.apply( this, arguments );
3616
+ }
3617
+ },
3618
+
3619
+ teardown: function() {
3620
+ jQuery.event.remove( this, "._change" );
3621
+
3622
+ return rformElems.test( this.nodeName );
3623
+ }
3624
+ };
3625
+}
3626
+
3627
+// Create "bubbling" focus and blur events
3628
+if ( !jQuery.support.focusinBubbles ) {
3629
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3630
+
3631
+ // Attach a single capturing handler while someone wants focusin/focusout
3632
+ var attaches = 0,
3633
+ handler = function( event ) {
3634
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
3635
+ };
3636
+
3637
+ jQuery.event.special[ fix ] = {
3638
+ setup: function() {
3639
+ if ( attaches++ === 0 ) {
3640
+ document.addEventListener( orig, handler, true );
3641
+ }
3642
+ },
3643
+ teardown: function() {
3644
+ if ( --attaches === 0 ) {
3645
+ document.removeEventListener( orig, handler, true );
3646
+ }
3647
+ }
3648
+ };
3649
+ });
3650
+}
3651
+
3652
+jQuery.fn.extend({
3653
+
3654
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3655
+ var origFn, type;
3656
+
3657
+ // Types can be a map of types/handlers
3658
+ if ( typeof types === "object" ) {
3659
+ // ( types-Object, selector, data )
3660
+ if ( typeof selector !== "string" ) {
3661
+ // ( types-Object, data )
3662
+ data = selector;
3663
+ selector = undefined;
3664
+ }
3665
+ for ( type in types ) {
3666
+ this.on( type, selector, data, types[ type ], one );
3667
+ }
3668
+ return this;
3669
+ }
3670
+
3671
+ if ( data == null && fn == null ) {
3672
+ // ( types, fn )
3673
+ fn = selector;
3674
+ data = selector = undefined;
3675
+ } else if ( fn == null ) {
3676
+ if ( typeof selector === "string" ) {
3677
+ // ( types, selector, fn )
3678
+ fn = data;
3679
+ data = undefined;
3680
+ } else {
3681
+ // ( types, data, fn )
3682
+ fn = data;
3683
+ data = selector;
3684
+ selector = undefined;
3685
+ }
3686
+ }
3687
+ if ( fn === false ) {
3688
+ fn = returnFalse;
3689
+ } else if ( !fn ) {
3690
+ return this;
3691
+ }
3692
+
3693
+ if ( one === 1 ) {
3694
+ origFn = fn;
3695
+ fn = function( event ) {
3696
+ // Can use an empty set, since event contains the info
3697
+ jQuery().off( event );
3698
+ return origFn.apply( this, arguments );
3699
+ };
3700
+ // Use same guid so caller can remove using origFn
3701
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
3702
+ }
3703
+ return this.each( function() {
3704
+ jQuery.event.add( this, types, fn, data, selector );
3705
+ });
3706
+ },
3707
+ one: function( types, selector, data, fn ) {
3708
+ return this.on.call( this, types, selector, data, fn, 1 );
3709
+ },
3710
+ off: function( types, selector, fn ) {
3711
+ if ( types && types.preventDefault && types.handleObj ) {
3712
+ // ( event ) dispatched jQuery.Event
3713
+ var handleObj = types.handleObj;
3714
+ jQuery( types.delegateTarget ).off(
3715
+ handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
3716
+ handleObj.selector,
3717
+ handleObj.handler
3718
+ );
3719
+ return this;
3720
+ }
3721
+ if ( typeof types === "object" ) {
3722
+ // ( types-object [, selector] )
3723
+ for ( var type in types ) {
3724
+ this.off( type, selector, types[ type ] );
3725
+ }
3726
+ return this;
3727
+ }
3728
+ if ( selector === false || typeof selector === "function" ) {
3729
+ // ( types [, fn] )
3730
+ fn = selector;
3731
+ selector = undefined;
3732
+ }
3733
+ if ( fn === false ) {
3734
+ fn = returnFalse;
3735
+ }
3736
+ return this.each(function() {
3737
+ jQuery.event.remove( this, types, fn, selector );
3738
+ });
3739
+ },
3740
+
3741
+ bind: function( types, data, fn ) {
3742
+ return this.on( types, null, data, fn );
3743
+ },
3744
+ unbind: function( types, fn ) {
3745
+ return this.off( types, null, fn );
3746
+ },
3747
+
3748
+ live: function( types, data, fn ) {
3749
+ jQuery( this.context ).on( types, this.selector, data, fn );
3750
+ return this;
3751
+ },
3752
+ die: function( types, fn ) {
3753
+ jQuery( this.context ).off( types, this.selector || "**", fn );
3754
+ return this;
3755
+ },
3756
+
3757
+ delegate: function( selector, types, data, fn ) {
3758
+ return this.on( types, selector, data, fn );
3759
+ },
3760
+ undelegate: function( selector, types, fn ) {
3761
+ // ( namespace ) or ( selector, types [, fn] )
3762
+ return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
3763
+ },
3764
+
3765
+ trigger: function( type, data ) {
3766
+ return this.each(function() {
3767
+ jQuery.event.trigger( type, data, this );
3768
+ });
3769
+ },
3770
+ triggerHandler: function( type, data ) {
3771
+ if ( this[0] ) {
3772
+ return jQuery.event.trigger( type, data, this[0], true );
3773
+ }
3774
+ },
3775
+
3776
+ toggle: function( fn ) {
3777
+ // Save reference to arguments for access in closure
3778
+ var args = arguments,
3779
+ guid = fn.guid || jQuery.guid++,
3780
+ i = 0,
3781
+ toggler = function( event ) {
3782
+ // Figure out which function to execute
3783
+ var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3784
+ jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3785
+
3786
+ // Make sure that clicks stop
3787
+ event.preventDefault();
3788
+
3789
+ // and execute the function
3790
+ return args[ lastToggle ].apply( this, arguments ) || false;
3791
+ };
3792
+
3793
+ // link all the functions, so any of them can unbind this click handler
3794
+ toggler.guid = guid;
3795
+ while ( i < args.length ) {
3796
+ args[ i++ ].guid = guid;
3797
+ }
3798
+
3799
+ return this.click( toggler );
3800
+ },
3801
+
3802
+ hover: function( fnOver, fnOut ) {
3803
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3804
+ }
3805
+});
3806
+
3807
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3808
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3809
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
3810
+
3811
+ // Handle event binding
3812
+ jQuery.fn[ name ] = function( data, fn ) {
3813
+ if ( fn == null ) {
3814
+ fn = data;
3815
+ data = null;
3816
+ }
3817
+
3818
+ return arguments.length > 0 ?
3819
+ this.on( name, null, data, fn ) :
3820
+ this.trigger( name );
3821
+ };
3822
+
3823
+ if ( jQuery.attrFn ) {
3824
+ jQuery.attrFn[ name ] = true;
3825
+ }
3826
+
3827
+ if ( rkeyEvent.test( name ) ) {
3828
+ jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
3829
+ }
3830
+
3831
+ if ( rmouseEvent.test( name ) ) {
3832
+ jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
3833
+ }
3834
+});
3835
+
3836
+
3837
+
3838
+/*!
3839
+ * Sizzle CSS Selector Engine
3840
+ * Copyright 2012, The Dojo Foundation
3841
+ * Released under the MIT, BSD, and GPL Licenses.
3842
+ * More information: http://sizzlejs.com/
3843
+ */
3844
+(function(){
3845
+
3846
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3847
+ expando = "sizcache" + (Math.random() + '').replace('.', ''),
3848
+ done = 0,
3849
+ toString = Object.prototype.toString,
3850
+ hasDuplicate = false,
3851
+ baseHasDuplicate = true,
3852
+ rBackslash = /\\/g,
3853
+ rReturn = /\r\n/g,
3854
+ rNonWord = /\W/;
3855
+
3856
+// Here we check if the JavaScript engine is using some sort of
3857
+// optimization where it does not always call our comparision
3858
+// function. If that is the case, discard the hasDuplicate value.
3859
+// Thus far that includes Google Chrome.
3860
+[0, 0].sort(function() {
3861
+ baseHasDuplicate = false;
3862
+ return 0;
3863
+});
3864
+
3865
+var Sizzle = function( selector, context, results, seed ) {
3866
+ results = results || [];
3867
+ context = context || document;
3868
+
3869
+ var origContext = context;
3870
+
3871
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3872
+ return [];
3873
+ }
3874
+
3875
+ if ( !selector || typeof selector !== "string" ) {
3876
+ return results;
3877
+ }
3878
+
3879
+ var m, set, checkSet, extra, ret, cur, pop, i,
3880
+ prune = true,
3881
+ contextXML = Sizzle.isXML( context ),
3882
+ parts = [],
3883
+ soFar = selector;
3884
+
3885
+ // Reset the position of the chunker regexp (start from head)
3886
+ do {
3887
+ chunker.exec( "" );
3888
+ m = chunker.exec( soFar );
3889
+
3890
+ if ( m ) {
3891
+ soFar = m[3];
3892
+
3893
+ parts.push( m[1] );
3894
+
3895
+ if ( m[2] ) {
3896
+ extra = m[3];
3897
+ break;
3898
+ }
3899
+ }
3900
+ } while ( m );
3901
+
3902
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
3903
+
3904
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3905
+ set = posProcess( parts[0] + parts[1], context, seed );
3906
+
3907
+ } else {
3908
+ set = Expr.relative[ parts[0] ] ?
3909
+ [ context ] :
3910
+ Sizzle( parts.shift(), context );
3911
+
3912
+ while ( parts.length ) {
3913
+ selector = parts.shift();
3914
+
3915
+ if ( Expr.relative[ selector ] ) {
3916
+ selector += parts.shift();
3917
+ }
3918
+
3919
+ set = posProcess( selector, set, seed );
3920
+ }
3921
+ }
3922
+
3923
+ } else {
3924
+ // Take a shortcut and set the context if the root selector is an ID
3925
+ // (but not if it'll be faster if the inner selector is an ID)
3926
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3927
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3928
+
3929
+ ret = Sizzle.find( parts.shift(), context, contextXML );
3930
+ context = ret.expr ?
3931
+ Sizzle.filter( ret.expr, ret.set )[0] :
3932
+ ret.set[0];
3933
+ }
3934
+
3935
+ if ( context ) {
3936
+ ret = seed ?
3937
+ { expr: parts.pop(), set: makeArray(seed) } :
3938
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3939
+
3940
+ set = ret.expr ?
3941
+ Sizzle.filter( ret.expr, ret.set ) :
3942
+ ret.set;
3943
+
3944
+ if ( parts.length > 0 ) {
3945
+ checkSet = makeArray( set );
3946
+
3947
+ } else {
3948
+ prune = false;
3949
+ }
3950
+
3951
+ while ( parts.length ) {
3952
+ cur = parts.pop();
3953
+ pop = cur;
3954
+
3955
+ if ( !Expr.relative[ cur ] ) {
3956
+ cur = "";
3957
+ } else {
3958
+ pop = parts.pop();
3959
+ }
3960
+
3961
+ if ( pop == null ) {
3962
+ pop = context;
3963
+ }
3964
+
3965
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
3966
+ }
3967
+
3968
+ } else {
3969
+ checkSet = parts = [];
3970
+ }
3971
+ }
3972
+
3973
+ if ( !checkSet ) {
3974
+ checkSet = set;
3975
+ }
3976
+
3977
+ if ( !checkSet ) {
3978
+ Sizzle.error( cur || selector );
3979
+ }
3980
+
3981
+ if ( toString.call(checkSet) === "[object Array]" ) {
3982
+ if ( !prune ) {
3983
+ results.push.apply( results, checkSet );
3984
+
3985
+ } else if ( context && context.nodeType === 1 ) {
3986
+ for ( i = 0; checkSet[i] != null; i++ ) {
3987
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
3988
+ results.push( set[i] );
3989
+ }
3990
+ }
3991
+
3992
+ } else {
3993
+ for ( i = 0; checkSet[i] != null; i++ ) {
3994
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
3995
+ results.push( set[i] );
3996
+ }
3997
+ }
3998
+ }
3999
+
4000
+ } else {
4001
+ makeArray( checkSet, results );
4002
+ }
4003
+
4004
+ if ( extra ) {
4005
+ Sizzle( extra, origContext, results, seed );
4006
+ Sizzle.uniqueSort( results );
4007
+ }
4008
+
4009
+ return results;
4010
+};
4011
+
4012
+Sizzle.uniqueSort = function( results ) {
4013
+ if ( sortOrder ) {
4014
+ hasDuplicate = baseHasDuplicate;
4015
+ results.sort( sortOrder );
4016
+
4017
+ if ( hasDuplicate ) {
4018
+ for ( var i = 1; i < results.length; i++ ) {
4019
+ if ( results[i] === results[ i - 1 ] ) {
4020
+ results.splice( i--, 1 );
4021
+ }
4022
+ }
4023
+ }
4024
+ }
4025
+
4026
+ return results;
4027
+};
4028
+
4029
+Sizzle.matches = function( expr, set ) {
4030
+ return Sizzle( expr, null, null, set );
4031
+};
4032
+
4033
+Sizzle.matchesSelector = function( node, expr ) {
4034
+ return Sizzle( expr, null, null, [node] ).length > 0;
4035
+};
4036
+
4037
+Sizzle.find = function( expr, context, isXML ) {
4038
+ var set, i, len, match, type, left;
4039
+
4040
+ if ( !expr ) {
4041
+ return [];
4042
+ }
4043
+
4044
+ for ( i = 0, len = Expr.order.length; i < len; i++ ) {
4045
+ type = Expr.order[i];
4046
+
4047
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
4048
+ left = match[1];
4049
+ match.splice( 1, 1 );
4050
+
4051
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
4052
+ match[1] = (match[1] || "").replace( rBackslash, "" );
4053
+ set = Expr.find[ type ]( match, context, isXML );
4054
+
4055
+ if ( set != null ) {
4056
+ expr = expr.replace( Expr.match[ type ], "" );
4057
+ break;
4058
+ }
4059
+ }
4060
+ }
4061
+ }
4062
+
4063
+ if ( !set ) {
4064
+ set = typeof context.getElementsByTagName !== "undefined" ?
4065
+ context.getElementsByTagName( "*" ) :
4066
+ [];
4067
+ }
4068
+
4069
+ return { set: set, expr: expr };
4070
+};
4071
+
4072
+Sizzle.filter = function( expr, set, inplace, not ) {
4073
+ var match, anyFound,
4074
+ type, found, item, filter, left,
4075
+ i, pass,
4076
+ old = expr,
4077
+ result = [],
4078
+ curLoop = set,
4079
+ isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
4080
+
4081
+ while ( expr && set.length ) {
4082
+ for ( type in Expr.filter ) {
4083
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
4084
+ filter = Expr.filter[ type ];
4085
+ left = match[1];
4086
+
4087
+ anyFound = false;
4088
+
4089
+ match.splice(1,1);
4090
+
4091
+ if ( left.substr( left.length - 1 ) === "\\" ) {
4092
+ continue;
4093
+ }
4094
+
4095
+ if ( curLoop === result ) {
4096
+ result = [];
4097
+ }
4098
+
4099
+ if ( Expr.preFilter[ type ] ) {
4100
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
4101
+
4102
+ if ( !match ) {
4103
+ anyFound = found = true;
4104
+
4105
+ } else if ( match === true ) {
4106
+ continue;
4107
+ }
4108
+ }
4109
+
4110
+ if ( match ) {
4111
+ for ( i = 0; (item = curLoop[i]) != null; i++ ) {
4112
+ if ( item ) {
4113
+ found = filter( item, match, i, curLoop );
4114
+ pass = not ^ found;
4115
+
4116
+ if ( inplace && found != null ) {
4117
+ if ( pass ) {
4118
+ anyFound = true;
4119
+
4120
+ } else {
4121
+ curLoop[i] = false;
4122
+ }
4123
+
4124
+ } else if ( pass ) {
4125
+ result.push( item );
4126
+ anyFound = true;
4127
+ }
4128
+ }
4129
+ }
4130
+ }
4131
+
4132
+ if ( found !== undefined ) {
4133
+ if ( !inplace ) {
4134
+ curLoop = result;
4135
+ }
4136
+
4137
+ expr = expr.replace( Expr.match[ type ], "" );
4138
+
4139
+ if ( !anyFound ) {
4140
+ return [];
4141
+ }
4142
+
4143
+ break;
4144
+ }
4145
+ }
4146
+ }
4147
+
4148
+ // Improper expression
4149
+ if ( expr === old ) {
4150
+ if ( anyFound == null ) {
4151
+ Sizzle.error( expr );
4152
+
4153
+ } else {
4154
+ break;
4155
+ }
4156
+ }
4157
+
4158
+ old = expr;
4159
+ }
4160
+
4161
+ return curLoop;
4162
+};
4163
+
4164
+Sizzle.error = function( msg ) {
4165
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
4166
+};
4167
+
4168
+/**
4169
+ * Utility function for retreiving the text value of an array of DOM nodes
4170
+ * @param {Array|Element} elem
4171
+ */
4172
+var getText = Sizzle.getText = function( elem ) {
4173
+ var i, node,
4174
+ nodeType = elem.nodeType,
4175
+ ret = "";
4176
+
4177
+ if ( nodeType ) {
4178
+ if ( nodeType === 1 || nodeType === 9 ) {
4179
+ // Use textContent || innerText for elements
4180
+ if ( typeof elem.textContent === 'string' ) {
4181
+ return elem.textContent;
4182
+ } else if ( typeof elem.innerText === 'string' ) {
4183
+ // Replace IE's carriage returns
4184
+ return elem.innerText.replace( rReturn, '' );
4185
+ } else {
4186
+ // Traverse it's children
4187
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
4188
+ ret += getText( elem );
4189
+ }
4190
+ }
4191
+ } else if ( nodeType === 3 || nodeType === 4 ) {
4192
+ return elem.nodeValue;
4193
+ }
4194
+ } else {
4195
+
4196
+ // If no nodeType, this is expected to be an array
4197
+ for ( i = 0; (node = elem[i]); i++ ) {
4198
+ // Do not traverse comment nodes
4199
+ if ( node.nodeType !== 8 ) {
4200
+ ret += getText( node );
4201
+ }
4202
+ }
4203
+ }
4204
+ return ret;
4205
+};
4206
+
4207
+var Expr = Sizzle.selectors = {
4208
+ order: [ "ID", "NAME", "TAG" ],
4209
+
4210
+ match: {
4211
+ ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4212
+ CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4213
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
4214
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
4215
+ TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
4216
+ CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
4217
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
4218
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
4219
+ },
4220
+
4221
+ leftMatch: {},
4222
+
4223
+ attrMap: {
4224
+ "class": "className",
4225
+ "for": "htmlFor"
4226
+ },
4227
+
4228
+ attrHandle: {
4229
+ href: function( elem ) {
4230
+ return elem.getAttribute( "href" );
4231
+ },
4232
+ type: function( elem ) {
4233
+ return elem.getAttribute( "type" );
4234
+ }
4235
+ },
4236
+
4237
+ relative: {
4238
+ "+": function(checkSet, part){
4239
+ var isPartStr = typeof part === "string",
4240
+ isTag = isPartStr && !rNonWord.test( part ),
4241
+ isPartStrNotTag = isPartStr && !isTag;
4242
+
4243
+ if ( isTag ) {
4244
+ part = part.toLowerCase();
4245
+ }
4246
+
4247
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4248
+ if ( (elem = checkSet[i]) ) {
4249
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
4250
+
4251
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
4252
+ elem || false :
4253
+ elem === part;
4254
+ }
4255
+ }
4256
+
4257
+ if ( isPartStrNotTag ) {
4258
+ Sizzle.filter( part, checkSet, true );
4259
+ }
4260
+ },
4261
+
4262
+ ">": function( checkSet, part ) {
4263
+ var elem,
4264
+ isPartStr = typeof part === "string",
4265
+ i = 0,
4266
+ l = checkSet.length;
4267
+
4268
+ if ( isPartStr && !rNonWord.test( part ) ) {
4269
+ part = part.toLowerCase();
4270
+
4271
+ for ( ; i < l; i++ ) {
4272
+ elem = checkSet[i];
4273
+
4274
+ if ( elem ) {
4275
+ var parent = elem.parentNode;
4276
+ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
4277
+ }
4278
+ }
4279
+
4280
+ } else {
4281
+ for ( ; i < l; i++ ) {
4282
+ elem = checkSet[i];
4283
+
4284
+ if ( elem ) {
4285
+ checkSet[i] = isPartStr ?
4286
+ elem.parentNode :
4287
+ elem.parentNode === part;
4288
+ }
4289
+ }
4290
+
4291
+ if ( isPartStr ) {
4292
+ Sizzle.filter( part, checkSet, true );
4293
+ }
4294
+ }
4295
+ },
4296
+
4297
+ "": function(checkSet, part, isXML){
4298
+ var nodeCheck,
4299
+ doneName = done++,
4300
+ checkFn = dirCheck;
4301
+
4302
+ if ( typeof part === "string" && !rNonWord.test( part ) ) {
4303
+ part = part.toLowerCase();
4304
+ nodeCheck = part;
4305
+ checkFn = dirNodeCheck;
4306
+ }
4307
+
4308
+ checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
4309
+ },
4310
+
4311
+ "~": function( checkSet, part, isXML ) {
4312
+ var nodeCheck,
4313
+ doneName = done++,
4314
+ checkFn = dirCheck;
4315
+
4316
+ if ( typeof part === "string" && !rNonWord.test( part ) ) {
4317
+ part = part.toLowerCase();
4318
+ nodeCheck = part;
4319
+ checkFn = dirNodeCheck;
4320
+ }
4321
+
4322
+ checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
4323
+ }
4324
+ },
4325
+
4326
+ find: {
4327
+ ID: function( match, context, isXML ) {
4328
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
4329
+ var m = context.getElementById(match[1]);
4330
+ // Check parentNode to catch when Blackberry 4.6 returns
4331
+ // nodes that are no longer in the document #6963
4332
+ return m && m.parentNode ? [m] : [];
4333
+ }
4334
+ },
4335
+
4336
+ NAME: function( match, context ) {
4337
+ if ( typeof context.getElementsByName !== "undefined" ) {
4338
+ var ret = [],
4339
+ results = context.getElementsByName( match[1] );
4340
+
4341
+ for ( var i = 0, l = results.length; i < l; i++ ) {
4342
+ if ( results[i].getAttribute("name") === match[1] ) {
4343
+ ret.push( results[i] );
4344
+ }
4345
+ }
4346
+
4347
+ return ret.length === 0 ? null : ret;
4348
+ }
4349
+ },
4350
+
4351
+ TAG: function( match, context ) {
4352
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
4353
+ return context.getElementsByTagName( match[1] );
4354
+ }
4355
+ }
4356
+ },
4357
+ preFilter: {
4358
+ CLASS: function( match, curLoop, inplace, result, not, isXML ) {
4359
+ match = " " + match[1].replace( rBackslash, "" ) + " ";
4360
+
4361
+ if ( isXML ) {
4362
+ return match;
4363
+ }
4364
+
4365
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4366
+ if ( elem ) {
4367
+ if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
4368
+ if ( !inplace ) {
4369
+ result.push( elem );
4370
+ }
4371
+
4372
+ } else if ( inplace ) {
4373
+ curLoop[i] = false;
4374
+ }
4375
+ }
4376
+ }
4377
+
4378
+ return false;
4379
+ },
4380
+
4381
+ ID: function( match ) {
4382
+ return match[1].replace( rBackslash, "" );
4383
+ },
4384
+
4385
+ TAG: function( match, curLoop ) {
4386
+ return match[1].replace( rBackslash, "" ).toLowerCase();
4387
+ },
4388
+
4389
+ CHILD: function( match ) {
4390
+ if ( match[1] === "nth" ) {
4391
+ if ( !match[2] ) {
4392
+ Sizzle.error( match[0] );
4393
+ }
4394
+
4395
+ match[2] = match[2].replace(/^\+|\s*/g, '');
4396
+
4397
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
4398
+ var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
4399
+ match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
4400
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4401
+
4402
+ // calculate the numbers (first)n+(last) including if they are negative
4403
+ match[2] = (test[1] + (test[2] || 1)) - 0;
4404
+ match[3] = test[3] - 0;
4405
+ }
4406
+ else if ( match[2] ) {
4407
+ Sizzle.error( match[0] );
4408
+ }
4409
+
4410
+ // TODO: Move to normal caching system
4411
+ match[0] = done++;
4412
+
4413
+ return match;
4414
+ },
4415
+
4416
+ ATTR: function( match, curLoop, inplace, result, not, isXML ) {
4417
+ var name = match[1] = match[1].replace( rBackslash, "" );
4418
+
4419
+ if ( !isXML && Expr.attrMap[name] ) {
4420
+ match[1] = Expr.attrMap[name];
4421
+ }
4422
+
4423
+ // Handle if an un-quoted value was used
4424
+ match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
4425
+
4426
+ if ( match[2] === "~=" ) {
4427
+ match[4] = " " + match[4] + " ";
4428
+ }
4429
+
4430
+ return match;
4431
+ },
4432
+
4433
+ PSEUDO: function( match, curLoop, inplace, result, not ) {
4434
+ if ( match[1] === "not" ) {
4435
+ // If we're dealing with a complex expression, or a simple one
4436
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4437
+ match[3] = Sizzle(match[3], null, null, curLoop);
4438
+
4439
+ } else {
4440
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4441
+
4442
+ if ( !inplace ) {
4443
+ result.push.apply( result, ret );
4444
+ }
4445
+
4446
+ return false;
4447
+ }
4448
+
4449
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4450
+ return true;
4451
+ }
4452
+
4453
+ return match;
4454
+ },
4455
+
4456
+ POS: function( match ) {
4457
+ match.unshift( true );
4458
+
4459
+ return match;
4460
+ }
4461
+ },
4462
+
4463
+ filters: {
4464
+ enabled: function( elem ) {
4465
+ return elem.disabled === false && elem.type !== "hidden";
4466
+ },
4467
+
4468
+ disabled: function( elem ) {
4469
+ return elem.disabled === true;
4470
+ },
4471
+
4472
+ checked: function( elem ) {
4473
+ return elem.checked === true;
4474
+ },
4475
+
4476
+ selected: function( elem ) {
4477
+ // Accessing this property makes selected-by-default
4478
+ // options in Safari work properly
4479
+ if ( elem.parentNode ) {
4480
+ elem.parentNode.selectedIndex;
4481
+ }
4482
+
4483
+ return elem.selected === true;
4484
+ },
4485
+
4486
+ parent: function( elem ) {
4487
+ return !!elem.firstChild;
4488
+ },
4489
+
4490
+ empty: function( elem ) {
4491
+ return !elem.firstChild;
4492
+ },
4493
+
4494
+ has: function( elem, i, match ) {
4495
+ return !!Sizzle( match[3], elem ).length;
4496
+ },
4497
+
4498
+ header: function( elem ) {
4499
+ return (/h\d/i).test( elem.nodeName );
4500
+ },
4501
+
4502
+ text: function( elem ) {
4503
+ var attr = elem.getAttribute( "type" ), type = elem.type;
4504
+ // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
4505
+ // use getAttribute instead to test this case
4506
+ return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
4507
+ },
4508
+
4509
+ radio: function( elem ) {
4510
+ return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
4511
+ },
4512
+
4513
+ checkbox: function( elem ) {
4514
+ return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
4515
+ },
4516
+
4517
+ file: function( elem ) {
4518
+ return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
4519
+ },
4520
+
4521
+ password: function( elem ) {
4522
+ return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
4523
+ },
4524
+
4525
+ submit: function( elem ) {
4526
+ var name = elem.nodeName.toLowerCase();
4527
+ return (name === "input" || name === "button") && "submit" === elem.type;
4528
+ },
4529
+
4530
+ image: function( elem ) {
4531
+ return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
4532
+ },
4533
+
4534
+ reset: function( elem ) {
4535
+ var name = elem.nodeName.toLowerCase();
4536
+ return (name === "input" || name === "button") && "reset" === elem.type;
4537
+ },
4538
+
4539
+ button: function( elem ) {
4540
+ var name = elem.nodeName.toLowerCase();
4541
+ return name === "input" && "button" === elem.type || name === "button";
4542
+ },
4543
+
4544
+ input: function( elem ) {
4545
+ return (/input|select|textarea|button/i).test( elem.nodeName );
4546
+ },
4547
+
4548
+ focus: function( elem ) {
4549
+ return elem === elem.ownerDocument.activeElement;
4550
+ }
4551
+ },
4552
+ setFilters: {
4553
+ first: function( elem, i ) {
4554
+ return i === 0;
4555
+ },
4556
+
4557
+ last: function( elem, i, match, array ) {
4558
+ return i === array.length - 1;
4559
+ },
4560
+
4561
+ even: function( elem, i ) {
4562
+ return i % 2 === 0;
4563
+ },
4564
+
4565
+ odd: function( elem, i ) {
4566
+ return i % 2 === 1;
4567
+ },
4568
+
4569
+ lt: function( elem, i, match ) {
4570
+ return i < match[3] - 0;
4571
+ },
4572
+
4573
+ gt: function( elem, i, match ) {
4574
+ return i > match[3] - 0;
4575
+ },
4576
+
4577
+ nth: function( elem, i, match ) {
4578
+ return match[3] - 0 === i;
4579
+ },
4580
+
4581
+ eq: function( elem, i, match ) {
4582
+ return match[3] - 0 === i;
4583
+ }
4584
+ },
4585
+ filter: {
4586
+ PSEUDO: function( elem, match, i, array ) {
4587
+ var name = match[1],
4588
+ filter = Expr.filters[ name ];
4589
+
4590
+ if ( filter ) {
4591
+ return filter( elem, i, match, array );
4592
+
4593
+ } else if ( name === "contains" ) {
4594
+ return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
4595
+
4596
+ } else if ( name === "not" ) {
4597
+ var not = match[3];
4598
+
4599
+ for ( var j = 0, l = not.length; j < l; j++ ) {
4600
+ if ( not[j] === elem ) {
4601
+ return false;
4602
+ }
4603
+ }
4604
+
4605
+ return true;
4606
+
4607
+ } else {
4608
+ Sizzle.error( name );
4609
+ }
4610
+ },
4611
+
4612
+ CHILD: function( elem, match ) {
4613
+ var first, last,
4614
+ doneName, parent, cache,
4615
+ count, diff,
4616
+ type = match[1],
4617
+ node = elem;
4618
+
4619
+ switch ( type ) {
4620
+ case "only":
4621
+ case "first":
4622
+ while ( (node = node.previousSibling) ) {
4623
+ if ( node.nodeType === 1 ) {
4624
+ return false;
4625
+ }
4626
+ }
4627
+
4628
+ if ( type === "first" ) {
4629
+ return true;
4630
+ }
4631
+
4632
+ node = elem;
4633
+
4634
+ case "last":
4635
+ while ( (node = node.nextSibling) ) {
4636
+ if ( node.nodeType === 1 ) {
4637
+ return false;
4638
+ }
4639
+ }
4640
+
4641
+ return true;
4642
+
4643
+ case "nth":
4644
+ first = match[2];
4645
+ last = match[3];
4646
+
4647
+ if ( first === 1 && last === 0 ) {
4648
+ return true;
4649
+ }
4650
+
4651
+ doneName = match[0];
4652
+ parent = elem.parentNode;
4653
+
4654
+ if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
4655
+ count = 0;
4656
+
4657
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
4658
+ if ( node.nodeType === 1 ) {
4659
+ node.nodeIndex = ++count;
4660
+ }
4661
+ }
4662
+
4663
+ parent[ expando ] = doneName;
4664
+ }
4665
+
4666
+ diff = elem.nodeIndex - last;
4667
+
4668
+ if ( first === 0 ) {
4669
+ return diff === 0;
4670
+
4671
+ } else {
4672
+ return ( diff % first === 0 && diff / first >= 0 );
4673
+ }
4674
+ }
4675
+ },
4676
+
4677
+ ID: function( elem, match ) {
4678
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
4679
+ },
4680
+
4681
+ TAG: function( elem, match ) {
4682
+ return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
4683
+ },
4684
+
4685
+ CLASS: function( elem, match ) {
4686
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
4687
+ .indexOf( match ) > -1;
4688
+ },
4689
+
4690
+ ATTR: function( elem, match ) {
4691
+ var name = match[1],
4692
+ result = Sizzle.attr ?
4693
+ Sizzle.attr( elem, name ) :
4694
+ Expr.attrHandle[ name ] ?
4695
+ Expr.attrHandle[ name ]( elem ) :
4696
+ elem[ name ] != null ?
4697
+ elem[ name ] :
4698
+ elem.getAttribute( name ),
4699
+ value = result + "",
4700
+ type = match[2],
4701
+ check = match[4];
4702
+
4703
+ return result == null ?
4704
+ type === "!=" :
4705
+ !type && Sizzle.attr ?
4706
+ result != null :
4707
+ type === "=" ?
4708
+ value === check :
4709
+ type === "*=" ?
4710
+ value.indexOf(check) >= 0 :
4711
+ type === "~=" ?
4712
+ (" " + value + " ").indexOf(check) >= 0 :
4713
+ !check ?
4714
+ value && result !== false :
4715
+ type === "!=" ?
4716
+ value !== check :
4717
+ type === "^=" ?
4718
+ value.indexOf(check) === 0 :
4719
+ type === "$=" ?
4720
+ value.substr(value.length - check.length) === check :
4721
+ type === "|=" ?
4722
+ value === check || value.substr(0, check.length + 1) === check + "-" :
4723
+ false;
4724
+ },
4725
+
4726
+ POS: function( elem, match, i, array ) {
4727
+ var name = match[2],
4728
+ filter = Expr.setFilters[ name ];
4729
+
4730
+ if ( filter ) {
4731
+ return filter( elem, i, match, array );
4732
+ }
4733
+ }
4734
+ }
4735
+};
4736
+
4737
+var origPOS = Expr.match.POS,
4738
+ fescape = function(all, num){
4739
+ return "\\" + (num - 0 + 1);
4740
+ };
4741
+
4742
+for ( var type in Expr.match ) {
4743
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4744
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4745
+}
4746
+
4747
+var makeArray = function( array, results ) {
4748
+ array = Array.prototype.slice.call( array, 0 );
4749
+
4750
+ if ( results ) {
4751
+ results.push.apply( results, array );
4752
+ return results;
4753
+ }
4754
+
4755
+ return array;
4756
+};
4757
+
4758
+// Perform a simple check to determine if the browser is capable of
4759
+// converting a NodeList to an array using builtin methods.
4760
+// Also verifies that the returned array holds DOM nodes
4761
+// (which is not the case in the Blackberry browser)
4762
+try {
4763
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
4764
+
4765
+// Provide a fallback method if it does not work
4766
+} catch( e ) {
4767
+ makeArray = function( array, results ) {
4768
+ var i = 0,
4769
+ ret = results || [];
4770
+
4771
+ if ( toString.call(array) === "[object Array]" ) {
4772
+ Array.prototype.push.apply( ret, array );
4773
+
4774
+ } else {
4775
+ if ( typeof array.length === "number" ) {
4776
+ for ( var l = array.length; i < l; i++ ) {
4777
+ ret.push( array[i] );
4778
+ }
4779
+
4780
+ } else {
4781
+ for ( ; array[i]; i++ ) {
4782
+ ret.push( array[i] );
4783
+ }
4784
+ }
4785
+ }
4786
+
4787
+ return ret;
4788
+ };
4789
+}
4790
+
4791
+var sortOrder, siblingCheck;
4792
+
4793
+if ( document.documentElement.compareDocumentPosition ) {
4794
+ sortOrder = function( a, b ) {
4795
+ if ( a === b ) {
4796
+ hasDuplicate = true;
4797
+ return 0;
4798
+ }
4799
+
4800
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4801
+ return a.compareDocumentPosition ? -1 : 1;
4802
+ }
4803
+
4804
+ return a.compareDocumentPosition(b) & 4 ? -1 : 1;
4805
+ };
4806
+
4807
+} else {
4808
+ sortOrder = function( a, b ) {
4809
+ // The nodes are identical, we can exit early
4810
+ if ( a === b ) {
4811
+ hasDuplicate = true;
4812
+ return 0;
4813
+
4814
+ // Fallback to using sourceIndex (in IE) if it's available on both nodes
4815
+ } else if ( a.sourceIndex && b.sourceIndex ) {
4816
+ return a.sourceIndex - b.sourceIndex;
4817
+ }
4818
+
4819
+ var al, bl,
4820
+ ap = [],
4821
+ bp = [],
4822
+ aup = a.parentNode,
4823
+ bup = b.parentNode,
4824
+ cur = aup;
4825
+
4826
+ // If the nodes are siblings (or identical) we can do a quick check
4827
+ if ( aup === bup ) {
4828
+ return siblingCheck( a, b );
4829
+
4830
+ // If no parents were found then the nodes are disconnected
4831
+ } else if ( !aup ) {
4832
+ return -1;
4833
+
4834
+ } else if ( !bup ) {
4835
+ return 1;
4836
+ }
4837
+
4838
+ // Otherwise they're somewhere else in the tree so we need
4839
+ // to build up a full list of the parentNodes for comparison
4840
+ while ( cur ) {
4841
+ ap.unshift( cur );
4842
+ cur = cur.parentNode;
4843
+ }
4844
+
4845
+ cur = bup;
4846
+
4847
+ while ( cur ) {
4848
+ bp.unshift( cur );
4849
+ cur = cur.parentNode;
4850
+ }
4851
+
4852
+ al = ap.length;
4853
+ bl = bp.length;
4854
+
4855
+ // Start walking down the tree looking for a discrepancy
4856
+ for ( var i = 0; i < al && i < bl; i++ ) {
4857
+ if ( ap[i] !== bp[i] ) {
4858
+ return siblingCheck( ap[i], bp[i] );
4859
+ }
4860
+ }
4861
+
4862
+ // We ended someplace up the tree so do a sibling check
4863
+ return i === al ?
4864
+ siblingCheck( a, bp[i], -1 ) :
4865
+ siblingCheck( ap[i], b, 1 );
4866
+ };
4867
+
4868
+ siblingCheck = function( a, b, ret ) {
4869
+ if ( a === b ) {
4870
+ return ret;
4871
+
4872
+ var cur = a.nextSibling;
4873
+ }
4874
+
4875
+ while ( cur ) {
4876
+ if ( cur === b ) {
4877
+ return -1;
4878
+ }
4879
+
4880
+ cur = cur.nextSibling;
4881
+ }
4882
+
4883
+ return 1;
4884
+ };
4885
+}
4886
+
4887
+// Check to see if the browser returns elements by name when
4888
+// querying by getElementById (and provide a workaround)
4889
+(function(){
4890
+ // We're going to inject a fake input element with a specified name
4891
+ var form = document.createElement("div"),
4892
+ id = "script" + (new Date()).getTime(),
4893
+ root = document.documentElement;
4894
+
4895
+ form.innerHTML = "<a name='" + id + "'/>";
4896
+
4897
+ // Inject it into the root element, check its status, and remove it quickly
4898
+ root.insertBefore( form, root.firstChild );
4899
+
4900
+ // The workaround has to do additional checks after a getElementById
4901
+ // Which slows things down for other browsers (hence the branching)
4902
+ if ( document.getElementById( id ) ) {
4903
+ Expr.find.ID = function( match, context, isXML ) {
4904
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
4905
+ var m = context.getElementById(match[1]);
4906
+
4907
+ return m ?
4908
+ m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4909
+ [m] :
4910
+ undefined :
4911
+ [];
4912
+ }
4913
+ };
4914
+
4915
+ Expr.filter.ID = function( elem, match ) {
4916
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4917
+
4918
+ return elem.nodeType === 1 && node && node.nodeValue === match;
4919
+ };
4920
+ }
4921
+
4922
+ root.removeChild( form );
4923
+
4924
+ // release memory in IE
4925
+ root = form = null;
4926
+})();
4927
+
4928
+(function(){
4929
+ // Check to see if the browser returns only elements
4930
+ // when doing getElementsByTagName("*")
4931
+
4932
+ // Create a fake element
4933
+ var div = document.createElement("div");
4934
+ div.appendChild( document.createComment("") );
4935
+
4936
+ // Make sure no comments are found
4937
+ if ( div.getElementsByTagName("*").length > 0 ) {
4938
+ Expr.find.TAG = function( match, context ) {
4939
+ var results = context.getElementsByTagName( match[1] );
4940
+
4941
+ // Filter out possible comments
4942
+ if ( match[1] === "*" ) {
4943
+ var tmp = [];
4944
+
4945
+ for ( var i = 0; results[i]; i++ ) {
4946
+ if ( results[i].nodeType === 1 ) {
4947
+ tmp.push( results[i] );
4948
+ }
4949
+ }
4950
+
4951
+ results = tmp;
4952
+ }
4953
+
4954
+ return results;
4955
+ };
4956
+ }
4957
+
4958
+ // Check to see if an attribute returns normalized href attributes
4959
+ div.innerHTML = "<a href='#'></a>";
4960
+
4961
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4962
+ div.firstChild.getAttribute("href") !== "#" ) {
4963
+
4964
+ Expr.attrHandle.href = function( elem ) {
4965
+ return elem.getAttribute( "href", 2 );
4966
+ };
4967
+ }
4968
+
4969
+ // release memory in IE
4970
+ div = null;
4971
+})();
4972
+
4973
+if ( document.querySelectorAll ) {
4974
+ (function(){
4975
+ var oldSizzle = Sizzle,
4976
+ div = document.createElement("div"),
4977
+ id = "__sizzle__";
4978
+
4979
+ div.innerHTML = "<p class='TEST'></p>";
4980
+
4981
+ // Safari can't handle uppercase or unicode characters when
4982
+ // in quirks mode.
4983
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4984
+ return;
4985
+ }
4986
+
4987
+ Sizzle = function( query, context, extra, seed ) {
4988
+ context = context || document;
4989
+
4990
+ // Only use querySelectorAll on non-XML documents
4991
+ // (ID selectors don't work in non-HTML documents)
4992
+ if ( !seed && !Sizzle.isXML(context) ) {
4993
+ // See if we find a selector to speed up
4994
+ var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
4995
+
4996
+ if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
4997
+ // Speed-up: Sizzle("TAG")
4998
+ if ( match[1] ) {
4999
+ return makeArray( context.getElementsByTagName( query ), extra );
This file is too large to show in full.
docs/docs/likebutton/docs/base-css.html
new
+1710
@@ -0,0 +1,1710 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Base · Twitter Bootstrap</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ </head>
29
+
30
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
31
+
32
+
33
+ <!-- Navbar
34
+ ================================================== -->
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="brand" href="./index.html">Bootstrap</a>
44
+ <div class="nav-collapse collapse">
45
+ <ul class="nav">
46
+ <li class="">
47
+ <a href="./index.html">Overview</a>
48
+ </li>
49
+ <li class="">
50
+ <a href="./scaffolding.html">Scaffolding</a>
51
+ </li>
52
+ <li class="active">
53
+ <a href="./base-css.html">Base CSS</a>
54
+ </li>
55
+ <li class="">
56
+ <a href="./components.html">Components</a>
57
+ </li>
58
+ <li class="">
59
+ <a href="./javascript.html">Javascript plugins</a>
60
+ </li>
61
+ <li class="">
62
+ <a href="./less.html">Using LESS</a>
63
+ </li>
64
+ <li class="divider-vertical"></li>
65
+ <li class="">
66
+ <a href="./download.html">Customize</a>
67
+ </li>
68
+ <li class="">
69
+ <a href="./examples.html">Examples</a>
70
+ </li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="container">
78
+
79
+<!-- Masthead
80
+================================================== -->
81
+<header class="jumbotron subhead" id="overview">
82
+ <h1>Base CSS</h1>
83
+ <p class="lead">On top of the scaffolding, basic HTML elements are styled and enhanced with extensible classes to provide a fresh, consistent look and feel.</p>
84
+ <div class="subnav">
85
+ <ul class="nav nav-pills">
86
+ <li><a href="#typography">Typography</a></li>
87
+ <li><a href="#code">Code</a></li>
88
+ <li><a href="#tables">Tables</a></li>
89
+ <li><a href="#forms">Forms</a></li>
90
+ <li><a href="#buttons">Buttons</a></li>
91
+ <li><a href="#icons">Icons by Glyphicons</a></li>
92
+ </ul>
93
+ </div>
94
+</header>
95
+
96
+
97
+<!-- Typography
98
+================================================== -->
99
+<section id="typography">
100
+ <div class="page-header">
101
+ <h1>Typography <small>Headings, paragraphs, lists, and other inline type elements</small></h1>
102
+ </div>
103
+
104
+ <h2>Headings & body copy</h2>
105
+
106
+ <!-- Headings & Paragraph Copy -->
107
+ <div class="row">
108
+ <div class="span4">
109
+ <h3>Typographic scale</h3>
110
+ <p>The entire typographic grid is based on two Less variables in our variables.less file: <code>@baseFontSize</code> and <code>@baseLineHeight</code>. The first is the base font-size used throughout and the second is the base line-height.</p>
111
+ <p>We use those variables, and some math, to create the margins, paddings, and line-heights of all our type and more.</p>
112
+ </div>
113
+ <div class="span4">
114
+ <h3>Example body text</h3>
115
+ <p>Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula.</p>
116
+ <h3>Lead body copy</h3>
117
+ <p>Make a paragraph stand out by adding <code>.lead</code>.</p>
118
+ <p class="lead">Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus.</p>
119
+ </div>
120
+ <div class="span4">
121
+ <div class="well">
122
+ <h1>h1. Heading 1</h1>
123
+ <h2>h2. Heading 2</h2>
124
+ <h3>h3. Heading 3</h3>
125
+ <h4>h4. Heading 4</h4>
126
+ <h5>h5. Heading 5</h5>
127
+ <h6>h6. Heading 6</h6>
128
+ </div>
129
+ </div>
130
+ </div>
131
+
132
+ <!-- Misc Elements -->
133
+ <h2>Emphasis, address, and abbreviation</h2>
134
+ <table class="table table-bordered table-striped">
135
+ <thead>
136
+ <tr>
137
+ <th>Element</th>
138
+ <th>Usage</th>
139
+ <th>Optional</th>
140
+ </tr>
141
+ </thead>
142
+ <tbody>
143
+ <tr>
144
+ <td>
145
+ <code><strong></code>
146
+ </td>
147
+ <td>
148
+ For emphasizing a snippet of text with <strong>important</strong>
149
+ </td>
150
+ <td>
151
+ <span class="muted">None</span>
152
+ </td>
153
+ </tr>
154
+ <tr>
155
+ <td>
156
+ <code><em></code>
157
+ </td>
158
+ <td>
159
+ For emphasizing a snippet of text with <em>stress</em>
160
+ </td>
161
+ <td>
162
+ <span class="muted">None</span>
163
+ </td>
164
+ </tr>
165
+ <tr>
166
+ <td>
167
+ <code><abbr></code>
168
+ </td>
169
+ <td>
170
+ Wraps abbreviations and acronyms to show the expanded version on hover
171
+ </td>
172
+ <td>
173
+ <p>Include optional <code>title</code> attribute for expanded text</p>
174
+ Use <code>.initialism</code> class for uppercase abbreviations.
175
+ </td>
176
+ </tr>
177
+ <tr>
178
+ <td>
179
+ <code><address></code>
180
+ </td>
181
+ <td>
182
+ For contact information for its nearest ancestor or the entire body of work
183
+ </td>
184
+ <td>
185
+ Preserve formatting by ending all lines with <code><br></code>
186
+ </td>
187
+ </tr>
188
+ </tbody>
189
+ </table>
190
+
191
+ <div class="row">
192
+ <div class="span4">
193
+ <h3>Using emphasis</h3>
194
+ <p><a href="#">Fusce dapibus</a>, <strong>tellus ac cursus commodo</strong>, <em>tortor mauris condimentum nibh</em>, ut fermentum massa justo sit amet risus. Maecenas faucibus mollis interdum. Nulla vitae elit libero, a pharetra augue.</p>
195
+ <p><strong>Note:</strong> Feel free to use <code><b></code> and <code><i></code> in HTML5, but their usage has changed a bit. <code><b></code> is meant to highlight words or phrases without conveying additional importance while <code><i></code> is mostly for voice, technical terms, etc.</p>
196
+ </div>
197
+ <div class="span4">
198
+ <h3>Example addresses</h3>
199
+ <p>Here are two examples of how the <code><address></code> tag can be used:</p>
200
+ <address>
201
+ <strong>Twitter, Inc.</strong><br>
202
+ 795 Folsom Ave, Suite 600<br>
203
+ San Francisco, CA 94107<br>
204
+ <abbr title="Phone">P:</abbr> (123) 456-7890
205
+ </address>
206
+ <address>
207
+ <strong>Full Name</strong><br>
208
+ <a href="mailto:#">first.last@gmail.com</a>
209
+ </address>
210
+ </div>
211
+ <div class="span4">
212
+ <h3>Example abbreviations</h3>
213
+ <p>Abbreviations with a <code>title</code> attribute have a light dotted bottom border and a help cursor on hover. This gives users extra indication something will be shown on hover.</p>
214
+ <p>Add the <code>initialism</code> class to an abbreviation to increase typographic harmony by giving it a slightly smaller text size.</p>
215
+ <p><abbr title="HyperText Markup Language" class="initialism">HTML</abbr> is the best thing since sliced bread.</p>
216
+ <p>An abbreviation of the word attribute is <abbr title="attribute">attr</abbr>.</p>
217
+ </div>
218
+ </div>
219
+
220
+
221
+ <!-- Blockquotes -->
222
+ <h2>Blockquotes</h2>
223
+ <table class="table table-bordered table-striped">
224
+ <thead>
225
+ <tr>
226
+ <th>Element</th>
227
+ <th>Usage</th>
228
+ <th>Optional</th>
229
+ </tr>
230
+ </thead>
231
+ <tbody>
232
+ <tr>
233
+ <td>
234
+ <code><blockquote></code>
235
+ </td>
236
+ <td>
237
+ Block-level element for quoting content from another source
238
+ </td>
239
+ <td>
240
+ <p>Add <code>cite</code> attribute for source URL</p>
241
+ Use <code>.pull-left</code> and <code>.pull-right</code> classes for floated options
242
+ </td>
243
+ </tr>
244
+ <tr>
245
+ <td>
246
+ <code><small></code>
247
+ </td>
248
+ <td>
249
+ Optional element for adding a user-facing citation, typically an author with title of work
250
+ </td>
251
+ <td>
252
+ Place the <code><cite></code> around the title or name of source
253
+ </td>
254
+ </tr>
255
+ </tbody>
256
+ </table>
257
+ <div class="row">
258
+ <div class="span4">
259
+ <p>To include a blockquote, wrap <code><blockquote></code> around any <abbr title="HyperText Markup Language">HTML</abbr> as the quote. For straight quotes we recommend a <code><p></code>.</p>
260
+ <p>Include an optional <code><small></code> element to cite your source and you'll get an em dash <code>&mdash;</code> before it for styling purposes.</p>
261
+ </div>
262
+ <div class="span8">
263
+<pre class="prettyprint linenums">
264
+<blockquote>
265
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante venenatis.</p>
266
+ <small>Someone famous</small>
267
+</blockquote>
268
+</pre>
269
+ </div>
270
+ </div><!--/row-->
271
+
272
+ <h3>Example blockquotes</h3>
273
+ <div class="row">
274
+ <div class="span6">
275
+ <p>Default blockquotes are styled as such:</p>
276
+ <blockquote>
277
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante venenatis.</p>
278
+ <small>Someone famous in <cite title="">Body of work</cite></small>
279
+ </blockquote>
280
+ </div>
281
+ <div class="span6">
282
+ <p>To float your blockquote to the right, add <code>class="pull-right"</code>:</p>
283
+ <blockquote class="pull-right">
284
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante venenatis.</p>
285
+ <small>Someone famous in <cite title="">Body of work</cite></small>
286
+ </blockquote>
287
+ </div>
288
+ </div>
289
+
290
+
291
+ <!-- Lists -->
292
+ <h2>Lists</h2>
293
+ <div class="row">
294
+ <div class="span4">
295
+ <h3>Unordered</h3>
296
+ <p><code><ul></code></p>
297
+ <ul>
298
+ <li>Lorem ipsum dolor sit amet</li>
299
+ <li>Consectetur adipiscing elit</li>
300
+ <li>Integer molestie lorem at massa</li>
301
+ <li>Facilisis in pretium nisl aliquet</li>
302
+ <li>Nulla volutpat aliquam velit
303
+ <ul>
304
+ <li>Phasellus iaculis neque</li>
305
+ <li>Purus sodales ultricies</li>
306
+ <li>Vestibulum laoreet porttitor sem</li>
307
+ <li>Ac tristique libero volutpat at</li>
308
+ </ul>
309
+ </li>
310
+ <li>Faucibus porta lacus fringilla vel</li>
311
+ <li>Aenean sit amet erat nunc</li>
312
+ <li>Eget porttitor lorem</li>
313
+ </ul>
314
+ </div>
315
+ <div class="span4">
316
+ <h3>Unstyled</h3>
317
+ <p><code><ul class="unstyled"></code></p>
318
+ <ul class="unstyled">
319
+ <li>Lorem ipsum dolor sit amet</li>
320
+ <li>Consectetur adipiscing elit</li>
321
+ <li>Integer molestie lorem at massa</li>
322
+ <li>Facilisis in pretium nisl aliquet</li>
323
+ <li>Nulla volutpat aliquam velit
324
+ <ul>
325
+ <li>Phasellus iaculis neque</li>
326
+ <li>Purus sodales ultricies</li>
327
+ <li>Vestibulum laoreet porttitor sem</li>
328
+ <li>Ac tristique libero volutpat at</li>
329
+ </ul>
330
+ </li>
331
+ <li>Faucibus porta lacus fringilla vel</li>
332
+ <li>Aenean sit amet erat nunc</li>
333
+ <li>Eget porttitor lorem</li>
334
+ </ul>
335
+ </div>
336
+ <div class="span4">
337
+ <h3>Ordered</h3>
338
+ <p><code><ol></code></p>
339
+ <ol>
340
+ <li>Lorem ipsum dolor sit amet</li>
341
+ <li>Consectetur adipiscing elit</li>
342
+ <li>Integer molestie lorem at massa</li>
343
+ <li>Facilisis in pretium nisl aliquet</li>
344
+ <li>Nulla volutpat aliquam velit</li>
345
+ <li>Faucibus porta lacus fringilla vel</li>
346
+ <li>Aenean sit amet erat nunc</li>
347
+ <li>Eget porttitor lorem</li>
348
+ </ol>
349
+ </div>
350
+ </div><!-- /row -->
351
+ <br>
352
+ <div class="row">
353
+ <div class="span4">
354
+ <h3>Description</h3>
355
+ <p><code><dl></code></p>
356
+ <dl>
357
+ <dt>Description lists</dt>
358
+ <dd>A description list is perfect for defining terms.</dd>
359
+ <dt>Euismod</dt>
360
+ <dd>Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.</dd>
361
+ <dd>Donec id elit non mi porta gravida at eget metus.</dd>
362
+ <dt>Malesuada porta</dt>
363
+ <dd>Etiam porta sem malesuada magna mollis euismod.</dd>
364
+ </dl>
365
+ </div>
366
+ <div class="span8">
367
+ <h3>Horizontal description</h3>
368
+ <p><code><dl class="dl-horizontal"></code></p>
369
+ <dl class="dl-horizontal">
370
+ <dt>Description lists</dt>
371
+ <dd>A description list is perfect for defining terms.</dd>
372
+ <dt>Euismod</dt>
373
+ <dd>Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.</dd>
374
+ <dd>Donec id elit non mi porta gravida at eget metus.</dd>
375
+ <dt>Malesuada porta</dt>
376
+ <dd>Etiam porta sem malesuada magna mollis euismod.</dd>
377
+ <dt>Felis euismod semper eget lacinia</dt>
378
+ <dd>Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</dd>
379
+ </dl>
380
+ <hr>
381
+ <p>
382
+ <span class="label label-info">Heads up!</span>
383
+ Horizontal description lists will truncate terms that are too long to fit in the left column fix <code>text-overflow</code>. In narrower viewports, they will change to the default stacked layout.
384
+ </p>
385
+ </div>
386
+ </div><!-- /row -->
387
+</section>
388
+
389
+
390
+
391
+<!-- Code
392
+================================================== -->
393
+<section id="code">
394
+ <div class="page-header">
395
+ <h1>Code <small>Inline and block code snippets</small></h1>
396
+ </div>
397
+ <div class="row">
398
+ <div class="span4">
399
+ <h2>Inline</h2>
400
+ <p>Wrap inline snippets of code with <code><code></code>.</p>
401
+<pre class="prettyprint linenums">
402
+For example, <code>section</code> should be wrapped as inline.
403
+</pre>
404
+ </div><!--/span-->
405
+ <div class="span4">
406
+ <h2>Basic block</h2>
407
+ <p>Use <code><pre></code> for multiple lines of code. Be sure to escape any angle brackets in the code for proper rendering.</p>
408
+<pre>
409
+<p>Sample text here...</p>
410
+</pre>
411
+<pre class="prettyprint linenums" style="margin-bottom: 9px;">
412
+<pre>
413
+ &lt;p&gt;Sample text here...&lt;/p&gt;
414
+</pre>
415
+</pre>
416
+ <p><strong>Note:</strong> Be sure to keep code within <code><pre></code> tags as close to the left as possible; it will render all tabs.</p>
417
+ <p>You may optionally add the <code>.pre-scrollable</code> class which will set a max-height of 350px and provide a y-axis scrollbar.</p>
418
+ </div><!--/span-->
419
+ <div class="span4">
420
+ <h2>Google Prettify</h2>
421
+ <p>Take the same <code><pre></code> element and add two optional classes for enhanced rendering.</p>
422
+<pre class="prettyprint linenums" style="margin-bottom: 9px;">
423
+<p>Sample text here...</p>
424
+</pre>
425
+<pre class="prettyprint linenums" style="margin-bottom: 9px;">
426
+<pre class="prettyprint
427
+ linenums">
428
+ &lt;p&gt;Sample text here...&lt;/p&gt;
429
+</pre>
430
+</pre>
431
+ <p><a href="http://code.google.com/p/google-code-prettify/">Download google-code-prettify</a> and view the readme for <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html">how to use</a>.</p>
432
+ </div><!--/span-->
433
+ </div><!--/row-->
434
+</section>
435
+
436
+
437
+
438
+<!-- Tables
439
+================================================== -->
440
+<section id="tables">
441
+ <div class="page-header">
442
+ <h1>Tables <small>For, you guessed it, tabular data</small></h1>
443
+ </div>
444
+
445
+ <h2>Table markup</h2>
446
+ <div class="row">
447
+ <div class="span8">
448
+ <table class="table table-bordered table-striped">
449
+ <colgroup>
450
+ <col class="span1">
451
+ <col class="span7">
452
+ </colgroup>
453
+ <thead>
454
+ <tr>
455
+ <th>Tag</th>
456
+ <th>Description</th>
457
+ </tr>
458
+ </thead>
459
+ <tbody>
460
+ <tr>
461
+ <td>
462
+ <code><table></code>
463
+ </td>
464
+ <td>
465
+ Wrapping element for displaying data in a tabular format
466
+ </td>
467
+ </tr>
468
+ <tr>
469
+ <td>
470
+ <code><thead></code>
471
+ </td>
472
+ <td>
473
+ Container element for table header rows (<code><tr></code>) to label table columns
474
+ </td>
475
+ </tr>
476
+ <tr>
477
+ <td>
478
+ <code><tbody></code>
479
+ </td>
480
+ <td>
481
+ Container element for table rows (<code><tr></code>) in the body of the table
482
+ </td>
483
+ </tr>
484
+ <tr>
485
+ <td>
486
+ <code><tr></code>
487
+ </td>
488
+ <td>
489
+ Container element for a set of table cells (<code><td></code> or <code><th></code>) that appears on a single row
490
+ </td>
491
+ </tr>
492
+ <tr>
493
+ <td>
494
+ <code><td></code>
495
+ </td>
496
+ <td>
497
+ Default table cell
498
+ </td>
499
+ </tr>
500
+ <tr>
501
+ <td>
502
+ <code><th></code>
503
+ </td>
504
+ <td>
505
+ Special table cell for column (or row, depending on scope and placement) labels<br>
506
+ Must be used within a <code><thead></code>
507
+ </td>
508
+ </tr>
509
+ <tr>
510
+ <td>
511
+ <code><caption></code>
512
+ </td>
513
+ <td>
514
+ Description or summary of what the table holds, especially useful for screen readers
515
+ </td>
516
+ </tr>
517
+ </tbody>
518
+ </table>
519
+ </div>
520
+ <div class="span4">
521
+<pre class="prettyprint linenums">
522
+<table>
523
+ <thead>
524
+ <tr>
525
+ <th>…</th>
526
+ <th>…</th>
527
+ </tr>
528
+ </thead>
529
+ <tbody>
530
+ <tr>
531
+ <td>…</td>
532
+ <td>…</td>
533
+ </tr>
534
+ </tbody>
535
+</table>
536
+</pre>
537
+ </div>
538
+ </div>
539
+
540
+ <h2>Table options</h2>
541
+ <table class="table table-bordered table-striped">
542
+ <thead>
543
+ <tr>
544
+ <th>Name</th>
545
+ <th>Class</th>
546
+ <th>Description</th>
547
+ </tr>
548
+ </thead>
549
+ <tbody>
550
+ <tr>
551
+ <td>Default</td>
552
+ <td class="muted">None</td>
553
+ <td>No styles, just columns and rows</td>
554
+ </tr>
555
+ <tr>
556
+ <td>Basic</td>
557
+ <td>
558
+ <code>.table</code>
559
+ </td>
560
+ <td>Only horizontal lines between rows</td>
561
+ </tr>
562
+ <tr>
563
+ <td>Bordered</td>
564
+ <td>
565
+ <code>.table-bordered</code>
566
+ </td>
567
+ <td>Rounds corners and adds outer border</td>
568
+ </tr>
569
+ <tr>
570
+ <td>Zebra-stripe</td>
571
+ <td>
572
+ <code>.table-striped</code>
573
+ </td>
574
+ <td>Adds light gray background color to odd rows (1, 3, 5, etc)</td>
575
+ </tr>
576
+ <tr>
577
+ <td>Condensed</td>
578
+ <td>
579
+ <code>.table-condensed</code>
580
+ </td>
581
+ <td>Cuts vertical padding in half, from 8px to 4px, within all <code>td</code> and <code>th</code> elements</td>
582
+ </tr>
583
+ </tbody>
584
+ </table>
585
+
586
+
587
+ <h2>Example tables</h2>
588
+
589
+ <h3>1. Default table styles</h3>
590
+ <div class="row">
591
+ <div class="span4">
592
+ <p>Tables are automatically styled with only a few borders to ensure readability and maintain structure. With 2.0, the <code>.table</code> class is required.</p>
593
+<pre class="prettyprint linenums">
594
+<table class="table">
595
+ …
596
+</table></pre>
597
+ </div>
598
+ <div class="span8">
599
+ <table class="table">
600
+ <thead>
601
+ <tr>
602
+ <th>#</th>
603
+ <th>First Name</th>
604
+ <th>Last Name</th>
605
+ <th>Username</th>
606
+ </tr>
607
+ </thead>
608
+ <tbody>
609
+ <tr>
610
+ <td>1</td>
611
+ <td>Mark</td>
612
+ <td>Otto</td>
613
+ <td>@mdo</td>
614
+ </tr>
615
+ <tr>
616
+ <td>2</td>
617
+ <td>Jacob</td>
618
+ <td>Thornton</td>
619
+ <td>@fat</td>
620
+ </tr>
621
+ <tr>
622
+ <td>3</td>
623
+ <td>Larry</td>
624
+ <td>the Bird</td>
625
+ <td>@twitter</td>
626
+ </tr>
627
+ </tbody>
628
+ </table>
629
+ </div>
630
+ </div>
631
+
632
+
633
+ <h3>2. Striped table</h3>
634
+ <div class="row">
635
+ <div class="span4">
636
+ <p>Get a little fancy with your tables by adding zebra-striping—just add the <code>.table-striped</code> class.</p>
637
+ <p class="muted"><strong>Note:</strong> Striped tables use the <code>:nth-child</code> CSS selector and is not available in IE7-IE8.</p>
638
+<pre class="prettyprint linenums" style="margin-bottom: 18px;">
639
+<table class="table table-striped">
640
+ …
641
+</table></pre>
642
+ </div>
643
+ <div class="span8">
644
+ <table class="table table-striped">
645
+ <thead>
646
+ <tr>
647
+ <th>#</th>
648
+ <th>First Name</th>
649
+ <th>Last Name</th>
650
+ <th>Username</th>
651
+ </tr>
652
+ </thead>
653
+ <tbody>
654
+ <tr>
655
+ <td>1</td>
656
+ <td>Mark</td>
657
+ <td>Otto</td>
658
+ <td>@mdo</td>
659
+ </tr>
660
+ <tr>
661
+ <td>2</td>
662
+ <td>Jacob</td>
663
+ <td>Thornton</td>
664
+ <td>@fat</td>
665
+ </tr>
666
+ <tr>
667
+ <td>3</td>
668
+ <td>Larry</td>
669
+ <td>the Bird</td>
670
+ <td>@twitter</td>
671
+ </tr>
672
+ </tbody>
673
+ </table>
674
+ </div>
675
+ </div>
676
+
677
+
678
+ <h3>3. Bordered table</h3>
679
+ <div class="row">
680
+ <div class="span4">
681
+ <p>Add borders around the entire table and rounded corners for aesthetic purposes.</p>
682
+<pre class="prettyprint linenums">
683
+<table class="table table-bordered">
684
+ …
685
+</table></pre>
686
+ </div>
687
+ <div class="span8">
688
+ <table class="table table-bordered">
689
+ <thead>
690
+ <tr>
691
+ <th>#</th>
692
+ <th>First Name</th>
693
+ <th>Last Name</th>
694
+ <th>Username</th>
695
+ </tr>
696
+ </thead>
697
+ <tbody>
698
+ <tr>
699
+ <td rowspan="2">1</td>
700
+ <td>Mark</td>
701
+ <td>Otto</td>
702
+ <td>@mdo</td>
703
+ </tr>
704
+ <tr>
705
+ <td>Mark</td>
706
+ <td>Otto</td>
707
+ <td>@TwBootstrap</td>
708
+ </tr>
709
+ <tr>
710
+ <td>2</td>
711
+ <td>Jacob</td>
712
+ <td>Thornton</td>
713
+ <td>@fat</td>
714
+ </tr>
715
+ <tr>
716
+ <td>3</td>
717
+ <td colspan="2">Larry the Bird</td>
718
+ <td>@twitter</td>
719
+ </tr>
720
+ </tbody>
721
+ </table>
722
+ </div>
723
+ </div>
724
+
725
+
726
+ <h3>4. Condensed table</h3>
727
+ <div class="row">
728
+ <div class="span4">
729
+ <p>Make your tables more compact by adding the <code>.table-condensed</code> class to cut table cell padding in half (from 8px to 4px).</p>
730
+<pre class="prettyprint linenums" style="margin-bottom: 18px;">
731
+<table class="table table-condensed">
732
+ …
733
+</table></pre>
734
+ </div>
735
+ <div class="span8">
736
+ <table class="table table-condensed">
737
+ <thead>
738
+ <tr>
739
+ <th>#</th>
740
+ <th>First Name</th>
741
+ <th>Last Name</th>
742
+ <th>Username</th>
743
+ </tr>
744
+ </thead>
745
+ <tbody>
746
+ <tr>
747
+ <td>1</td>
748
+ <td>Mark</td>
749
+ <td>Otto</td>
750
+ <td>@mdo</td>
751
+ </tr>
752
+ <tr>
753
+ <td>2</td>
754
+ <td>Jacob</td>
755
+ <td>Thornton</td>
756
+ <td>@fat</td>
757
+ </tr>
758
+ <tr>
759
+ <td>3</td>
760
+ <td colspan="2">Larry the Bird</td>
761
+ <td>@twitter</td>
762
+ </tr>
763
+ </tbody>
764
+ </table>
765
+ </div>
766
+ </div>
767
+
768
+
769
+
770
+ <h3>5. Combine them all!</h3>
771
+ <div class="row">
772
+ <div class="span4">
773
+ <p>Feel free to combine any of the table classes to achieve different looks by utilizing any of the available classes.</p>
774
+<pre class="prettyprint linenums" style="margin-bottom: 18px;">
775
+<table class="table table-striped table-bordered table-condensed">
776
+ ...
777
+</table></pre>
778
+ </div>
779
+ <div class="span8">
780
+ <table class="table table-striped table-bordered table-condensed">
781
+ <thead>
782
+ <tr>
783
+ <th></th>
784
+ <th colspan="2">Full name</th>
785
+ <th></th>
786
+ </tr>
787
+ <tr>
788
+ <th>#</th>
789
+ <th>First Name</th>
790
+ <th>Last Name</th>
791
+ <th>Username</th>
792
+ </tr>
793
+ </thead>
794
+ <tbody>
795
+ <tr>
796
+ <tr>
797
+ <td>1</td>
798
+ <td>Mark</td>
799
+ <td>Otto</td>
800
+ <td>@mdo</td>
801
+ </tr>
802
+ <tr>
803
+ <td>2</td>
804
+ <td>Jacob</td>
805
+ <td>Thornton</td>
806
+ <td>@fat</td>
807
+ </tr>
808
+ <tr>
809
+ <td>3</td>
810
+ <td colspan="2">Larry the Bird</td>
811
+ <td>@twitter</td>
812
+ </tr>
813
+ </tbody>
814
+ </table>
815
+ </div>
816
+ </div>
817
+</section>
818
+
819
+
820
+
821
+<!-- Forms
822
+================================================== -->
823
+<section id="forms">
824
+ <div class="page-header">
825
+ <h1>Forms</h1>
826
+ </div>
827
+ <div class="row">
828
+ <div class="span4">
829
+ <h2>Flexible HTML and CSS</h2>
830
+ <p>The best part about forms in Bootstrap is that all your inputs and controls look great no matter how you build them in your markup. No superfluous HTML is required, but we provide the patterns for those who require it.</p>
831
+ <p>More complicated layouts come with succinct and scalable classes for easy styling and event binding, so you're covered at every step.</p>
832
+ </div>
833
+ <div class="span4">
834
+ <h2>Four layouts included</h2>
835
+ <p>Bootstrap comes with support for four types of form layouts:</p>
836
+ <ul>
837
+ <li>Vertical (default)</li>
838
+ <li>Search</li>
839
+ <li>Inline</li>
840
+ <li>Horizontal</li>
841
+ </ul>
842
+ <p>Different types of form layouts require some changes to markup, but the controls themselves remain and behave the same.</p>
843
+ </div>
844
+ <div class="span4">
845
+ <h2>Control states and more</h2>
846
+ <p>Bootstrap's forms include styles for all the base form controls like input, textarea, and select you'd expect. But it also comes with a number of custom components like appended and prepended inputs and support for lists of checkboxes.</p>
847
+ <p>States like error, warning, and success are included for each type of form control. Also included are styles for disabled controls.</p>
848
+ </div>
849
+ </div>
850
+
851
+ <h2>Four types of forms</h2>
852
+ <p>Bootstrap provides simple markup and styles for four styles of common web forms.</p>
853
+ <table class="table table-bordered table-striped">
854
+ <thead>
855
+ <tr>
856
+ <th>Name</th>
857
+ <th>Class</th>
858
+ <th>Description</th>
859
+ </tr>
860
+ </thead>
861
+ <tbody>
862
+ <tr>
863
+ <th>Vertical (default)</th>
864
+ <td><code>.form-vertical</code> <span class="muted">(not required)</span></td>
865
+ <td>Stacked, left-aligned labels over controls</td>
866
+ </tr>
867
+ <tr>
868
+ <th>Inline</th>
869
+ <td><code>.form-inline</code></td>
870
+ <td>Left-aligned label and inline-block controls for compact style</td>
871
+ </tr>
872
+ <tr>
873
+ <th>Search</th>
874
+ <td><code>.form-search</code></td>
875
+ <td>Extra-rounded text input for a typical search aesthetic</td>
876
+ </tr>
877
+ <tr>
878
+ <th>Horizontal</th>
879
+ <td><code>.form-horizontal</code></td>
880
+ <td>Float left, right-aligned labels on same line as controls</td>
881
+ </tr>
882
+ </tbody>
883
+ </table>
884
+
885
+
886
+ <h2>Example forms <small>using just form controls, no extra markup</small></h2>
887
+ <div class="row">
888
+ <div class="span6">
889
+ <h3>Basic form</h3>
890
+ <p>Smart and lightweight defaults without extra markup.</p>
891
+ <form class="well">
892
+ <label>Label name</label>
893
+ <input type="text" class="span3" placeholder="Type something…">
894
+ <p class="help-block">Example block-level help text here.</p>
895
+ <label class="checkbox">
896
+ <input type="checkbox"> Check me out
897
+ </label>
898
+ <button type="submit" class="btn">Submit</button>
899
+ </form>
900
+<pre class="prettyprint linenums">
901
+<form class="well">
902
+ <label>Label name</label>
903
+ <input type="text" class="span3" placeholder="Type something…">
904
+ <span class="help-block">Example block-level help text here.</span>
905
+ <label class="checkbox">
906
+ <input type="checkbox"> Check me out
907
+ </label>
908
+ <button type="submit" class="btn">Submit</button>
909
+</form>
910
+</pre>
911
+ </div>
912
+ <div class="span6">
913
+ <h3>Search form</h3>
914
+ <p>Add <code>.form-search</code> to the form and <code>.search-query</code> to the <code>input</code>.</p>
915
+ <form class="well form-search">
916
+ <input type="text" class="input-medium search-query">
917
+ <button type="submit" class="btn">Search</button>
918
+ </form>
919
+<pre class="prettyprint linenums">
920
+<form class="well form-search">
921
+ <input type="text" class="input-medium search-query">
922
+ <button type="submit" class="btn">Search</button>
923
+</form>
924
+</pre>
925
+
926
+ <h3>Inline form</h3>
927
+ <p>Add <code>.form-inline</code> to finesse the vertical alignment and spacing of form controls.</p>
928
+ <form class="well form-inline">
929
+ <input type="text" class="input-small" placeholder="Email">
930
+ <input type="password" class="input-small" placeholder="Password">
931
+ <label class="checkbox">
932
+ <input type="checkbox"> Remember me
933
+ </label>
934
+ <button type="submit" class="btn">Sign in</button>
935
+ </form>
936
+<pre class="prettyprint linenums">
937
+<form class="well form-inline">
938
+ <input type="text" class="input-small" placeholder="Email">
939
+ <input type="password" class="input-small" placeholder="Password">
940
+ <label class="checkbox">
941
+ <input type="checkbox"> Remember me
942
+ </label>
943
+ <button type="submit" class="btn">Sign in</button>
944
+</form>
945
+</pre>
946
+ </div><!-- /.span -->
947
+ </div><!-- /row -->
948
+
949
+ <br>
950
+
951
+ <h2>Horizontal forms</h2>
952
+ <div class="row">
953
+ <div class="span4">
954
+ <p></p>
955
+ <p>Shown on the right are all the default form controls we support. Here's the bulleted list:</p>
956
+ <ul>
957
+ <li>text inputs (text, password, email, etc)</li>
958
+ <li>checkbox</li>
959
+ <li>radio</li>
960
+ <li>select</li>
961
+ <li>multiple select</li>
962
+ <li>file input</li>
963
+ <li>textarea</li>
964
+ </ul>
965
+ </div><!-- /.span -->
966
+ <div class="span8">
967
+ <form class="form-horizontal">
968
+ <fieldset>
969
+ <div class="control-group">
970
+ <label class="control-label" for="input01">Text input</label>
971
+ <div class="controls">
972
+ <input type="text" class="input-xlarge" id="input01">
973
+ <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p>
974
+ </div>
975
+ </div>
976
+ <div class="control-group">
977
+ <label class="control-label" for="optionsCheckbox">Checkbox</label>
978
+ <div class="controls">
979
+ <label class="checkbox">
980
+ <input type="checkbox" id="optionsCheckbox" value="option1">
981
+ Option one is this and that—be sure to include why it's great
982
+ </label>
983
+ </div>
984
+ </div>
985
+ <div class="control-group">
986
+ <label class="control-label" for="select01">Select list</label>
987
+ <div class="controls">
988
+ <select id="select01">
989
+ <option>something</option>
990
+ <option>2</option>
991
+ <option>3</option>
992
+ <option>4</option>
993
+ <option>5</option>
994
+ </select>
995
+ </div>
996
+ </div>
997
+ <div class="control-group">
998
+ <label class="control-label" for="multiSelect">Multicon-select</label>
999
+ <div class="controls">
1000
+ <select multiple="multiple" id="multiSelect">
1001
+ <option>1</option>
1002
+ <option>2</option>
1003
+ <option>3</option>
1004
+ <option>4</option>
1005
+ <option>5</option>
1006
+ </select>
1007
+ </div>
1008
+ </div>
1009
+ <div class="control-group">
1010
+ <label class="control-label" for="fileInput">File input</label>
1011
+ <div class="controls">
1012
+ <input class="input-file" id="fileInput" type="file">
1013
+ </div>
1014
+ </div>
1015
+ <div class="control-group">
1016
+ <label class="control-label" for="textarea">Textarea</label>
1017
+ <div class="controls">
1018
+ <textarea class="input-xlarge" id="textarea" rows="3"></textarea>
1019
+ </div>
1020
+ </div>
1021
+ <div class="form-actions">
1022
+ <button type="submit" class="btn btn-primary">Save changes</button>
1023
+ <button class="btn">Cancel</button>
1024
+ </div>
1025
+ </fieldset>
1026
+ </form>
1027
+ <h3>Example markup</h3>
1028
+ <p>Given the above example form layout, here's the markup associated with the first input and control group. The <code>.control-group</code>, <code>.control-label</code>, and <code>.controls</code> classes are all required for styling.</p>
1029
+<pre class="prettyprint linenums">
1030
+<form class="form-horizontal">
1031
+ <fieldset>
1032
+ <legend>Legend text</legend>
1033
+ <div class="control-group">
1034
+ <label class="control-label" for="input01">Text input</label>
1035
+ <div class="controls">
1036
+ <input type="text" class="input-xlarge" id="input01">
1037
+ <p class="help-block">Supporting help text</p>
1038
+ </div>
1039
+ </div>
1040
+ </fieldset>
1041
+</form>
1042
+</pre>
1043
+ </div>
1044
+ </div>
1045
+
1046
+ <br>
1047
+
1048
+ <h2>Form control states</h2>
1049
+ <div class="row">
1050
+ <div class="span4">
1051
+ <p>Bootstrap features styles for browser-supported focused and <code>disabled</code> states. We remove the default Webkit <code>outline</code> and apply a <code>box-shadow</code> in its place for <code>:focus</code>.</p>
1052
+ <hr>
1053
+ <h3>Form validation</h3>
1054
+ <p>It also includes validation styles for errors, warnings, and success. To use, add the error class to the surrounding <code>.control-group</code>.</p>
1055
+<pre class="prettyprint linenums">
1056
+<fieldset
1057
+ class="control-group error">
1058
+ …
1059
+</fieldset>
1060
+</pre>
1061
+ </div>
1062
+ <div class="span8">
1063
+ <form class="form-horizontal">
1064
+ <fieldset>
1065
+ <div class="control-group">
1066
+ <label class="control-label" for="focusedInput">Focused input</label>
1067
+ <div class="controls">
1068
+ <input class="input-xlarge focused" id="focusedInput" type="text" value="This is focused…">
1069
+ </div>
1070
+ </div>
1071
+ <div class="control-group">
1072
+ <label class="control-label">Uneditable input</label>
1073
+ <div class="controls">
1074
+ <span class="input-xlarge uneditable-input">Some value here</span>
1075
+ </div>
1076
+ </div>
1077
+ <div class="control-group">
1078
+ <label class="control-label" for="disabledInput">Disabled input</label>
1079
+ <div class="controls">
1080
+ <input class="input-xlarge disabled" id="disabledInput" type="text" placeholder="Disabled input here…" disabled>
1081
+ </div>
1082
+ </div>
1083
+ <div class="control-group">
1084
+ <label class="control-label" for="optionsCheckbox2">Disabled checkbox</label>
1085
+ <div class="controls">
1086
+ <label class="checkbox">
1087
+ <input type="checkbox" id="optionsCheckbox2" value="option1" disabled>
1088
+ This is a disabled checkbox
1089
+ </label>
1090
+ </div>
1091
+ </div>
1092
+ <div class="control-group warning">
1093
+ <label class="control-label" for="inputWarning">Input with warning</label>
1094
+ <div class="controls">
1095
+ <input type="text" id="inputWarning">
1096
+ <span class="help-inline">Something may have gone wrong</span>
1097
+ </div>
1098
+ </div>
1099
+ <div class="control-group error">
1100
+ <label class="control-label" for="inputError">Input with error</label>
1101
+ <div class="controls">
1102
+ <input type="text" id="inputError">
1103
+ <span class="help-inline">Please correct the error</span>
1104
+ </div>
1105
+ </div>
1106
+ <div class="control-group success">
1107
+ <label class="control-label" for="inputSuccess">Input with success</label>
1108
+ <div class="controls">
1109
+ <input type="text" id="inputSuccess">
1110
+ <span class="help-inline">Woohoo!</span>
1111
+ </div>
1112
+ </div>
1113
+ <div class="control-group success">
1114
+ <label class="control-label" for="selectError">Select with success</label>
1115
+ <div class="controls">
1116
+ <select id="selectError">
1117
+ <option>1</option>
1118
+ <option>2</option>
1119
+ <option>3</option>
1120
+ <option>4</option>
1121
+ <option>5</option>
1122
+ </select>
1123
+ <span class="help-inline">Woohoo!</span>
1124
+ </div>
1125
+ </div>
1126
+ <div class="form-actions">
1127
+ <button type="submit" class="btn btn-primary">Save changes</button>
1128
+ <button class="btn">Cancel</button>
1129
+ </div>
1130
+ </fieldset>
1131
+ </form>
1132
+ </div>
1133
+ </div>
1134
+
1135
+ <br>
1136
+
1137
+ <h2>Extending form controls</h2>
1138
+ <div class="row">
1139
+ <div class="span4">
1140
+ <h3>Prepend & append inputs</h3>
1141
+ <p>Input groups—with appended or prepended text—provide an easy way to give more context for your inputs. Great examples include the @ sign for Twitter usernames or $ for finances.</p>
1142
+ <hr>
1143
+ <h3>Checkboxes and radios</h3>
1144
+ <p>Up to v1.4, Bootstrap required extra markup around checkboxes and radios to stack them. Now, it's a simple matter of repeating the <code><label class="checkbox"></code> that wraps the <code><input type="checkbox"></code>.</p>
1145
+ <p>Inline checkboxes and radios are also supported. Just add <code>.inline</code> to any <code>.checkbox</code> or <code>.radio</code> and you're done.</p>
1146
+ <hr>
1147
+ <h4>Inline forms and append/prepend</h4>
1148
+ <p>To use prepend or append inputs in an inline form, be sure to place the <code>.add-on</code> and <code>input</code> on the same line, without spaces.</p>
1149
+ <hr>
1150
+ <h4>Form help text</h4>
1151
+ <p>To add help text for your form inputs, include inline help text with <code><span class="help-inline"></code> or a help text block with <code><p class="help-block"></code> after the input element.</p>
1152
+ </div>
1153
+ <div class="span8">
1154
+ <form class="form-horizontal">
1155
+ <fieldset>
1156
+ <div class="control-group">
1157
+ <label class="control-label">Form grid sizes</label>
1158
+ <div class="controls docs-input-sizes">
1159
+ <input class="span1" type="text" placeholder=".span1">
1160
+ <input class="span2" type="text" placeholder=".span2">
1161
+ <input class="span3" type="text" placeholder=".span3">
1162
+ <select class="span1">
1163
+ <option>1</option>
1164
+ <option>2</option>
1165
+ <option>3</option>
1166
+ <option>4</option>
1167
+ <option>5</option>
1168
+ </select>
1169
+ <select class="span2">
1170
+ <option>1</option>
1171
+ <option>2</option>
1172
+ <option>3</option>
1173
+ <option>4</option>
1174
+ <option>5</option>
1175
+ </select>
1176
+ <select class="span3">
1177
+ <option>1</option>
1178
+ <option>2</option>
1179
+ <option>3</option>
1180
+ <option>4</option>
1181
+ <option>5</option>
1182
+ </select>
1183
+ <p class="help-block">Use the same <code>.span*</code> classes from the grid system for input sizes.</p>
1184
+ </div>
1185
+ </div>
1186
+ <div class="control-group">
1187
+ <label class="control-label">Alternate sizes</label>
1188
+ <div class="controls docs-input-sizes">
1189
+ <input class="input-mini" type="text" placeholder=".input-mini">
1190
+ <input class="input-small" type="text" placeholder=".input-small">
1191
+ <input class="input-medium" type="text" placeholder=".input-medium">
1192
+ <p class="help-block">You may also use static classes that don't map to the grid, adapt to the responsive CSS styles, or account for varying types of controls (e.g., <code>input</code> vs. <code>select</code>).</p>
1193
+ </div>
1194
+ </div>
1195
+ <div class="control-group">
1196
+ <label class="control-label" for="prependedInput">Prepended text</label>
1197
+ <div class="controls">
1198
+ <div class="input-prepend">
1199
+ <span class="add-on">@</span><input class="span2" id="prependedInput" size="16" type="text">
1200
+ </div>
1201
+ <p class="help-block">Here's some help text</p>
1202
+ </div>
1203
+ </div>
1204
+ <div class="control-group">
1205
+ <label class="control-label" for="appendedInput">Appended text</label>
1206
+ <div class="controls">
1207
+ <div class="input-append">
1208
+ <input class="span2" id="appendedInput" size="16" type="text"><span class="add-on">.00</span>
1209
+ </div>
1210
+ <span class="help-inline">Here's more help text</span>
1211
+ </div>
1212
+ </div>
1213
+ <div class="control-group">
1214
+ <label class="control-label" for="appendedPrependedInput">Append and prepend</label>
1215
+ <div class="controls">
1216
+ <div class="input-prepend input-append">
1217
+ <span class="add-on">$</span><input class="span2" id="appendedPrependedInput" size="16" type="text"><span class="add-on">.00</span>
1218
+ </div>
1219
+ </div>
1220
+ </div>
1221
+ <div class="control-group">
1222
+ <label class="control-label" for="appendedInputButton">Append with button</label>
1223
+ <div class="controls">
1224
+ <div class="input-append">
1225
+ <input class="span2" id="appendedInputButton" size="16" type="text"><button class="btn" type="button">Go!</button>
1226
+ </div>
1227
+ </div>
1228
+ </div>
1229
+ <div class="control-group">
1230
+ <label class="control-label" for="appendedInputButtons">Two-button append</label>
1231
+ <div class="controls">
1232
+ <div class="input-append">
1233
+ <input class="span2" id="appendedInputButtons" size="16" type="text"><button class="btn" type="button">Search</button><button class="btn" type="button">Options</button>
1234
+ </div>
1235
+ </div>
1236
+ </div>
1237
+ <div class="control-group">
1238
+ <label class="control-label" for="inlineCheckboxes">Inline checkboxes</label>
1239
+ <div class="controls">
1240
+ <label class="checkbox inline">
1241
+ <input type="checkbox" id="inlineCheckbox1" value="option1"> 1
1242
+ </label>
1243
+ <label class="checkbox inline">
1244
+ <input type="checkbox" id="inlineCheckbox2" value="option2"> 2
1245
+ </label>
1246
+ <label class="checkbox inline">
1247
+ <input type="checkbox" id="inlineCheckbox3" value="option3"> 3
1248
+ </label>
1249
+ </div>
1250
+ </div>
1251
+ <div class="control-group">
1252
+ <label class="control-label" for="optionsCheckboxList">Checkboxes</label>
1253
+ <div class="controls">
1254
+ <label class="checkbox">
1255
+ <input type="checkbox" name="optionsCheckboxList1" value="option1">
1256
+ Option one is this and that—be sure to include why it's great
1257
+ </label>
1258
+ <label class="checkbox">
1259
+ <input type="checkbox" name="optionsCheckboxList2" value="option2">
1260
+ Option two can also be checked and included in form results
1261
+ </label>
1262
+ <label class="checkbox">
1263
+ <input type="checkbox" name="optionsCheckboxList3" value="option3">
1264
+ Option three can—yes, you guessed it—also be checked and included in form results
1265
+ </label>
1266
+ <p class="help-block"><strong>Note:</strong> Labels surround all the options for much larger click areas and a more usable form.</p>
1267
+ </div>
1268
+ </div>
1269
+ <div class="control-group">
1270
+ <label class="control-label">Radio buttons</label>
1271
+ <div class="controls">
1272
+ <label class="radio">
1273
+ <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
1274
+ Option one is this and that—be sure to include why it's great
1275
+ </label>
1276
+ <label class="radio">
1277
+ <input type="radio" name="optionsRadios" id="optionsRadios2" value="option2">
1278
+ Option two can be something else and selecting it will deselect option one
1279
+ </label>
1280
+ </div>
1281
+ </div>
1282
+ <div class="form-actions">
1283
+ <button type="submit" class="btn btn-primary">Save changes</button>
1284
+ <button class="btn">Cancel</button>
1285
+ </div>
1286
+ </fieldset>
1287
+ </form>
1288
+ </div>
1289
+ </div><!-- /row -->
1290
+</section>
1291
+
1292
+
1293
+
1294
+<!-- Buttons
1295
+================================================== -->
1296
+<section id="buttons">
1297
+ <div class="page-header">
1298
+ <h1>Buttons</h1>
1299
+ </div>
1300
+ <table class="table table-bordered table-striped">
1301
+ <thead>
1302
+ <tr>
1303
+ <th>Button</th>
1304
+ <th>class=""</th>
1305
+ <th>Description</th>
1306
+ </tr>
1307
+ </thead>
1308
+ <tbody>
1309
+ <tr>
1310
+ <td><button class="btn" href="#">Default</button></td>
1311
+ <td><code>btn</code></td>
1312
+ <td>Standard gray button with gradient</td>
1313
+ </tr>
1314
+ <tr>
1315
+ <td><button class="btn btn-primary" href="#">Primary</button></td>
1316
+ <td><code>btn btn-primary</code></td>
1317
+ <td>Provides extra visual weight and identifies the primary action in a set of buttons</td>
1318
+ </tr>
1319
+ <tr>
1320
+ <td><button class="btn btn-info" href="#">Info</button></td>
1321
+ <td><code>btn btn-info</code></td>
1322
+ <td>Used as an alternative to the default styles</td>
1323
+ </tr>
1324
+ <tr>
1325
+ <td><button class="btn btn-success" href="#">Success</button></td>
1326
+ <td><code>btn btn-success</code></td>
1327
+ <td>Indicates a successful or positive action</td>
1328
+ </tr>
1329
+ <tr>
1330
+ <td><button class="btn btn-warning" href="#">Warning</button></td>
1331
+ <td><code>btn btn-warning</code></td>
1332
+ <td>Indicates caution should be taken with this action</td>
1333
+ </tr>
1334
+ <tr>
1335
+ <td><button class="btn btn-danger" href="#">Danger</button></td>
1336
+ <td><code>btn btn-danger</code></td>
1337
+ <td>Indicates a dangerous or potentially negative action</td>
1338
+ </tr>
1339
+ <tr>
1340
+ <td><button class="btn btn-inverse" href="#">Inverse</button></td>
1341
+ <td><code>btn btn-inverse</code></td>
1342
+ <td>Alternate dark gray button, not tied to a semantic action or use</td>
1343
+ </tr>
1344
+ </tbody>
1345
+ </table>
1346
+
1347
+ <div class="row">
1348
+ <div class="span4">
1349
+ <h3>Buttons for actions</h3>
1350
+ <p>As a convention, buttons should only be used for actions while hyperlinks are to be used for objects. For instance, "Download" should be a button while "recent activity" should be a link.</p>
1351
+ <p>Button styles can be applied to anything with the <code>.btn</code> class applied. However, typically you'll want to apply these to only <code><a></code> and <code><button></code> elements.</p>
1352
+ <h3>Cross browser compatibility</h3>
1353
+ <p>IE9 doesn't crop background gradients on rounded corners, so we remove it. Related, IE9 jankifies disabled <code>button</code> elements, rendering text gray with a nasty text-shadow that we cannot fix.</p>
1354
+ </div>
1355
+ <div class="span4">
1356
+ <h3>Multiple sizes</h3>
1357
+ <p>Fancy larger or smaller buttons? Add <code>.btn-large</code>, <code>.btn-small</code>, or <code>.btn-mini</code> for two additional sizes.</p>
1358
+ <p>
1359
+ <button class="btn btn-large btn-primary">Primary action</button>
1360
+ <button class="btn btn-large">Action</button>
1361
+ </p>
1362
+ <p>
1363
+ <button class="btn btn-small btn-primary">Primary action</button>
1364
+ <button class="btn btn-small">Action</button>
1365
+ </p>
1366
+ <p>
1367
+ <button class="btn btn-mini btn-primary">Primary action</button>
1368
+ <button class="btn btn-mini">Action</button>
1369
+ </p>
1370
+ <br>
1371
+ <h3>Disabled state</h3>
1372
+ <p>For disabled buttons, add the <code>.disabled</code> class to links and the <code>disabled</code> attribute for <code><button></code> elements.</p>
1373
+ <p>
1374
+ <a href="#" class="btn btn-large btn-primary disabled">Primary link</a>
1375
+ <a href="#" class="btn btn-large disabled">Link</a>
1376
+ </p>
1377
+ <p style="margin-bottom: 18px;">
1378
+ <button class="btn btn-large btn-primary disabled" disabled="disabled">Primary button</button>
1379
+ <button class="btn btn-large" disabled>Button</button>
1380
+ </p>
1381
+ <p>
1382
+ <span class="label label-info">Heads up!</span>
1383
+ We use <code>.disabled</code> as a utility class here, similar to the common <code>.active</code> class, so no prefix is required.
1384
+ </p>
1385
+ </div>
1386
+ <div class="span4">
1387
+ <h3>One class, multiple tags</h3>
1388
+ <p>Use the <code>.btn</code> class on an <code><a></code>, <code><button></code>, or <code><input></code> element.</p>
1389
+<form>
1390
+<a class="btn" href="">Link</a>
1391
+<button class="btn" type="submit">Button</button>
1392
+<input class="btn" type="button" value="Input">
1393
+<input class="btn" type="submit" value="Submit">
1394
+</form>
1395
+<pre class="prettyprint linenums">
1396
+<a class="btn" href="">Link</a>
1397
+<button class="btn" type="submit">
1398
+ Button
1399
+</button>
1400
+<input class="btn" type="button"
1401
+ value="Input">
1402
+<input class="btn" type="submit"
1403
+ value="Submit">
1404
+</pre>
1405
+ <p>As a best practice, try to match the element for you context to ensure matching cross-browser rendering. If you have an <code>input</code>, use an <code><input type="submit"></code> for your button.</p>
1406
+ </div>
1407
+ </div>
1408
+</section>
1409
+
1410
+
1411
+
1412
+<!-- Icons
1413
+================================================== -->
1414
+<section id="icons">
1415
+ <div class="page-header">
1416
+ <h1>Icons <small>Graciously provided by <a href="http://glyphicons.com" target="_blank">Glyphicons</a></small></h1>
1417
+ </div>
1418
+ <div class="row">
1419
+ <div class="span3">
1420
+ <ul class="the-icons">
1421
+ <li><i class="icon-glass"></i> icon-glass</li>
1422
+ <li><i class="icon-music"></i> icon-music</li>
1423
+ <li><i class="icon-search"></i> icon-search</li>
1424
+ <li><i class="icon-envelope"></i> icon-envelope</li>
1425
+ <li><i class="icon-heart"></i> icon-heart</li>
1426
+ <li><i class="icon-star"></i> icon-star</li>
1427
+ <li><i class="icon-star-empty"></i> icon-star-empty</li>
1428
+ <li><i class="icon-user"></i> icon-user</li>
1429
+ <li><i class="icon-film"></i> icon-film</li>
1430
+ <li><i class="icon-th-large"></i> icon-th-large</li>
1431
+ <li><i class="icon-th"></i> icon-th</li>
1432
+ <li><i class="icon-th-list"></i> icon-th-list</li>
1433
+ <li><i class="icon-ok"></i> icon-ok</li>
1434
+ <li><i class="icon-remove"></i> icon-remove</li>
1435
+ <li><i class="icon-zoom-in"></i> icon-zoom-in</li>
1436
+ <li><i class="icon-zoom-out"></i> icon-zoom-out</li>
1437
+ <li><i class="icon-off"></i> icon-off</li>
1438
+ <li><i class="icon-signal"></i> icon-signal</li>
1439
+ <li><i class="icon-cog"></i> icon-cog</li>
1440
+ <li><i class="icon-trash"></i> icon-trash</li>
1441
+ <li><i class="icon-home"></i> icon-home</li>
1442
+ <li><i class="icon-file"></i> icon-file</li>
1443
+ <li><i class="icon-time"></i> icon-time</li>
1444
+ <li><i class="icon-road"></i> icon-road</li>
1445
+ <li><i class="icon-download-alt"></i> icon-download-alt</li>
1446
+ <li><i class="icon-download"></i> icon-download</li>
1447
+ <li><i class="icon-upload"></i> icon-upload</li>
1448
+ <li><i class="icon-inbox"></i> icon-inbox</li>
1449
+ <li><i class="icon-play-circle"></i> icon-play-circle</li>
1450
+ <li><i class="icon-repeat"></i> icon-repeat</li>
1451
+ <li><i class="icon-refresh"></i> icon-refresh</li>
1452
+ <li><i class="icon-list-alt"></i> icon-list-alt</li>
1453
+ <li><i class="icon-lock"></i> icon-lock</li>
1454
+ <li><i class="icon-flag"></i> icon-flag</li>
1455
+ <li><i class="icon-headphones"></i> icon-headphones</li>
1456
+ </ul>
1457
+ </div>
1458
+ <div class="span3">
1459
+ <ul class="the-icons">
1460
+ <li><i class="icon-volume-off"></i> icon-volume-off</li>
1461
+ <li><i class="icon-volume-down"></i> icon-volume-down</li>
1462
+ <li><i class="icon-volume-up"></i> icon-volume-up</li>
1463
+ <li><i class="icon-qrcode"></i> icon-qrcode</li>
1464
+ <li><i class="icon-barcode"></i> icon-barcode</li>
1465
+ <li><i class="icon-tag"></i> icon-tag</li>
1466
+ <li><i class="icon-tags"></i> icon-tags</li>
1467
+ <li><i class="icon-book"></i> icon-book</li>
1468
+ <li><i class="icon-bookmark"></i> icon-bookmark</li>
1469
+ <li><i class="icon-print"></i> icon-print</li>
1470
+ <li><i class="icon-camera"></i> icon-camera</li>
1471
+ <li><i class="icon-font"></i> icon-font</li>
1472
+ <li><i class="icon-bold"></i> icon-bold</li>
1473
+ <li><i class="icon-italic"></i> icon-italic</li>
1474
+ <li><i class="icon-text-height"></i> icon-text-height</li>
1475
+ <li><i class="icon-text-width"></i> icon-text-width</li>
1476
+ <li><i class="icon-align-left"></i> icon-align-left</li>
1477
+ <li><i class="icon-align-center"></i> icon-align-center</li>
1478
+ <li><i class="icon-align-right"></i> icon-align-right</li>
1479
+ <li><i class="icon-align-justify"></i> icon-align-justify</li>
1480
+ <li><i class="icon-list"></i> icon-list</li>
1481
+ <li><i class="icon-indent-left"></i> icon-indent-left</li>
1482
+ <li><i class="icon-indent-right"></i> icon-indent-right</li>
1483
+ <li><i class="icon-facetime-video"></i> icon-facetime-video</li>
1484
+ <li><i class="icon-picture"></i> icon-picture</li>
1485
+ <li><i class="icon-pencil"></i> icon-pencil</li>
1486
+ <li><i class="icon-map-marker"></i> icon-map-marker</li>
1487
+ <li><i class="icon-adjust"></i> icon-adjust</li>
1488
+ <li><i class="icon-tint"></i> icon-tint</li>
1489
+ <li><i class="icon-edit"></i> icon-edit</li>
1490
+ <li><i class="icon-share"></i> icon-share</li>
1491
+ <li><i class="icon-check"></i> icon-check</li>
1492
+ <li><i class="icon-move"></i> icon-move</li>
1493
+ <li><i class="icon-step-backward"></i> icon-step-backward</li>
1494
+ <li><i class="icon-fast-backward"></i> icon-fast-backward</li>
1495
+ </ul>
1496
+ </div>
1497
+ <div class="span3">
1498
+ <ul class="the-icons">
1499
+ <li><i class="icon-backward"></i> icon-backward</li>
1500
+ <li><i class="icon-play"></i> icon-play</li>
1501
+ <li><i class="icon-pause"></i> icon-pause</li>
1502
+ <li><i class="icon-stop"></i> icon-stop</li>
1503
+ <li><i class="icon-forward"></i> icon-forward</li>
1504
+ <li><i class="icon-fast-forward"></i> icon-fast-forward</li>
1505
+ <li><i class="icon-step-forward"></i> icon-step-forward</li>
1506
+ <li><i class="icon-eject"></i> icon-eject</li>
1507
+ <li><i class="icon-chevron-left"></i> icon-chevron-left</li>
1508
+ <li><i class="icon-chevron-right"></i> icon-chevron-right</li>
1509
+ <li><i class="icon-plus-sign"></i> icon-plus-sign</li>
1510
+ <li><i class="icon-minus-sign"></i> icon-minus-sign</li>
1511
+ <li><i class="icon-remove-sign"></i> icon-remove-sign</li>
1512
+ <li><i class="icon-ok-sign"></i> icon-ok-sign</li>
1513
+ <li><i class="icon-question-sign"></i> icon-question-sign</li>
1514
+ <li><i class="icon-info-sign"></i> icon-info-sign</li>
1515
+ <li><i class="icon-screenshot"></i> icon-screenshot</li>
1516
+ <li><i class="icon-remove-circle"></i> icon-remove-circle</li>
1517
+ <li><i class="icon-ok-circle"></i> icon-ok-circle</li>
1518
+ <li><i class="icon-ban-circle"></i> icon-ban-circle</li>
1519
+ <li><i class="icon-arrow-left"></i> icon-arrow-left</li>
1520
+ <li><i class="icon-arrow-right"></i> icon-arrow-right</li>
1521
+ <li><i class="icon-arrow-up"></i> icon-arrow-up</li>
1522
+ <li><i class="icon-arrow-down"></i> icon-arrow-down</li>
1523
+ <li><i class="icon-share-alt"></i> icon-share-alt</li>
1524
+ <li><i class="icon-resize-full"></i> icon-resize-full</li>
1525
+ <li><i class="icon-resize-small"></i> icon-resize-small</li>
1526
+ <li><i class="icon-plus"></i> icon-plus</li>
1527
+ <li><i class="icon-minus"></i> icon-minus</li>
1528
+ <li><i class="icon-asterisk"></i> icon-asterisk</li>
1529
+ <li><i class="icon-exclamation-sign"></i> icon-exclamation-sign</li>
1530
+ <li><i class="icon-gift"></i> icon-gift</li>
1531
+ <li><i class="icon-leaf"></i> icon-leaf</li>
1532
+ <li><i class="icon-fire"></i> icon-fire</li>
1533
+ <li><i class="icon-eye-open"></i> icon-eye-open</li>
1534
+ </ul>
1535
+ </div>
1536
+ <div class="span3">
1537
+ <ul class="the-icons">
1538
+ <li><i class="icon-eye-close"></i> icon-eye-close</li>
1539
+ <li><i class="icon-warning-sign"></i> icon-warning-sign</li>
1540
+ <li><i class="icon-plane"></i> icon-plane</li>
1541
+ <li><i class="icon-calendar"></i> icon-calendar</li>
1542
+ <li><i class="icon-random"></i> icon-random</li>
1543
+ <li><i class="icon-comment"></i> icon-comment</li>
1544
+ <li><i class="icon-magnet"></i> icon-magnet</li>
1545
+ <li><i class="icon-chevron-up"></i> icon-chevron-up</li>
1546
+ <li><i class="icon-chevron-down"></i> icon-chevron-down</li>
1547
+ <li><i class="icon-retweet"></i> icon-retweet</li>
1548
+ <li><i class="icon-shopping-cart"></i> icon-shopping-cart</li>
1549
+ <li><i class="icon-folder-close"></i> icon-folder-close</li>
1550
+ <li><i class="icon-folder-open"></i> icon-folder-open</li>
1551
+ <li><i class="icon-resize-vertical"></i> icon-resize-vertical</li>
1552
+ <li><i class="icon-resize-horizontal"></i> icon-resize-horizontal</li>
1553
+ <li><i class="icon-hdd"></i> icon-hdd</li>
1554
+ <li><i class="icon-bullhorn"></i> icon-bullhorn</li>
1555
+ <li><i class="icon-bell"></i> icon-bell</li>
1556
+ <li><i class="icon-certificate"></i> icon-certificate</li>
1557
+ <li><i class="icon-thumbs-up"></i> icon-thumbs-up</li>
1558
+ <li><i class="icon-thumbs-down"></i> icon-thumbs-down</li>
1559
+ <li><i class="icon-hand-right"></i> icon-hand-right</li>
1560
+ <li><i class="icon-hand-left"></i> icon-hand-left</li>
1561
+ <li><i class="icon-hand-up"></i> icon-hand-up</li>
1562
+ <li><i class="icon-hand-down"></i> icon-hand-down</li>
1563
+ <li><i class="icon-circle-arrow-right"></i> icon-circle-arrow-right</li>
1564
+ <li><i class="icon-circle-arrow-left"></i> icon-circle-arrow-left</li>
1565
+ <li><i class="icon-circle-arrow-up"></i> icon-circle-arrow-up</li>
1566
+ <li><i class="icon-circle-arrow-down"></i> icon-circle-arrow-down</li>
1567
+ <li><i class="icon-globe"></i> icon-globe</li>
1568
+ <li><i class="icon-wrench"></i> icon-wrench</li>
1569
+ <li><i class="icon-tasks"></i> icon-tasks</li>
1570
+ <li><i class="icon-filter"></i> icon-filter</li>
1571
+ <li><i class="icon-briefcase"></i> icon-briefcase</li>
1572
+ <li><i class="icon-fullscreen"></i> icon-fullscreen</li>
1573
+ </ul>
1574
+ </div>
1575
+ </div>
1576
+
1577
+ <br>
1578
+
1579
+ <div class="row">
1580
+ <div class="span4">
1581
+ <h3>Built as a sprite</h3>
1582
+ <p>Instead of making every icon an extra request, we've compiled them into a sprite—a bunch of images in one file that uses CSS to position the images with <code>background-position</code>. This is the same method we use on Twitter.com and it has worked well for us.</p>
1583
+ <p>All icons classes are prefixed with <code>.icon-</code> for proper namespacing and scoping, much like our other components. This will help avoid conflicts with other tools.</p>
1584
+ <p><a href="http://glyphicons.com" target="_blank">Glyphicons</a> has granted us use of the Halflings set in our open-source toolkit so long as we provide a link and credit here in the docs. Please consider doing the same in your projects.</p>
1585
+ </div>
1586
+ <div class="span4">
1587
+ <h3>How to use</h3>
1588
+ <p>Bootstrap uses an <code><i></code> tag for all icons, but they have no case class—only a shared prefix. To use, place the following code just about anywhere:</p>
1589
+<pre class="prettyprint linenums">
1590
+<i class="icon-search"></i>
1591
+</pre>
1592
+ <p>There are also styles available for inverted (white) icons, made ready with one extra class:</p>
1593
+<pre class="prettyprint linenums">
1594
+<i class="icon-search icon-white"></i>
1595
+</pre>
1596
+ <p>There are 140 classes to choose from for your icons. Just add an <code><i></code> tag with the right classes and you're set. You can find the full list in <strong>sprites.less</strong> or right here in this document.</p>
1597
+ <p>
1598
+ <span class="label label-info">Heads up!</span>
1599
+ When using beside strings of text, as in buttons or nav links, be sure to leave a space after the <code><i></code> tag for proper spacing.
1600
+ </p>
1601
+ </div>
1602
+ <div class="span4">
1603
+ <h3>Use cases</h3>
1604
+ <p>Icons are great, but where would one use them? Here are a few ideas:</p>
1605
+ <ul>
1606
+ <li>As visuals for your sidebar navigation</li>
1607
+ <li>For a purely icon-driven navigation</li>
1608
+ <li>For buttons to help convey the meaning of an action</li>
1609
+ <li>With links to share context on a user's destination</li>
1610
+ </ul>
1611
+ <p>Essentially, anywhere you can put an <code><i></code> tag, you can put an icon.</p>
1612
+ </div>
1613
+ </div>
1614
+
1615
+ <h3>Examples</h3>
1616
+ <p>Use them in buttons, button groups for a toolbar, navigation, or prepended form inputs.</p>
1617
+ <div class="row">
1618
+ <div class="span4">
1619
+ <div class="btn-toolbar" style="margin-bottom: 9px">
1620
+ <div class="btn-group">
1621
+ <a class="btn" href="#"><i class="icon-align-left"></i></a>
1622
+ <a class="btn" href="#"><i class="icon-align-center"></i></a>
1623
+ <a class="btn" href="#"><i class="icon-align-right"></i></a>
1624
+ <a class="btn" href="#"><i class="icon-align-justify"></i></a>
1625
+ </div>
1626
+ <div class="btn-group">
1627
+ <a class="btn btn-primary" href="#"><i class="icon-user icon-white"></i> User</a>
1628
+ <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#"><span class="caret"></span></a>
1629
+ <ul class="dropdown-menu">
1630
+ <li><a href="#"><i class="icon-pencil"></i> Edit</a></li>
1631
+ <li><a href="#"><i class="icon-trash"></i> Delete</a></li>
1632
+ <li><a href="#"><i class="icon-ban-circle"></i> Ban</a></li>
1633
+ <li class="divider"></li>
1634
+ <li><a href="#"><i class="i"></i> Make admin</a></li>
1635
+ </ul>
1636
+ </div>
1637
+ </div>
1638
+ <p>
1639
+ <a class="btn" href="#"><i class="icon-refresh"></i> Refresh</a>
1640
+ <a class="btn btn-success" href="#"><i class="icon-shopping-cart icon-white"></i> Checkout</a>
1641
+ <a class="btn btn-danger" href="#"><i class="icon-trash icon-white"></i> Delete</a>
1642
+ </p>
1643
+ <p>
1644
+ <a class="btn btn-large" href="#"><i class="icon-comment"></i> Comment</a>
1645
+ <a class="btn btn-small" href="#"><i class="icon-cog"></i> Settings</a>
1646
+ <a class="btn btn-small btn-info" href="#"><i class="icon-info-sign icon-white"></i> More Info</a>
1647
+ </p>
1648
+ </div>
1649
+ <div class="span4">
1650
+ <div class="well" style="padding: 8px 0;">
1651
+ <ul class="nav nav-list">
1652
+ <li class="active"><a href="#"><i class="icon-home icon-white"></i> Home</a></li>
1653
+ <li><a href="#"><i class="icon-book"></i> Library</a></li>
1654
+ <li><a href="#"><i class="icon-pencil"></i> Applications</a></li>
1655
+ <li><a href="#"><i class="i"></i> Misc</a></li>
1656
+ </ul>
1657
+ </div> <!-- /well -->
1658
+ </div>
1659
+ <div class="span4">
1660
+ <form>
1661
+ <div class="control-group">
1662
+ <label class="control-label" for="inputIcon">Email address</label>
1663
+ <div class="controls">
1664
+ <div class="input-prepend">
1665
+ <span class="add-on"><i class="icon-envelope"></i></span><input class="span2" id="inputIcon" type="text">
1666
+ </div>
1667
+ </div>
1668
+ </div>
1669
+ </form>
1670
+ </div>
1671
+ </div>
1672
+</section>
1673
+
1674
+
1675
+ <!-- Footer
1676
+ ================================================== -->
1677
+ <footer class="footer">
1678
+ <p class="pull-right"><a href="#">Back to top</a></p>
1679
+ <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
1680
+ <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
1681
+ <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
1682
+ </footer>
1683
+
1684
+ </div><!-- /container -->
1685
+
1686
+
1687
+
1688
+ <!-- Le javascript
1689
+ ================================================== -->
1690
+ <!-- Placed at the end of the document so the pages load faster -->
1691
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
1692
+ <script src="assets/js/jquery.js"></script>
1693
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
1694
+ <script src="assets/js/bootstrap-transition.js"></script>
1695
+ <script src="assets/js/bootstrap-alert.js"></script>
1696
+ <script src="assets/js/bootstrap-modal.js"></script>
1697
+ <script src="assets/js/bootstrap-dropdown.js"></script>
1698
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
1699
+ <script src="assets/js/bootstrap-tab.js"></script>
1700
+ <script src="assets/js/bootstrap-tooltip.js"></script>
1701
+ <script src="assets/js/bootstrap-popover.js"></script>
1702
+ <script src="assets/js/bootstrap-button.js"></script>
1703
+ <script src="assets/js/bootstrap-collapse.js"></script>
1704
+ <script src="assets/js/bootstrap-carousel.js"></script>
1705
+ <script src="assets/js/bootstrap-typeahead.js"></script>
1706
+ <script src="assets/js/application.js"></script>
1707
+
1708
+
1709
+ </body>
1710
+</html>
docs/docs/likebutton/docs/components.html
new
+1931
@@ -0,0 +1,1931 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Components · Twitter Bootstrap</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ </head>
29
+
30
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
31
+
32
+
33
+ <!-- Navbar
34
+ ================================================== -->
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="brand" href="./index.html">Bootstrap</a>
44
+ <div class="nav-collapse collapse">
45
+ <ul class="nav">
46
+ <li class="">
47
+ <a href="./index.html">Overview</a>
48
+ </li>
49
+ <li class="">
50
+ <a href="./scaffolding.html">Scaffolding</a>
51
+ </li>
52
+ <li class="">
53
+ <a href="./base-css.html">Base CSS</a>
54
+ </li>
55
+ <li class="active">
56
+ <a href="./components.html">Components</a>
57
+ </li>
58
+ <li class="">
59
+ <a href="./javascript.html">Javascript plugins</a>
60
+ </li>
61
+ <li class="">
62
+ <a href="./less.html">Using LESS</a>
63
+ </li>
64
+ <li class="divider-vertical"></li>
65
+ <li class="">
66
+ <a href="./download.html">Customize</a>
67
+ </li>
68
+ <li class="">
69
+ <a href="./examples.html">Examples</a>
70
+ </li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="container">
78
+
79
+<!-- Masthead
80
+================================================== -->
81
+<header class="jumbotron subhead" id="overview">
82
+ <h1>Components</h1>
83
+ <p class="lead">Dozens of reusable components are built into Bootstrap to provide navigation, alerts, popovers, and much more.</p>
84
+ <div class="subnav">
85
+ <ul class="nav nav-pills">
86
+ <li class="dropdown">
87
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">Buttons <b class="caret"></b></a>
88
+ <ul class="dropdown-menu">
89
+ <li><a href="#buttonGroups">Button groups</a></li>
90
+ <li><a href="#buttonDropdowns">Button dropdowns</a></li>
91
+ </ul>
92
+ </li>
93
+ <li class="dropdown">
94
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">Navigation <b class="caret"></b></a>
95
+ <ul class="dropdown-menu">
96
+ <li><a href="#navs">Nav, tabs, pills</a></li>
97
+ <li><a href="#navbar">Navbar</a></li>
98
+ <li><a href="#breadcrumbs">Breadcrumbs</a></li>
99
+ <li><a href="#pagination">Pagination</a></li>
100
+ </ul>
101
+ </li>
102
+ <li><a href="#labels">Labels</a></li>
103
+ <li><a href="#badges">Badges</a></li>
104
+ <li><a href="#typography">Typography</a></li>
105
+ <li><a href="#thumbnails">Thumbnails</a></li>
106
+ <li><a href="#alerts">Alerts</a></li>
107
+ <li><a href="#progress">Progress bars</a></li>
108
+ <li><a href="#misc">Miscellaneous</a></li>
109
+ </ul>
110
+ </div>
111
+</header>
112
+
113
+
114
+
115
+<!-- Button Groups
116
+================================================== -->
117
+<section id="buttonGroups">
118
+ <div class="page-header">
119
+ <h1>Button groups <small>Join buttons for more toolbar-like functionality</small></h1>
120
+ </div>
121
+ <div class="row">
122
+ <div class="span4">
123
+ <h3>Button groups</h3>
124
+ <p>Use button groups to join multiple buttons together as one composite component. Build them with a series of <code><a></code> or <code><button></code> elements.</p>
125
+ <h3>Best practices</h3>
126
+ <p>We recommend the following guidelines for using button groups and toolbars:</p>
127
+ <ul>
128
+ <li>Always use the same element in a single button group, <code><a></code> or <code><button></code>.</li>
129
+ <li>Don't mix buttons of different colors in the same button group.</li>
130
+ <li>Use icons in addition to or instead of text, but be sure include alt and title text where appropriate.</li>
131
+ </ul>
132
+ <p><span class="label label-info">Related</span> Button groups with dropdowns (see below) should be called out separately and always include a dropdown caret to indicate intended behavior.</p>
133
+ </div>
134
+ <div class="span4">
135
+ <h3>Default example</h3>
136
+ <p>Here's how the HTML looks for a standard button group built with anchor tag buttons:</p>
137
+ <div class="">
138
+ <div class="btn-group" style="margin: 9px 0;">
139
+ <button class="btn">Left</button>
140
+ <button class="btn">Middle</button>
141
+ <button class="btn">Right</button>
142
+ </div>
143
+ </div>
144
+<pre class="prettyprint linenums">
145
+<div class="btn-group">
146
+ <button class="btn">1</button>
147
+ <button class="btn">2</button>
148
+ <button class="btn">3</button>
149
+</div>
150
+</pre>
151
+ <h3>Toolbar example</h3>
152
+ <p>Combine sets of <code><div class="btn-group"></code> into a <code><div class="btn-toolbar"></code> for more complex components.</p>
153
+ <div class="btn-toolbar">
154
+ <div class="btn-group">
155
+ <button class="btn">1</button>
156
+ <button class="btn">2</button>
157
+ <button class="btn">3</button>
158
+ <button class="btn">4</button>
159
+ </div>
160
+ <div class="btn-group">
161
+ <button class="btn">5</button>
162
+ <button class="btn">6</button>
163
+ <button class="btn">7</button>
164
+ </div>
165
+ <div class="btn-group">
166
+ <button class="btn">8</button>
167
+ </div>
168
+ </div>
169
+<pre class="prettyprint linenums">
170
+<div class="btn-toolbar">
171
+ <div class="btn-group">
172
+ ...
173
+ </div>
174
+</div>
175
+</pre>
176
+ </div>
177
+ <div class="span4">
178
+ <h3>Checkbox and radio flavors</h3>
179
+ <p>Button groups can also function as radios, where only one button may be active, or checkboxes, where any number of buttons may be active. View <a href="./javascript.html#buttons">the Javascript docs</a> for that.</p>
180
+ <p><a class="btn js-btn" href="./javascript.html#buttons">Get the javascript »</a></p>
181
+ <h3>Dropdowns in button groups</h3>
182
+ <p><span class="label label-info">Heads up!</span> Buttons with dropdowns must be individually wrapped in their own <code>.btn-group</code> within a <code>.btn-toolbar</code> for proper rendering.</p>
183
+ </div>
184
+ </div>
185
+</section>
186
+
187
+
188
+
189
+<!-- Split button dropdowns
190
+================================================== -->
191
+<section id="buttonDropdowns">
192
+ <div class="page-header">
193
+ <h1>Button dropdown menus <small>Built on button groups to provide contextual menus</small></h1>
194
+ </div>
195
+
196
+ <h2>Button dropdowns</h2>
197
+ <div class="row">
198
+ <div class="span4">
199
+ <h3>Overview and examples</h3>
200
+ <p>Use any button to trigger a dropdown menu by placing it within a <code>.btn-group</code> and providing the proper menu markup.</p>
201
+ <div class="btn-toolbar" style="margin-top: 18px;">
202
+ <div class="btn-group">
203
+ <button class="btn dropdown-toggle" data-toggle="dropdown">Action <span class="caret"></span></button>
204
+ <ul class="dropdown-menu">
205
+ <li><a href="#">Action</a></li>
206
+ <li><a href="#">Another action</a></li>
207
+ <li><a href="#">Something else here</a></li>
208
+ <li class="divider"></li>
209
+ <li><a href="#">Separated link</a></li>
210
+ </ul>
211
+ </div><!-- /btn-group -->
212
+ <div class="btn-group">
213
+ <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">Action <span class="caret"></span></button>
214
+ <ul class="dropdown-menu">
215
+ <li><a href="#">Action</a></li>
216
+ <li><a href="#">Another action</a></li>
217
+ <li><a href="#">Something else here</a></li>
218
+ <li class="divider"></li>
219
+ <li><a href="#">Separated link</a></li>
220
+ </ul>
221
+ </div><!-- /btn-group -->
222
+ <div class="btn-group">
223
+ <button class="btn btn-danger dropdown-toggle" data-toggle="dropdown">Danger <span class="caret"></span></button>
224
+ <ul class="dropdown-menu">
225
+ <li><a href="#">Action</a></li>
226
+ <li><a href="#">Another action</a></li>
227
+ <li><a href="#">Something else here</a></li>
228
+ <li class="divider"></li>
229
+ <li><a href="#">Separated link</a></li>
230
+ </ul>
231
+ </div><!-- /btn-group -->
232
+ </div>
233
+ <div class="btn-toolbar">
234
+ <div class="btn-group">
235
+ <button class="btn btn-warning dropdown-toggle" data-toggle="dropdown">Warning <span class="caret"></span></button>
236
+ <ul class="dropdown-menu">
237
+ <li><a href="#">Action</a></li>
238
+ <li><a href="#">Another action</a></li>
239
+ <li><a href="#">Something else here</a></li>
240
+ <li class="divider"></li>
241
+ <li><a href="#">Separated link</a></li>
242
+ </ul>
243
+ </div><!-- /btn-group -->
244
+ <div class="btn-group">
245
+ <button class="btn btn-success dropdown-toggle" data-toggle="dropdown">Success <span class="caret"></span></button>
246
+ <ul class="dropdown-menu">
247
+ <li><a href="#">Action</a></li>
248
+ <li><a href="#">Another action</a></li>
249
+ <li><a href="#">Something else here</a></li>
250
+ <li class="divider"></li>
251
+ <li><a href="#">Separated link</a></li>
252
+ </ul>
253
+ </div><!-- /btn-group -->
254
+ <div class="btn-group">
255
+ <button class="btn btn-info dropdown-toggle" data-toggle="dropdown">Info <span class="caret"></span></button>
256
+ <ul class="dropdown-menu">
257
+ <li><a href="#">Action</a></li>
258
+ <li><a href="#">Another action</a></li>
259
+ <li><a href="#">Something else here</a></li>
260
+ <li class="divider"></li>
261
+ <li><a href="#">Separated link</a></li>
262
+ </ul>
263
+ </div><!-- /btn-group -->
264
+ <div class="btn-group">
265
+ <button class="btn btn-inverse dropdown-toggle" data-toggle="dropdown">Inverse <span class="caret"></span></button>
266
+ <ul class="dropdown-menu">
267
+ <li><a href="#">Action</a></li>
268
+ <li><a href="#">Another action</a></li>
269
+ <li><a href="#">Something else here</a></li>
270
+ <li class="divider"></li>
271
+ <li><a href="#">Separated link</a></li>
272
+ </ul>
273
+ </div><!-- /btn-group -->
274
+ </div><!-- /btn-toolbar -->
275
+ </div>
276
+ <div class="span8">
277
+ <h3>Example markup</h3>
278
+ <p>Similar to a button group, our markup uses regular button markup, but with a handful of additions to refine the style and support Bootstrap's dropdown jQuery plugin.</p>
279
+<pre class="prettyprint linenums">
280
+<div class="btn-group">
281
+ <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
282
+ Action
283
+ <span class="caret"></span>
284
+ </a>
285
+ <ul class="dropdown-menu">
286
+ <!-- dropdown menu links -->
287
+ </ul>
288
+</div>
289
+</pre>
290
+ </div>
291
+ </div>
292
+ <div class="row">
293
+ <div class="span4">
294
+ <h3>Works with all button sizes</h3>
295
+ <p>Button dropdowns work at any size. your button sizes to <code>.btn-large</code>, <code>.btn-small</code>, or <code>.btn-mini</code>.</p>
296
+ <div class="btn-toolbar" style="margin-top: 18px;">
297
+ <div class="btn-group">
298
+ <button class="btn btn-large dropdown-toggle" data-toggle="dropdown">Large button <span class="caret"></span></button>
299
+ <ul class="dropdown-menu">
300
+ <li><a href="#">Action</a></li>
301
+ <li><a href="#">Another action</a></li>
302
+ <li><a href="#">Something else here</a></li>
303
+ <li class="divider"></li>
304
+ <li><a href="#">Separated link</a></li>
305
+ </ul>
306
+ </div><!-- /btn-group -->
307
+ <div class="btn-group">
308
+ <button class="btn btn-small dropdown-toggle" data-toggle="dropdown">Small button <span class="caret"></span></button>
309
+ <ul class="dropdown-menu">
310
+ <li><a href="#">Action</a></li>
311
+ <li><a href="#">Another action</a></li>
312
+ <li><a href="#">Something else here</a></li>
313
+ <li class="divider"></li>
314
+ <li><a href="#">Separated link</a></li>
315
+ </ul>
316
+ </div><!-- /btn-group -->
317
+ <div class="btn-group">
318
+ <button class="btn btn-mini dropdown-toggle" data-toggle="dropdown">Mini button <span class="caret"></span></button>
319
+ <ul class="dropdown-menu">
320
+ <li><a href="#">Action</a></li>
321
+ <li><a href="#">Another action</a></li>
322
+ <li><a href="#">Something else here</a></li>
323
+ <li class="divider"></li>
324
+ <li><a href="#">Separated link</a></li>
325
+ </ul>
326
+ </div><!-- /btn-group -->
327
+ </div><!-- /btn-toolbar -->
328
+ </div><!--/span-->
329
+ <div class="span4">
330
+ <h3>Requires javascript</h3>
331
+ <p>Button dropdowns require the <a href="./javascript.html#dropdowns">Bootstrap dropdown plugin</a> to function.</p>
332
+ <p>In some cases—like mobile—dropdown menus will extend outside the viewport. You need to resolve the alignment manually or with custom javascript.</p>
333
+ </div><!--/span-->
334
+ </div><!--/row-->
335
+ <br>
336
+
337
+ <h2>Split button dropdowns</h2>
338
+ <div class="row">
339
+ <div class="span4">
340
+ <h3>Overview and examples</h3>
341
+ <p>Building on the button group styles and markup, we can easily create a split button. Split buttons feature a standard action on the left and a dropdown toggle on the right with contextual links.</p>
342
+ <div class="btn-toolbar" style="margin-top: 18px;">
343
+ <div class="btn-group">
344
+ <button class="btn">Action</button>
345
+ <button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
346
+ <ul class="dropdown-menu">
347
+ <li><a href="#">Action</a></li>
348
+ <li><a href="#">Another action</a></li>
349
+ <li><a href="#">Something else here</a></li>
350
+ <li class="divider"></li>
351
+ <li><a href="#">Separated link</a></li>
352
+ </ul>
353
+ </div><!-- /btn-group -->
354
+ <div class="btn-group">
355
+ <button class="btn btn-primary">Action</button>
356
+ <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
357
+ <ul class="dropdown-menu">
358
+ <li><a href="#">Action</a></li>
359
+ <li><a href="#">Another action</a></li>
360
+ <li><a href="#">Something else here</a></li>
361
+ <li class="divider"></li>
362
+ <li><a href="#">Separated link</a></li>
363
+ </ul>
364
+ </div><!-- /btn-group -->
365
+ <div class="btn-group">
366
+ <button class="btn btn-danger">Danger</button>
367
+ <button class="btn btn-danger dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
368
+ <ul class="dropdown-menu">
369
+ <li><a href="#">Action</a></li>
370
+ <li><a href="#">Another action</a></li>
371
+ <li><a href="#">Something else here</a></li>
372
+ <li class="divider"></li>
373
+ <li><a href="#">Separated link</a></li>
374
+ </ul>
375
+ </div><!-- /btn-group -->
376
+ </div>
377
+ <div class="btn-toolbar">
378
+ <div class="btn-group">
379
+ <button class="btn btn-warning">Warning</button>
380
+ <button class="btn btn-warning dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
381
+ <ul class="dropdown-menu">
382
+ <li><a href="#">Action</a></li>
383
+ <li><a href="#">Another action</a></li>
384
+ <li><a href="#">Something else here</a></li>
385
+ <li class="divider"></li>
386
+ <li><a href="#">Separated link</a></li>
387
+ </ul>
388
+ </div><!-- /btn-group -->
389
+ <div class="btn-group">
390
+ <button class="btn btn-success">Success</button>
391
+ <button class="btn btn-success dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
392
+ <ul class="dropdown-menu">
393
+ <li><a href="#">Action</a></li>
394
+ <li><a href="#">Another action</a></li>
395
+ <li><a href="#">Something else here</a></li>
396
+ <li class="divider"></li>
397
+ <li><a href="#">Separated link</a></li>
398
+ </ul>
399
+ </div><!-- /btn-group -->
400
+ <div class="btn-group">
401
+ <button class="btn btn-info">Info</button>
402
+ <button class="btn btn-info dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
403
+ <ul class="dropdown-menu">
404
+ <li><a href="#">Action</a></li>
405
+ <li><a href="#">Another action</a></li>
406
+ <li><a href="#">Something else here</a></li>
407
+ <li class="divider"></li>
408
+ <li><a href="#">Separated link</a></li>
409
+ </ul>
410
+ </div><!-- /btn-group -->
411
+ </div>
412
+ <div class="btn-toolbar">
413
+ <div class="btn-group">
414
+ <button class="btn btn-inverse">Inverse</button>
415
+ <button class="btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
416
+ <ul class="dropdown-menu">
417
+ <li><a href="#">Action</a></li>
418
+ <li><a href="#">Another action</a></li>
419
+ <li><a href="#">Something else here</a></li>
420
+ <li class="divider"></li>
421
+ <li><a href="#">Separated link</a></li>
422
+ </ul>
423
+ </div><!-- /btn-group -->
424
+ </div><!-- /btn-toolbar -->
425
+ <h3>Sizes</h3>
426
+ <p>Utilize the extra button classes <code>.btn-mini</code>, <code>.btn-small</code>, or <code>.btn-large</code> for sizing.</p>
427
+ <div class="btn-toolbar">
428
+ <div class="btn-group">
429
+ <button class="btn btn-large">Large action</button>
430
+ <button class="btn btn-large dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
431
+ <ul class="dropdown-menu">
432
+ <li><a href="#">Action</a></li>
433
+ <li><a href="#">Another action</a></li>
434
+ <li><a href="#">Something else here</a></li>
435
+ <li class="divider"></li>
436
+ <li><a href="#">Separated link</a></li>
437
+ </ul>
438
+ </div><!-- /btn-group -->
439
+ </div><!-- /btn-toolbar -->
440
+ <div class="btn-toolbar">
441
+ <div class="btn-group">
442
+ <button class="btn btn-small">Small action</button>
443
+ <button class="btn btn-small dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
444
+ <ul class="dropdown-menu">
445
+ <li><a href="#">Action</a></li>
446
+ <li><a href="#">Another action</a></li>
447
+ <li><a href="#">Something else here</a></li>
448
+ <li class="divider"></li>
449
+ <li><a href="#">Separated link</a></li>
450
+ </ul>
451
+ </div><!-- /btn-group -->
452
+ </div><!-- /btn-toolbar -->
453
+ <div class="btn-toolbar">
454
+ <div class="btn-group">
455
+ <button class="btn btn-mini">Mini action</button>
456
+ <button class="btn btn-mini dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
457
+ <ul class="dropdown-menu">
458
+ <li><a href="#">Action</a></li>
459
+ <li><a href="#">Another action</a></li>
460
+ <li><a href="#">Something else here</a></li>
461
+ <li class="divider"></li>
462
+ <li><a href="#">Separated link</a></li>
463
+ </ul>
464
+ </div><!-- /btn-group -->
465
+ </div><!-- /btn-toolbar -->
466
+<pre class="prettyprint linenums">
467
+<div class="btn-group">
468
+ ...
469
+ <ul class="dropdown-menu pull-right">
470
+ <!-- dropdown menu links -->
471
+ </ul>
472
+</div>
473
+</pre>
474
+ </div>
475
+ <div class="span8">
476
+ <h3>Example markup</h3>
477
+ <p>We expand on the normal button dropdowns to provide a second button action that operates as a separate dropdown trigger.</p>
478
+<pre class="prettyprint linenums">
479
+<div class="btn-group">
480
+ <button class="btn">Action</button>
481
+ <button class="btn dropdown-toggle" data-toggle="dropdown">
482
+ <span class="caret"></span>
483
+ </button>
484
+ <ul class="dropdown-menu">
485
+ <!-- dropdown menu links -->
486
+ </ul>
487
+</div>
488
+</pre>
489
+ <h3>Dropup menus</h3>
490
+ <p>Dropdown menus can also be toggled from the bottom up by adding a single class to the immediate parent of <code>.dropdown-menu</code>. It will flip the direction of the <code>.caret</code> and reposition the menu itself to move from the bottom up instead of top down.</p>
491
+ <div class="btn-toolbar" style="margin-top: 9px;">
492
+ <div class="btn-group dropup">
493
+ <button class="btn">Dropup</button>
494
+ <button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
495
+ <ul class="dropdown-menu">
496
+ <li><a href="#">Action</a></li>
497
+ <li><a href="#">Another action</a></li>
498
+ <li><a href="#">Something else here</a></li>
499
+ <li class="divider"></li>
500
+ <li><a href="#">Separated link</a></li>
501
+ </ul>
502
+ </div><!-- /btn-group -->
503
+ <div class="btn-group dropup">
504
+ <button class="btn primary">Right dropup</button>
505
+ <button class="btn primary dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
506
+ <ul class="dropdown-menu pull-right">
507
+ <li><a href="#">Action</a></li>
508
+ <li><a href="#">Another action</a></li>
509
+ <li><a href="#">Something else here</a></li>
510
+ <li class="divider"></li>
511
+ <li><a href="#">Separated link</a></li>
512
+ </ul>
513
+ </div><!-- /btn-group -->
514
+ </div>
515
+<pre class="prettyprint linenums">
516
+<div class="btn-group dropup">
517
+ <button class="btn">Dropup</button>
518
+ <button class="btn dropdown-toggle" data-toggle="dropdown">
519
+ <span class="caret"></span>
520
+ </button>
521
+ <ul class="dropdown-menu">
522
+ <!-- dropdown menu links -->
523
+ </ul>
524
+</div>
525
+</pre>
526
+
527
+ </div>
528
+ </div>
529
+</section>
530
+
531
+
532
+
533
+<!-- Nav, Tabs, & Pills
534
+================================================== -->
535
+<section id="navs">
536
+ <div class="page-header">
537
+ <h1>Nav, tabs, and pills <small>Highly customizable list-style navigation</small></h1>
538
+ </div>
539
+
540
+ <h2>Lightweight defaults <small>Same markup, different classes</small></h2>
541
+ <div class="row">
542
+ <div class="span4">
543
+ <h3>Powerful base class</h3>
544
+ <p>All nav components here—tabs, pills, and lists—<strong>share the same base markup and styles</strong> through the <code>.nav</code> class.</p>
545
+ <h3>When to use</h3>
546
+ <p>Tabs and pills are great for sections of content or navigating between pages of related content.</p>
547
+ <h3>Component alignment</h3>
548
+ <p>To align nav links, use the <code>.pull-left</code> or <code>.pull-right</code> utility classes. Both classes will add a CSS float in the specified direction.</p>
549
+ </div>
550
+ <div class="span4">
551
+ <h3>Basic tabs</h3>
552
+ <p>Take a regular <code><ul></code> of links and add <code>.nav-tabs</code>:</p>
553
+ <ul class="nav nav-tabs">
554
+ <li class="active"><a href="#">Home</a></li>
555
+ <li><a href="#">Profile</a></li>
556
+ <li><a href="#">Messages</a></li>
557
+ </ul>
558
+<pre class="prettyprint linenums">
559
+<ul class="nav nav-tabs">
560
+ <li class="active">
561
+ <a href="#">Home</a>
562
+ </li>
563
+ <li><a href="#">...</a></li>
564
+ <li><a href="#">...</a></li>
565
+</ul>
566
+</pre>
567
+ </div>
568
+ <div class="span4">
569
+ <h3>Basic pills</h3>
570
+ <p>Take that same HTML, but use <code>.nav-pills</code> instead:</p>
571
+ <ul class="nav nav-pills">
572
+ <li class="active"><a href="#">Home</a></li>
573
+ <li><a href="#">Profile</a></li>
574
+ <li><a href="#">Messages</a></li>
575
+ </ul>
576
+<pre class="prettyprint linenums">
577
+<ul class="nav nav-pills">
578
+ <li class="active">
579
+ <a href="#">Home</a>
580
+ </li>
581
+ <li><a href="#">...</a></li>
582
+ <li><a href="#">...</a></li>
583
+</ul>
584
+</pre>
585
+ </div>
586
+ </div>
587
+
588
+ <h2>Stackable <small>Make tabs or pills vertical</small></h2>
589
+ <div class="row">
590
+ <div class="span4">
591
+ <h3>How to stack 'em</h3>
592
+ <p>As tabs and pills are horizontal by default, just add a second class, <code>.nav-stacked</code>, to make them appear vertically stacked.</p>
593
+ </div>
594
+ <div class="span4">
595
+ <h3>Stacked tabs</h3>
596
+ <ul class="nav nav-tabs nav-stacked">
597
+ <li class="active"><a href="#">Home</a></li>
598
+ <li><a href="#">Profile</a></li>
599
+ <li><a href="#">Messages</a></li>
600
+ </ul>
601
+<pre class="prettyprint linenums">
602
+<ul class="nav nav-tabs nav-stacked">
603
+ ...
604
+</ul>
605
+</pre>
606
+ </div>
607
+ <div class="span4">
608
+ <h3>Stacked pills</h3>
609
+ <ul class="nav nav-pills nav-stacked">
610
+ <li class="active"><a href="#">Home</a></li>
611
+ <li><a href="#">Profile</a></li>
612
+ <li><a href="#">Messages</a></li>
613
+ </ul>
614
+<pre class="prettyprint linenums">
615
+<ul class="nav nav-pills nav-stacked">
616
+ ...
617
+</ul>
618
+</pre>
619
+ </div>
620
+ </div>
621
+
622
+ <h2>Dropdowns <small>For advanced nav components</small></h2>
623
+ <div class="row">
624
+ <div class="span4">
625
+ <h3>Rich menus made easy</h3>
626
+ <p>Dropdown menus in Bootstrap tabs and pills are super easy and require only a little extra HTML and a lightweight jQuery plugin.</p>
627
+ <p>Head over to the Javascript page to read the docs on <a href="./javascript.html#tabs">initializing dropdowns</a> in Bootstrap.</p>
628
+ </div>
629
+ <div class="span4">
630
+ <h3>Tabs with dropdowns</h3>
631
+ <ul class="nav nav-tabs">
632
+ <li class="active"><a href="#">Home</a></li>
633
+ <li><a href="#">Help</a></li>
634
+ <li class="dropdown">
635
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">Dropdown <b class="caret"></b></a>
636
+ <ul class="dropdown-menu">
637
+ <li><a href="#">Action</a></li>
638
+ <li><a href="#">Another action</a></li>
639
+ <li><a href="#">Something else here</a></li>
640
+ <li class="divider"></li>
641
+ <li><a href="#">Separated link</a></li>
642
+ </ul>
643
+ </li>
644
+ </ul>
645
+<pre class="prettyprint linenums">
646
+<ul class="nav nav-tabs">
647
+ <li class="dropdown">
648
+ <a class="dropdown-toggle"
649
+ data-toggle="dropdown"
650
+ href="#">
651
+ Dropdown
652
+ <b class="caret"></b>
653
+ </a>
654
+ <ul class="dropdown-menu">
655
+ <!-- links -->
656
+ </ul>
657
+ </li>
658
+</ul>
659
+</pre>
660
+ </div>
661
+ <div class="span4">
662
+ <h3>Pills with dropdowns</h3>
663
+ <ul class="nav nav-pills">
664
+ <li class="active"><a href="#">Home</a></li>
665
+ <li><a href="#">Help</a></li>
666
+ <li class="dropdown">
667
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">Dropdown <b class="caret"></b></a>
668
+ <ul class="dropdown-menu">
669
+ <li><a href="#">Action</a></li>
670
+ <li><a href="#">Another action</a></li>
671
+ <li><a href="#">Something else here</a></li>
672
+ <li class="divider"></li>
673
+ <li><a href="#">Separated link</a></li>
674
+ </ul>
675
+ </li>
676
+ </ul>
677
+<pre class="prettyprint linenums">
678
+<ul class="nav nav-pills">
679
+ <li class="dropdown">
680
+ <a class="dropdown-toggle"
681
+ data-toggle="dropdown"
682
+ href="#">
683
+ Dropdown
684
+ <b class="caret"></b>
685
+ </a>
686
+ <ul class="dropdown-menu">
687
+ <!-- links -->
688
+ </ul>
689
+ </li>
690
+</ul>
691
+</pre>
692
+ </div>
693
+ </div>
694
+
695
+ <h2>Nav lists <small>Build simple stacked navs, great for sidebars</small></h2>
696
+ <div class="row">
697
+ <div class="span4">
698
+ <h3>Application-style navigation</h3>
699
+ <p>Nav lists provide a simple and easy way to build groups of nav links with optional headers. They're best used in sidebars like the Finder in OS X.</p>
700
+ <p>Structurally, they're built on the same core nav styles as tabs and pills, so usage and customization are straightforward.</p>
701
+ <hr>
702
+ <h4>With icons</h4>
703
+ <p>Nav lists are also easy to equip with icons. Add the proper <code><i></code> tag with class and you're set.</p>
704
+ <h4>Horizontal dividers</h4>
705
+ <p>Add a horizontal divider by creating an empty list item with the class <code>.divider</code>, like so:</p>
706
+<pre class="prettyprint linenums">
707
+<ul class="nav nav-list">
708
+ ...
709
+ <li class="divider"></li>
710
+ ...
711
+</ul>
712
+</pre>
713
+ </div>
714
+ <div class="span4">
715
+ <h3>Example nav list</h3>
716
+ <p>Take a list of links and add <code>class="nav nav-list"</code>:</p>
717
+ <div class="well" style="padding: 8px 0;">
718
+ <ul class="nav nav-list">
719
+ <li class="nav-header">List header</li>
720
+ <li class="active"><a href="#">Home</a></li>
721
+ <li><a href="#">Library</a></li>
722
+ <li><a href="#">Applications</a></li>
723
+ <li class="nav-header">Another list header</li>
724
+ <li><a href="#">Profile</a></li>
725
+ <li><a href="#">Settings</a></li>
726
+ <li class="divider"></li>
727
+ <li><a href="#">Help</a></li>
728
+ </ul>
729
+ </div> <!-- /well -->
730
+<pre class="prettyprint linenums">
731
+<ul class="nav nav-list">
732
+ <li class="nav-header">
733
+ List header
734
+ </li>
735
+ <li class="active">
736
+ <a href="#">Home</a>
737
+ </li>
738
+ <li>
739
+ <a href="#">Library</a>
740
+ </li>
741
+ ...
742
+</ul>
743
+</pre>
744
+ </div>
745
+ <div class="span4">
746
+ <h3>Example with icons</h3>
747
+ <p>Same example, but with <code><i></code> tags for icons.</p>
748
+ <div class="well" style="padding: 8px 0;">
749
+ <ul class="nav nav-list">
750
+ <li class="nav-header">List header</li>
751
+ <li class="active"><a href="#"><i class="icon-white icon-home"></i> Home</a></li>
752
+ <li><a href="#"><i class="icon-book"></i> Library</a></li>
753
+ <li><a href="#"><i class="icon-pencil"></i> Applications</a></li>
754
+ <li class="nav-header">Another list header</li>
755
+ <li><a href="#"><i class="icon-user"></i> Profile</a></li>
756
+ <li><a href="#"><i class="icon-cog"></i> Settings</a></li>
757
+ <li class="divider"></li>
758
+ <li><a href="#"><i class="icon-flag"></i> Help</a></li>
759
+ </ul>
760
+ </div> <!-- /well -->
761
+<pre class="prettyprint linenums">
762
+<ul class="nav nav-list">
763
+ ...
764
+ <li>
765
+ <a href="#">
766
+ <i class="icon-book"></i>
767
+ Library
768
+ </a>
769
+ </li>
770
+ ...
771
+</ul>
772
+</pre>
773
+ </div>
774
+ </div>
775
+
776
+
777
+ <h2>Tabbable nav <small>Bring tabs to life via javascript</small></h2>
778
+ <div class="row">
779
+ <div class="span4">
780
+ <h3>What's included</h3>
781
+ <p>Bring your tabs to life with a simple plugin to toggle between content via tabs. Bootstrap integrates tabbable tabs in four styles: top (default), right, bottom, and left.</p>
782
+ <p>Changing between them is easy and only requires changing very little markup.</p>
783
+ <hr>
784
+ <h4>Fade in tabs</h4>
785
+ <p>To make tabs fade in, add <code>.fade</code> to each <code>.tab-pane</code>.</p>
786
+ <hr>
787
+ <h4>Requires jQuery plugin</h4>
788
+ <p>All tabbable tabs are powered by our lightweight jQuery plugin. Read more about how to bring tabbable tabs to life <a href="./javascript.html#tabs">on the javascript docs page</a>.</p>
789
+ <p><a class="btn" href="./javascript.html#tabs">Get the javascript →</a></p>
790
+ </div>
791
+ <div class="span8">
792
+ <h3>Tabbable example</h3>
793
+ <p>To make tabs tabbable, create a <code>.tab-pane</code> with unique ID for every tab and wrap them in <code>.tab-content</code>.</p>
794
+ <div class="tabbable" style="margin-bottom: 18px;">
795
+ <ul class="nav nav-tabs">
796
+ <li class="active"><a href="#tab1" data-toggle="tab">Section 1</a></li>
797
+ <li><a href="#tab2" data-toggle="tab">Section 2</a></li>
798
+ <li><a href="#tab3" data-toggle="tab">Section 3</a></li>
799
+ </ul>
800
+ <div class="tab-content" style="padding-bottom: 9px; border-bottom: 1px solid #ddd;">
801
+ <div class="tab-pane active" id="tab1">
802
+ <p>I'm in Section 1.</p>
803
+ </div>
804
+ <div class="tab-pane" id="tab2">
805
+ <p>Howdy, I'm in Section 2.</p>
806
+ </div>
807
+ <div class="tab-pane" id="tab3">
808
+ <p>What up girl, this is Section 3.</p>
809
+ </div>
810
+ </div>
811
+ </div> <!-- /tabbable -->
812
+ <p>For right or left aligned tabs, wrap the <code>.nav-tabs</code> and <code>.tab-content</code> in <code>.tabbable</code>.</p>
813
+
814
+ <h3>Straightforward markup</h3>
815
+ <p>Using tabbable tabs requires a wrapping div, a set of tabs, and a set of tabbable panes of content.</p>
816
+<pre class="prettyprint linenums">
817
+<div class="tabbable"> <!-- Only required for left/right tabs -->
818
+ <ul class="nav nav-tabs">
819
+ <li class="active"><a href="#tab1" data-toggle="tab">Section 1</a></li>
820
+ <li><a href="#tab2" data-toggle="tab">Section 2</a></li>
821
+ </ul>
822
+ <div class="tab-content">
823
+ <div class="tab-pane active" id="tab1">
824
+ <p>I'm in Section 1.</p>
825
+ </div>
826
+ <div class="tab-pane" id="tab2">
827
+ <p>Howdy, I'm in Section 2.</p>
828
+ </div>
829
+ </div>
830
+</div>
831
+</pre>
832
+ </div>
833
+ </div>
834
+
835
+
836
+ <h3>Tabbable in any direction</h3>
837
+ <div class="row">
838
+ <div class="span4">
839
+ <h4>Tabs on the bottom</h4>
840
+ <p>Flip the order of the HTML and add a class to put tabs on the bottom.</p>
841
+ <div class="tabbable tabs-below">
842
+ <div class="tab-content">
843
+ <div class="tab-pane active" id="A">
844
+ <p>I'm in Section A.</p>
845
+ </div>
846
+ <div class="tab-pane" id="B">
847
+ <p>Howdy, I'm in Section B.</p>
848
+ </div>
849
+ <div class="tab-pane" id="C">
850
+ <p>What up girl, this is Section C.</p>
851
+ </div>
852
+ </div>
853
+ <ul class="nav nav-tabs">
854
+ <li class="active"><a href="#A" data-toggle="tab">Section 1</a></li>
855
+ <li><a href="#B" data-toggle="tab">Section 2</a></li>
856
+ <li><a href="#C" data-toggle="tab">Section 3</a></li>
857
+ </ul>
858
+ </div> <!-- /tabbable -->
859
+<pre class="prettyprint linenums" style="margin-top: 11px;">
860
+<div class="tabbable tabs-below">
861
+ <div class="tab-content">
862
+ ...
863
+ </div>
864
+ <ul class="nav nav-tabs">
865
+ ...
866
+ </ul>
867
+</div>
868
+</pre>
869
+ </div>
870
+ <div class="span4">
871
+ <h4>Tabs on the left</h4>
872
+ <p>Swap the class to put tabs on the left.</p>
873
+ <div class="tabbable tabs-left">
874
+ <ul class="nav nav-tabs">
875
+ <li class="active"><a href="#lA" data-toggle="tab">Section 1</a></li>
876
+ <li><a href="#lB" data-toggle="tab">Section 2</a></li>
877
+ <li><a href="#lC" data-toggle="tab">Section 3</a></li>
878
+ </ul>
879
+ <div class="tab-content">
880
+ <div class="tab-pane active" id="lA">
881
+ <p>I'm in Section A.</p>
882
+ </div>
883
+ <div class="tab-pane" id="lB">
884
+ <p>Howdy, I'm in Section B.</p>
885
+ </div>
886
+ <div class="tab-pane" id="lC">
887
+ <p>What up girl, this is Section C.</p>
888
+ </div>
889
+ </div>
890
+ </div> <!-- /tabbable -->
891
+<pre class="prettyprint linenums">
892
+<div class="tabbable tabs-left">
893
+ <ul class="nav nav-tabs">
894
+ ...
895
+ </ul>
896
+ <div class="tab-content">
897
+ ...
898
+ </div>
899
+</div>
900
+</pre>
901
+ </div>
902
+ <div class="span4">
903
+ <h4>Tabs on the right</h4>
904
+ <p>Swap the class to put tabs on the right.</p>
905
+ <div class="tabbable tabs-right">
906
+ <ul class="nav nav-tabs">
907
+ <li class="active"><a href="#rA" data-toggle="tab">Section 1</a></li>
908
+ <li><a href="#rB" data-toggle="tab">Section 2</a></li>
909
+ <li><a href="#rC" data-toggle="tab">Section 3</a></li>
910
+ </ul>
911
+ <div class="tab-content">
912
+ <div class="tab-pane active" id="rA">
913
+ <p>I'm in Section A.</p>
914
+ </div>
915
+ <div class="tab-pane" id="rB">
916
+ <p>Howdy, I'm in Section B.</p>
917
+ </div>
918
+ <div class="tab-pane" id="rC">
919
+ <p>What up girl, this is Section C.</p>
920
+ </div>
921
+ </div>
922
+ </div> <!-- /tabbable -->
923
+<pre class="prettyprint linenums">
924
+<div class="tabbable tabs-right">
925
+ <ul class="nav nav-tabs">
926
+ ...
927
+ </ul>
928
+ <div class="tab-content">
929
+ ...
930
+ </div>
931
+</div>
932
+</pre>
933
+ </div>
934
+ </div>
935
+
936
+</section>
937
+
938
+
939
+
940
+<!-- Navbar
941
+================================================== -->
942
+<section id="navbar">
943
+ <div class="page-header">
944
+ <h1>Navbar</h1>
945
+ </div>
946
+ <h2>Static navbar example</h2>
947
+ <p>An example of a static (not fixed to the top) navbar with project name, navigation, and search form.</p>
948
+ <div class="navbar">
949
+ <div class="navbar-inner">
950
+ <div class="container">
951
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
952
+ <span class="icon-bar"></span>
953
+ <span class="icon-bar"></span>
954
+ <span class="icon-bar"></span>
955
+ </a>
956
+ <a class="brand" href="#">Project name</a>
957
+ <div class="nav-collapse">
958
+ <ul class="nav">
959
+ <li class="active"><a href="#">Home</a></li>
960
+ <li><a href="#">Link</a></li>
961
+ <li><a href="#">Link</a></li>
962
+ <li><a href="#">Link</a></li>
963
+ <li class="dropdown">
964
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
965
+ <ul class="dropdown-menu">
966
+ <li><a href="#">Action</a></li>
967
+ <li><a href="#">Another action</a></li>
968
+ <li><a href="#">Something else here</a></li>
969
+ <li class="divider"></li>
970
+ <li class="nav-header">Nav header</li>
971
+ <li><a href="#">Separated link</a></li>
972
+ <li><a href="#">One more separated link</a></li>
973
+ </ul>
974
+ </li>
975
+ </ul>
976
+ <form class="navbar-search pull-left" action="">
977
+ <input type="text" class="search-query span2" placeholder="Search">
978
+ </form>
979
+ <ul class="nav pull-right">
980
+ <li><a href="#">Link</a></li>
981
+ <li class="divider-vertical"></li>
982
+ <li class="dropdown">
983
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
984
+ <ul class="dropdown-menu">
985
+ <li><a href="#">Action</a></li>
986
+ <li><a href="#">Another action</a></li>
987
+ <li><a href="#">Something else here</a></li>
988
+ <li class="divider"></li>
989
+ <li><a href="#">Separated link</a></li>
990
+ </ul>
991
+ </li>
992
+ </ul>
993
+ </div><!-- /.nav-collapse -->
994
+ </div>
995
+ </div><!-- /navbar-inner -->
996
+ </div><!-- /navbar -->
997
+
998
+ <div class="row">
999
+ <div class="span8">
1000
+ <h3>Navbar scaffolding</h3>
1001
+ <p>The navbar requires only a few divs to structure it well for static or fixed display.</p>
1002
+<pre class="prettyprint linenums">
1003
+<div class="navbar">
1004
+ <div class="navbar-inner">
1005
+ <div class="container">
1006
+ ...
1007
+ </div>
1008
+ </div>
1009
+</div>
1010
+</pre>
1011
+ <h3>Fixed navbar</h3>
1012
+ <p>Fix the navbar to the top or bottom of the viewport with an additional class on the outermost div, <code>.navbar</code>.</p>
1013
+ <div class="row">
1014
+ <div class="span4">
1015
+<pre class="prettyprint linenums">
1016
+<div class="navbar navbar-fixed-top">
1017
+ ...
1018
+</div>
1019
+</pre>
1020
+ </div><!--/span-->
1021
+ <div class="span4">
1022
+<pre class="prettyprint linenums">
1023
+<div class="navbar navbar-fixed-bottom">
1024
+ ...
1025
+</div>
1026
+</pre>
1027
+ </div><!--/span-->
1028
+ </div><!--/row-->
1029
+ <p>When you affix the navbar, remember to account for the hidden area underneath. Add 40px or more of padding to the <code><body></code>. Be sure to add this after the core Bootstrap CSS and before the optional responsive CSS.</p>
1030
+ <h3>Brand name</h3>
1031
+ <p>A simple link to show your brand or project name only requires an anchor tag.</p>
1032
+<pre class="prettyprint linenums">
1033
+<a class="brand" href="#">
1034
+ Project name
1035
+</a>
1036
+</pre>
1037
+ <h3>Forms in navbar</h3>
1038
+ <p>To properly style and position a form within the navbar, add the appropriate classes as shown below. For a default form, include <code>.navbar-form</code> and either <code>.pull-left</code> or <code>.pull-right</code> to properly align it.</p>
1039
+<pre class="prettyprint linenums">
1040
+<form class="navbar-form pull-left">
1041
+ <input type="text" class="span2">
1042
+</form>
1043
+</pre>
1044
+ <p>For a more customized search form, add <code>.navbar-search</code> to the <code>form</code> and <code>.search-query</code> to the input for specialized styles in the navbar.</p>
1045
+<pre class="prettyprint linenums">
1046
+<form class="navbar-search pull-left">
1047
+ <input type="text" class="search-query" placeholder="Search">
1048
+</form>
1049
+</pre>
1050
+ <h3>Optional responsive variation</h3>
1051
+ <p>Depending on the amount of content in your topbar, you might want to implement the responsive options. To do so, wrap your nav content in a containing div, <code>.nav-collapse.collapse</code>, and add the navbar toggle button, <code>.btn-navbar</code>.</p>
1052
+<pre class="prettyprint linenums">
1053
+<div class="navbar">
1054
+ <div class="navbar-inner">
1055
+ <div class="container">
1056
+
1057
+ <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
1058
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
1059
+ <span class="icon-bar"></span>
1060
+ <span class="icon-bar"></span>
1061
+ <span class="icon-bar"></span>
1062
+ </a>
1063
+
1064
+ <!-- Be sure to leave the brand out there if you want it shown -->
1065
+ <a class="brand" href="#">Project name</a>
1066
+
1067
+ <!-- Everything you want hidden at 940px or less, place within here -->
1068
+ <div class="nav-collapse">
1069
+ <!-- .nav, .navbar-search, .navbar-form, etc -->
1070
+ </div>
1071
+
1072
+ </div>
1073
+ </div>
1074
+</div>
1075
+</pre>
1076
+ <div class="alert alert-info">
1077
+ <strong>Heads up!</strong> The responsive navbar requires the <a href="./javascript.html#collapse">collapse plugin</a> and <a href="./scaffolding.html#responsive">responsive Bootstrap CSS file</a>.
1078
+ </div>
1079
+
1080
+ </div><!-- /.span -->
1081
+ <div class="span4">
1082
+ <h3>Nav links</h3>
1083
+ <p>Nav items are simple to add via unordered lists.</p>
1084
+<pre class="prettyprint linenums">
1085
+<ul class="nav">
1086
+ <li class="active">
1087
+ <a href="#">Home</a>
1088
+ </li>
1089
+ <li><a href="#">Link</a></li>
1090
+ <li><a href="#">Link</a></li>
1091
+</ul>
1092
+</pre>
1093
+ <p>You can easily add dividers to your nav links with an empty list item and a simple class. Just add this between links:</p>
1094
+<pre class="prettyprint linenums">
1095
+<ul class="nav">
1096
+ ...
1097
+ <li class="divider-vertical"></li>
1098
+ ...
1099
+</ul>
1100
+</pre>
1101
+ <h3>Component alignment</h3>
1102
+ <p>To align a nav, search form, or text, use the <code>.pull-left</code> or <code>.pull-right</code> utility classes. Both classes will add a CSS float in the specified direction.</p>
1103
+ <h3>Adding dropdown menus</h3>
1104
+ <p>Adding dropdowns and dropups to the nav is super simple, but does require the use of <a href="./javascript.html#dropdowns">our javascript plugin</a>.</p>
1105
+<pre class="prettyprint linenums">
1106
+<ul class="nav">
1107
+ <li class="dropdown">
1108
+ <a href="#"
1109
+ class="dropdown-toggle"
1110
+ data-toggle="dropdown">
1111
+ Account
1112
+ <b class="caret"></b>
1113
+ </a>
1114
+ <ul class="dropdown-menu">
1115
+ ...
1116
+ </ul>
1117
+ </li>
1118
+</ul>
1119
+</pre>
1120
+ <p><a class="btn" href="./javascript.html#dropdowns">Get the javascript →</a></p>
1121
+ <hr>
1122
+ <h3>Text in the navbar</h3>
1123
+ <p>Wrap strings of text in a <code><.navbar-text></code>, usually on a <code><p></code> tag for proper leading and color.</p>
1124
+ </div><!-- /.span -->
1125
+ </div><!-- /.row -->
1126
+
1127
+</section>
1128
+
1129
+
1130
+
1131
+<!-- Breadcrumbs
1132
+================================================== -->
1133
+<section id="breadcrumbs">
1134
+ <div class="page-header">
1135
+ <h1>Breadcrumbs <small></small></h1>
1136
+ </div>
1137
+
1138
+ <div class="row">
1139
+ <div class="span6">
1140
+ <h3>Why use them</h3>
1141
+ <p>Breadcrumb navigation is used as a way to show users where they are within an app or a site, but not for primary navigation. Keep their use sparse and succinct to be most effective.</p>
1142
+
1143
+ <h3>Examples</h3>
1144
+ <p>A single example shown as it might be displayed across multiple pages.</p>
1145
+ <ul class="breadcrumb">
1146
+ <li class="active">Home</li>
1147
+ </ul>
1148
+ <ul class="breadcrumb">
1149
+ <li><a href="#">Home</a> <span class="divider">/</span></li>
1150
+ <li class="active">Library</li>
1151
+ </ul>
1152
+ <ul class="breadcrumb">
1153
+ <li><a href="#">Home</a> <span class="divider">/</span></li>
1154
+ <li><a href="#">Library</a> <span class="divider">/</span></li>
1155
+ <li class="active">Data</li>
1156
+ </ul>
1157
+ </div>
1158
+ <div class="span6">
1159
+ <h3>Markup</h3>
1160
+ <p>HTML is your standard unordered list with links.</p>
1161
+<pre class="prettyprint linenums">
1162
+<ul class="breadcrumb">
1163
+ <li>
1164
+ <a href="#">Home</a> <span class="divider">/</span>
1165
+ </li>
1166
+ <li>
1167
+ <a href="#">Library</a> <span class="divider">/</span>
1168
+ </li>
1169
+ <li class="active">Data</li>
1170
+</ul>
1171
+</pre>
1172
+ </div>
1173
+ </div>
1174
+
1175
+</section>
1176
+
1177
+
1178
+
1179
+<!-- Pagination
1180
+================================================== -->
1181
+<section id="pagination">
1182
+ <div class="page-header">
1183
+ <h1>Pagination <small>Two options for paging through content</small></h1>
1184
+ </div>
1185
+
1186
+ <h2>Multicon-page pagination</h2>
1187
+ <div class="row">
1188
+ <div class="span4">
1189
+ <h3>When to use</h3>
1190
+ <p>Ultra simplistic and minimally styled pagination inspired by Rdio, great for apps and search results. The large block is hard to miss, easily scalable, and provides large click areas.</p>
1191
+ <h3>Stateful page links</h3>
1192
+ <p>Links are customizable and work in a number of circumstances with the right class. <code>.disabled</code> for unclickable links and <code>.active</code> for current page.</p>
1193
+ <h3>Flexible alignment</h3>
1194
+ <p>Add either of two optional classes to change the alignment of pagination links: <code>.pagination-centered</code> and <code>.pagination-right</code>.</p>
1195
+ </div>
1196
+ <div class="span4">
1197
+ <h3>Examples</h3>
1198
+ <p>The default pagination component is flexible and works in a number of variations.</p>
1199
+ <div class="pagination">
1200
+ <ul>
1201
+ <li class="disabled"><a href="#">«</a></li>
1202
+ <li class="active"><a href="#">1</a></li>
1203
+ <li><a href="#">2</a></li>
1204
+ <li><a href="#">3</a></li>
1205
+ <li><a href="#">4</a></li>
1206
+ <li><a href="#">»</a></li>
1207
+ </ul>
1208
+ </div>
1209
+ <div class="pagination">
1210
+ <ul>
1211
+ <li><a href="#">«</a></li>
1212
+ <li><a href="#">10</a></li>
1213
+ <li class="active"><a href="#">11</a></li>
1214
+ <li><a href="#">12</a></li>
1215
+ <li><a href="#">»</a></li>
1216
+ </ul>
1217
+ </div>
1218
+ <div class="pagination">
1219
+ <ul>
1220
+ <li><a href="#">«</a></li>
1221
+ <li class="active"><a href="#">10</a></li>
1222
+ <li class="disabled"><a href="#">...</a></li>
1223
+ <li><a href="#">20</a></li>
1224
+ <li><a href="#">»</a></li>
1225
+ </ul>
1226
+ </div>
1227
+ <div class="pagination pagination-centered">
1228
+ <ul>
1229
+ <li class="active"><a href="#">1</a></li>
1230
+ <li><a href="#">2</a></li>
1231
+ <li><a href="#">3</a></li>
1232
+ <li><a href="#">4</a></li>
1233
+ <li><a href="#">5</a></li>
1234
+ </ul>
1235
+ </div>
1236
+ </div>
1237
+ <div class="span4">
1238
+ <h3>Markup</h3>
1239
+ <p>Wrapped in a <code><div></code>, pagination is just a <code><ul></code>.</p>
1240
+<pre class="prettyprint linenums">
1241
+<div class="pagination">
1242
+ <ul>
1243
+ <li><a href="#">Prev</a></li>
1244
+ <li class="active">
1245
+ <a href="#">1</a>
1246
+ </li>
1247
+ <li><a href="#">2</a></li>
1248
+ <li><a href="#">3</a></li>
1249
+ <li><a href="#">4</a></li>
1250
+ <li><a href="#">Next</a></li>
1251
+ </ul>
1252
+</div>
1253
+</pre>
1254
+ </div>
1255
+ </div><!-- /row -->
1256
+
1257
+ <h2>Pager <small>For quick previous and next links</small></h2>
1258
+ <div class="row">
1259
+ <div class="span4">
1260
+ <h3>About pager</h3>
1261
+ <p>The pager component is a set of links for simple pagination implementations with light markup and even lighter styles. It's great for simple sites like blogs or magazines.</p>
1262
+ <h4>Optional disabled state</h4>
1263
+ <p>Pager links also use the general <code>.disabled</code> class from the pagination.</p>
1264
+ </div>
1265
+ <div class="span4">
1266
+ <h3>Default example</h3>
1267
+ <p>By default, the pager centers links.</p>
1268
+ <ul class="pager">
1269
+ <li><a href="#">Previous</a></li>
1270
+ <li><a href="#">Next</a></li>
1271
+ </ul>
1272
+<pre class="prettyprint linenums">
1273
+<ul class="pager">
1274
+ <li>
1275
+ <a href="#">Previous</a>
1276
+ </li>
1277
+ <li>
1278
+ <a href="#">Next</a>
1279
+ </li>
1280
+</ul>
1281
+</pre>
1282
+ </div>
1283
+ <div class="span4">
1284
+ <h3>Aligned links</h3>
1285
+ <p>Alternatively, you can align each link to the sides:</p>
1286
+ <ul class="pager">
1287
+ <li class="previous"><a href="#">← Older</a></li>
1288
+ <li class="next"><a href="#">Newer →</a></li>
1289
+ </ul>
1290
+<pre class="prettyprint linenums">
1291
+<ul class="pager">
1292
+ <li class="previous">
1293
+ <a href="#">&larr; Older</a>
1294
+ </li>
1295
+ <li class="next">
1296
+ <a href="#">Newer &rarr;</a>
1297
+ </li>
1298
+</ul>
1299
+</pre>
1300
+ </div>
1301
+ </div><!-- /row -->
1302
+</section>
1303
+
1304
+
1305
+
1306
+<!-- Labels
1307
+================================================== -->
1308
+<section id="labels">
1309
+ <div class="page-header">
1310
+ <h1>Inline labels <small>Label and annotate text</small></h1>
1311
+ </div>
1312
+ <table class="table table-bordered table-striped">
1313
+ <thead>
1314
+ <tr>
1315
+ <th>Labels</th>
1316
+ <th>Markup</th>
1317
+ </tr>
1318
+ </thead>
1319
+ <tbody>
1320
+ <tr>
1321
+ <td>
1322
+ <span class="label">Default</span>
1323
+ </td>
1324
+ <td>
1325
+ <code><span class="label">Default</span></code>
1326
+ </td>
1327
+ </tr>
1328
+ <tr>
1329
+ <td>
1330
+ <span class="label label-success">Success</span>
1331
+ </td>
1332
+ <td>
1333
+ <code><span class="label label-success">Success</span></code>
1334
+ </td>
1335
+ </tr>
1336
+ <tr>
1337
+ <td>
1338
+ <span class="label label-warning">Warning</span>
1339
+ </td>
1340
+ <td>
1341
+ <code><span class="label label-warning">Warning</span></code>
1342
+ </td>
1343
+ </tr>
1344
+ <tr>
1345
+ <td>
1346
+ <span class="label label-important">Important</span>
1347
+ </td>
1348
+ <td>
1349
+ <code><span class="label label-important">Important</span></code>
1350
+ </td>
1351
+ </tr>
1352
+ <tr>
1353
+ <td>
1354
+ <span class="label label-info">Info</span>
1355
+ </td>
1356
+ <td>
1357
+ <code><span class="label label-info">Info</span></code>
1358
+ </td>
1359
+ </tr>
1360
+ <tr>
1361
+ <td>
1362
+ <span class="label label-inverse">Inverse</span>
1363
+ </td>
1364
+ <td>
1365
+ <code><span class="label label-inverse">Inverse</span></code>
1366
+ </td>
1367
+ </tr>
1368
+ </tbody>
1369
+ </table>
1370
+</section>
1371
+
1372
+
1373
+
1374
+<!-- Badges
1375
+================================================== -->
1376
+<section id="badges">
1377
+ <div class="page-header">
1378
+ <h1>Badges <small>Indicators and unread counts</small></h1>
1379
+ </div>
1380
+ <div class="row">
1381
+ <div class="span4">
1382
+ <h3>About</h3>
1383
+ <p>Badges are small, simple components for displaying an indicator or count of some sort. They're commonly found in email clients like Mail.app or on mobile apps for push notifications.</p>
1384
+ </div><!-- /.span -->
1385
+ <div class="span8">
1386
+ <h3>Available classes</h3>
1387
+ <table class="table table-bordered table-striped">
1388
+ <thead>
1389
+ <tr>
1390
+ <th>Name</th>
1391
+ <th>Example</th>
1392
+ <th>Markup</th>
1393
+ </tr>
1394
+ </thead>
1395
+ <tbody>
1396
+ <tr>
1397
+ <td>
1398
+ Default
1399
+ </td>
1400
+ <td>
1401
+ <span class="badge">1</span>
1402
+ </td>
1403
+ <td>
1404
+ <code><span class="badge">1</span></code>
1405
+ </td>
1406
+ </tr>
1407
+ <tr>
1408
+ <td>
1409
+ Success
1410
+ </td>
1411
+ <td>
1412
+ <span class="badge badge-success">2</span>
1413
+ </td>
1414
+ <td>
1415
+ <code><span class="badge badge-success">2</span></code>
1416
+ </td>
1417
+ </tr>
1418
+ <tr>
1419
+ <td>
1420
+ Warning
1421
+ </td>
1422
+ <td>
1423
+ <span class="badge badge-warning">4</span>
1424
+ </td>
1425
+ <td>
1426
+ <code><span class="badge badge-warning">4</span></code>
1427
+ </td>
1428
+ </tr>
1429
+ <tr>
1430
+ <td>
1431
+ Important
1432
+ </td>
1433
+ <td>
1434
+ <span class="badge badge-important">6</span>
1435
+ </td>
1436
+ <td>
1437
+ <code><span class="badge badge-important">6</span></code>
1438
+ </td>
1439
+ </tr>
1440
+ <tr>
1441
+ <td>
1442
+ Info
1443
+ </td>
1444
+ <td>
1445
+ <span class="badge badge-info">8</span>
1446
+ </td>
1447
+ <td>
1448
+ <code><span class="badge badge-info">8</span></code>
1449
+ </td>
1450
+ </tr>
1451
+ <tr>
1452
+ <td>
1453
+ Inverse
1454
+ </td>
1455
+ <td>
1456
+ <span class="badge badge-inverse">10</span>
1457
+ </td>
1458
+ <td>
1459
+ <code><span class="badge badge-inverse">10</span></code>
1460
+ </td>
1461
+ </tr>
1462
+ </tbody>
1463
+ </table>
1464
+ </div><!-- /.span -->
1465
+ </div><!-- /.row -->
1466
+</section>
1467
+
1468
+
1469
+
1470
+<!-- Typographic components
1471
+================================================== -->
1472
+<section id="typography">
1473
+ <div class="page-header">
1474
+ <h1>Typographic components <small>Page header and hero unit for segmenting content</small></h1>
1475
+ </div>
1476
+ <h2>Hero unit</h2>
1477
+ <div class="row">
1478
+ <div class="span4">
1479
+ <p>Bootstrap provides a lightweight, flexible component called a hero unit to showcase content on your site. It works well on marketing and content-heavy sites.</p>
1480
+ <h3>Markup</h3>
1481
+ <p>Wrap your content in a <code>div</code> like so:</p>
1482
+<pre class="prettyprint linenums">
1483
+<div class="hero-unit">
1484
+ <h1>Heading</h1>
1485
+ <p>Tagline</p>
1486
+ <p>
1487
+ <a class="btn btn-primary btn-large">
1488
+ Learn more
1489
+ </a>
1490
+ </p>
1491
+</div>
1492
+</pre>
1493
+ </div>
1494
+ <div class="span8">
1495
+ <div class="hero-unit">
1496
+ <h1>Hello, world!</h1>
1497
+ <p>This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.</p>
1498
+ <p><a class="btn btn-primary btn-large">Learn more</a></p>
1499
+ </div>
1500
+ </div>
1501
+ </div><!-- /row -->
1502
+ <h2>Page header</h2>
1503
+ <div class="row">
1504
+ <div class="span4">
1505
+ <p>A simple shell for an <code>h1</code> to appropriately space out and segment sections of content on a page. It can utilize the <code>h1</code>'s default <code>small</code>, element as well most other components (with additional styles).</p>
1506
+ </div>
1507
+ <div class="span8">
1508
+ <div class="page-header">
1509
+ <h1>Example page header <small>Subtext for header</small></h1>
1510
+ </div>
1511
+<pre class="prettyprint linenums">
1512
+<div class="page-header">
1513
+ <h1>Example page header</h1>
1514
+</div>
1515
+</pre>
1516
+ </div>
1517
+ </div><!-- /row -->
1518
+</section>
1519
+
1520
+
1521
+
1522
+<!-- Thumbnails
1523
+================================================== -->
1524
+<section id="thumbnails">
1525
+ <div class="page-header">
1526
+ <h1>Thumbnails <small>Grids of images, videos, text, and more</small></h1>
1527
+ </div>
1528
+
1529
+ <div class="row">
1530
+ <div class="span6">
1531
+ <h2>Default thumbnails</h2>
1532
+ <p>By default, Bootstrap's thumbnails are designed to showcase linked images with minimal required markup.</p>
1533
+ <ul class="thumbnails">
1534
+ <li class="span3">
1535
+ <a href="#" class="thumbnail">
1536
+ <img src="http://placehold.it/260x180" alt="">
1537
+ </a>
1538
+ </li>
1539
+ <li class="span3">
1540
+ <a href="#" class="thumbnail">
1541
+ <img src="http://placehold.it/260x180" alt="">
1542
+ </a>
1543
+ </li>
1544
+ <li class="span3">
1545
+ <a href="#" class="thumbnail">
1546
+ <img src="http://placehold.it/260x180" alt="">
1547
+ </a>
1548
+ </li>
1549
+ <li class="span3">
1550
+ <a href="#" class="thumbnail">
1551
+ <img src="http://placehold.it/260x180" alt="">
1552
+ </a>
1553
+ </li>
1554
+ </ul>
1555
+ </div>
1556
+ <div class="span6">
1557
+ <h2>Highly customizable</h2>
1558
+ <p>With a bit of extra markup, it's possible to add any kind of HTML content like headings, paragraphs, or buttons into thumbnails.</p>
1559
+ <ul class="thumbnails">
1560
+ <li class="span3">
1561
+ <div class="thumbnail">
1562
+ <img src="http://placehold.it/260x180" alt="">
1563
+ <div class="caption">
1564
+ <h5>Thumbnail label</h5>
1565
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1566
+ <p><a href="#" class="btn btn-primary">Action</a> <a href="#" class="btn">Action</a></p>
1567
+ </div>
1568
+ </div>
1569
+ </li>
1570
+ <li class="span3">
1571
+ <div class="thumbnail">
1572
+ <img src="http://placehold.it/260x180" alt="">
1573
+ <div class="caption">
1574
+ <h5>Thumbnail label</h5>
1575
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1576
+ <p><a href="#" class="btn btn-primary">Action</a> <a href="#" class="btn">Action</a></p>
1577
+ </div>
1578
+ </div>
1579
+ </li>
1580
+ </ul>
1581
+ </div>
1582
+ </div>
1583
+
1584
+ <div class="row">
1585
+ <div class="span4">
1586
+ <h3>Why use thumbnails</h3>
1587
+ <p>Thumbnails (previously <code>.media-grid</code> up until v1.4) are great for grids of photos or videos, image search results, retail products, portfolios, and much more. They can be links or static content.</p>
1588
+ </div>
1589
+ <div class="span4">
1590
+ <h3>Simple, flexible markup</h3>
1591
+ <p>Thumbnail markup is simple—a <code>ul</code> with any number of <code>li</code> elements is all that is required. It's also super flexible, allowing for any type of content with just a bit more markup to wrap your contents.</p>
1592
+ </div>
1593
+ <div class="span4">
1594
+ <h3>Uses grid column sizes</h3>
1595
+ <p>Lastly, the thumbnails component uses existing grid system classes—like <code>.span2</code> or <code>.span3</code>—for control of thumbnail dimensions.</p>
1596
+ </div>
1597
+ </div>
1598
+
1599
+ <div class="row">
1600
+ <div class="span6">
1601
+ <h2>The markup</h2>
1602
+ <p>As mentioned previously, the required markup for thumbnails is light and straightforward. Here's a look at the default setup <strong>for linked images</strong>:</p>
1603
+<pre class="prettyprint linenums">
1604
+<ul class="thumbnails">
1605
+ <li class="span3">
1606
+ <a href="#" class="thumbnail">
1607
+ <img src="http://placehold.it/260x180" alt="">
1608
+ </a>
1609
+ </li>
1610
+ ...
1611
+</ul>
1612
+</pre>
1613
+ <p>For custom HTML content in thumbnails, the markup changes slightly. To allow block level content anywhere, we swap the <code><a></code> for a <code><div></code> like so:</p>
1614
+<pre class="prettyprint linenums">
1615
+<ul class="thumbnails">
1616
+ <li class="span3">
1617
+ <div class="thumbnail">
1618
+ <img src="http://placehold.it/260x180" alt="">
1619
+ <h5>Thumbnail label</h5>
1620
+ <p>Thumbnail caption right here...</p>
1621
+ </div>
1622
+ </li>
1623
+ ...
1624
+</ul>
1625
+</pre>
1626
+ </div>
1627
+ <div class="span6">
1628
+ <h2>More examples</h2>
1629
+ <p>Explore all your options with the various grid classes available to you. You can also mix and match different sizes.</p>
1630
+ <ul class="thumbnails">
1631
+ <li class="span4">
1632
+ <a href="#" class="thumbnail">
1633
+ <img src="http://placehold.it/360x268" alt="">
1634
+ </a>
1635
+ </li>
1636
+ <li class="span2">
1637
+ <a href="#" class="thumbnail">
1638
+ <img src="http://placehold.it/160x120" alt="">
1639
+ </a>
1640
+ </li>
1641
+ <li class="span2">
1642
+ <a href="#" class="thumbnail">
1643
+ <img src="http://placehold.it/160x120" alt="">
1644
+ </a>
1645
+ </li>
1646
+ <li class="span2">
1647
+ <a href="#" class="thumbnail">
1648
+ <img src="http://placehold.it/160x120" alt="">
1649
+ </a>
1650
+ </li>
1651
+ <li class="span2">
1652
+ <a href="#" class="thumbnail">
1653
+ <img src="http://placehold.it/160x120" alt="">
1654
+ </a>
1655
+ </li>
1656
+ <li class="span2">
1657
+ <a href="#" class="thumbnail">
1658
+ <img src="http://placehold.it/160x120" alt="">
1659
+ </a>
1660
+ </li>
1661
+ </ul>
1662
+ </div>
1663
+ </div>
1664
+
1665
+</section>
1666
+
1667
+
1668
+
1669
+<!-- Alerts
1670
+================================================== -->
1671
+<section id="alerts">
1672
+ <div class="page-header">
1673
+ <h1>Alerts <small>Styles for success, warning, and error messages</small></h1>
1674
+ </div>
1675
+
1676
+ <h2>Lightweight defaults</h2>
1677
+ <div class="row">
1678
+ <div class="span4">
1679
+ <h3>Rewritten base class</h3>
1680
+ <p>With Bootstrap 2, we've simplified the base class: <code>.alert</code> instead of <code>.alert-message</code>. We've also reduced the minimum required markup—no <code><p></code> is required by default, just the outer <code><div></code>.</p>
1681
+ <h3>Single alert message</h3>
1682
+ <p>For a more durable component with less code, we've removed the differentiating look for block alerts, messages that come with more padding and typically more text. The class also has changed to <code>.alert-block</code>.</p>
1683
+ <hr>
1684
+ <h3>Goes great with javascript</h3>
1685
+ <p>Bootstrap comes with a great jQuery plugin that supports alert messages, making dismissing them quick and easy.</p>
1686
+ <p><a class="btn js-btn" href="./javascript.html#alerts">Get the plugin »</a></p>
1687
+ </div>
1688
+ <div class="span8">
1689
+ <h3>Example alerts</h3>
1690
+ <p>Wrap your message and an optional close icon in a div with simple class.</p>
1691
+ <div class="alert">
1692
+ <button type="button" class="close" data-dismiss="alert">×</button>
1693
+ <strong>Warning!</strong> Best check yo self, you're not looking too good.
1694
+ </div>
1695
+<pre class="prettyprint linenums">
1696
+<div class="alert">
1697
+ <button class="close" data-dismiss="alert">×</button>
1698
+ <strong>Warning!</strong> Best check yo self, you're not looking too good.
1699
+</div>
1700
+</pre>
1701
+ <p><span class="label label-info">Heads up!</span> iOS devices require an <code>href="#"</code> for the dismissal of alerts. Be sure to include it and the data attribute for anchor close icons. Alternatively, you may use a <code><button></code> element with the data attribute, which we have opted to do for our docs. When using <code><button></code>, you must include <code>type="button"</code> or your forms may not submit.</p>
1702
+ <p>Easily extend the standard alert message with two optional classes: <code>.alert-block</code> for more padding and text controls and <code>.alert-heading</code> for a matching heading.</p>
1703
+ <div class="alert alert-block">
1704
+ <button type="button" class="close" data-dismiss="alert">×</button>
1705
+ <h4 class="alert-heading">Warning!</h4>
1706
+ <p>Best check yo self, you're not looking too good. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.</p>
1707
+ </div>
1708
+<pre class="prettyprint linenums">
1709
+<div class="alert alert-block">
1710
+ <a class="close" data-dismiss="alert" href="#">×</a>
1711
+ <h4 class="alert-heading">Warning!</h4>
1712
+ Best check yo self, you're not...
1713
+</div>
1714
+</pre>
1715
+ </div>
1716
+ </div>
1717
+
1718
+ <h2>Contextual alternatives <small>Add optional classes to change an alert's connotation</small></h2>
1719
+ <div class="row">
1720
+ <div class="span4">
1721
+ <h3>Error or danger</h3>
1722
+ <div class="alert alert-error">
1723
+ <button type="button" class="close" data-dismiss="alert">×</button>
1724
+ <strong>Oh snap!</strong> Change a few things up and try submitting again.
1725
+ </div>
1726
+<pre class="prettyprint linenums">
1727
+<div class="alert alert-error">
1728
+ ...
1729
+</div>
1730
+</pre>
1731
+ </div>
1732
+ <div class="span4">
1733
+ <h3>Success</h3>
1734
+ <div class="alert alert-success">
1735
+ <button type="button" class="close" data-dismiss="alert">×</button>
1736
+ <strong>Well done!</strong> You successfully read this important alert message.
1737
+ </div>
1738
+<pre class="prettyprint linenums">
1739
+<div class="alert alert-success">
1740
+ ...
1741
+</div>
1742
+</pre>
1743
+ </div>
1744
+ <div class="span4">
1745
+ <h3>Information</h3>
1746
+ <div class="alert alert-info">
1747
+ <button type="button" class="close" data-dismiss="alert">×</button>
1748
+ <strong>Heads up!</strong> This alert needs your attention, but it's not super important.
1749
+ </div>
1750
+<pre class="prettyprint linenums">
1751
+<div class="alert alert-info">
1752
+ ...
1753
+</div>
1754
+</pre>
1755
+ </div>
1756
+ </div>
1757
+
1758
+</section>
1759
+
1760
+
1761
+
1762
+<!-- Progress bars
1763
+================================================== -->
1764
+<section id="progress">
1765
+ <div class="page-header">
1766
+ <h1>Progress bars <small>For loading, redirecting, or action status</small></h1>
1767
+ </div>
1768
+
1769
+ <h2>Examples and markup</h2>
1770
+ <div class="row">
1771
+ <div class="span4">
1772
+ <h3>Basic</h3>
1773
+ <p>Default progress bar with a vertical gradient.</p>
1774
+ <div class="progress">
1775
+ <div class="bar" style="width: 60%;"></div>
1776
+ </div>
1777
+<pre class="prettyprint linenums">
1778
+<div class="progress">
1779
+ <div class="bar"
1780
+ style="width: 60%;"></div>
1781
+</div>
1782
+</pre>
1783
+ </div>
1784
+ <div class="span4">
1785
+ <h3>Striped</h3>
1786
+ <p>Uses a gradient to create a striped effect (no IE).</p>
1787
+ <div class="progress progress-striped">
1788
+ <div class="bar" style="width: 20%;"></div>
1789
+ </div>
1790
+<pre class="prettyprint linenums">
1791
+<div class="progress progress-striped">
1792
+ <div class="bar"
1793
+ style="width: 20%;"></div>
1794
+</div>
1795
+</pre>
1796
+ </div>
1797
+ <div class="span4">
1798
+ <h3>Animated</h3>
1799
+ <p>Takes the striped example and animates it (no IE).</p>
1800
+ <div class="progress progress-striped active">
1801
+ <div class="bar" style="width: 45%"></div>
1802
+ </div>
1803
+<pre class="prettyprint linenums">
1804
+<div class="progress progress-striped
1805
+ active">
1806
+ <div class="bar"
1807
+ style="width: 40%;"></div>
1808
+</div>
1809
+</pre>
1810
+ </div>
1811
+ </div>
1812
+
1813
+ <h2>Options and browser support</h2>
1814
+ <div class="row">
1815
+ <div class="span3">
1816
+ <h3>Additional colors</h3>
1817
+ <p>Progress bars use some of the same button and alert classes for consistent styles.</p>
1818
+ <div class="progress progress-info" style="margin-bottom: 9px;">
1819
+ <div class="bar" style="width: 20%"></div>
1820
+ </div>
1821
+ <div class="progress progress-success" style="margin-bottom: 9px;">
1822
+ <div class="bar" style="width: 40%"></div>
1823
+ </div>
1824
+ <div class="progress progress-warning" style="margin-bottom: 9px;">
1825
+ <div class="bar" style="width: 60%"></div>
1826
+ </div>
1827
+ <div class="progress progress-danger" style="margin-bottom: 9px;">
1828
+ <div class="bar" style="width: 80%"></div>
1829
+ </div>
1830
+ </div>
1831
+ <div class="span3">
1832
+ <h3>Striped bars</h3>
1833
+ <p>Similar to the solid colors, we have varied striped progress bars.</p>
1834
+ <div class="progress progress-info progress-striped" style="margin-bottom: 9px;">
1835
+ <div class="bar" style="width: 20%"></div>
1836
+ </div>
1837
+ <div class="progress progress-success progress-striped" style="margin-bottom: 9px;">
1838
+ <div class="bar" style="width: 40%"></div>
1839
+ </div>
1840
+ <div class="progress progress-warning progress-striped" style="margin-bottom: 9px;">
1841
+ <div class="bar" style="width: 60%"></div>
1842
+ </div>
1843
+ <div class="progress progress-danger progress-striped" style="margin-bottom: 9px;">
1844
+ <div class="bar" style="width: 80%"></div>
1845
+ </div>
1846
+ </div>
1847
+ <div class="span3">
1848
+ <h3>Behavior</h3>
1849
+ <p>Progress bars use CSS3 transitions, so if you dynamically adjust the width via javascript, it will smoothly resize.</p>
1850
+ <p>If you use the <code>.active</code> class, your <code>.progress-striped</code> progress bars will animate the stripes left to right.</p>
1851
+ </div>
1852
+ <div class="span3">
1853
+ <h3>Browser support</h3>
1854
+ <p>Progress bars use CSS3 gradients, transitions, and animations to achieve all their effects. These features are not supported in IE7-9 or older versions of Firefox.</p>
1855
+ <p>Opera and IE do not support animations at this time.</p>
1856
+ </div>
1857
+ </div>
1858
+
1859
+</section>
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+<!-- Miscellaneous
1866
+================================================== -->
1867
+<section id="misc">
1868
+ <div class="page-header">
1869
+ <h1>Miscellaneous <small>Lightweight utility components</small></h1>
1870
+ </div>
1871
+ <div class="row">
1872
+ <div class="span4">
1873
+ <h2>Wells</h2>
1874
+ <p>Use the well as a simple effect on an element to give it an inset effect.</p>
1875
+ <div class="well">
1876
+ Look, I'm in a well!
1877
+ </div>
1878
+<pre class="prettyprint linenums">
1879
+<div class="well">
1880
+ ...
1881
+</div>
1882
+</pre>
1883
+ </div><!--/span-->
1884
+ <div class="span4">
1885
+ <h2>Close icon</h2>
1886
+ <p>Use the generic close icon for dismissing content like modals and alerts.</p>
1887
+ <p><button class="close" style="float: none;">×</button></p>
1888
+<pre class="prettyprint linenums"><button class="close">&times;</button></pre>
1889
+ <p>iOS devices require an href="#" for click events if you rather use an anchor.</p>
1890
+<pre class="prettyprint linenums"><a class="close" href="#">&times;</a></pre>
1891
+ </div><!--/span-->
1892
+ </div><!--/row-->
1893
+</section>
1894
+
1895
+
1896
+ <!-- Footer
1897
+ ================================================== -->
1898
+ <footer class="footer">
1899
+ <p class="pull-right"><a href="#">Back to top</a></p>
1900
+ <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
1901
+ <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
1902
+ <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
1903
+ </footer>
1904
+
1905
+ </div><!-- /container -->
1906
+
1907
+
1908
+
1909
+ <!-- Le javascript
1910
+ ================================================== -->
1911
+ <!-- Placed at the end of the document so the pages load faster -->
1912
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
1913
+ <script src="assets/js/jquery.js"></script>
1914
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
1915
+ <script src="assets/js/bootstrap-transition.js"></script>
1916
+ <script src="assets/js/bootstrap-alert.js"></script>
1917
+ <script src="assets/js/bootstrap-modal.js"></script>
1918
+ <script src="assets/js/bootstrap-dropdown.js"></script>
1919
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
1920
+ <script src="assets/js/bootstrap-tab.js"></script>
1921
+ <script src="assets/js/bootstrap-tooltip.js"></script>
1922
+ <script src="assets/js/bootstrap-popover.js"></script>
1923
+ <script src="assets/js/bootstrap-button.js"></script>
1924
+ <script src="assets/js/bootstrap-collapse.js"></script>
1925
+ <script src="assets/js/bootstrap-carousel.js"></script>
1926
+ <script src="assets/js/bootstrap-typeahead.js"></script>
1927
+ <script src="assets/js/application.js"></script>
1928
+
1929
+
1930
+ </body>
1931
+</html>
docs/docs/likebutton/docs/download.html
new
+454
@@ -0,0 +1,454 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Download · Twitter Bootstrap</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ </head>
29
+
30
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
31
+
32
+
33
+ <!-- Navbar
34
+ ================================================== -->
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="brand" href="./index.html">Bootstrap</a>
44
+ <div class="nav-collapse collapse">
45
+ <ul class="nav">
46
+ <li class="">
47
+ <a href="./index.html">Overview</a>
48
+ </li>
49
+ <li class="">
50
+ <a href="./scaffolding.html">Scaffolding</a>
51
+ </li>
52
+ <li class="">
53
+ <a href="./base-css.html">Base CSS</a>
54
+ </li>
55
+ <li class="">
56
+ <a href="./components.html">Components</a>
57
+ </li>
58
+ <li class="">
59
+ <a href="./javascript.html">Javascript plugins</a>
60
+ </li>
61
+ <li class="">
62
+ <a href="./less.html">Using LESS</a>
63
+ </li>
64
+ <li class="divider-vertical"></li>
65
+ <li class="active">
66
+ <a href="./download.html">Customize</a>
67
+ </li>
68
+ <li class="">
69
+ <a href="./examples.html">Examples</a>
70
+ </li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="container">
78
+
79
+<!-- Masthead
80
+================================================== -->
81
+<header class="jumbotron subhead" id="overview">
82
+ <h1>Customize and download</h1>
83
+ <p class="lead"><a href="https://github.com/twitter/bootstrap/zipball/master">Download the full repository</a> or customize your entire Bootstrap build by selecting only the components, javascript plugins, and assets you need.</p>
84
+ <div class="subnav">
85
+ <ul class="nav nav-pills">
86
+ <li><a href="#components">1. Choose components</a></li>
87
+ <li><a href="#plugins">2. Select jQuery plugins</a></li>
88
+ <li><a href="#variables">3. Customize variables</a></li>
89
+ <li><a href="#download">4. Download</a></li>
90
+ </ul>
91
+ </div>
92
+</header>
93
+
94
+<section class="download" id="components">
95
+ <div class="page-header">
96
+ <a class="btn btn-small pull-right toggle-all" href="#">Toggle all</a>
97
+ <h1>
98
+ 1. Choose components
99
+ <small>Get just the CSS you need</small>
100
+ </h1>
101
+ </div>
102
+ <div class="row download-builder">
103
+ <div class="span3">
104
+ <h3>Scaffolding</h3>
105
+ <label class="checkbox"><input checked="checked" type="checkbox" value="reset.less"> Normalize and reset</label>
106
+ <label class="checkbox"><input checked="checked" type="checkbox" value="scaffolding.less"> Body type and links</label>
107
+ <label class="checkbox"><input checked="checked" type="checkbox" value="grid.less"> Grid system</label>
108
+ <label class="checkbox"><input checked="checked" type="checkbox" value="layouts.less"> Layouts</label>
109
+ <h3>Base CSS</h3>
110
+ <label class="checkbox"><input checked="checked" type="checkbox" value="type.less"> Headings, body, etc</label>
111
+ <label class="checkbox"><input checked="checked" type="checkbox" value="code.less"> Code and pre</label>
112
+ <label class="checkbox"><input checked="checked" type="checkbox" value="labels-badges.less"> Labels and badges</label>
113
+ <label class="checkbox"><input checked="checked" type="checkbox" value="tables.less"> Tables</label>
114
+ <label class="checkbox"><input checked="checked" type="checkbox" value="forms.less"> Forms</label>
115
+ <label class="checkbox"><input checked="checked" type="checkbox" value="buttons.less"> Buttons</label>
116
+ <label class="checkbox"><input checked="checked" type="checkbox" value="sprites.less"> Icons</label>
117
+ </div><!-- /span -->
118
+ <div class="span3">
119
+ <h3>Components</h3>
120
+ <label class="checkbox"><input checked="checked" type="checkbox" value="button-groups.less"> Button groups and dropdowns</label>
121
+ <label class="checkbox"><input checked="checked" type="checkbox" value="navs.less"> Navs, tabs, and pills</label>
122
+ <label class="checkbox"><input checked="checked" type="checkbox" value="navbar.less"> Navbar</label>
123
+ <label class="checkbox"><input checked="checked" type="checkbox" value="breadcrumbs.less"> Breadcrumbs</label>
124
+ <label class="checkbox"><input checked="checked" type="checkbox" value="pagination.less"> Pagination</label>
125
+ <label class="checkbox"><input checked="checked" type="checkbox" value="pager.less"> Pager</label>
126
+ <label class="checkbox"><input checked="checked" type="checkbox" value="thumbnails.less"> Thumbnails</label>
127
+ <label class="checkbox"><input checked="checked" type="checkbox" value="alerts.less"> Alerts</label>
128
+ <label class="checkbox"><input checked="checked" type="checkbox" value="progress-bars.less"> Progress bars</label>
129
+ <label class="checkbox"><input checked="checked" type="checkbox" value="hero-unit.less"> Hero unit</label>
130
+ </div><!-- /span -->
131
+ <div class="span3">
132
+ <h3>JS Components</h3>
133
+ <label class="checkbox"><input checked="checked" type="checkbox" value="tooltip.less"> Tooltips</label>
134
+ <label class="checkbox"><input checked="checked" type="checkbox" value="popovers.less"> Popovers</label>
135
+ <label class="checkbox"><input checked="checked" type="checkbox" value="modals.less"> Modals</label>
136
+ <label class="checkbox"><input checked="checked" type="checkbox" value="dropdowns.less"> Dropdowns</label>
137
+ <label class="checkbox"><input checked="checked" type="checkbox" value="accordion.less"> Collapse</label>
138
+ <label class="checkbox"><input checked="checked" type="checkbox" value="carousel.less"> Carousel</label>
139
+ </div><!-- /span -->
140
+ <div class="span3">
141
+ <h3>Miscellaneous</h3>
142
+ <label class="checkbox"><input checked="checked" type="checkbox" value="wells.less"> Wells</label>
143
+ <label class="checkbox"><input checked="checked" type="checkbox" value="close.less"> Close icon</label>
144
+ <label class="checkbox"><input checked="checked" type="checkbox" value="utilities.less"> Utilities</label>
145
+ <label class="checkbox"><input checked="checked" type="checkbox" value="component-animations.less"> Component animations</label>
146
+ <h3>Responsive</h3>
147
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-utilities.less"> Visible/hidden classes</label>
148
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-767px-max.less"> Narrow tablets and below (<767px)</label>
149
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-768px-979px.less"> Tablets to desktops (767-979px)</label>
150
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-1200px-min.less"> Large desktops (>1200px)</label>
151
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-navbar.less"> Responsive navbar</label>
152
+ </div><!-- /span -->
153
+ </div><!-- /row -->
154
+</section>
155
+
156
+<section class="download" id="plugins">
157
+ <div class="page-header">
158
+ <a class="btn btn-small pull-right toggle-all" href="#">Toggle all</a>
159
+ <h1>
160
+ 2. Select jQuery plugins
161
+ <small>Quickly add only the necessary javascript</small>
162
+ </h1>
163
+ </div>
164
+ <div class="row download-builder">
165
+ <div class="span4">
166
+ <label class="checkbox">
167
+ <input type="checkbox" checked="true" value="bootstrap-transition.js">
168
+ Transitions <small>(required for any animation)</small>
169
+ </label>
170
+ <label class="checkbox">
171
+ <input type="checkbox" checked="true" value="bootstrap-modal.js">
172
+ Modals
173
+ </label>
174
+ <label class="checkbox">
175
+ <input type="checkbox" checked="true" value="bootstrap-dropdown.js">
176
+ Dropdowns
177
+ </label>
178
+ <label class="checkbox">
179
+ <input type="checkbox" checked="true" value="bootstrap-scrollspy.js">
180
+ Scrollspy
181
+ </label>
182
+ <label class="checkbox">
183
+ <input type="checkbox" checked="true" value="bootstrap-tab.js">
184
+ Togglable tabs
185
+ </label>
186
+ <label class="checkbox">
187
+ <input type="checkbox" checked="true" value="bootstrap-tooltip.js">
188
+ Tooltips
189
+ </label>
190
+ </div><!-- /span -->
191
+ <div class="span4">
192
+ <label class="checkbox">
193
+ <input type="checkbox" checked="true" value="bootstrap-popover.js">
194
+ Popovers <small>(requires Tooltips)</small>
195
+ </label>
196
+ <label class="checkbox">
197
+ <input type="checkbox" checked="true" value="bootstrap-alert.js">
198
+ Alert messages
199
+ </label>
200
+ <label class="checkbox">
201
+ <input type="checkbox" checked="true" value="bootstrap-button.js">
202
+ Buttons
203
+ </label>
204
+ <label class="checkbox">
205
+ <input type="checkbox" checked="true" value="bootstrap-collapse.js">
206
+ Collapse
207
+ </label>
208
+ <label class="checkbox">
209
+ <input type="checkbox" checked="true" value="bootstrap-carousel.js">
210
+ Carousel
211
+ </label>
212
+ <label class="checkbox">
213
+ <input type="checkbox" checked="true" value="bootstrap-typeahead.js">
214
+ Typeahead
215
+ </label>
216
+ </div><!-- /span -->
217
+ <div class="span4">
218
+ <h4 class="muted">Heads up!</h4>
219
+ <p class="muted">All checked plugins will be compiled into a single file, bootstrap.js. All plugins require the latest version of <a href="http://jquery.com/" target="_blank">jQuery</a> to be included.</p>
220
+ </div><!-- /span -->
221
+ </div><!-- /row -->
222
+</section>
223
+
224
+
225
+<section class="download" id="variables">
226
+ <div class="page-header">
227
+ <a class="btn btn-small pull-right toggle-all" href="#">Reset to defaults</a>
228
+ <h1>
229
+ 3. Customize variables
230
+ <small>Optionally modify Bootstrap without a compiler</small>
231
+ </h1>
232
+ </div>
233
+ <div class="row download-builder">
234
+ <div class="span3">
235
+ <h3>Scaffolding</h3>
236
+ <label>@bodyBackground</label>
237
+ <input type="text" class="span3" placeholder="@white">
238
+ <label>@textColor</label>
239
+ <input type="text" class="span3" placeholder="@grayDark">
240
+
241
+ <h3>Links</h3>
242
+ <label>@linkColor</label>
243
+ <input type="text" class="span3" placeholder="#08c">
244
+ <label>@linkColorHover</label>
245
+ <input type="text" class="span3" placeholder="darken(@linkColor, 15%)">
246
+ <h3>Colors</h3>
247
+ <label>@blue</label>
248
+ <input type="text" class="span3" placeholder="#049cdb">
249
+ <label>@green</label>
250
+ <input type="text" class="span3" placeholder="#46a546">
251
+ <label>@red</label>
252
+ <input type="text" class="span3" placeholder="#9d261d">
253
+ <label>@yellow</label>
254
+ <input type="text" class="span3" placeholder="#ffc40d">
255
+ <label>@orange</label>
256
+ <input type="text" class="span3" placeholder="#f89406">
257
+ <label>@pink</label>
258
+ <input type="text" class="span3" placeholder="#c3325f">
259
+ <label>@purple</label>
260
+ <input type="text" class="span3" placeholder="#7a43b6">
261
+
262
+ <h3>Sprites</h3>
263
+ <label>@iconSpritePath</label>
264
+ <input type="text" class="span3" placeholder="'../img/glyphicons-halflings.png'">
265
+ <label>@iconWhiteSpritePath</label>
266
+ <input type="text" class="span3" placeholder="'../img/glyphicons-halflings-white.png'">
267
+
268
+ </div><!-- /span -->
269
+ <div class="span3">
270
+ <h3>Grid system</h3>
271
+ <label>@gridColumns</label>
272
+ <input type="text" class="span3" placeholder="12">
273
+ <label>@gridColumnWidth</label>
274
+ <input type="text" class="span3" placeholder="60px">
275
+ <label>@gridGutterWidth</label>
276
+ <input type="text" class="span3" placeholder="20px">
277
+ <h3>Fluid grid system</h3>
278
+ <label>@fluidGridColumnWidth</label>
279
+ <input type="text" class="span3" placeholder="6.382978723%">
280
+ <label>@fluidGridGutterWidth</label>
281
+ <input type="text" class="span3" placeholder="2.127659574%">
282
+
283
+ <h3>Typography</h3>
284
+ <label>@sansFontFamily</label>
285
+ <input type="text" class="span3" placeholder="'Helvetica Neue', Helvetica, Arial, sans-serif">
286
+ <label>@serifFontFamily</label>
287
+ <input type="text" class="span3" placeholder="Georgia, 'Times New Roman', Times, serif">
288
+ <label>@monoFontFamily</label>
289
+ <input type="text" class="span3" placeholder="Menlo, Monaco, 'Courier New', monospace">
290
+ <label>@baseFontSize</label>
291
+ <input type="text" class="span3" placeholder="13px">
292
+ <label>@baseFontFamily</label>
293
+ <input type="text" class="span3" placeholder="@sansFontFamily">
294
+ <label>@baseLineHeight</label>
295
+ <input type="text" class="span3" placeholder="18px">
296
+ <label>@altFontFamily</label>
297
+ <input type="text" class="span3" placeholder="@serifFontFamily">
298
+ <label>@headingsFontFamily</label>
299
+ <input type="text" class="span3" placeholder="inherit">
300
+ <label>@headingsFontWeight</label>
301
+ <input type="text" class="span3" placeholder="bold">
302
+ <label>@headingsColor</label>
303
+ <input type="text" class="span3" placeholder="inherit">
304
+ <label>@heroUnitBackground</label>
305
+ <input type="text" class="span3" placeholder="@grayLighter">
306
+ <label>@heroUnitHeadingColor</label>
307
+ <input type="text" class="span3" placeholder="inherit">
308
+ <label>@heroUnitLeadColor</label>
309
+ <input type="text" class="span3" placeholder="inherit">
310
+ </div><!-- /span -->
311
+ <div class="span3">
312
+ <h3>Tables</h3>
313
+ <label>@tableBackground</label>
314
+ <input type="text" class="span3" placeholder="transparent">
315
+ <label>@tableBackgroundAccent</label>
316
+ <input type="text" class="span3" placeholder="#f9f9f9">
317
+ <label>@tableBackgroundHover</label>
318
+ <input type="text" class="span3" placeholder="#f5f5f5">
319
+ <label>@tableBorder</label>
320
+ <input type="text" class="span3" placeholder="#ddd">
321
+
322
+ <h3>Navbar</h3>
323
+ <label>@navbarHeight</label>
324
+ <input type="text" class="span3" placeholder="40px">
325
+ <label>@navbarBackground</label>
326
+ <input type="text" class="span3" placeholder="@grayDarker">
327
+ <label>@navbarBackgroundHighlight</label>
328
+ <input type="text" class="span3" placeholder="@grayDark">
329
+ <label>@navbarText</label>
330
+ <input type="text" class="span3" placeholder="@grayLight">
331
+ <label>@navbarBrandColor</label>
332
+ <input type="text" class="span3" placeholder="@navbarLinkColor">
333
+ <label>@navbarLinkColor</label>
334
+ <input type="text" class="span3" placeholder="@grayLight">
335
+ <label>@navbarLinkColorHover</label>
336
+ <input type="text" class="span3" placeholder="@white">
337
+ <label>@navbarLinkColorActive</label>
338
+ <input type="text" class="span3" placeholder="@navbarLinkColorHover">
339
+ <label>@navbarLinkBackgroundHover</label>
340
+ <input type="text" class="span3" placeholder="transparent">
341
+ <label>@navbarLinkBackgroundActive</label>
342
+ <input type="text" class="span3" placeholder="@navbarBackground">
343
+ <label>@navbarSearchBackground</label>
344
+ <input type="text" class="span3" placeholder="lighten(@navbarBackground, 25%)">
345
+ <label>@navbarSearchBackgroundFocus</label>
346
+ <input type="text" class="span3" placeholder="@white">
347
+ <label>@navbarSearchBorder</label>
348
+ <input type="text" class="span3" placeholder="darken(@navbarSearchBackground, 30%)">
349
+ <label>@navbarSearchPlaceholderColor</label>
350
+ <input type="text" class="span3" placeholder="#ccc">
351
+
352
+ <h3>Dropdowns</h3>
353
+ <label>@dropdownBackground</label>
354
+ <input type="text" class="span3" placeholder="@white">
355
+ <label>@dropdownBorder</label>
356
+ <input type="text" class="span3" placeholder="rgba(0,0,0,.2)">
357
+ <label>@dropdownLinkColor</label>
358
+ <input type="text" class="span3" placeholder="@grayDark">
359
+ <label>@dropdownLinkColorHover</label>
360
+ <input type="text" class="span3" placeholder="@white">
361
+ <label>@dropdownLinkBackgroundHover</label>
362
+ <input type="text" class="span3" placeholder="@linkColor">
363
+ </div><!-- /span -->
364
+ <div class="span3">
365
+ <h3>Forms</h3>
366
+ <label>@placeholderText</label>
367
+ <input type="text" class="span3" placeholder="@grayLight">
368
+ <label>@inputBackground</label>
369
+ <input type="text" class="span3" placeholder="@white">
370
+ <label>@inputBorder</label>
371
+ <input type="text" class="span3" placeholder="#ccc">
372
+ <label>@inputBorderRadius</label>
373
+ <input type="text" class="span3" placeholder="3px">
374
+ <label>@inputDisabledBackground</label>
375
+ <input type="text" class="span3" placeholder="@grayLighter">
376
+ <label>@formActionsBackground</label>
377
+ <input type="text" class="span3" placeholder="#f5f5f5">
378
+
379
+ <label>@btnPrimaryBackground</label>
380
+ <input type="text" class="span3" placeholder="@linkColor">
381
+ <label>@btnPrimaryBackgroundHighlight</label>
382
+ <input type="text" class="span3" placeholder="darken(@white, 10%);">
383
+
384
+ <h3>Form states & alerts</h3>
385
+ <label>@warningText</label>
386
+ <input type="text" class="span3" placeholder="#c09853">
387
+ <label>@warningBackground</label>
388
+ <input type="text" class="span3" placeholder="#fcf8e3">
389
+ <label>@errorText</label>
390
+ <input type="text" class="span3" placeholder="#b94a48">
391
+ <label>@errorBackground</label>
392
+ <input type="text" class="span3" placeholder="#f2dede">
393
+ <label>@successText</label>
394
+ <input type="text" class="span3" placeholder="#468847">
395
+ <label>@successBackground</label>
396
+ <input type="text" class="span3" placeholder="#dff0d8">
397
+ <label>@infoText</label>
398
+ <input type="text" class="span3" placeholder="#3a87ad">
399
+ <label>@infoBackground</label>
400
+ <input type="text" class="span3" placeholder="#d9edf7">
401
+ </div><!-- /span -->
402
+ </div><!-- /row -->
403
+</section>
404
+
405
+<section class="download" id="download">
406
+ <div class="page-header">
407
+ <h1>
408
+ 4. Download
409
+ </h1>
410
+ </div>
411
+ <div class="download-btn">
412
+ <a class="btn btn-primary" href="#" >Customize and Download</a>
413
+ <h4>What's included?</h4>
414
+ <p>Downloads include compiled CSS, compiled and minified CSS, and compiled jQuery plugins, all nicely packed up into a zipball for your convenience.</p>
415
+ </div>
416
+</section><!-- /download -->
417
+
418
+
419
+ <!-- Footer
420
+ ================================================== -->
421
+ <footer class="footer">
422
+ <p class="pull-right"><a href="#">Back to top</a></p>
423
+ <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
424
+ <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
425
+ <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
426
+ </footer>
427
+
428
+ </div><!-- /container -->
429
+
430
+
431
+
432
+ <!-- Le javascript
433
+ ================================================== -->
434
+ <!-- Placed at the end of the document so the pages load faster -->
435
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
436
+ <script src="assets/js/jquery.js"></script>
437
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
438
+ <script src="assets/js/bootstrap-transition.js"></script>
439
+ <script src="assets/js/bootstrap-alert.js"></script>
440
+ <script src="assets/js/bootstrap-modal.js"></script>
441
+ <script src="assets/js/bootstrap-dropdown.js"></script>
442
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
443
+ <script src="assets/js/bootstrap-tab.js"></script>
444
+ <script src="assets/js/bootstrap-tooltip.js"></script>
445
+ <script src="assets/js/bootstrap-popover.js"></script>
446
+ <script src="assets/js/bootstrap-button.js"></script>
447
+ <script src="assets/js/bootstrap-collapse.js"></script>
448
+ <script src="assets/js/bootstrap-carousel.js"></script>
449
+ <script src="assets/js/bootstrap-typeahead.js"></script>
450
+ <script src="assets/js/application.js"></script>
451
+
452
+
453
+ </body>
454
+</html>
docs/docs/likebutton/docs/examples.html
new
+147
@@ -0,0 +1,147 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Examples · Twitter Bootstrap</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ </head>
29
+
30
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
31
+
32
+
33
+ <!-- Navbar
34
+ ================================================== -->
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="brand" href="./index.html">Bootstrap</a>
44
+ <div class="nav-collapse collapse">
45
+ <ul class="nav">
46
+ <li class="">
47
+ <a href="./index.html">Overview</a>
48
+ </li>
49
+ <li class="">
50
+ <a href="./scaffolding.html">Scaffolding</a>
51
+ </li>
52
+ <li class="">
53
+ <a href="./base-css.html">Base CSS</a>
54
+ </li>
55
+ <li class="">
56
+ <a href="./components.html">Components</a>
57
+ </li>
58
+ <li class="">
59
+ <a href="./javascript.html">Javascript plugins</a>
60
+ </li>
61
+ <li class="">
62
+ <a href="./less.html">Using LESS</a>
63
+ </li>
64
+ <li class="divider-vertical"></li>
65
+ <li class="">
66
+ <a href="./download.html">Customize</a>
67
+ </li>
68
+ <li class="active">
69
+ <a href="./examples.html">Examples</a>
70
+ </li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="container">
78
+
79
+<!-- Masthead
80
+================================================== -->
81
+<header class="jumbotron subhead" id="overview">
82
+ <h1>Bootstrap examples</h1>
83
+ <p class="lead">We've included a few basic examples as starting points for your work with Bootstrap. We encourage folks to iterate on these examples and not simply use them as an end result.</p>
84
+</header>
85
+
86
+
87
+<ul class="thumbnails bootstrap-examples">
88
+ <li class="span4">
89
+ <a class="thumbnail" href="examples/hero.html">
90
+ <img src="assets/img/examples/bootstrap-example-hero.jpg" alt="">
91
+ </a>
92
+ <h3>Basic marketing site</h3>
93
+ <p>Featuring a hero unit for a primary message and three supporting elements.</p>
94
+ </li>
95
+ <li class="span4">
96
+ <a class="thumbnail" href="examples/fluid.html">
97
+ <img src="assets/img/examples/bootstrap-example-fluid.jpg" alt="">
98
+ </a>
99
+ <h3>Fluid layout</h3>
100
+ <p>Uses our new responsive, fluid grid system to create a seamless liquid layout.</p>
101
+ </li>
102
+ <li class="span4">
103
+ <a class="thumbnail" href="examples/starter-template.html">
104
+ <img src="assets/img/examples/bootstrap-example-starter.jpg" alt="">
105
+ </a>
106
+ <h3>Starter template</h3>
107
+ <p>A barebones HTML document with all the Bootstrap CSS and javascript included.</p>
108
+ </li>
109
+</ul>
110
+
111
+
112
+ <!-- Footer
113
+ ================================================== -->
114
+ <footer class="footer">
115
+ <p class="pull-right"><a href="#">Back to top</a></p>
116
+ <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
117
+ <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
118
+ <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
119
+ </footer>
120
+
121
+ </div><!-- /container -->
122
+
123
+
124
+
125
+ <!-- Le javascript
126
+ ================================================== -->
127
+ <!-- Placed at the end of the document so the pages load faster -->
128
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
129
+ <script src="assets/js/jquery.js"></script>
130
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
131
+ <script src="assets/js/bootstrap-transition.js"></script>
132
+ <script src="assets/js/bootstrap-alert.js"></script>
133
+ <script src="assets/js/bootstrap-modal.js"></script>
134
+ <script src="assets/js/bootstrap-dropdown.js"></script>
135
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
136
+ <script src="assets/js/bootstrap-tab.js"></script>
137
+ <script src="assets/js/bootstrap-tooltip.js"></script>
138
+ <script src="assets/js/bootstrap-popover.js"></script>
139
+ <script src="assets/js/bootstrap-button.js"></script>
140
+ <script src="assets/js/bootstrap-collapse.js"></script>
141
+ <script src="assets/js/bootstrap-carousel.js"></script>
142
+ <script src="assets/js/bootstrap-typeahead.js"></script>
143
+ <script src="assets/js/application.js"></script>
144
+
145
+
146
+ </body>
147
+</html>
docs/docs/likebutton/docs/examples/fluid.html
new
+162
@@ -0,0 +1,162 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Bootstrap, from Twitter</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="../assets/css/bootstrap.css" rel="stylesheet">
12
+ <style type="text/css">
13
+ body {
14
+ padding-top: 60px;
15
+ padding-bottom: 40px;
16
+ }
17
+ .sidebar-nav {
18
+ padding: 9px 0;
19
+ }
20
+ </style>
21
+ <link href="../assets/css/bootstrap-responsive.css" rel="stylesheet">
22
+
23
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
24
+ <!--[if lt IE 9]>
25
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
26
+ <![endif]-->
27
+
28
+ <!-- Le fav and touch icons -->
29
+ <link rel="shortcut icon" href="../assets/ico/favicon.ico">
30
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../assets/ico/apple-touch-icon-144-precomposed.png">
31
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../assets/ico/apple-touch-icon-114-precomposed.png">
32
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../assets/ico/apple-touch-icon-72-precomposed.png">
33
+ <link rel="apple-touch-icon-precomposed" href="../assets/ico/apple-touch-icon-57-precomposed.png">
34
+ </head>
35
+
36
+ <body>
37
+
38
+ <div class="navbar navbar-fixed-top">
39
+ <div class="navbar-inner">
40
+ <div class="container-fluid">
41
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
42
+ <span class="icon-bar"></span>
43
+ <span class="icon-bar"></span>
44
+ <span class="icon-bar"></span>
45
+ </a>
46
+ <a class="brand" href="#">Project name</a>
47
+ <div class="btn-group pull-right">
48
+ <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
49
+ <i class="icon-user"></i> Username
50
+ <span class="caret"></span>
51
+ </a>
52
+ <ul class="dropdown-menu">
53
+ <li><a href="#">Profile</a></li>
54
+ <li class="divider"></li>
55
+ <li><a href="#">Sign Out</a></li>
56
+ </ul>
57
+ </div>
58
+ <div class="nav-collapse">
59
+ <ul class="nav">
60
+ <li class="active"><a href="#">Home</a></li>
61
+ <li><a href="#about">About</a></li>
62
+ <li><a href="#contact">Contact</a></li>
63
+ </ul>
64
+ </div><!--/.nav-collapse -->
65
+ </div>
66
+ </div>
67
+ </div>
68
+
69
+ <div class="container-fluid">
70
+ <div class="row-fluid">
71
+ <div class="span3">
72
+ <div class="well sidebar-nav">
73
+ <ul class="nav nav-list">
74
+ <li class="nav-header">Sidebar</li>
75
+ <li class="active"><a href="#">Link</a></li>
76
+ <li><a href="#">Link</a></li>
77
+ <li><a href="#">Link</a></li>
78
+ <li><a href="#">Link</a></li>
79
+ <li class="nav-header">Sidebar</li>
80
+ <li><a href="#">Link</a></li>
81
+ <li><a href="#">Link</a></li>
82
+ <li><a href="#">Link</a></li>
83
+ <li><a href="#">Link</a></li>
84
+ <li><a href="#">Link</a></li>
85
+ <li><a href="#">Link</a></li>
86
+ <li class="nav-header">Sidebar</li>
87
+ <li><a href="#">Link</a></li>
88
+ <li><a href="#">Link</a></li>
89
+ <li><a href="#">Link</a></li>
90
+ </ul>
91
+ </div><!--/.well -->
92
+ </div><!--/span-->
93
+ <div class="span9">
94
+ <div class="hero-unit">
95
+ <h1>Hello, world!</h1>
96
+ <p>This is a template for a simple marketing or informational website. It includes a large callout called the hero unit and three supporting pieces of content. Use it as a starting point to create something more unique.</p>
97
+ <p><a class="btn btn-primary btn-large">Learn more »</a></p>
98
+ </div>
99
+ <div class="row-fluid">
100
+ <div class="span4">
101
+ <h2>Heading</h2>
102
+ <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
103
+ <p><a class="btn" href="#">View details »</a></p>
104
+ </div><!--/span-->
105
+ <div class="span4">
106
+ <h2>Heading</h2>
107
+ <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
108
+ <p><a class="btn" href="#">View details »</a></p>
109
+ </div><!--/span-->
110
+ <div class="span4">
111
+ <h2>Heading</h2>
112
+ <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
113
+ <p><a class="btn" href="#">View details »</a></p>
114
+ </div><!--/span-->
115
+ </div><!--/row-->
116
+ <div class="row-fluid">
117
+ <div class="span4">
118
+ <h2>Heading</h2>
119
+ <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
120
+ <p><a class="btn" href="#">View details »</a></p>
121
+ </div><!--/span-->
122
+ <div class="span4">
123
+ <h2>Heading</h2>
124
+ <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
125
+ <p><a class="btn" href="#">View details »</a></p>
126
+ </div><!--/span-->
127
+ <div class="span4">
128
+ <h2>Heading</h2>
129
+ <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
130
+ <p><a class="btn" href="#">View details »</a></p>
131
+ </div><!--/span-->
132
+ </div><!--/row-->
133
+ </div><!--/span-->
134
+ </div><!--/row-->
135
+
136
+ <hr>
137
+
138
+ <footer>
139
+ <p>© Company 2012</p>
140
+ </footer>
141
+
142
+ </div><!--/.fluid-container-->
143
+
144
+ <!-- Le javascript
145
+ ================================================== -->
146
+ <!-- Placed at the end of the document so the pages load faster -->
147
+ <script src="../assets/js/jquery.js"></script>
148
+ <script src="../assets/js/bootstrap-transition.js"></script>
149
+ <script src="../assets/js/bootstrap-alert.js"></script>
150
+ <script src="../assets/js/bootstrap-modal.js"></script>
151
+ <script src="../assets/js/bootstrap-dropdown.js"></script>
152
+ <script src="../assets/js/bootstrap-scrollspy.js"></script>
153
+ <script src="../assets/js/bootstrap-tab.js"></script>
154
+ <script src="../assets/js/bootstrap-tooltip.js"></script>
155
+ <script src="../assets/js/bootstrap-popover.js"></script>
156
+ <script src="../assets/js/bootstrap-button.js"></script>
157
+ <script src="../assets/js/bootstrap-collapse.js"></script>
158
+ <script src="../assets/js/bootstrap-carousel.js"></script>
159
+ <script src="../assets/js/bootstrap-typeahead.js"></script>
160
+
161
+ </body>
162
+</html>
docs/docs/likebutton/docs/examples/hero.html
new
+109
@@ -0,0 +1,109 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Bootstrap, from Twitter</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="../assets/css/bootstrap.css" rel="stylesheet">
12
+ <style type="text/css">
13
+ body {
14
+ padding-top: 60px;
15
+ padding-bottom: 40px;
16
+ }
17
+ </style>
18
+ <link href="../assets/css/bootstrap-responsive.css" rel="stylesheet">
19
+
20
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
21
+ <!--[if lt IE 9]>
22
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
23
+ <![endif]-->
24
+
25
+ <!-- Le fav and touch icons -->
26
+ <link rel="shortcut icon" href="../assets/ico/favicon.ico">
27
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../assets/ico/apple-touch-icon-144-precomposed.png">
28
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../assets/ico/apple-touch-icon-114-precomposed.png">
29
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../assets/ico/apple-touch-icon-72-precomposed.png">
30
+ <link rel="apple-touch-icon-precomposed" href="../assets/ico/apple-touch-icon-57-precomposed.png">
31
+ </head>
32
+
33
+ <body>
34
+
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </a>
43
+ <a class="brand" href="#">Project name</a>
44
+ <div class="nav-collapse">
45
+ <ul class="nav">
46
+ <li class="active"><a href="#">Home</a></li>
47
+ <li><a href="#about">About</a></li>
48
+ <li><a href="#contact">Contact</a></li>
49
+ </ul>
50
+ </div><!--/.nav-collapse -->
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="container">
56
+
57
+ <!-- Main hero unit for a primary marketing message or call to action -->
58
+ <div class="hero-unit">
59
+ <h1>Hello, world!</h1>
60
+ <p>This is a template for a simple marketing or informational website. It includes a large callout called the hero unit and three supporting pieces of content. Use it as a starting point to create something more unique.</p>
61
+ <p><a class="btn btn-primary btn-large">Learn more »</a></p>
62
+ </div>
63
+
64
+ <!-- Example row of columns -->
65
+ <div class="row">
66
+ <div class="span4">
67
+ <h2>Heading</h2>
68
+ <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
69
+ <p><a class="btn" href="#">View details »</a></p>
70
+ </div>
71
+ <div class="span4">
72
+ <h2>Heading</h2>
73
+ <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
74
+ <p><a class="btn" href="#">View details »</a></p>
75
+ </div>
76
+ <div class="span4">
77
+ <h2>Heading</h2>
78
+ <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
79
+ <p><a class="btn" href="#">View details »</a></p>
80
+ </div>
81
+ </div>
82
+
83
+ <hr>
84
+
85
+ <footer>
86
+ <p>© Company 2012</p>
87
+ </footer>
88
+
89
+ </div> <!-- /container -->
90
+
91
+ <!-- Le javascript
92
+ ================================================== -->
93
+ <!-- Placed at the end of the document so the pages load faster -->
94
+ <script src="../assets/js/jquery.js"></script>
95
+ <script src="../assets/js/bootstrap-transition.js"></script>
96
+ <script src="../assets/js/bootstrap-alert.js"></script>
97
+ <script src="../assets/js/bootstrap-modal.js"></script>
98
+ <script src="../assets/js/bootstrap-dropdown.js"></script>
99
+ <script src="../assets/js/bootstrap-scrollspy.js"></script>
100
+ <script src="../assets/js/bootstrap-tab.js"></script>
101
+ <script src="../assets/js/bootstrap-tooltip.js"></script>
102
+ <script src="../assets/js/bootstrap-popover.js"></script>
103
+ <script src="../assets/js/bootstrap-button.js"></script>
104
+ <script src="../assets/js/bootstrap-collapse.js"></script>
105
+ <script src="../assets/js/bootstrap-carousel.js"></script>
106
+ <script src="../assets/js/bootstrap-typeahead.js"></script>
107
+
108
+ </body>
109
+</html>
docs/docs/likebutton/docs/examples/starter-template.html
new
+79
@@ -0,0 +1,79 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Bootstrap, from Twitter</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="../assets/css/bootstrap.css" rel="stylesheet">
12
+ <style>
13
+ body {
14
+ padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */
15
+ }
16
+ </style>
17
+ <link href="../assets/css/bootstrap-responsive.css" rel="stylesheet">
18
+
19
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
20
+ <!--[if lt IE 9]>
21
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
22
+ <![endif]-->
23
+
24
+ <!-- Le fav and touch icons -->
25
+ <link rel="shortcut icon" href="../assets/ico/favicon.ico">
26
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../assets/ico/apple-touch-icon-144-precomposed.png">
27
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../assets/ico/apple-touch-icon-114-precomposed.png">
28
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../assets/ico/apple-touch-icon-72-precomposed.png">
29
+ <link rel="apple-touch-icon-precomposed" href="../assets/ico/apple-touch-icon-57-precomposed.png">
30
+ </head>
31
+
32
+ <body>
33
+
34
+ <div class="navbar navbar-fixed-top">
35
+ <div class="navbar-inner">
36
+ <div class="container">
37
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
38
+ <span class="icon-bar"></span>
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ </a>
42
+ <a class="brand" href="#">Project name</a>
43
+ <div class="nav-collapse">
44
+ <ul class="nav">
45
+ <li class="active"><a href="#">Home</a></li>
46
+ <li><a href="#about">About</a></li>
47
+ <li><a href="#contact">Contact</a></li>
48
+ </ul>
49
+ </div><!--/.nav-collapse -->
50
+ </div>
51
+ </div>
52
+ </div>
53
+
54
+ <div class="container">
55
+
56
+ <h1>Bootstrap starter template</h1>
57
+ <p>Use this document as a way to quick start any new project.<br> All you get is this message and a barebones HTML document.</p>
58
+
59
+ </div> <!-- /container -->
60
+
61
+ <!-- Le javascript
62
+ ================================================== -->
63
+ <!-- Placed at the end of the document so the pages load faster -->
64
+ <script src="../assets/js/jquery.js"></script>
65
+ <script src="../assets/js/bootstrap-transition.js"></script>
66
+ <script src="../assets/js/bootstrap-alert.js"></script>
67
+ <script src="../assets/js/bootstrap-modal.js"></script>
68
+ <script src="../assets/js/bootstrap-dropdown.js"></script>
69
+ <script src="../assets/js/bootstrap-scrollspy.js"></script>
70
+ <script src="../assets/js/bootstrap-tab.js"></script>
71
+ <script src="../assets/js/bootstrap-tooltip.js"></script>
72
+ <script src="../assets/js/bootstrap-popover.js"></script>
73
+ <script src="../assets/js/bootstrap-button.js"></script>
74
+ <script src="../assets/js/bootstrap-collapse.js"></script>
75
+ <script src="../assets/js/bootstrap-carousel.js"></script>
76
+ <script src="../assets/js/bootstrap-typeahead.js"></script>
77
+
78
+ </body>
79
+</html>
docs/docs/likebutton/docs/index.html
new
+259
@@ -0,0 +1,259 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Twitter Bootstrap</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ </head>
29
+
30
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
31
+
32
+
33
+ <!-- Navbar
34
+ ================================================== -->
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="brand" href="./index.html">Bootstrap</a>
44
+ <div class="nav-collapse collapse">
45
+ <ul class="nav">
46
+ <li class="active">
47
+ <a href="./index.html">Overview</a>
48
+ </li>
49
+ <li class="">
50
+ <a href="./scaffolding.html">Scaffolding</a>
51
+ </li>
52
+ <li class="">
53
+ <a href="./base-css.html">Base CSS</a>
54
+ </li>
55
+ <li class="">
56
+ <a href="./components.html">Components</a>
57
+ </li>
58
+ <li class="">
59
+ <a href="./javascript.html">Javascript plugins</a>
60
+ </li>
61
+ <li class="">
62
+ <a href="./less.html">Using LESS</a>
63
+ </li>
64
+ <li class="divider-vertical"></li>
65
+ <li class="">
66
+ <a href="./download.html">Customize</a>
67
+ </li>
68
+ <li class="">
69
+ <a href="./examples.html">Examples</a>
70
+ </li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="container">
78
+
79
+<!-- Masthead
80
+================================================== -->
81
+<header class="jumbotron masthead">
82
+ <div class="inner">
83
+ <h1>Bootstrap, from Twitter</h1>
84
+ <p>Simple and flexible HTML, CSS, and Javascript for popular user interface components and interactions.</p>
85
+ <p class="download-info">
86
+ <a href="https://github.com/twitter/bootstrap/" class="btn btn-primary btn-large" >View project on GitHub</a>
87
+ <a href="assets/bootstrap.zip" class="btn btn-large" >Download Bootstrap <small>(v2.0.4)</small></a>
88
+ </p>
89
+ </div>
90
+
91
+ <div class="bs-links">
92
+ <ul class="quick-links">
93
+ <li><a href="./upgrading.html">Upgrading from 1.4</a></li>
94
+ <li><a href="https://github.com/twitter/bootstrap/zipball/master">Download with docs</a></li>
95
+ <li><a href="http://blog.getbootstrap.com">Read the blog</a></li>
96
+ <li><a href="https://github.com/twitter/bootstrap/issues?state=open">Submit issues</a></li>
97
+ <li><a href="https://github.com/twitter/bootstrap/wiki">Roadmap and changelog</a></li>
98
+ </ul>
99
+ <ul class="quick-links">
100
+ <li>
101
+ <iframe class="github-btn" src="http://markdotto.github.com/github-buttons/github-btn.html?user=twitter&repo=bootstrap&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="112px" height="20px"></iframe>
102
+ </li>
103
+ <li>
104
+ <iframe class="github-btn" src="http://markdotto.github.com/github-buttons/github-btn.html?user=twitter&repo=bootstrap&type=fork&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="98px" height="20px"></iframe>
105
+ </li>
106
+ <li class="follow-btn">
107
+ <a href="https://twitter.com/twbootstrap" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="true">Follow @twbootstrap</a>
108
+ </li>
109
+ <li class="tweet-btn">
110
+ <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://twitter.github.com/bootstrap/" data-count="horizontal" data-via="twbootstrap" data-related="mdo:Creator of Twitter Bootstrap">Tweet</a>
111
+ </li>
112
+ </ul>
113
+ </div>
114
+</header>
115
+
116
+<hr class="soften">
117
+
118
+<div class="marketing">
119
+ <h1>Designed for everyone, everywhere.</h1>
120
+ <p class="marketing-byline">Need reasons to love Bootstrap? Look no further.</p>
121
+ <div class="row">
122
+ <div class="span4">
123
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_042_group.png">
124
+ <h2>Built for and by nerds</h2>
125
+ <p>Like you, we love building awesome products on the web. We love it so much, we decided to help people just like us do it easier, better, and faster. Bootstrap is built for you.</p>
126
+ </div>
127
+ <div class="span4">
128
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_079_podium.png">
129
+ <h2>For all skill levels</h2>
130
+ <p>Bootstrap is designed to help people of all skill levels—designer or developer, huge nerd or early beginner. Use it as a complete kit or use to start something more complex.</p>
131
+ </div>
132
+ <div class="span4">
133
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_163_iphone.png">
134
+ <h2>Cross-everything</h2>
135
+ <p>Originally built with only modern browsers in mind, Bootstrap has evolved to include support for all major browsers (even IE7!) and, with Bootstrap 2, tablets and smartphones, too.</p>
136
+ </div>
137
+ </div><!--/row-->
138
+ <div class="row">
139
+ <div class="span4">
140
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_155_show_thumbnails.png">
141
+ <h2>12-column grid</h2>
142
+ <p>Grid systems aren't everything, but having a durable and flexible one at the core of your work can make development much simpler. Use our built-in grid classes or roll your own.</p>
143
+ </div>
144
+ <div class="span4">
145
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_214_resize_small.png">
146
+ <h2>Responsive design</h2>
147
+ <p>With Bootstrap 2, we've gone fully responsive. Our components are scaled according to a range of resolutions and devices to provide a consistent experience, no matter what.</p>
148
+ </div>
149
+ <div class="span4">
150
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_266_book_open.png">
151
+ <h2>Styleguide docs</h2>
152
+ <p>Unlike other front-end toolkits, Bootstrap was designed first and foremost as a styleguide to document not only our features, but best practices and living, coded examples.</p>
153
+ </div>
154
+ </div><!--/row-->
155
+ <div class="row">
156
+ <div class="span4">
157
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_082_roundabout.png">
158
+ <h2>Growing library</h2>
159
+ <p>Despite being only 10kb (gzipped), Bootstrap is one of the most complete front-end toolkits out there with dozens of fully functional components ready to be put to use.</p>
160
+ </div>
161
+ <div class="span4">
162
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_009_magic.png">
163
+ <h2>Custom jQuery plugins</h2>
164
+ <p>What good is an awesome design component without easy-to-use, proper, and extensible interactions? With Bootstrap, you get custom-built jQuery plugins to bring your projects to life.</p>
165
+ </div>
166
+ <div class="span4">
167
+ <img class="bs-icon" src="assets/img/less-small.png">
168
+ <h2>Built on LESS</h2>
169
+ <p>Where vanilla CSS falters, LESS excels. Variables, nesting, operations, and mixins in LESS makes coding CSS faster and more efficient with minimal overhead.</p>
170
+ </div>
171
+ </div><!--/row-->
172
+ <div class="row">
173
+ <div class="span3">
174
+ <img class="small-bs-icon" src="assets/img/icon-html5.png">
175
+ <h3>HTML5</h3>
176
+ <p>Built to support new HTML5 elements and syntax.</p>
177
+ </div>
178
+ <div class="span3">
179
+ <img class="small-bs-icon" src="assets/img/icon-css3.png">
180
+ <h3>CSS3</h3>
181
+ <p>Progressively enhanced components for ultimate style.</p>
182
+ </div>
183
+ <div class="span3">
184
+ <img class="small-bs-icon" src="assets/img/icon-github.png">
185
+ <h3>Open-source</h3>
186
+ <p>Built for and maintained by the community via <a href="https://github.com">GitHub</a>.</p>
187
+ </div>
188
+ <div class="span3">
189
+ <img class="small-bs-icon" src="assets/img/icon-twitter.png">
190
+ <h3>Made at Twitter</h3>
191
+ <p>Brought to you by an experienced <a href="http://twitter.com/fat">engineer</a> and <a href="http://twitter.com/mdo">designer</a>.</p>
192
+ </div>
193
+ </div><!--/row-->
194
+
195
+ <hr class="soften">
196
+
197
+ <h1>Built with Bootstrap.</h1>
198
+ <p class="marketing-byline">For even more sites built with Bootstrap, <a href="http://builtwithbootstrap.tumblr.com/" target="_blank">visit the unofficial Tumblr</a> or <a href="./examples.html">browse the examples</a>.</p>
199
+ <ul class="thumbnails example-sites">
200
+ <li class="span3">
201
+ <a class="thumbnail" href="http://soundready.fm/" target="_blank">
202
+ <img src="assets/img/example-sites/soundready.png" alt="SoundReady.fm">
203
+ </a>
204
+ </li>
205
+ <li class="span3">
206
+ <a class="thumbnail" href="http://kippt.com/" target="_blank">
207
+ <img src="assets/img/example-sites/kippt.png" alt="Kippt">
208
+ </a>
209
+ </li>
210
+ <li class="span3">
211
+ <a class="thumbnail" href="http://www.fleetio.com/" target="_blank">
212
+ <img src="assets/img/example-sites/fleetio.png" alt="Fleetio">
213
+ </a>
214
+ </li>
215
+ <li class="span3">
216
+ <a class="thumbnail" href="http://www.jshint.com/" target="_blank">
217
+ <img src="assets/img/example-sites/jshint.png" alt="JS Hint">
218
+ </a>
219
+ </li>
220
+ </ul>
221
+
222
+</div><!-- /.marketing -->
223
+
224
+ <!-- Footer
225
+ ================================================== -->
226
+ <footer class="footer">
227
+ <p class="pull-right"><a href="#">Back to top</a></p>
228
+ <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
229
+ <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
230
+ <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
231
+ </footer>
232
+
233
+ </div><!-- /container -->
234
+
235
+
236
+
237
+ <!-- Le javascript
238
+ ================================================== -->
239
+ <!-- Placed at the end of the document so the pages load faster -->
240
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
241
+ <script src="assets/js/jquery.js"></script>
242
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
243
+ <script src="assets/js/bootstrap-transition.js"></script>
244
+ <script src="assets/js/bootstrap-alert.js"></script>
245
+ <script src="assets/js/bootstrap-modal.js"></script>
246
+ <script src="assets/js/bootstrap-dropdown.js"></script>
247
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
248
+ <script src="assets/js/bootstrap-tab.js"></script>
249
+ <script src="assets/js/bootstrap-tooltip.js"></script>
250
+ <script src="assets/js/bootstrap-popover.js"></script>
251
+ <script src="assets/js/bootstrap-button.js"></script>
252
+ <script src="assets/js/bootstrap-collapse.js"></script>
253
+ <script src="assets/js/bootstrap-carousel.js"></script>
254
+ <script src="assets/js/bootstrap-typeahead.js"></script>
255
+ <script src="assets/js/application.js"></script>
256
+
257
+
258
+ </body>
259
+</html>
docs/docs/likebutton/docs/javascript.html
new
+1520
@@ -0,0 +1,1520 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Javascript · Twitter Bootstrap</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ </head>
29
+
30
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
31
+
32
+
33
+ <!-- Navbar
34
+ ================================================== -->
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="brand" href="./index.html">Bootstrap</a>
44
+ <div class="nav-collapse collapse">
45
+ <ul class="nav">
46
+ <li class="">
47
+ <a href="./index.html">Overview</a>
48
+ </li>
49
+ <li class="">
50
+ <a href="./scaffolding.html">Scaffolding</a>
51
+ </li>
52
+ <li class="">
53
+ <a href="./base-css.html">Base CSS</a>
54
+ </li>
55
+ <li class="">
56
+ <a href="./components.html">Components</a>
57
+ </li>
58
+ <li class="active">
59
+ <a href="./javascript.html">Javascript plugins</a>
60
+ </li>
61
+ <li class="">
62
+ <a href="./less.html">Using LESS</a>
63
+ </li>
64
+ <li class="divider-vertical"></li>
65
+ <li class="">
66
+ <a href="./download.html">Customize</a>
67
+ </li>
68
+ <li class="">
69
+ <a href="./examples.html">Examples</a>
70
+ </li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="container">
78
+
79
+ <!-- Masthead
80
+ ================================================== -->
81
+ <header class="jumbotron subhead" id="overview">
82
+ <h1>Javascript for Bootstrap</h1>
83
+ <p class="lead">Bring Bootstrap's components to life—now with 12 custom <a href="http://jquery.com/" target="_blank">jQuery</a> plugins.
84
+ <div class="subnav">
85
+ <ul class="nav nav-pills">
86
+ <li><a href="#javascript">All plugins</a></li>
87
+ <li><a href="#modals">Modal</a></li>
88
+ <li><a href="#dropdowns">Dropdown</a></li>
89
+ <li><a href="#scrollspy">Scrollspy</a></li>
90
+ <li><a href="#tabs">Tab</a></li>
91
+ <li><a href="#tooltips">Tooltip</a></li>
92
+ <li><a href="#popovers">Popover</a></li>
93
+ <li><a href="#alerts">Alert</a></li>
94
+ <li><a href="#buttons">Button</a></li>
95
+ <li><a href="#collapse">Collapse</a></li>
96
+ <li><a href="#carousel">Carousel</a></li>
97
+ <li><a href="#typeahead">Typeahead</a></li>
98
+ </ul>
99
+ </div>
100
+ </header>
101
+
102
+
103
+ <!-- Using Javascript w/ Bootstrap
104
+ ================================================== -->
105
+ <section id="javascript">
106
+ <div class="page-header">
107
+ <h1>jQuery plugins <small>A dozen Bootstrap plugins to get you started</small></h1>
108
+ </div>
109
+ <div class="row">
110
+ <div class="span3">
111
+ <h3><a href="./javascript.html#modals">Modals</a></h3>
112
+ <p>A streamlined, but flexible, take on the traditional javascript modal plugin with only the minimum required functionality and smart defaults.</p>
113
+ </div>
114
+ <div class="span3">
115
+ <h3><a href="./javascript.html#dropdowns">Dropdowns</a></h3>
116
+ <p>Add dropdown menus to nearly anything in Bootstrap with this simple plugin. Bootstrap features full dropdown menu support on in the navbar, tabs, and pills.</p>
117
+ </div>
118
+ <div class="span3">
119
+ <h3><a href="./javascript.html#scrollspy">Scrollspy</a></h3>
120
+ <p>Use scrollspy to automatically update the links in your navbar to show the current active link based on scroll position.</p>
121
+ </div>
122
+ <div class="span3">
123
+ <h3><a href="./javascript.html#tabs">Togglable tabs</a></h3>
124
+ <p>Use this plugin to make tabs and pills more useful by allowing them to toggle through tabbable panes of local content.</p>
125
+ </div>
126
+ </div> <!-- /row -->
127
+ <div class="row">
128
+ <div class="span3">
129
+ <h3><a href="./javascript.html#tooltips">Tooltips</a></h3>
130
+ <p>A new take on the jQuery Tipsy plugin, Tooltips don't rely on images—they use CSS3 for animations and data-attributes for local title storage.</p>
131
+ </div>
132
+ <div class="span3">
133
+ <h3><a href="./javascript.html#popovers">Popovers</a> <small class="muted">*</small></h3>
134
+ <p>Add small overlays of content, like those on the iPad, to any element for housing secondary information.</p>
135
+ <p class="muted"><strong>*</strong> Requires <a href="#tooltips">Tooltips</a> to be included</p>
136
+ </div>
137
+ <div class="span3">
138
+ <h3><a href="./javascript.html#alerts">Alert messages</a></h3>
139
+ <p>The alert plugin is a tiny class for adding close functionality to alerts.</p>
140
+ </div>
141
+ <div class="span3">
142
+ <h3><a href="./javascript.html#buttons">Buttons</a></h3>
143
+ <p>Do more with buttons. Control button states or create groups of buttons for more components like toolbars.</p>
144
+ </div>
145
+ </div> <!-- /row -->
146
+ <div class="row" style="margin-bottom: 9px;">
147
+ <div class="span3">
148
+ <h3><a href="./javascript.html#collapse">Collapse</a></h3>
149
+ <p>Get base styles and flexible support for collapsible components like accordions and navigation.</p>
150
+ </div>
151
+ <div class="span3">
152
+ <h3><a href="./javascript.html#carousel">Carousel</a></h3>
153
+ <p>Create a merry-go-round of any content you wish to provide an interactive slideshow of content.</p>
154
+ </div>
155
+ <div class="span3">
156
+ <h3><a href="./javascript.html#typeahead">Typeahead</a></h3>
157
+ <p>A basic, easily extended plugin for quickly creating elegant typeaheads with any form text input.</p>
158
+ </div>
159
+ <div class="span3">
160
+ <h3>Transitions <small class="muted">*</small></h3>
161
+ <p>For simple transition effects, include bootstrap-transition.js once to slide in modals or fade out alerts.</p>
162
+ <p class="muted"><strong>*</strong> Required for animation in plugins</p>
163
+ </div>
164
+ </div> <!-- /row -->
165
+ <div class="alert alert-info"><strong>Heads up!</strong> All javascript plugins require the latest version of jQuery.</div>
166
+ </section>
167
+
168
+
169
+
170
+ <!-- Modal
171
+ ================================================== -->
172
+ <section id="modals">
173
+ <div class="page-header">
174
+ <h1>Modals <small>bootstrap-modal.js</small></h1>
175
+ </div>
176
+ <div class="row">
177
+ <div class="span3 columns">
178
+ <h3>About modals</h3>
179
+ <p>A streamlined, but flexible, take on the traditional javascript modal plugin with only the minimum required functionality and smart defaults.</p>
180
+ <a href="assets/js/bootstrap-modal.js" target="_blank" class="btn">Download file</a>
181
+ </div>
182
+ <div class="span9 columns">
183
+ <h2>Static example</h2>
184
+ <p>Below is a statically rendered modal.</p>
185
+ <div class="well modal-example" style="background-color: #888; border: none;">
186
+ <div class="modal" style="position: relative; top: auto; left: auto; margin: 0 auto; z-index: 1; max-width: 100%;">
187
+ <div class="modal-header">
188
+ <button type="button" class="close" data-dismiss="modal">×</button>
189
+ <h3>Modal header</h3>
190
+ </div>
191
+ <div class="modal-body">
192
+ <p>One fine body…</p>
193
+ </div>
194
+ <div class="modal-footer">
195
+ <a href="#" class="btn">Close</a>
196
+ <a href="#" class="btn btn-primary">Save changes</a>
197
+ </div>
198
+ </div>
199
+ </div> <!-- /well -->
200
+
201
+ <h2>Live demo</h2>
202
+ <p>Toggle a modal via javascript by clicking the button below. It will slide down and fade in from the top of the page.</p>
203
+ <!-- sample modal content -->
204
+ <div id="myModal" class="modal hide fade">
205
+ <div class="modal-header">
206
+ <button type="button" class="close" data-dismiss="modal">×</button>
207
+ <h3>Modal Heading</h3>
208
+ </div>
209
+ <div class="modal-body">
210
+ <h4>Text in a modal</h4>
211
+ <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem.</p>
212
+
213
+ <h4>Popover in a modal</h4>
214
+ <p>This <a href="#" class="btn popover-test" title="A Title" data-content="And here's some amazing content. It's very engaging. right?">button</a> should trigger a popover on hover.</p>
215
+
216
+ <h4>Tooltips in a modal</h4>
217
+ <p><a href="#" class="tooltip-test" title="Tooltip">This link</a> and <a href="#" class="tooltip-test" title="Tooltip">that link</a> should have tooltips on hover.</p>
218
+
219
+ <hr>
220
+
221
+ <h4>Overflowing text to show optional scrollbar</h4>
222
+ <p>We set a fixed <code>max-height</code> on the <code>.modal-body</code>. Watch it overflow with all this extra lorem ipsum text we've included.</p>
223
+ <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
224
+ <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
225
+ <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
226
+ <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
227
+ <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
228
+ <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
229
+ </div>
230
+ <div class="modal-footer">
231
+ <a href="#" class="btn" data-dismiss="modal" >Close</a>
232
+ <a href="#" class="btn btn-primary">Save changes</a>
233
+ </div>
234
+ </div>
235
+ <a data-toggle="modal" href="#myModal" class="btn btn-primary btn-large">Launch demo modal</a>
236
+
237
+ <hr>
238
+
239
+ <h2>Using bootstrap-modal</h2>
240
+ <p>Call the modal via javascript:</p>
241
+ <pre class="prettyprint linenums">$('#myModal').modal(options)</pre>
242
+ <h3>Options</h3>
243
+ <table class="table table-bordered table-striped">
244
+ <thead>
245
+ <tr>
246
+ <th style="width: 100px;">Name</th>
247
+ <th style="width: 50px;">type</th>
248
+ <th style="width: 50px;">default</th>
249
+ <th>description</th>
250
+ </tr>
251
+ </thead>
252
+ <tbody>
253
+ <tr>
254
+ <td>backdrop</td>
255
+ <td>boolean</td>
256
+ <td>true</td>
257
+ <td>Includes a modal-backdrop element. Alternatively, specify <code>static</code> for a backdrop which doesn't close the modal on click.</td>
258
+ </tr>
259
+ <tr>
260
+ <td>keyboard</td>
261
+ <td>boolean</td>
262
+ <td>true</td>
263
+ <td>Closes the modal when escape key is pressed</td>
264
+ </tr>
265
+ <tr>
266
+ <td>show</td>
267
+ <td>boolean</td>
268
+ <td>true</td>
269
+ <td>Shows the modal when initialized.</td>
270
+ </tr>
271
+ </tbody>
272
+ </table>
273
+ <h3>Markup</h3>
274
+ <p>You can activate modals on your page easily without having to write a single line of javascript. Just set <code>data-toggle="modal"</code> on a controller element with a <code>data-target="#foo"</code> or <code>href="#foo"</code> which corresponds to a modal element id, and when clicked, it will launch your modal.</p>
275
+ <p>Also, to add options to your modal instance, just include them as additional data attributes on either the control element or the modal markup itself.</p>
276
+<pre class="prettyprint linenums">
277
+<a class="btn" data-toggle="modal" href="#myModal" >Launch Modal</a>
278
+</pre>
279
+
280
+<pre class="prettyprint linenums">
281
+<div class="modal hide" id="myModal">
282
+ <div class="modal-header">
283
+ <button type="button" class="close" data-dismiss="modal">×</button>
284
+ <h3>Modal header</h3>
285
+ </div>
286
+ <div class="modal-body">
287
+ <p>One fine body…</p>
288
+ </div>
289
+ <div class="modal-footer">
290
+ <a href="#" class="btn" data-dismiss="modal">Close</a>
291
+ <a href="#" class="btn btn-primary">Save changes</a>
292
+ </div>
293
+</div>
294
+</pre>
295
+ <div class="alert alert-info">
296
+ <strong>Heads up!</strong> If you want your modal to animate in and out, just add a <code>.fade</code> class to the <code>.modal</code> element (refer to the demo to see this in action) and include bootstrap-transition.js.
297
+ </div>
298
+ <h3>Methods</h3>
299
+ <h4>.modal(options)</h4>
300
+ <p>Activates your content as a modal. Accepts an optional options <code>object</code>.</p>
301
+<pre class="prettyprint linenums">
302
+$('#myModal').modal({
303
+ keyboard: false
304
+})</pre>
305
+ <h4>.modal('toggle')</h4>
306
+ <p>Manually toggles a modal.</p>
307
+ <pre class="prettyprint linenums">$('#myModal').modal('toggle')</pre>
308
+ <h4>.modal('show')</h4>
309
+ <p>Manually opens a modal.</p>
310
+ <pre class="prettyprint linenums">$('#myModal').modal('show')</pre>
311
+ <h4>.modal('hide')</h4>
312
+ <p>Manually hides a modal.</p>
313
+ <pre class="prettyprint linenums">$('#myModal').modal('hide')</pre>
314
+ <h3>Events</h3>
315
+ <p>Bootstrap's modal class exposes a few events for hooking into modal functionality.</p>
316
+ <table class="table table-bordered table-striped">
317
+ <thead>
318
+ <tr>
319
+ <th style="width: 150px;">Event</th>
320
+ <th>Description</th>
321
+ </tr>
322
+ </thead>
323
+ <tbody>
324
+ <tr>
325
+ <td>show</td>
326
+ <td>This event fires immediately when the <code>show</code> instance method is called.</td>
327
+ </tr>
328
+ <tr>
329
+ <td>shown</td>
330
+ <td>This event is fired when the modal has been made visible to the user (will wait for css transitions to complete).</td>
331
+ </tr>
332
+ <tr>
333
+ <td>hide</td>
334
+ <td>This event is fired immediately when the <code>hide</code> instance method has been called.</td>
335
+ </tr>
336
+ <tr>
337
+ <td>hidden</td>
338
+ <td>This event is fired when the modal has finished being hidden from the user (will wait for css transitions to complete).</td>
339
+ </tr>
340
+ </tbody>
341
+ </table>
342
+
343
+<pre class="prettyprint linenums">
344
+$('#myModal').on('hidden', function () {
345
+ // do something…
346
+})</pre>
347
+ </div>
348
+ </div>
349
+ </section>
350
+
351
+
352
+
353
+ <!-- Dropdown
354
+ ================================================== -->
355
+ <section id="dropdowns">
356
+ <div class="page-header">
357
+ <h1>Dropdowns <small>bootstrap-dropdown.js</small></h1>
358
+ </div>
359
+ <div class="row">
360
+ <div class="span3 columns">
361
+ <h3>About dropdowns</h3>
362
+ <p>Add dropdown menus to nearly anything in Bootstrap with this simple plugin. Bootstrap features full dropdown menu support on in the navbar, tabs, and pills.</p>
363
+ <a href="assets/js/bootstrap-dropdown.js" target="_blank" class="btn">Download file</a>
364
+ </div>
365
+ <div class="span9 columns">
366
+ <h2>Examples</h2>
367
+ <p>Click on the dropdown nav links in the navbar and pills below to test dropdowns.</p>
368
+ <div id="navbar-example" class="navbar navbar-static">
369
+ <div class="navbar-inner">
370
+ <div class="container" style="width: auto;">
371
+ <a class="brand" href="#">Project Name</a>
372
+ <ul class="nav">
373
+ <li class="dropdown">
374
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
375
+ <ul class="dropdown-menu">
376
+ <li><a href="#">Action</a></li>
377
+ <li><a href="#">Another action</a></li>
378
+ <li><a href="#">Something else here</a></li>
379
+ <li class="divider"></li>
380
+ <li><a href="#">Separated link</a></li>
381
+ </ul>
382
+ </li>
383
+ <li class="dropdown">
384
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown 2 <b class="caret"></b></a>
385
+ <ul class="dropdown-menu">
386
+ <li><a href="#">Action</a></li>
387
+ <li><a href="#">Another action</a></li>
388
+ <li><a href="#">Something else here</a></li>
389
+ <li class="divider"></li>
390
+ <li><a href="#">Separated link</a></li>
391
+ </ul>
392
+ </li>
393
+ </ul>
394
+ <ul class="nav pull-right">
395
+ <li id="fat-menu" class="dropdown">
396
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown 3 <b class="caret"></b></a>
397
+ <ul class="dropdown-menu">
398
+ <li><a href="#">Action</a></li>
399
+ <li><a href="#">Another action</a></li>
400
+ <li><a href="#">Something else here</a></li>
401
+ <li class="divider"></li>
402
+ <li><a href="#">Separated link</a></li>
403
+ </ul>
404
+ </li>
405
+ </ul>
406
+ </div>
407
+ </div>
408
+ </div> <!-- /navbar-example -->
409
+
410
+ <ul class="nav nav-pills">
411
+ <li class="active"><a href="#">Regular link</a></li>
412
+ <li class="dropdown">
413
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">Dropdown <b class="caret"></b></a>
414
+ <ul id="menu1" class="dropdown-menu">
415
+ <li><a href="#">Action</a></li>
416
+ <li><a href="#">Another action</a></li>
417
+ <li><a href="#">Something else here</a></li>
418
+ <li class="divider"></li>
419
+ <li><a href="#">Separated link</a></li>
420
+ </ul>
421
+ </li>
422
+ <li class="dropdown">
423
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">Dropdown 2 <b class="caret"></b></a>
424
+ <ul id="menu2" class="dropdown-menu">
425
+ <li><a href="#">Action</a></li>
426
+ <li><a href="#">Another action</a></li>
427
+ <li><a href="#">Something else here</a></li>
428
+ <li class="divider"></li>
429
+ <li><a href="#">Separated link</a></li>
430
+ </ul>
431
+ </li>
432
+ <li class="dropdown">
433
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">Dropdown 3 <b class="caret"></b></a>
434
+ <ul id="menu3" class="dropdown-menu">
435
+ <li><a href="#">Action</a></li>
436
+ <li><a href="#">Another action</a></li>
437
+ <li><a href="#">Something else here</a></li>
438
+ <li class="divider"></li>
439
+ <li><a href="#">Separated link</a></li>
440
+ </ul>
441
+ </li>
442
+ </ul> <!-- /tabs -->
443
+
444
+ <hr>
445
+
446
+ <h2>Using bootstrap-dropdown.js</h2>
447
+ <p>Call the dropdowns via javascript:</p>
448
+ <pre class="prettyprint linenums">$('.dropdown-toggle').dropdown()</pre>
449
+ <h3>Markup</h3>
450
+ <p>To quickly add dropdown functionality to any element just add <code>data-toggle="dropdown"</code> and any valid bootstrap dropdown will automatically be activated.</p>
451
+ <div class="alert alert-info">
452
+ <strong>Heads up!</strong> You may optionally target a specific dropdown by using <code>data-target="#fat"</code> or <code>href="#fat"</code>.
453
+ </div>
454
+
455
+<pre class="prettyprint linenums">
456
+<ul class="nav nav-pills">
457
+ <li class="active"><a href="#">Regular link</a></li>
458
+ <li class="dropdown" id="menu1">
459
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#menu1">
460
+ Dropdown
461
+ <b class="caret"></b>
462
+ </a>
463
+ <ul class="dropdown-menu">
464
+ <li><a href="#">Action</a></li>
465
+ <li><a href="#">Another action</a></li>
466
+ <li><a href="#">Something else here</a></li>
467
+ <li class="divider"></li>
468
+ <li><a href="#">Separated link</a></li>
469
+ </ul>
470
+ </li>
471
+ ...
472
+</ul></pre>
473
+ <p>To keep URLs intact, use the <code>data-target</code> attribute instead of <code>href="#"</code>.</p>
474
+<pre class="prettyprint linenums">
475
+<ul class="nav nav-pills">
476
+ <li class="dropdown">
477
+ <a class="dropdown-toggle" data-toggle="dropdown" data-target="#" href="path/to/page.html">
478
+ Dropdown
479
+ <b class="caret"></b>
480
+ </a>
481
+ <ul class="dropdown-menu">
482
+ ...
483
+ </ul>
484
+ </li>
485
+</ul>
486
+</pre>
487
+ <h3>Methods</h3>
488
+ <h4>$().dropdown()</h4>
489
+ <p>A programatic api for activating menus for a given navbar or tabbed navigation.</p>
490
+ </div>
491
+ </div>
492
+ </section>
493
+
494
+
495
+
496
+ <!-- ScrollSpy
497
+ ================================================== -->
498
+ <section id="scrollspy">
499
+ <div class="page-header">
500
+ <h1>ScrollSpy <small>bootstrap-scrollspy.js</small></h1>
501
+ </div>
502
+ <div class="row">
503
+ <div class="span3 columns">
504
+ <p>The ScrollSpy plugin is for automatically updating nav targets based on scroll position.</p>
505
+ <a href="assets/js/bootstrap-scrollspy.js" target="_blank" class="btn">Download file</a>
506
+ </div>
507
+ <div class="span9 columns">
508
+ <h2>Example navbar with scrollspy</h2>
509
+ <p>Scroll the area below and watch the navigation update. The dropdown sub items will be highlighted as well. Try it!</p>
510
+ <div id="navbarExample" class="navbar navbar-static">
511
+ <div class="navbar-inner">
512
+ <div class="container" style="width: auto;">
513
+ <a class="brand" href="#">Project Name</a>
514
+ <ul class="nav">
515
+ <li><a href="#fat">@fat</a></li>
516
+ <li><a href="#mdo">@mdo</a></li>
517
+ <li class="dropdown">
518
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
519
+ <ul class="dropdown-menu">
520
+ <li><a href="#one">one</a></li>
521
+ <li><a href="#two">two</a></li>
522
+ <li class="divider"></li>
523
+ <li><a href="#three">three</a></li>
524
+ </ul>
525
+ </li>
526
+ </ul>
527
+ </div>
528
+ </div>
529
+ </div>
530
+ <div data-spy="scroll" data-target="#navbarExample" data-offset="0" class="scrollspy-example">
531
+ <h4 id="fat">@fat</h4>
532
+ <p>
533
+ Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.
534
+ </p>
535
+ <h4 id="mdo">@mdo</h4>
536
+ <p>
537
+ Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.
538
+ </p>
539
+ <h4 id="one">one</h4>
540
+ <p>
541
+ Occaecat commodo aliqua delectus. Fap craft beer deserunt skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea sunt next level locavore single-origin coffee in magna veniam. High life id vinyl, echo park consequat quis aliquip banh mi pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim messenger bag. Cred ex in, sustainable delectus consectetur fanny pack iphone.
542
+ </p>
543
+ <h4 id="two">two</h4>
544
+ <p>
545
+ In incididunt echo park, officia deserunt mcsweeney's proident master cleanse thundercats sapiente veniam. Excepteur VHS elit, proident shoreditch +1 biodiesel laborum craft beer. Single-origin coffee wayfarers irure four loko, cupidatat terry richardson master cleanse. Assumenda you probably haven't heard of them art party fanny pack, tattooed nulla cardigan tempor ad. Proident wolf nesciunt sartorial keffiyeh eu banh mi sustainable. Elit wolf voluptate, lo-fi ea portland before they sold out four loko. Locavore enim nostrud mlkshk brooklyn nesciunt.
546
+ </p>
547
+ <h4 id="three">three</h4>
548
+ <p>
549
+ Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.
550
+ </p>
551
+ <p>Keytar twee blog, culpa messenger bag marfa whatever delectus food truck. Sapiente synth id assumenda. Locavore sed helvetica cliche irony, thundercats you probably haven't heard of them consequat hoodie gluten-free lo-fi fap aliquip. Labore elit placeat before they sold out, terry richardson proident brunch nesciunt quis cosby sweater pariatur keffiyeh ut helvetica artisan. Cardigan craft beer seitan readymade velit. VHS chambray laboris tempor veniam. Anim mollit minim commodo ullamco thundercats.
552
+ </p>
553
+ </div>
554
+ <hr>
555
+ <h2>Using bootstrap-scrollspy.js</h2>
556
+ <p>Call the scrollspy via javascript:</p>
557
+ <pre class="prettyprint linenums">$('#navbar').scrollspy()</pre>
558
+ <h3>Markup</h3>
559
+ <p>To easily add scrollspy behavior to your topbar navigation, just add <code>data-spy="scroll"</code> to the element you want to spy on (most typically this would be the body).</p>
560
+ <pre class="prettyprint linenums"><body data-spy="scroll" >...</body></pre>
561
+ <div class="alert alert-info">
562
+ <strong>Heads up!</strong>
563
+ Navbar links must have resolvable id targets. For example, a <code><a href="#home">home</a></code> must correspond to something in the dom like <code><div id="home"></div></code>.
564
+ </div>
565
+ <h3>Methods</h3>
566
+ <h4>.scrollspy('refresh')</h4>
567
+ <p>When using scrollspy in conjunction with adding or removing of elements from the DOM, you'll need to call the refresh method like so:</p>
568
+<pre class="prettyprint linenums">
569
+$('[data-spy="scroll"]').each(function () {
570
+ var $spy = $(this).scrollspy('refresh')
571
+});
572
+</pre>
573
+ <h3>Options</h3>
574
+ <table class="table table-bordered table-striped">
575
+ <thead>
576
+ <tr>
577
+ <th style="width: 100px;">Name</th>
578
+ <th style="width: 100px;">type</th>
579
+ <th style="width: 50px;">default</th>
580
+ <th>description</th>
581
+ </tr>
582
+ </thead>
583
+ <tbody>
584
+ <tr>
585
+ <td>offset</td>
586
+ <td>number</td>
587
+ <td>10</td>
588
+ <td>Pixels to offset from top when calculating position of scroll.</td>
589
+ </tr>
590
+ </tbody>
591
+ </table>
592
+ <h3>Events</h3>
593
+ <table class="table table-bordered table-striped">
594
+ <thead>
595
+ <tr>
596
+ <th style="width: 150px;">Event</th>
597
+ <th>Description</th>
598
+ </tr>
599
+ </thead>
600
+ <tbody>
601
+ <tr>
602
+ <td>activate</td>
603
+ <td>This event fires whenever a new item becomes activated by the scrollspy.</td>
604
+ </tr>
605
+ </tbody>
606
+ </table>
607
+ </div>
608
+ </div>
609
+ </section>
610
+
611
+
612
+
613
+ <!-- Tabs
614
+ ================================================== -->
615
+ <section id="tabs">
616
+ <div class="page-header">
617
+ <h1>Togglable tabs <small>bootstrap-tab.js</small></h1>
618
+ </div>
619
+ <div class="row">
620
+ <div class="span3 columns">
621
+ <p>This plugin adds quick, dynamic tab and pill functionality for transitioning through local content.</p>
622
+ <a href="assets/js/bootstrap-tab.js" target="_blank" class="btn">Download file</a>
623
+ </div>
624
+ <div class="span9 columns">
625
+ <h2>Example tabs</h2>
626
+ <p>Click the tabs below to toggle between hidden panes, even via dropdown menus.</p>
627
+ <ul id="myTab" class="nav nav-tabs">
628
+ <li class="active"><a href="#home" data-toggle="tab">Home</a></li>
629
+ <li><a href="#profile" data-toggle="tab">Profile</a></li>
630
+ <li class="dropdown">
631
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
632
+ <ul class="dropdown-menu">
633
+ <li><a href="#dropdown1" data-toggle="tab">@fat</a></li>
634
+ <li><a href="#dropdown2" data-toggle="tab">@mdo</a></li>
635
+ </ul>
636
+ </li>
637
+ </ul>
638
+ <div id="myTabContent" class="tab-content">
639
+ <div class="tab-pane fade in active" id="home">
640
+ <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
641
+ </div>
642
+ <div class="tab-pane fade" id="profile">
643
+ <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
644
+ </div>
645
+ <div class="tab-pane fade" id="dropdown1">
646
+ <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
647
+ </div>
648
+ <div class="tab-pane fade" id="dropdown2">
649
+ <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
650
+ </div>
651
+ </div>
652
+ <hr>
653
+ <h2>Using bootstrap-tab.js</h2>
654
+ <p>Enable tabbable tabs via javascript (each tab needs to be activated individually):</p>
655
+ <pre class="prettyprint linenums">
656
+$('#myTab a').click(function (e) {
657
+ e.preventDefault();
658
+ $(this).tab('show');
659
+})</pre>
660
+ <p>You can activate individual tabs in several ways:</p>
661
+<pre class="prettyprint linenums">
662
+$('#myTab a[href="#profile"]').tab('show'); // Select tab by name
663
+$('#myTab a:first').tab('show'); // Select first tab
664
+$('#myTab a:last').tab('show'); // Select last tab
665
+$('#myTab li:eq(2) a').tab('show'); // Select third tab (0-indexed)
666
+</pre>
667
+ <h3>Markup</h3>
668
+ <p>You can activate a tab or pill navigation without writing any javascript by simply specifying <code>data-toggle="tab"</code> or <code>data-toggle="pill"</code> on an element. Adding the <code>nav</code> and <code>nav-tabs</code> classes to the tab <code>ul</code> will apply the bootstrap tab styling.</p>
669
+<pre class="prettyprint linenums">
670
+<ul class="nav nav-tabs">
671
+ <li><a href="#home" data-toggle="tab">Home</a></li>
672
+ <li><a href="#profile" data-toggle="tab">Profile</a></li>
673
+ <li><a href="#messages" data-toggle="tab">Messages</a></li>
674
+ <li><a href="#settings" data-toggle="tab">Settings</a></li>
675
+</ul></pre>
676
+ <h3>Methods</h3>
677
+ <h4>$().tab</h4>
678
+ <p>
679
+ Activates a tab element and content container. Tab should have either a <code>data-target</code> or an <code>href</code> targeting a container node in the DOM.
680
+ </p>
681
+<pre class="prettyprint linenums">
682
+<ul class="nav nav-tabs" id="myTab">
683
+ <li class="active"><a href="#home">Home</a></li>
684
+ <li><a href="#profile">Profile</a></li>
685
+ <li><a href="#messages">Messages</a></li>
686
+ <li><a href="#settings">Settings</a></li>
687
+</ul>
688
+
689
+<div class="tab-content">
690
+ <div class="tab-pane active" id="home">...</div>
691
+ <div class="tab-pane" id="profile">...</div>
692
+ <div class="tab-pane" id="messages">...</div>
693
+ <div class="tab-pane" id="settings">...</div>
694
+</div>
695
+
696
+<script>
697
+ $(function () {
698
+ $('#myTab a:last').tab('show');
699
+ })
700
+</script></pre>
701
+ <h3>Events</h3>
702
+ <table class="table table-bordered table-striped">
703
+ <thead>
704
+ <tr>
705
+ <th style="width: 150px;">Event</th>
706
+ <th>Description</th>
707
+ </tr>
708
+ </thead>
709
+ <tbody>
710
+ <tr>
711
+ <td>show</td>
712
+ <td>This event fires on tab show, but before the new tab has been shown. Use <code>event.target</code> and <code>event.relatedTarget</code> to target the active tab and the previous active tab (if available) respectively.</td>
713
+ </tr>
714
+ <tr>
715
+ <td>shown</td>
716
+ <td>This event fires on tab show after a tab has been shown. Use <code>event.target</code> and <code>event.relatedTarget</code> to target the active tab and the previous active tab (if available) respectively.</td>
717
+ </tr>
718
+ </tbody>
719
+ </table>
720
+
721
+ <pre class="prettyprint linenums">
722
+$('a[data-toggle="tab"]').on('shown', function (e) {
723
+ e.target // activated tab
724
+ e.relatedTarget // previous tab
725
+})</pre>
726
+ </div>
727
+ </div>
728
+ </section>
729
+
730
+
731
+ <!-- Tooltips
732
+ ================================================== -->
733
+ <section id="tooltips">
734
+ <div class="page-header">
735
+ <h1>Tooltips <small>bootstrap-tooltip.js</small></h1>
736
+ </div>
737
+ <div class="row">
738
+ <div class="span3 columns">
739
+ <h3>About Tooltips</h3>
740
+ <p>Inspired by the excellent jQuery.tipsy plugin written by Jason Frame; Tooltips are an updated version, which don't rely on images, use css3 for animations, and data-attributes for local title storage.</p>
741
+ <a href="assets/js/bootstrap-tooltip.js" target="_blank" class="btn">Download file</a>
742
+ </div>
743
+ <div class="span9 columns">
744
+ <h2>Example use of Tooltips</h2>
745
+ <p>Hover over the links below to see tooltips:</p>
746
+ <div class="tooltip-demo well">
747
+ <p class="muted" style="margin-bottom: 0;">Tight pants next level keffiyeh <a href="#" rel="tooltip" title="first tooltip">you probably</a> haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel <a href="#" rel="tooltip" title="Another tooltip">have a</a> terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan <a href="#" rel="tooltip" title="Another one here too">whatever keytar</a>, scenester farm-to-table banksy Austin <a href="#" rel="tooltip" title="The last tip!">twitter handle</a> freegan cred raw denim single-origin coffee viral.
748
+ </p>
749
+ </div>
750
+ <hr>
751
+ <h2>Using bootstrap-tooltip.js</h2>
752
+ <p>Trigger the tooltip via javascript:</p>
753
+ <pre class="prettyprint linenums">$('#example').tooltip(options)</pre>
754
+ <h3>Options</h3>
755
+ <table class="table table-bordered table-striped">
756
+ <thead>
757
+ <tr>
758
+ <th style="width: 100px;">Name</th>
759
+ <th style="width: 100px;">type</th>
760
+ <th style="width: 50px;">default</th>
761
+ <th>description</th>
762
+ </tr>
763
+ </thead>
764
+ <tbody>
765
+ <tr>
766
+ <td>animation</td>
767
+ <td>boolean</td>
768
+ <td>true</td>
769
+ <td>apply a css fade transition to the tooltip</td>
770
+ </tr>
771
+ <tr>
772
+ <td>placement</td>
773
+ <td>string|function</td>
774
+ <td>'top'</td>
775
+ <td>how to position the tooltip - top | bottom | left | right</td>
776
+ </tr>
777
+ <tr>
778
+ <td>selector</td>
779
+ <td>string</td>
780
+ <td>false</td>
781
+ <td>If a selector is provided, tooltip objects will be delegated to the specified targets.</td>
782
+ </tr>
783
+ <tr>
784
+ <td>title</td>
785
+ <td>string | function</td>
786
+ <td>''</td>
787
+ <td>default title value if `title` tag isn't present</td>
788
+ </tr>
789
+ <tr>
790
+ <td>trigger</td>
791
+ <td>string</td>
792
+ <td>'hover'</td>
793
+ <td>how tooltip is triggered - hover | focus | manual</td>
794
+ </tr>
795
+ <tr>
796
+ <td>delay</td>
797
+ <td>number | object</td>
798
+ <td>0</td>
799
+ <td>
800
+ <p>delay showing and hiding the tooltip (ms) - does not apply to manual trigger type</p>
801
+ <p>If a number is supplied, delay is applied to both hide/show</p>
802
+ <p>Object structure is: <code>delay: { show: 500, hide: 100 }</code></p>
803
+ </td>
804
+ </tr>
805
+ </tbody>
806
+ </table>
807
+ <div class="alert alert-info">
808
+ <strong>Heads up!</strong>
809
+ Options for individual tooltips can alternatively be specified through the use of data attributes.
810
+ </div>
811
+ <h3>Markup</h3>
812
+ <p>For performance reasons, the Tooltip and Popover data-apis are opt in. If you would like to use them just specify a selector option.</p>
813
+<pre class="prettyprint linenums">
814
+<a href="#" rel="tooltip" title="first tooltip">hover over me</a>
815
+</pre>
816
+ <h3>Methods</h3>
817
+ <h4>$().tooltip(options)</h4>
818
+ <p>Attaches a tooltip handler to an element collection.</p>
819
+ <h4>.tooltip('show')</h4>
820
+ <p>Reveals an element's tooltip.</p>
821
+ <pre class="prettyprint linenums">$('#element').tooltip('show')</pre>
822
+ <h4>.tooltip('hide')</h4>
823
+ <p>Hides an element's tooltip.</p>
824
+ <pre class="prettyprint linenums">$('#element').tooltip('hide')</pre>
825
+ <h4>.tooltip('toggle')</h4>
826
+ <p>Toggles an element's tooltip.</p>
827
+ <pre class="prettyprint linenums">$('#element').tooltip('toggle')</pre>
828
+ </div>
829
+ </div>
830
+ </section>
831
+
832
+
833
+
834
+ <!-- Popovers
835
+ ================================================== -->
836
+ <section id="popovers">
837
+ <div class="page-header">
838
+ <h1>Popovers <small>bootstrap-popover.js</small></h1>
839
+ </div>
840
+ <div class="row">
841
+ <div class="span3 columns">
842
+ <h3>About popovers</h3>
843
+ <p>Add small overlays of content, like those on the iPad, to any element for housing secondary information.</p>
844
+ <p class="muted"><strong>*</strong> Requires <a href="#tooltips">Tooltip</a> to be included</p>
845
+ <a href="assets/js/bootstrap-popover.js" target="_blank" class="btn">Download file</a>
846
+ </div>
847
+ <div class="span9 columns">
848
+ <h2>Example hover popover</h2>
849
+ <p>Hover over the button to trigger the popover.</p>
850
+ <div class="well">
851
+ <a href="#" class="btn btn-danger" rel="popover" title="A Title" data-content="And here's some amazing content. It's very engaging. right?">hover for popover</a>
852
+ </div>
853
+ <hr>
854
+ <h2>Using bootstrap-popover.js</h2>
855
+ <p>Enable popovers via javascript:</p>
856
+ <pre class="prettyprint linenums">$('#example').popover(options)</pre>
857
+ <h3>Options</h3>
858
+ <table class="table table-bordered table-striped">
859
+ <thead>
860
+ <tr>
861
+ <th style="width: 100px;">Name</th>
862
+ <th style="width: 100px;">type</th>
863
+ <th style="width: 50px;">default</th>
864
+ <th>description</th>
865
+ </tr>
866
+ </thead>
867
+ <tbody>
868
+ <tr>
869
+ <td>animation</td>
870
+ <td>boolean</td>
871
+ <td>true</td>
872
+ <td>apply a css fade transition to the tooltip</td>
873
+ </tr>
874
+ <tr>
875
+ <td>placement</td>
876
+ <td>string|function</td>
877
+ <td>'right'</td>
878
+ <td>how to position the popover - top | bottom | left | right</td>
879
+ </tr>
880
+ <tr>
881
+ <td>selector</td>
882
+ <td>string</td>
883
+ <td>false</td>
884
+ <td>if a selector is provided, tooltip objects will be delegated to the specified targets</td>
885
+ </tr>
886
+ <tr>
887
+ <td>trigger</td>
888
+ <td>string</td>
889
+ <td>'hover'</td>
890
+ <td>how tooltip is triggered - hover | focus | manual</td>
891
+ </tr>
892
+ <tr>
893
+ <td>title</td>
894
+ <td>string | function</td>
895
+ <td>''</td>
896
+ <td>default title value if `title` attribute isn't present</td>
897
+ </tr>
898
+ <tr>
899
+ <td>content</td>
900
+ <td>string | function</td>
901
+ <td>''</td>
902
+ <td>default content value if `data-content` attribute isn't present</td>
903
+ </tr>
904
+ <tr>
905
+ <td>delay</td>
906
+ <td>number | object</td>
907
+ <td>0</td>
908
+ <td>
909
+ <p>delay showing and hiding the popover (ms) - does not apply to manual trigger type</p>
910
+ <p>If a number is supplied, delay is applied to both hide/show</p>
911
+ <p>Object structure is: <code>delay: { show: 500, hide: 100 }</code></p>
912
+ </td>
913
+ </tr>
914
+ </tbody>
915
+ </table>
916
+ <div class="alert alert-info">
917
+ <strong>Heads up!</strong>
918
+ Options for individual popovers can alternatively be specified through the use of data attributes.
919
+ </div>
920
+ <h3>Markup</h3>
921
+ <p>
922
+ For performance reasons, the Tooltip and Popover data-apis are opt in. If you would like to use them just specify a selector option.
923
+ </p>
924
+ <h3>Methods</h3>
925
+ <h4>$().popover(options)</h4>
926
+ <p>Initializes popovers for an element collection.</p>
927
+ <h4>.popover('show')</h4>
928
+ <p>Reveals an elements popover.</p>
929
+ <pre class="prettyprint linenums">$('#element').popover('show')</pre>
930
+ <h4>.popover('hide')</h4>
931
+ <p>Hides an elements popover.</p>
932
+ <pre class="prettyprint linenums">$('#element').popover('hide')</pre>
933
+ <h4>.popover('toggle')</h4>
934
+ <p>Toggles an elements popover.</p>
935
+ <pre class="prettyprint linenums">$('#element').popover('toggle')</pre>
936
+ </div>
937
+ </div>
938
+ </section>
939
+
940
+
941
+
942
+ <!-- Alert
943
+ ================================================== -->
944
+ <section id="alerts">
945
+ <div class="page-header">
946
+ <h1>Alert messages <small>bootstrap-alert.js</small></h1>
947
+ </div>
948
+ <div class="row">
949
+ <div class="span3 columns">
950
+ <h3>About alerts</h3>
951
+ <p>The alert plugin is a tiny class for adding close functionality to alerts.</p>
952
+ <a href="assets/js/bootstrap-alert.js" target="_blank" class="btn">Download</a>
953
+ </div>
954
+ <div class="span9 columns">
955
+ <h2>Example alerts</h2>
956
+ <p>The alerts plugin works on regular alert messages, and block messages.</p>
957
+ <div class="alert fade in">
958
+ <button type="button" class="close" data-dismiss="alert">×</button>
959
+ <strong>Holy guacamole!</strong> Best check yo self, you're not looking too good.
960
+ </div>
961
+ <div class="alert alert-block alert-error fade in">
962
+ <button type="button" class="close" data-dismiss="alert">×</button>
963
+ <h4 class="alert-heading">Oh snap! You got an error!</h4>
964
+ <p>Change this and that and try again. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum.</p>
965
+ <p>
966
+ <a class="btn btn-danger" href="#">Take this action</a> <a class="btn" href="#">Or do this</a>
967
+ </p>
968
+ </div>
969
+ <hr>
970
+ <h2>Using bootstrap-alert.js</h2>
971
+ <p>Enable dismissal of an alert via javascript:</p>
972
+ <pre class="prettyprint linenums">$(".alert").alert()</pre>
973
+ <h3>Markup</h3>
974
+ <p>Just add <code>data-dismiss="alert"</code> to your close button to automatically give an alert close functionality.</p>
975
+ <pre class="prettyprint linenums"><a class="close" data-dismiss="alert" href="#">&times;</a></pre>
976
+ <h3>Methods</h3>
977
+ <h4>$().alert()</h4>
978
+ <p>Wraps all alerts with close functionality. To have your alerts animate out when closed, make sure they have the <code>.fade</code> and <code>.in</code> class already applied to them.</p>
979
+ <h4>.alert('close')</h4>
980
+ <p>Closes an alert.</p>
981
+ <pre class="prettyprint linenums">$(".alert").alert('close')</pre>
982
+ <h3>Events</h3>
983
+ <p>Bootstrap's alert class exposes a few events for hooking into alert functionality.</p>
984
+ <table class="table table-bordered table-striped">
985
+ <thead>
986
+ <tr>
987
+ <th style="width: 150px;">Event</th>
988
+ <th>Description</th>
989
+ </tr>
990
+ </thead>
991
+ <tbody>
992
+ <tr>
993
+ <td>close</td>
994
+ <td>This event fires immediately when the <code>close</code> instance method is called.</td>
995
+ </tr>
996
+ <tr>
997
+ <td>closed</td>
998
+ <td>This event is fired when the alert has been closed (will wait for css transitions to complete).</td>
999
+ </tr>
1000
+ </tbody>
1001
+ </table>
1002
+<pre class="prettyprint linenums">
1003
+$('#my-alert').bind('closed', function () {
1004
+ // do something…
1005
+})</pre>
1006
+ </div>
1007
+ </div>
1008
+ </section>
1009
+
1010
+
1011
+
1012
+ <!-- Buttons
1013
+ ================================================== -->
1014
+ <section id="buttons">
1015
+ <div class="page-header">
1016
+ <h1>Buttons <small>bootstrap-button.js</small></h1>
1017
+ </div>
1018
+ <div class="row">
1019
+ <div class="span3 columns">
1020
+ <h3>About</h3>
1021
+ <p>Do more with buttons. Control button states or create groups of buttons for more components like toolbars.</p>
1022
+ <a href="assets/js/bootstrap-button.js" target="_blank" class="btn">Download file</a>
1023
+ </div>
1024
+ <div class="span9 columns">
1025
+ <h2>Example uses</h2>
1026
+ <p>Use the buttons plugin for states and toggles.</p>
1027
+ <table class="table table-bordered table-striped">
1028
+ <tbody>
1029
+ <tr>
1030
+ <td>Stateful</td>
1031
+ <td>
1032
+ <button id="fat-btn" data-loading-text="loading..." class="btn btn-primary">
1033
+ Loading State
1034
+ </button>
1035
+ </td>
1036
+ </tr>
1037
+ <tr>
1038
+ <td>Single toggle</td>
1039
+ <td>
1040
+ <button class="btn btn-primary" data-toggle="button">Single Toggle</button>
1041
+ </td>
1042
+ </tr>
1043
+ <tr>
1044
+ <td>Checkbox</td>
1045
+ <td>
1046
+ <div class="btn-group" data-toggle="buttons-checkbox">
1047
+ <button class="btn btn-primary">Left</button>
1048
+ <button class="btn btn-primary">Middle</button>
1049
+ <button class="btn btn-primary">Right</button>
1050
+ </div>
1051
+ </td>
1052
+ </tr>
1053
+ <tr>
1054
+ <td>Radio</td>
1055
+ <td>
1056
+ <div class="btn-group" data-toggle="buttons-radio">
1057
+ <button class="btn btn-primary">Left</button>
1058
+ <button class="btn btn-primary">Middle</button>
1059
+ <button class="btn btn-primary">Right</button>
1060
+ </div>
1061
+ </td>
1062
+ </tr>
1063
+ </tbody>
1064
+ </table>
1065
+ <hr>
1066
+ <h2>Using bootstrap-button.js</h2>
1067
+ <p>Enable buttons via javascript:</p>
1068
+ <pre class="prettyprint linenums">$('.nav-tabs').button()</pre>
1069
+ <h3>Markup</h3>
1070
+ <p>Data attributes are integral to the button plugin. Check out the example code below for the various markup types.</p>
1071
+<pre class="prettyprint linenums">
1072
+<!-- Add data-toggle="button" to activate toggling on a single button -->
1073
+<button class="btn" data-toggle="button">Single Toggle</button>
1074
+
1075
+<!-- Add data-toggle="buttons-checkbox" for checkbox style toggling on btn-group -->
1076
+<div class="btn-group" data-toggle="buttons-checkbox">
1077
+ <button class="btn">Left</button>
1078
+ <button class="btn">Middle</button>
1079
+ <button class="btn">Right</button>
1080
+</div>
1081
+
1082
+<!-- Add data-toggle="buttons-radio" for radio style toggling on btn-group -->
1083
+<div class="btn-group" data-toggle="buttons-radio">
1084
+ <button class="btn">Left</button>
1085
+ <button class="btn">Middle</button>
1086
+ <button class="btn">Right</button>
1087
+</div>
1088
+</pre>
1089
+ <h3>Methods</h3>
1090
+ <h4>$().button('toggle')</h4>
1091
+ <p>Toggles push state. Gives the button the appearance that it has been activated.</p>
1092
+ <div class="alert alert-info">
1093
+ <strong>Heads up!</strong>
1094
+ You can enable auto toggling of a button by using the <code>data-toggle</code> attribute.
1095
+ </div>
1096
+ <pre class="prettyprint linenums"><button class="btn" data-toggle="button" >…</button></pre>
1097
+ <h4>$().button('loading')</h4>
1098
+ <p>Sets button state to loading - disables button and swaps text to loading text. Loading text should be defined on the button element using the data attribute <code>data-loading-text</code>.
1099
+ </p>
1100
+ <pre class="prettyprint linenums"><button class="btn" data-loading-text="loading stuff..." >...</button></pre>
1101
+ <div class="alert alert-info">
1102
+ <strong>Heads up!</strong>
1103
+ <a href="https://github.com/twitter/bootstrap/issues/793">Firefox persists the disabled state across page loads</a>. A workaround for this is to use <code>autocomplete="off"</code>.
1104
+ </div>
1105
+ <h4>$().button('reset')</h4>
1106
+ <p>Resets button state - swaps text to original text.</p>
1107
+ <h4>$().button(string)</h4>
1108
+ <p>Resets button state - swaps text to any data defined text state.</p>
1109
+<pre class="prettyprint linenums"><button class="btn" data-complete-text="finished!" >...</button>
1110
+<script>
1111
+ $('.btn').button('complete')
1112
+</script></pre>
1113
+ </div>
1114
+ </div>
1115
+ </section>
1116
+
1117
+
1118
+
1119
+ <!-- Collapse
1120
+ ================================================== -->
1121
+ <section id="collapse">
1122
+ <div class="page-header">
1123
+ <h1>Collapse <small>bootstrap-collapse.js</small></h1>
1124
+ </div>
1125
+ <div class="row">
1126
+ <div class="span3 columns">
1127
+ <h3>About</h3>
1128
+ <p>Get base styles and flexible support for collapsible components like accordions and navigation.</p>
1129
+ <a href="assets/js/bootstrap-collapse.js" target="_blank" class="btn">Download file</a>
1130
+ <p class="muted"><strong>*</strong> Requires the Transitions plugin to be included.</p>
1131
+ </div>
1132
+ <div class="span9 columns">
1133
+ <h2>Example accordion</h2>
1134
+ <p>Using the collapse plugin, we built a simple accordion style widget:</p>
1135
+
1136
+ <div class="accordion" id="accordion2">
1137
+ <div class="accordion-group">
1138
+ <div class="accordion-heading">
1139
+ <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseOne">
1140
+ Collapsible Group Item #1
1141
+ </a>
1142
+ </div>
1143
+ <div id="collapseOne" class="accordion-body collapse in">
1144
+ <div class="accordion-inner">
1145
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
1146
+ </div>
1147
+ </div>
1148
+ </div>
1149
+ <div class="accordion-group">
1150
+ <div class="accordion-heading">
1151
+ <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseTwo">
1152
+ Collapsible Group Item #2
1153
+ </a>
1154
+ </div>
1155
+ <div id="collapseTwo" class="accordion-body collapse">
1156
+ <div class="accordion-inner">
1157
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
1158
+ </div>
1159
+ </div>
1160
+ </div>
1161
+ <div class="accordion-group">
1162
+ <div class="accordion-heading">
1163
+ <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseThree">
1164
+ Collapsible Group Item #3
1165
+ </a>
1166
+ </div>
1167
+ <div id="collapseThree" class="accordion-body collapse">
1168
+ <div class="accordion-inner">
1169
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
1170
+ </div>
1171
+ </div>
1172
+ </div>
1173
+ </div>
1174
+
1175
+
1176
+ <hr>
1177
+ <h2>Using bootstrap-collapse.js</h2>
1178
+ <p>Enable via javascript:</p>
1179
+ <pre class="prettyprint linenums">$(".collapse").collapse()</pre>
1180
+ <h3>Options</h3>
1181
+ <table class="table table-bordered table-striped">
1182
+ <thead>
1183
+ <tr>
1184
+ <th style="width: 100px;">Name</th>
1185
+ <th style="width: 50px;">type</th>
1186
+ <th style="width: 50px;">default</th>
1187
+ <th>description</th>
1188
+ </tr>
1189
+ </thead>
1190
+ <tbody>
1191
+ <tr>
1192
+ <td>parent</td>
1193
+ <td>selector</td>
1194
+ <td>false</td>
1195
+ <td>If selector then all collapsible elements under the specified parent will be closed when this collapsible item is shown. (similar to traditional accordion behavior)</td>
1196
+ </tr>
1197
+ <tr>
1198
+ <td>toggle</td>
1199
+ <td>boolean</td>
1200
+ <td>true</td>
1201
+ <td>Toggles the collapsible element on invocation</td>
1202
+ </tr>
1203
+ </tbody>
1204
+ </table>
1205
+ <h3>Markup</h3>
1206
+ <p>Just add <code>data-toggle="collapse"</code> and a <code>data-target</code> to element to automatically assign control of a collapsible element. The <code>data-target</code> attribute accepts a css selector to apply the collapse to. Be sure to add the class <code>collapse</code> to the collapsible element. If you'd like it to default open, add the additional class <code>in</code>.</p>
1207
+ <pre class="prettyprint linenums">
1208
+<button class="btn btn-danger" data-toggle="collapse" data-target="#demo">
1209
+ simple collapsible
1210
+</button>
1211
+
1212
+<div id="demo" class="collapse in"> … </div></pre>
1213
+ <div class="alert alert-info">
1214
+ <strong>Heads up!</strong>
1215
+ To add accordion-like group management to a collapsible control, add the data attribute <code>data-parent="#selector"</code>. Refer to the demo to see this in action.
1216
+ </div>
1217
+ <h3>Methods</h3>
1218
+ <h4>.collapse(options)</h4>
1219
+ <p>Activates your content as a collapsible element. Accepts an optional options <code>object</code>.
1220
+<pre class="prettyprint linenums">
1221
+$('#myCollapsible').collapse({
1222
+ toggle: false
1223
+})</pre>
1224
+ <h4>.collapse('toggle')</h4>
1225
+ <p>Toggles a collapsible element to shown or hidden.</p>
1226
+ <h4>.collapse('show')</h4>
1227
+ <p>Shows a collapsible element.</p>
1228
+ <h4>.collapse('hide')</h4>
1229
+ <p>Hides a collapsible element.</p>
1230
+ <h3>Events</h3>
1231
+ <p>
1232
+ Bootstrap's collapse class exposes a few events for hooking into collapse functionality.
1233
+ </p>
1234
+ <table class="table table-bordered table-striped">
1235
+ <thead>
1236
+ <tr>
1237
+ <th style="width: 150px;">Event</th>
1238
+ <th>Description</th>
1239
+ </tr>
1240
+ </thead>
1241
+ <tbody>
1242
+ <tr>
1243
+ <td>show</td>
1244
+ <td>This event fires immediately when the <code>show</code> instance method is called.</td>
1245
+ </tr>
1246
+ <tr>
1247
+ <td>shown</td>
1248
+ <td>This event is fired when a collapse element has been made visible to the user (will wait for css transitions to complete).</td>
1249
+ </tr>
1250
+ <tr>
1251
+ <td>hide</td>
1252
+ <td>
1253
+ This event is fired immediately when the <code>hide</code> method has been called.
1254
+ </td>
1255
+ </tr>
1256
+ <tr>
1257
+ <td>hidden</td>
1258
+ <td>This event is fired when a collapse element has been hidden from the user (will wait for css transitions to complete).</td>
1259
+ </tr>
1260
+ </tbody>
1261
+ </table>
1262
+
1263
+<pre class="prettyprint linenums">
1264
+$('#myCollapsible').on('hidden', function () {
1265
+ // do something…
1266
+})</pre>
1267
+ </div>
1268
+ </div>
1269
+ </section>
1270
+
1271
+
1272
+
1273
+ <!-- Carousel
1274
+ ================================================== -->
1275
+ <section id="carousel">
1276
+ <div class="page-header">
1277
+ <h1>Carousel <small>bootstrap-carousel.js</small></h1>
1278
+ </div>
1279
+ <div class="row">
1280
+ <div class="span3 columns">
1281
+ <h3>About</h3>
1282
+ <p>A generic plugin for cycling through elements. A merry-go-round.</p>
1283
+ <a href="assets/js/bootstrap-carousel.js" target="_blank" class="btn">Download file</a>
1284
+ </div>
1285
+ <div class="span9 columns">
1286
+ <h2>Example carousel</h2>
1287
+ <p>Watch the slideshow below.</p>
1288
+ <div id="myCarousel" class="carousel slide">
1289
+ <div class="carousel-inner">
1290
+ <div class="item active">
1291
+ <img src="assets/img/bootstrap-mdo-sfmoma-01.jpg" alt="">
1292
+ <div class="carousel-caption">
1293
+ <h4>First Thumbnail label</h4>
1294
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1295
+ </div>
1296
+ </div>
1297
+ <div class="item">
1298
+ <img src="assets/img/bootstrap-mdo-sfmoma-02.jpg" alt="">
1299
+ <div class="carousel-caption">
1300
+ <h4>Second Thumbnail label</h4>
1301
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1302
+ </div>
1303
+ </div>
1304
+ <div class="item">
1305
+ <img src="assets/img/bootstrap-mdo-sfmoma-03.jpg" alt="">
1306
+ <div class="carousel-caption">
1307
+ <h4>Third Thumbnail label</h4>
1308
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1309
+ </div>
1310
+ </div>
1311
+ </div>
1312
+ <a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>
1313
+ <a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>
1314
+ </div>
1315
+ <div class="alert alert-info">
1316
+ <strong>Heads up!</strong>
1317
+ When implementing this carousel, remove the images we have provided and replace them with your own.
1318
+ </div>
1319
+ <hr>
1320
+ <h2>Using bootstrap-carousel.js</h2>
1321
+ <p>Call via javascript:</p>
1322
+ <pre class="prettyprint linenums">$('.carousel').carousel()</pre>
1323
+ <h3>Options</h3>
1324
+ <table class="table table-bordered table-striped">
1325
+ <thead>
1326
+ <tr>
1327
+ <th style="width: 100px;">Name</th>
1328
+ <th style="width: 50px;">type</th>
1329
+ <th style="width: 50px;">default</th>
1330
+ <th>description</th>
1331
+ </tr>
1332
+ </thead>
1333
+ <tbody>
1334
+ <tr>
1335
+ <td>interval</td>
1336
+ <td>number</td>
1337
+ <td>5000</td>
1338
+ <td>The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle.</td>
1339
+ </tr>
1340
+ <tr>
1341
+ <td>pause</td>
1342
+ <td>string</td>
1343
+ <td>"hover"</td>
1344
+ <td>Pauses the cycling of the carousel on mouseenter and resumes the cycling of the carousel on mouseleave.</td>
1345
+ </tr>
1346
+ </tbody>
1347
+ </table>
1348
+ <h3>Markup</h3>
1349
+ <p>Data attributes are used for the previous and next conrols. Check out the example markup below.</p>
1350
+<pre class="prettyprint linenums">
1351
+<div id="myCarousel" class="carousel slide">
1352
+ <!-- Carousel items -->
1353
+ <div class="carousel-inner">
1354
+ <div class="active item">…</div>
1355
+ <div class="item">…</div>
1356
+ <div class="item">…</div>
1357
+ </div>
1358
+ <!-- Carousel nav -->
1359
+ <a class="carousel-control left" href="#myCarousel" data-slide="prev">&lsaquo;</a>
1360
+ <a class="carousel-control right" href="#myCarousel" data-slide="next">&rsaquo;</a>
1361
+</div>
1362
+</pre>
1363
+ <h3>Methods</h3>
1364
+ <h4>.carousel(options)</h4>
1365
+ <p>Initializes the carousel with an optional options <code>object</code> and starts cycling through items.</p>
1366
+<pre class="prettyprint linenums">
1367
+$('.carousel').carousel({
1368
+ interval: 2000
1369
+})
1370
+</pre>
1371
+ <h4>.carousel('cycle')</h4>
1372
+ <p>Cycles through the carousel items from left to right.</p>
1373
+ <h4>.carousel('pause')</h4>
1374
+ <p>Stops the carousel from cycling through items.</p>
1375
+ <h4>.carousel(number)</h4>
1376
+ <p>Cycles the carousel to a particular frame (0 based, similar to an array).</p>
1377
+ <h4>.carousel('prev')</h4>
1378
+ <p>Cycles to the previous item.</p>
1379
+ <h4>.carousel('next')</h4>
1380
+ <p>Cycles to the next item.</p>
1381
+ <h3>Events</h3>
1382
+ <p>Bootstrap's carousel class exposes two events for hooking into carousel functionality.</p>
1383
+ <table class="table table-bordered table-striped">
1384
+ <thead>
1385
+ <tr>
1386
+ <th style="width: 150px;">Event</th>
1387
+ <th>Description</th>
1388
+ </tr>
1389
+ </thead>
1390
+ <tbody>
1391
+ <tr>
1392
+ <td>slide</td>
1393
+ <td>This event fires immediately when the <code>slide</code> instance method is invoked.</td>
1394
+ </tr>
1395
+ <tr>
1396
+ <td>slid</td>
1397
+ <td>This event is fired when the carousel has completed its slide transition.</td>
1398
+ </tr>
1399
+ </tbody>
1400
+ </table>
1401
+ </div>
1402
+ </div>
1403
+ </section>
1404
+
1405
+
1406
+
1407
+ <!-- Typeahead
1408
+ ================================================== -->
1409
+ <section id="typeahead">
1410
+ <div class="page-header">
1411
+ <h1>Typeahead <small>bootstrap-typeahead.js</small></h1>
1412
+ </div>
1413
+ <div class="row">
1414
+ <div class="span3 columns">
1415
+ <h3>About</h3>
1416
+ <p>A basic, easily extended plugin for quickly creating elegant typeaheads with any form text input.</p>
1417
+ <a href="assets/js/bootstrap-typeahead.js" target="_blank" class="btn">Download file</a>
1418
+ </div>
1419
+ <div class="span9 columns">
1420
+ <h2>Example</h2>
1421
+ <p>Start typing in the field below to show the typeahead results.</p>
1422
+ <div class="well">
1423
+ <input type="text" class="span3" style="margin: 0 auto;" data-provide="typeahead" data-items="4" data-source='["Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Hampshire","New Jersey","New Mexico","New York","North Dakota","North Carolina","Ohio","Oklahoma","Oregon","Pennsylvania","Rhode Island","South Carolina","South Dakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","West Virginia","Wisconsin","Wyoming"]'>
1424
+ </div>
1425
+ <hr>
1426
+ <h2>Using bootstrap-typeahead.js</h2>
1427
+ <p>Call the typeahead via javascript:</p>
1428
+ <pre class="prettyprint linenums">$('.typeahead').typeahead()</pre>
1429
+ <h3>Options</h3>
1430
+ <table class="table table-bordered table-striped">
1431
+ <thead>
1432
+ <tr>
1433
+ <th style="width: 100px;">Name</th>
1434
+ <th style="width: 50px;">type</th>
1435
+ <th style="width: 100px;">default</th>
1436
+ <th>description</th>
1437
+ </tr>
1438
+ </thead>
1439
+ <tbody>
1440
+ <tr>
1441
+ <td>source</td>
1442
+ <td>array</td>
1443
+ <td>[ ]</td>
1444
+ <td>The data source to query against.</td>
1445
+ </tr>
1446
+ <tr>
1447
+ <td>items</td>
1448
+ <td>number</td>
1449
+ <td>8</td>
1450
+ <td>The max number of items to display in the dropdown.</td>
1451
+ </tr>
1452
+ <tr>
1453
+ <td>matcher</td>
1454
+ <td>function</td>
1455
+ <td>case insensitive</td>
1456
+ <td>The method used to determine if a query matches an item. Accepts a single argument, the <code>item</code> against which to test the query. Access the current query with <code>this.query</code>. Return a boolean <code>true</code> if query is a match.</td>
1457
+ </tr>
1458
+ <tr>
1459
+ <td>sorter</td>
1460
+ <td>function</td>
1461
+ <td>exact match,<br> case sensitive,<br> case insensitive</td>
1462
+ <td>Method used to sort autocomplete results. Accepts a single argument <code>items</code> and has the scope of the typeahead instance. Reference the current query with <code>this.query</code>.</td>
1463
+ </tr>
1464
+ <tr>
1465
+ <td>highlighter</td>
1466
+ <td>function</td>
1467
+ <td>highlights all default matches</td>
1468
+ <td>Method used to highlight autocomplete results. Accepts a single argument <code>item</code> and has the scope of the typeahead instance. Should return html.</td>
1469
+ </tr>
1470
+ </tbody>
1471
+ </table>
1472
+
1473
+ <h3>Markup</h3>
1474
+ <p>Add data attributes to register an element with typeahead functionality.</p>
1475
+<pre class="prettyprint linenums">
1476
+<input type="text" data-provide="typeahead">
1477
+</pre>
1478
+ <h3>Methods</h3>
1479
+ <h4>.typeahead(options)</h4>
1480
+ <p>Initializes an input with a typeahead.</p>
1481
+ </div>
1482
+ </div>
1483
+ </section>
1484
+
1485
+ <!-- Footer
1486
+ ================================================== -->
1487
+ <footer class="footer">
1488
+ <p class="pull-right"><a href="#">Back to top</a></p>
1489
+ <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
1490
+ <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
1491
+ <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
1492
+ </footer>
1493
+
1494
+ </div><!-- /container -->
1495
+
1496
+
1497
+
1498
+ <!-- Le javascript
1499
+ ================================================== -->
1500
+ <!-- Placed at the end of the document so the pages load faster -->
1501
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
1502
+ <script src="assets/js/jquery.js"></script>
1503
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
1504
+ <script src="assets/js/bootstrap-transition.js"></script>
1505
+ <script src="assets/js/bootstrap-alert.js"></script>
1506
+ <script src="assets/js/bootstrap-modal.js"></script>
1507
+ <script src="assets/js/bootstrap-dropdown.js"></script>
1508
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
1509
+ <script src="assets/js/bootstrap-tab.js"></script>
1510
+ <script src="assets/js/bootstrap-tooltip.js"></script>
1511
+ <script src="assets/js/bootstrap-popover.js"></script>
1512
+ <script src="assets/js/bootstrap-button.js"></script>
1513
+ <script src="assets/js/bootstrap-collapse.js"></script>
1514
+ <script src="assets/js/bootstrap-carousel.js"></script>
1515
+ <script src="assets/js/bootstrap-typeahead.js"></script>
1516
+ <script src="assets/js/application.js"></script>
1517
+
1518
+
1519
+ </body>
1520
+</html>
docs/docs/likebutton/docs/less.html
new
+1060
@@ -0,0 +1,1060 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Less · Twitter Bootstrap</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ </head>
29
+
30
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
31
+
32
+
33
+ <!-- Navbar
34
+ ================================================== -->
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="brand" href="./index.html">Bootstrap</a>
44
+ <div class="nav-collapse collapse">
45
+ <ul class="nav">
46
+ <li class="">
47
+ <a href="./index.html">Overview</a>
48
+ </li>
49
+ <li class="">
50
+ <a href="./scaffolding.html">Scaffolding</a>
51
+ </li>
52
+ <li class="">
53
+ <a href="./base-css.html">Base CSS</a>
54
+ </li>
55
+ <li class="">
56
+ <a href="./components.html">Components</a>
57
+ </li>
58
+ <li class="">
59
+ <a href="./javascript.html">Javascript plugins</a>
60
+ </li>
61
+ <li class="active">
62
+ <a href="./less.html">Using LESS</a>
63
+ </li>
64
+ <li class="divider-vertical"></li>
65
+ <li class="">
66
+ <a href="./download.html">Customize</a>
67
+ </li>
68
+ <li class="">
69
+ <a href="./examples.html">Examples</a>
70
+ </li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="container">
78
+
79
+<!-- Masthead
80
+================================================== -->
81
+<header class="jumbotron subhead" id="overview">
82
+ <h1>Using LESS with Bootstrap</h1>
83
+ <p class="lead">Customize and extend Bootstrap with <a href="http://lesscss.org" target="_blank">LESS</a>, a CSS preprocessor, to take advantage of the variables, mixins, and more used to build Bootstrap's CSS.</p>
84
+ <div class="subnav">
85
+ <ul class="nav nav-pills">
86
+ <li><a href="#builtWith">Built with Less</a></li>
87
+ <li><a href="#variables">Variables</a></li>
88
+ <li><a href="#mixins">Mixins</a></li>
89
+ <li><a href="#compiling">Compiling Bootstrap</a></li>
90
+ </ul>
91
+ </div>
92
+</header>
93
+
94
+
95
+
96
+<!-- BUILT WITH LESS
97
+================================================== -->
98
+<section id="builtWith">
99
+ <div class="page-header">
100
+ <h1>Built with LESS</h1>
101
+ </div>
102
+ <div class="row">
103
+ <div class="span4">
104
+ <h3>Why LESS?</h3>
105
+ <p>Bootstrap is made with LESS at its core, a dynamic stylesheet language created by our good friend, <a href="http://cloudhead.io">Alexis Sellier</a>. It makes developing systems-based CSS faster, easier, and more fun.</p>
106
+ </div>
107
+ <div class="span4">
108
+ <h3>What's included?</h3>
109
+ <p>As an extension of CSS, LESS includes variables, mixins for reusable snippets of code, operations for simple math, nesting, and even color functions.</p>
110
+ </div>
111
+ <div class="span4">
112
+ <h3>Learn more</h3>
113
+ <img style="float: right; height: 36px;" src="assets/img/less-logo-large.png" alt="LESS CSS">
114
+ <p>Visit the official website at <a href="http://lesscss.org">http://lesscss.org</a> to learn more.</p>
115
+ </div>
116
+ </div>
117
+ <div class="row">
118
+ <div class="span4">
119
+ <h3><a href="#variables">Variables</a></h3>
120
+ <p>Managing colors and pixel values in CSS can be a bit of a pain, usually full of copy and paste. Not with LESS though—assign colors or pixel values as variables and change them once.</p>
121
+ </div>
122
+ <div class="span4">
123
+ <h3><a href="#mixins">Mixins</a></h3>
124
+ <p>Those three border-radius declarations you need to make in regular ol' CSS? Now they're down to one line with the help of mixins, snippets of code you can reuse anywhere.</p>
125
+ </div>
126
+ <div class="span4">
127
+ <h3>Operations</h3>
128
+ <p>Make your grid, leading, and more super flexible by doing the math on the fly with operations. Multiply, divide, add, and subtract your way to CSS sanity.</p>
129
+ </div>
130
+ </div>
131
+</section>
132
+
133
+
134
+
135
+<!-- VARIABLES
136
+================================================== -->
137
+<section id="variables">
138
+ <div class="page-header">
139
+ <h1>Bootstrap variables <small>LESS variables, their values, and usage guidelines</small></h1>
140
+ </div>
141
+
142
+ <h3>Scaffolding and links</h3>
143
+ <table class="table table-bordered table-striped">
144
+ <tbody>
145
+ <tr>
146
+ <td class="span4"><code>@bodyBackground</code></td>
147
+ <td><code>@white</code></td>
148
+ <td>Page background color</td>
149
+ <td class="swatch-col"><span class="swatch" style="background-color: #fff;"></span></td>
150
+ </tr>
151
+ <tr>
152
+ <td><code>@textColor</code></td>
153
+ <td><code>@grayDark</code></td>
154
+ <td>Default text color for entire body, headings, and more</td>
155
+ <td class="swatch-col"><span class="swatch" style="background-color: #333;"></span></td>
156
+ </tr>
157
+ <tr>
158
+ <td><code>@linkColor</code></td>
159
+ <td><code>#08c</code></td>
160
+ <td>Default link text color</td>
161
+ <td class="swatch-col"><span class="swatch" style="background-color: #08c;"></span></td>
162
+ </tr>
163
+ <tr>
164
+ <td><code>@linkColorHover</code></td>
165
+ <td><code>darken(@linkColor, 15%)</code></td>
166
+ <td>Default link text hover color</td>
167
+ <td><span class="swatch" style="background-color: #005580;"></span></td>
168
+ </tr>
169
+ </tbody>
170
+ </table>
171
+ <h3>Grid system</h3>
172
+ <table class="table table-bordered table-striped">
173
+ <tbody>
174
+ <tr>
175
+ <td class="span4"><code>@gridColumns</code></td>
176
+ <td>12</td>
177
+ </tr>
178
+ <tr>
179
+ <td><code>@gridColumnWidth</code></td>
180
+ <td>60px</td>
181
+ </tr>
182
+ <tr>
183
+ <td><code>@gridGutterWidth</code></td>
184
+ <td>20px</td>
185
+ </tr>
186
+ <tr>
187
+ <td><code>@fluidGridColumnWidth</code></td>
188
+ <td>6.382978723%</td>
189
+ </tr>
190
+ <tr>
191
+ <td><code>@fluidGridGutterWidth</code></td>
192
+ <td>2.127659574%</td>
193
+ </tr>
194
+ </tbody>
195
+ </table>
196
+ <h3>Typography</h3>
197
+ <table class="table table-bordered table-striped">
198
+ <tbody>
199
+ <tr>
200
+ <td class="span4"><code>@sansFontFamily</code></td>
201
+ <td colspan="2">"Helvetica Neue", Helvetica, Arial, sans-serif</td>
202
+ </tr>
203
+ <tr>
204
+ <td><code>@serifFontFamily</code></td>
205
+ <td colspan="2"><code>Georgia, "Times New Roman", Times, serif</code></td>
206
+ </tr>
207
+ <tr>
208
+ <td><code>@monoFontFamily</code></td>
209
+ <td colspan="2">Menlo, Monaco, "Courier New", monospace</td>
210
+ </tr>
211
+
212
+ <tr>
213
+ <td><code>@baseFontSize</code></td>
214
+ <td>13px</td>
215
+ <td><em class="muted">Must be pixels</em></td>
216
+ </tr>
217
+ <tr>
218
+ <td><code>@baseFontFamily</code></td>
219
+ <td colspan="2"><code>@sansFontFamily</code></td>
220
+ </tr>
221
+ <tr>
222
+ <td><code>@baseLineHeight</code></td>
223
+ <td>18px</td>
224
+ <td><em class="muted">Must be pixels</em></td>
225
+ </tr>
226
+ <tr>
227
+ <td><code>@altFontFamily</code></td>
228
+ <td colspan="2"><code>@serifFontFamily</code></td>
229
+ </tr>
230
+
231
+ <tr>
232
+ <td><code>@headingsFontFamily</code></td>
233
+ <td colspan="2"><code>inherit</code></td>
234
+ </tr>
235
+ <tr>
236
+ <td><code>@headingsFontWeight</code></td>
237
+ <td colspan="2"><code>bold</code></td>
238
+ </tr>
239
+ <tr>
240
+ <td><code>@headingsColor</code></td>
241
+ <td colspan="2"><code>inherit</code></td>
242
+ </tr>
243
+ </tbody>
244
+ </table>
245
+ <h3>Tables</h3>
246
+ <table class="table table-bordered table-striped">
247
+ <tbody>
248
+ <tr>
249
+ <td class="span4"><code>@tableBackground</code></td>
250
+ <td><code>transparent</code></td>
251
+ </tr>
252
+ <tr>
253
+ <td><code>@tableBackgroundAccent</code></td>
254
+ <td><code>#f9f9f9</code></td>
255
+ </tr>
256
+ <tr>
257
+ <td><code>@tableBackgroundHover</code></td>
258
+ <td><code>#f5f5f5</code></td>
259
+ </tr>
260
+ <tr>
261
+ <td><code>@tableBorder</code></td>
262
+ <td><code>ddd</code></td>
263
+ </tr>
264
+ </tbody>
265
+ </table>
266
+
267
+ <h3>Grayscale colors</h3>
268
+ <table class="table table-bordered table-striped">
269
+ <tbody>
270
+ <tr>
271
+ <td class="span4"><code>@black</code></td>
272
+ <td>#000</td>
273
+ <td class="swatch-col"><span class="swatch" style="background-color: #000;"></span></td>
274
+ </tr>
275
+ <tr>
276
+ <td><code>@grayDarker</code></td>
277
+ <td>#222</td>
278
+ <td><span class="swatch" style="background-color: #222;"></span></td>
279
+ </tr>
280
+ <tr>
281
+ <td><code>@grayDark</code></td>
282
+ <td>#333</td>
283
+ <td><span class="swatch" style="background-color: #333;"></span></td>
284
+ </tr>
285
+ <tr>
286
+ <td><code>@gray</code></td>
287
+ <td>#555</td>
288
+ <td><span class="swatch" style="background-color: #555;"></span></td>
289
+ </tr>
290
+ <tr>
291
+ <td><code>@grayLight</code></td>
292
+ <td>#999</td>
293
+ <td><span class="swatch" style="background-color: #999;"></span></td>
294
+ </tr>
295
+ <tr>
296
+ <td><code>@grayLighter</code></td>
297
+ <td>#eee</td>
298
+ <td><span class="swatch" style="background-color: #eee;"></span></td>
299
+ </tr>
300
+ <tr>
301
+ <td><code>@white</code></td>
302
+ <td>#fff</td>
303
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
304
+ </tr>
305
+ </tbody>
306
+ </table>
307
+ <h3>Accent colors</h3>
308
+ <table class="table table-bordered table-striped">
309
+ <tbody>
310
+ <tr>
311
+ <td class="span4"><code>@blue</code></td>
312
+ <td>#049cdb</td>
313
+ <td class="swatch-col"><span class="swatch" style="background-color: #049cdb;"></span></td>
314
+ </tr>
315
+ <tr>
316
+ <td><code>@green</code></td>
317
+ <td>#46a546</td>
318
+ <td><span class="swatch" style="background-color: #46a546;"></span></td>
319
+ </tr>
320
+ <tr>
321
+ <td><code>@red</code></td>
322
+ <td>#9d261d</td>
323
+ <td><span class="swatch" style="background-color: #9d261d;"></span></td>
324
+ </tr>
325
+ <tr>
326
+ <td><code>@yellow</code></td>
327
+ <td>#ffc40d</td>
328
+ <td><span class="swatch" style="background-color: #ffc40d;"></span></td>
329
+ </tr>
330
+ <tr>
331
+ <td><code>@orange</code></td>
332
+ <td>#f89406</td>
333
+ <td><span class="swatch" style="background-color: #f89406;"></span></td>
334
+ </tr>
335
+ <tr>
336
+ <td><code>@pink</code></td>
337
+ <td>#c3325f</td>
338
+ <td><span class="swatch" style="background-color: #c3325f;"></span></td>
339
+ </tr>
340
+ <tr>
341
+ <td><code>@purple</code></td>
342
+ <td>#7a43b6</td>
343
+ <td><span class="swatch" style="background-color: #7a43b6;"></span></td>
344
+ </tr>
345
+ </tbody>
346
+ </table>
347
+
348
+
349
+ <h3>Components</h3>
350
+
351
+ <h4>Buttons</h4>
352
+ <table class="table table-bordered table-striped">
353
+ <tbody>
354
+ <tr>
355
+ <td class="span4"><code>@btnBackground</code></td>
356
+ <td><code>@white</code></td>
357
+ <td class="swatch-col"><span class="swatch" style="background-color: #fff;"></span></td>
358
+ </tr>
359
+ <tr>
360
+ <td><code>@btnBackgroundHighlight</code></td>
361
+ <td><code>darken(@white, 10%)</code></td>
362
+ <td class="swatch-col"><span class="swatch" style="background-color: #e6e6e6;"></span></td>
363
+ </tr>
364
+ <tr>
365
+ <td><code>@btnBorder</code></td>
366
+ <td><code>darken(@white, 20%)</code></td>
367
+ <td class="swatch-col"><span class="swatch" style="background-color: #ccc;"></span></td>
368
+ </tr>
369
+
370
+ <tr>
371
+ <td><code>@btnPrimaryBackground</code></td>
372
+ <td><code>@linkColor</code></td>
373
+ <td class="swatch-col"><span class="swatch" style="background-color: #08c;"></span></td>
374
+ </tr>
375
+ <tr>
376
+ <td><code>@btnPrimaryBackgroundHighlight</code></td>
377
+ <td><code>spin(@btnPrimaryBackground, 15%)</code></td>
378
+ <td class="swatch-col"><span class="swatch" style="background-color: #05c;"></span></td>
379
+ </tr>
380
+
381
+ <tr>
382
+ <td><code>@btnInfoBackground</code></td>
383
+ <td><code>#5bc0de</code></td>
384
+ <td class="swatch-col"><span class="swatch" style="background-color: #5bc0de;"></span></td>
385
+ </tr>
386
+ <tr>
387
+ <td><code>@btnInfoBackgroundHighlight</code></td>
388
+ <td><code>#2f96b4</code></td>
389
+ <td class="swatch-col"><span class="swatch" style="background-color: #2f96b4;"></span></td>
390
+ </tr>
391
+
392
+ <tr>
393
+ <td><code>@btnSuccessBackground</code></td>
394
+ <td><code>#62c462</code></td>
395
+ <td class="swatch-col"><span class="swatch" style="background-color: #62c462;"></span></td>
396
+ </tr>
397
+ <tr>
398
+ <td><code>@btnSuccessBackgroundHighlight</code></td>
399
+ <td><code>51a351</code></td>
400
+ <td class="swatch-col"><span class="swatch" style="background-color: #51a351;"></span></td>
401
+ </tr>
402
+
403
+ <tr>
404
+ <td><code>@btnWarningBackground</code></td>
405
+ <td><code>lighten(@orange, 15%)</code></td>
406
+ <td class="swatch-col"><span class="swatch" style="background-color: #fbb450;"></span></td>
407
+ </tr>
408
+ <tr>
409
+ <td><code>@btnWarningBackgroundHighlight</code></td>
410
+ <td><code>@orange</code></td>
411
+ <td class="swatch-col"><span class="swatch" style="background-color: #f89406;"></span></td>
412
+ </tr>
413
+
414
+ <tr>
415
+ <td><code>@btnDangerBackground</code></td>
416
+ <td><code>#ee5f5b</code></td>
417
+ <td class="swatch-col"><span class="swatch" style="background-color: #ee5f5b;"></span></td>
418
+ </tr>
419
+ <tr>
420
+ <td><code>@btnDangerBackgroundHighlight</code></td>
421
+ <td><code>#bd362f</code></td>
422
+ <td class="swatch-col"><span class="swatch" style="background-color: #bd362f;"></span></td>
423
+ </tr>
424
+
425
+ <tr>
426
+ <td><code>@btnInverseBackground</code></td>
427
+ <td><code>@gray</code></td>
428
+ <td class="swatch-col"><span class="swatch" style="background-color: #555;"></span></td>
429
+ </tr>
430
+ <tr>
431
+ <td><code>@btnInverseBackgroundHighlight</code></td>
432
+ <td><code>@grayDarker</code></td>
433
+ <td class="swatch-col"><span class="swatch" style="background-color: #222;"></span></td>
434
+ </tr>
435
+ </tbody>
436
+ </table>
437
+ <h4>Forms</h4>
438
+ <table class="table table-bordered table-striped">
439
+ <tbody>
440
+ <tr>
441
+ <td class="span4"><code>@placeholderText</code></td>
442
+ <td><code>@grayLight</code></td>
443
+ </tr>
444
+ <tr>
445
+ <td><code>@inputBackground</code></td>
446
+ <td><code>@white</code></td>
447
+ </tr>
448
+ <tr>
449
+ <td><code>@inputBorder</code></td>
450
+ <td><code>#ccc</code></td>
451
+ </tr>
452
+ <tr>
453
+ <td><code>@inputBorderRadius</code></td>
454
+ <td><code>3px</code></td>
455
+ </tr>
456
+ <tr>
457
+ <td><code>@inputDisabledBackground</code></td>
458
+ <td><code>@grayLighter</code></td>
459
+ </tr>
460
+ <tr>
461
+ <td><code>@formActionsBackground</code></td>
462
+ <td><code>#f5f5f5</code></td>
463
+ </tr>
464
+ </tbody>
465
+ </table>
466
+ <h4>Form states and alerts</h4>
467
+ <table class="table table-bordered table-striped">
468
+ <tbody>
469
+ <tr>
470
+ <td class="span4"><code>@warningText</code></td>
471
+ <td>#c09853</td>
472
+ <td><span class="swatch" style="background-color: #c09853;"></span></td>
473
+ </tr>
474
+ <tr>
475
+ <td><code>@warningBackground</code></td>
476
+ <td>#f3edd2</td>
477
+ <td class="swatch-col"><span class="swatch" style="background-color: #f3edd2;"></span></td>
478
+ </tr>
479
+ <tr>
480
+ <td><code>@errorText</code></td>
481
+ <td>#b94a48</td>
482
+ <td><span class="swatch" style="background-color: #b94a48;"></span></td>
483
+ </tr>
484
+ <tr>
485
+ <td><code>@errorBackground</code></td>
486
+ <td>#f2dede</td>
487
+ <td><span class="swatch" style="background-color: #f2dede;"></span></td>
488
+ </tr>
489
+ <tr>
490
+ <td><code>@successText</code></td>
491
+ <td>#468847</td>
492
+ <td><span class="swatch" style="background-color: #468847;"></span></td>
493
+ </tr>
494
+ <tr>
495
+ <td><code>@successBackground</code></td>
496
+ <td>#dff0d8</td>
497
+ <td><span class="swatch" style="background-color: #dff0d8;"></span></td>
498
+ </tr>
499
+ <tr>
500
+ <td><code>@infoText</code></td>
501
+ <td>#3a87ad</td>
502
+ <td><span class="swatch" style="background-color: #3a87ad;"></span></td>
503
+ </tr>
504
+ <tr>
505
+ <td><code>@infoBackground</code></td>
506
+ <td>#d9edf7</td>
507
+ <td><span class="swatch" style="background-color: #d9edf7;"></span></td>
508
+ </tr>
509
+ </tbody>
510
+ </table>
511
+
512
+ <h4>Navbar</h4>
513
+ <table class="table table-bordered table-striped">
514
+ <tbody>
515
+ <tr>
516
+ <td class="span4"><code>@navbarHeight</code></td>
517
+ <td>40px</td>
518
+ <td class="swatch-col"></td>
519
+ </tr>
520
+ <tr>
521
+ <td><code>@navbarBackground</code></td>
522
+ <td><code>@grayDarker</code></td>
523
+ <td><span class="swatch" style="background-color: #222;"></span></td>
524
+ </tr>
525
+ <tr>
526
+ <td><code>@navbarBackgroundHighlight</code></td>
527
+ <td><code>@grayDark</code></td>
528
+ <td><span class="swatch" style="background-color: #333;"></span></td>
529
+ </tr>
530
+
531
+ <tr>
532
+ <td><code>@navbarText</code></td>
533
+ <td><code>@grayLight</code></td>
534
+ <td><span class="swatch" style="background-color: #999;"></span></td>
535
+ </tr>
536
+ <tr>
537
+ <td><code>@navbarLinkColor</code></td>
538
+ <td><code>@grayLight</code></td>
539
+ <td><span class="swatch" style="background-color: #999;"></span></td>
540
+ </tr>
541
+ <tr>
542
+ <td><code>@navbarLinkColorHover</code></td>
543
+ <td><code>@white</code></td>
544
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
545
+ </tr>
546
+ <tr>
547
+ <td><code>@navbarLinkColorActive</code></td>
548
+ <td><code>@navbarLinkColorHover</code></td>
549
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
550
+ </tr>
551
+ <tr>
552
+ <td><code>@navbarLinkBackgroundHover</code></td>
553
+ <td><code>transparent</code></td>
554
+ <td><span class="swatch swatch-bordered" style="background-color: transparent;"></span></td>
555
+ </tr>
556
+ <tr>
557
+ <td><code>@navbarLinkBackgroundActive</code></td>
558
+ <td><code>@navbarBackground</code></td>
559
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
560
+ </tr>
561
+
562
+ <tr>
563
+ <td><code>@navbarSearchBackground</code></td>
564
+ <td><code>lighten(@navbarBackground, 25%)</code></td>
565
+ <td><span class="swatch" style="background-color: #666;"></span></td>
566
+ </tr>
567
+ <tr>
568
+ <td><code>@navbarSearchBackgroundFocus</code></td>
569
+ <td><code>@white</code></td>
570
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
571
+ </tr>
572
+ <tr>
573
+ <td><code>@navbarSearchBorder</code></td>
574
+ <td><code>darken(@navbarSearchBackground, 30%)</code></td>
575
+ <td><span class="swatch" style="background-color: #111;"></span></td>
576
+ </tr>
577
+ <tr>
578
+ <td><code>@navbarSearchPlaceholderColor</code></td>
579
+ <td><code>#ccc</code></td>
580
+ <td><span class="swatch" style="background-color: #ccc;"></span></td>
581
+ </tr>
582
+ <tr>
583
+ <td><code>@navbarBrandColor</code></td>
584
+ <td><code>@navbarLinkColor</code></td>
585
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
586
+ </tr>
587
+ </tbody>
588
+ </table>
589
+ <h4>Dropdowns</h4>
590
+ <table class="table table-bordered table-striped">
591
+ <tbody>
592
+ <tr>
593
+ <td class="span4"><code>@dropdownBackground</code></td>
594
+ <td><code>@white</code></td>
595
+ </tr>
596
+ <tr>
597
+ <td><code>@dropdownBorder</code></td>
598
+ <td><code>rgba(0,0,0,.2)</code></td>
599
+ </tr>
600
+ <tr>
601
+ <td><code>@dropdownLinkColor</code></td>
602
+ <td><code>@grayDark</code></td>
603
+ </tr>
604
+ <tr>
605
+ <td><code>@dropdownLinkColorHover</code></td>
606
+ <td><code>@white</code></td>
607
+ </tr>
608
+ <tr>
609
+ <td><code>@dropdownLinkBackgroundHover</code></td>
610
+ <td><code>@linkColor</code></td>
611
+ </tr>
612
+ <tr>
613
+ <td><code>@@dropdownDividerTop</code></td>
614
+ <td><code>#e5e5e5</code></td>
615
+ </tr>
616
+ <tr>
617
+ <td><code>@@dropdownDividerBottom</code></td>
618
+ <td><code>@white</code></td>
619
+ </tr>
620
+ </tbody>
621
+ </table>
622
+ <h4>Hero unit</h4>
623
+ <table class="table table-bordered table-striped">
624
+ <tbody>
625
+ <tr>
626
+ <td class="span4"><code>@heroUnitBackground</code></td>
627
+ <td><code>@grayLighter</code></td>
628
+ <td class="swatch-col"><span class="swatch" style="background-color: #eee;"></span></td>
629
+ </tr>
630
+ <tr>
631
+ <td class="span2"><code>@heroUnitHeadingColor</code></td>
632
+ <td><code>inherit</code></td>
633
+ <td></td>
634
+ </tr>
635
+ <tr>
636
+ <td><code>@heroUnitLeadColor</code></td>
637
+ <td><code>inhereit</code></td>
638
+ <td></td>
639
+ </tr>
640
+ </tbody>
641
+ </table>
642
+
643
+
644
+</section>
645
+
646
+
647
+
648
+<!-- MIXINS
649
+================================================== -->
650
+<section id="mixins">
651
+ <div class="page-header">
652
+ <h1>Bootstrap mixins <small></small></h1>
653
+ </div>
654
+ <h2>About mixins</h2>
655
+ <div class="row">
656
+ <div class="span4">
657
+ <h3>Basic mixins</h3>
658
+ <p>A basic mixin is essentially an include or a partial for a snippet of CSS. They're written just like a CSS class and can be called anywhere.</p>
659
+<pre class="prettyprint linenums">
660
+.element {
661
+ .clearfix();
662
+}
663
+</pre>
664
+ </div><!-- /span4 -->
665
+ <div class="span4">
666
+ <h3>Parametric mixins</h3>
667
+ <p>A parametric mixin is just like a basic mixin, but it also accepts parameters (hence the name) with optional default values.</p>
668
+<pre class="prettyprint linenums">
669
+.element {
670
+ .border-radius(4px);
671
+}
672
+</pre>
673
+ </div><!-- /span4 -->
674
+ <div class="span4">
675
+ <h3>Easily add your own</h3>
676
+ <p>Nearly all of Bootstrap's mixins are stored in mixins.less, a wonderful utility .less file that enables you to use a mixin in any of the .less files in the toolkit.</p>
677
+ <p>So, go ahead and use the existing ones or feel free to add your own as you need.</p>
678
+ </div><!-- /span4 -->
679
+ </div><!-- /row -->
680
+ <h2>Included mixins</h2>
681
+ <h3>Utilities</h3>
682
+ <table class="table table-bordered table-striped">
683
+ <thead>
684
+ <tr>
685
+ <th class="span4">Mixin</th>
686
+ <th>Parameters</th>
687
+ <th>Usage</th>
688
+ </tr>
689
+ </thead>
690
+ <tbody>
691
+ <tr>
692
+ <td><code>.clearfix()</code></td>
693
+ <td><em class="muted">none</em></td>
694
+ <td>Add to any parent to clear floats within</td>
695
+ </tr>
696
+ <tr>
697
+ <td><code>.tab-focus()</code></td>
698
+ <td><em class="muted">none</em></td>
699
+ <td>Apply the Webkit focus style and round Firefox outline</td>
700
+ </tr>
701
+ <tr>
702
+ <td><code>.center-block()</code></td>
703
+ <td><em class="muted">none</em></td>
704
+ <td>Auto center a block-level element using <code>margin: auto</code></td>
705
+ </tr>
706
+ <tr>
707
+ <td><code>.ie7-inline-block()</code></td>
708
+ <td><em class="muted">none</em></td>
709
+ <td>Use in addition to regular <code>display: inline-block</code> to get IE7 support</td>
710
+ </tr>
711
+ <tr>
712
+ <td><code>.size()</code></td>
713
+ <td><code>@height @width</code></td>
714
+ <td>Quickly set the height and width on one line</td>
715
+ </tr>
716
+ <tr>
717
+ <td><code>.square()</code></td>
718
+ <td><code>@size</code></td>
719
+ <td>Builds on <code>.size()</code> to set the width and height as same value</td>
720
+ </tr>
721
+ <tr>
722
+ <td><code>.opacity()</code></td>
723
+ <td><code>@opacity</code></td>
724
+ <td>Set, in whole numbers, the opacity percentage (e.g., "50" or "75")</td>
725
+ </tr>
726
+ </tbody>
727
+ </table>
728
+ <h3>Forms</h3>
729
+ <table class="table table-bordered table-striped">
730
+ <thead>
731
+ <tr>
732
+ <th class="span4">Mixin</th>
733
+ <th>Parameters</th>
734
+ <th>Usage</th>
735
+ </tr>
736
+ </thead>
737
+ <tbody>
738
+ <tr>
739
+ <td><code>.placeholder()</code></td>
740
+ <td><code>@color: @placeholderText</code></td>
741
+ <td>Set the <code>placeholder</code> text color for inputs</td>
742
+ </tr>
743
+ </tbody>
744
+ </table>
745
+ <h3>Typography</h3>
746
+ <table class="table table-bordered table-striped">
747
+ <thead>
748
+ <tr>
749
+ <th class="span4">Mixin</th>
750
+ <th>Parameters</th>
751
+ <th>Usage</th>
752
+ </tr>
753
+ </thead>
754
+ <tbody>
755
+ <tr>
756
+ <td><code>#font > #family > .serif()</code></td>
757
+ <td><em class="muted">none</em></td>
758
+ <td>Make an element use a serif font stack</td>
759
+ </tr>
760
+ <tr>
761
+ <td><code>#font > #family > .sans-serif()</code></td>
762
+ <td><em class="muted">none</em></td>
763
+ <td>Make an element use a sans-serif font stack</td>
764
+ </tr>
765
+ <tr>
766
+ <td><code>#font > #family > .monospace()</code></td>
767
+ <td><em class="muted">none</em></td>
768
+ <td>Make an element use a monospace font stack</td>
769
+ </tr>
770
+ <tr>
771
+ <td><code>#font > .shorthand()</code></td>
772
+ <td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
773
+ <td>Easily set font size, weight, and leading</td>
774
+ </tr>
775
+ <tr>
776
+ <td><code>#font > .serif()</code></td>
777
+ <td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
778
+ <td>Set font family to serif, and control size, weight, and leading</td>
779
+ </tr>
780
+ <tr>
781
+ <td><code>#font > .sans-serif()</code></td>
782
+ <td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
783
+ <td>Set font family to sans-serif, and control size, weight, and leading</td>
784
+ </tr>
785
+ <tr>
786
+ <td><code>#font > .monospace()</code></td>
787
+ <td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
788
+ <td>Set font family to monospace, and control size, weight, and leading</td>
789
+ </tr>
790
+ </tbody>
791
+ </table>
792
+ <h3>Grid system</h3>
793
+ <table class="table table-bordered table-striped">
794
+ <thead>
795
+ <tr>
796
+ <th class="span4">Mixin</th>
797
+ <th>Parameters</th>
798
+ <th>Usage</th>
799
+ </tr>
800
+ </thead>
801
+ <tbody>
802
+ <tr>
803
+ <td><code>.container-fixed()</code></td>
804
+ <td><em class="muted">none</em></td>
805
+ <td>Create a horizontally centered container for holding your content</td>
806
+ </tr>
807
+ <tr>
808
+ <td><code>#grid > .core()</code></td>
809
+ <td><code>@gridColumnWidth, @gridGutterWidth</code></td>
810
+ <td>Generate a pixel grid system (container, row, and columns) with <em>n</em> columns and <em>x</em> pixel wide gutter</td>
811
+ </tr>
812
+ <tr>
813
+ <td><code>#grid > .fluid()</code></td>
814
+ <td><code>@fluidGridColumnWidth, @fluidGridGutterWidth</code></td>
815
+ <td>Generate a percent grid system with <em>n</em> columns and <em>x</em> % wide gutter</td>
816
+ </tr>
817
+ <tr>
818
+ <td><code>#grid > .input()</code></td>
819
+ <td><code>@gridColumnWidth, @gridGutterWidth</code></td>
820
+ <td>Generate the pixel grid system for <code>input</code> elements, accounting for padding and borders</td>
821
+ </tr>
822
+ <tr>
823
+ <td><code>.makeColumn</code></td>
824
+ <td><code>@columns: 1, @offset: 0</code></td>
825
+ <td>Turn any <code>div</code> into a grid column without the <code>.span*</code> classes</td>
826
+ </tr>
827
+ </tbody>
828
+ </table>
829
+ <h3>CSS3 properties</h3>
830
+ <table class="table table-bordered table-striped">
831
+ <thead>
832
+ <tr>
833
+ <th class="span3">Mixin</th>
834
+ <th>Parameters</th>
835
+ <th>Usage</th>
836
+ </tr>
837
+ </thead>
838
+ <tbody>
839
+ <tr>
840
+ <td><code>.border-radius()</code></td>
841
+ <td><code>@radius</code></td>
842
+ <td>Round the corners of an element. Can be a single value or four space-separated values</td>
843
+ </tr>
844
+ <tr>
845
+ <td><code>.box-shadow()</code></td>
846
+ <td><code>@shadow</code></td>
847
+ <td>Add a drop shadow to an element</td>
848
+ </tr>
849
+ <tr>
850
+ <td><code>.transition()</code></td>
851
+ <td><code>@transition</code></td>
852
+ <td>Add CSS3 transition effect (e.g., <code>all .2s linear</code>)</td>
853
+ </tr>
854
+ <tr>
855
+ <td><code>.rotate()</code></td>
856
+ <td><code>@degrees</code></td>
857
+ <td>Rotate an element <em>n</em> degrees</td>
858
+ </tr>
859
+ <tr>
860
+ <td><code>.scale()</code></td>
861
+ <td><code>@ratio</code></td>
862
+ <td>Scale an element to <em>n</em> times its original size</td>
863
+ </tr>
864
+ <tr>
865
+ <td><code>.translate()</code></td>
866
+ <td><code>@x, @y</code></td>
867
+ <td>Move an element on the x and y planes</td>
868
+ </tr>
869
+ <tr>
870
+ <td><code>.background-clip()</code></td>
871
+ <td><code>@clip</code></td>
872
+ <td>Crop the background of an element (useful for <code>border-radius</code>)</td>
873
+ </tr>
874
+ <tr>
875
+ <td><code>.background-size()</code></td>
876
+ <td><code>@size</code></td>
877
+ <td>Control the size of background images via CSS3</td>
878
+ </tr>
879
+ <tr>
880
+ <td><code>.box-sizing()</code></td>
881
+ <td><code>@boxmodel</code></td>
882
+ <td>Change the box model for an element (e.g., <code>border-box</code> for a full-width <code>input</code>)</td>
883
+ </tr>
884
+ <tr>
885
+ <td><code>.user-select()</code></td>
886
+ <td><code>@select</code></td>
887
+ <td>Control cursor selection of text on a page</td>
888
+ </tr>
889
+ <tr>
890
+ <td><code>.backface-visibility()</code></td>
891
+ <td><code>@visibility: visible</code></td>
892
+ <td>Prevent flickering of content when using CSS 3D transforms</td>
893
+ </tr>
894
+ <tr>
895
+ <td><code>.resizable()</code></td>
896
+ <td><code>@direction: both</code></td>
897
+ <td>Make any element resizable on the right and bottom</td>
898
+ </tr>
899
+ <tr>
900
+ <td><code>.content-columns()</code></td>
901
+ <td><code>@columnCount, @columnGap: @gridGutterWidth</code></td>
902
+ <td>Make the content of any element use CSS3 columns</td>
903
+ </tr>
904
+ <tr>
905
+ <td><code>.hyphens()</code></td>
906
+ <td><code>@mode: auto</code></td>
907
+ <td>CSS3 hyphenation when you want it (includes <code>word-wrap: break-word</code>)</td>
908
+ </tr>
909
+ </tbody>
910
+ </table>
911
+ <h3>Backgrounds and gradients</h3>
912
+ <table class="table table-bordered table-striped">
913
+ <thead>
914
+ <tr>
915
+ <th class="span4">Mixin</th>
916
+ <th>Parameters</th>
917
+ <th>Usage</th>
918
+ </tr>
919
+ </thead>
920
+ <tbody>
921
+ <tr>
922
+ <td><code>#translucent > .background()</code></td>
923
+ <td><code>@color: @white, @alpha: 1</code></td>
924
+ <td>Give an element a translucent background color</td>
925
+ </tr>
926
+ <tr>
927
+ <td><code>#translucent > .border()</code></td>
928
+ <td><code>@color: @white, @alpha: 1</code></td>
929
+ <td>Give an element a translucent border color</td>
930
+ </tr>
931
+ <tr>
932
+ <td><code>#gradient > .vertical()</code></td>
933
+ <td><code>@startColor, @endColor</code></td>
934
+ <td>Create a cross-browser vertical background gradient</td>
935
+ </tr>
936
+ <tr>
937
+ <td><code>#gradient > .horizontal()</code></td>
938
+ <td><code>@startColor, @endColor</code></td>
939
+ <td>Create a cross-browser horizontal background gradient</td>
940
+ </tr>
941
+ <tr>
942
+ <td><code>#gradient > .directional()</code></td>
943
+ <td><code>@startColor, @endColor, @deg</code></td>
944
+ <td>Create a cross-browser directional background gradient</td>
945
+ </tr>
946
+ <tr>
947
+ <td><code>#gradient > .vertical-three-colors()</code></td>
948
+ <td><code>@startColor, @midColor, @colorStop, @endColor</code></td>
949
+ <td>Create a cross-browser three-color background gradient</td>
950
+ </tr>
951
+ <tr>
952
+ <td><code>#gradient > .radial()</code></td>
953
+ <td><code>@innerColor, @outerColor</code></td>
954
+ <td>Create a cross-browser radial background gradient</td>
955
+ </tr>
956
+ <tr>
957
+ <td><code>#gradient > .striped()</code></td>
958
+ <td><code>@color, @angle</code></td>
959
+ <td>Create a cross-browser striped background gradient</td>
960
+ </tr>
961
+ <tr>
962
+ <td><code>#gradientBar()</code></td>
963
+ <td><code>@primaryColor, @secondaryColor</code></td>
964
+ <td>Used for buttons to assign a gradient and slightly darker border</td>
965
+ </tr>
966
+ </tbody>
967
+ </table>
968
+</section>
969
+
970
+
971
+
972
+<!-- COMPILING LESS AND BOOTSTRAP
973
+================================================== -->
974
+<section id="compiling">
975
+ <div class="page-header">
976
+ <h1>Compiling Bootstrap with LESS</h1>
977
+ </div>
978
+ <div class="alert alert-info">
979
+ <strong>Note:</strong> If you're submitting a pull request to GitHub with modified CSS, you <strong>must</strong> recompile the CSS via any of these methods.
980
+ </div>
981
+ <h2>Tools for compiling</h2>
982
+ <div class="row">
983
+ <div class="span4">
984
+ <h3>Node with makefile</h3>
985
+ <p>Install the LESS command line compiler, JSHint, Recess, and uglify-js globally with npm by running the following command:</p>
986
+ <pre>$ npm install -g less jshint recess uglify-js</pre>
987
+ <p>Once installed just run <code>make</code> from the root of your bootstrap directory and you're all set.</p>
988
+ <p>Additionally, if you have <a href="https://github.com/mynyml/watchr">watchr</a> installed, you may run <code>make watch</code> to have bootstrap automatically rebuilt every time you edit a file in the bootstrap lib (this isn't required, just a convenience method).</p>
989
+ </div><!-- /span4 -->
990
+ <div class="span4">
991
+ <h3>Command line</h3>
992
+ <p>Install the LESS command line tool via Node and run the following command:</p>
993
+ <pre>$ lessc ./less/bootstrap.less > bootstrap.css</pre>
994
+ <p>Be sure to include <code>--compress</code> in that command if you're trying to save some bytes!</p>
995
+ </div><!-- /span4 -->
996
+ <div class="span4">
997
+ <h3>Javascript</h3>
998
+ <p><a href="http://lesscss.org/">Download the latest Less.js</a> and include the path to it (and Bootstrap) in the <code><head></code>.</p>
999
+<pre class="prettyprint">
1000
+<link rel="stylesheet/less" href="/path/to/bootstrap.less">
1001
+<script src="/path/to/less.js"></script>
1002
+</pre>
1003
+ <p>To recompile the .less files, just save them and reload your page. Less.js compiles them and stores them in local storage.</p>
1004
+ </div><!-- /span4 -->
1005
+ </div><!-- /row -->
1006
+ <div class="row">
1007
+ <div class="span4">
1008
+ <h3>Unofficial Mac app</h3>
1009
+ <p><a href="http://incident57.com/less/">The unofficial Mac app</a> watches directories of .less files and compiles the code to local files after every save of a watched .less file.</p>
1010
+ <p>If you like, you can toggle preferences in the app for automatic minifying and which directory the compiled files end up in.</p>
1011
+ </div><!-- /span4 -->
1012
+ <div class="span4">
1013
+ <h3>More Mac apps</h3>
1014
+ <h4><a href="http://crunchapp.net/" target="_blank">Crunch</a></h4>
1015
+ <p>Crunch is a great looking LESS editor and compiler built on Adobe Air.</p>
1016
+ <h4><a href="http://incident57.com/codekit/" target="_blank">CodeKit</a></h4>
1017
+ <p>Created by the same guy as the unofficial Mac app, CodeKit is a Mac app that compiles LESS, SASS, Stylus, and CoffeeScript.</p>
1018
+ <h4><a href="http://wearekiss.com/simpless" target="_blank">Simpless</a></h4>
1019
+ <p>Mac, Linux, and PC app for drag and drop compiling of LESS files. Plus, the <a href="https://github.com/Paratron/SimpLESS" target="_blank">source code is on GitHub</a>.</p>
1020
+ </div><!-- /span4 -->
1021
+ </div><!-- /row -->
1022
+</section>
1023
+
1024
+
1025
+ <!-- Footer
1026
+ ================================================== -->
1027
+ <footer class="footer">
1028
+ <p class="pull-right"><a href="#">Back to top</a></p>
1029
+ <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
1030
+ <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
1031
+ <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
1032
+ </footer>
1033
+
1034
+ </div><!-- /container -->
1035
+
1036
+
1037
+
1038
+ <!-- Le javascript
1039
+ ================================================== -->
1040
+ <!-- Placed at the end of the document so the pages load faster -->
1041
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
1042
+ <script src="assets/js/jquery.js"></script>
1043
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
1044
+ <script src="assets/js/bootstrap-transition.js"></script>
1045
+ <script src="assets/js/bootstrap-alert.js"></script>
1046
+ <script src="assets/js/bootstrap-modal.js"></script>
1047
+ <script src="assets/js/bootstrap-dropdown.js"></script>
1048
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
1049
+ <script src="assets/js/bootstrap-tab.js"></script>
1050
+ <script src="assets/js/bootstrap-tooltip.js"></script>
1051
+ <script src="assets/js/bootstrap-popover.js"></script>
1052
+ <script src="assets/js/bootstrap-button.js"></script>
1053
+ <script src="assets/js/bootstrap-collapse.js"></script>
1054
+ <script src="assets/js/bootstrap-carousel.js"></script>
1055
+ <script src="assets/js/bootstrap-typeahead.js"></script>
1056
+ <script src="assets/js/application.js"></script>
1057
+
1058
+
1059
+ </body>
1060
+</html>
docs/docs/likebutton/docs/scaffolding.html
new
+671
@@ -0,0 +1,671 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Scaffolding · Twitter Bootstrap</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ </head>
29
+
30
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
31
+
32
+
33
+ <!-- Navbar
34
+ ================================================== -->
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="brand" href="./index.html">Bootstrap</a>
44
+ <div class="nav-collapse collapse">
45
+ <ul class="nav">
46
+ <li class="">
47
+ <a href="./index.html">Overview</a>
48
+ </li>
49
+ <li class="active">
50
+ <a href="./scaffolding.html">Scaffolding</a>
51
+ </li>
52
+ <li class="">
53
+ <a href="./base-css.html">Base CSS</a>
54
+ </li>
55
+ <li class="">
56
+ <a href="./components.html">Components</a>
57
+ </li>
58
+ <li class="">
59
+ <a href="./javascript.html">Javascript plugins</a>
60
+ </li>
61
+ <li class="">
62
+ <a href="./less.html">Using LESS</a>
63
+ </li>
64
+ <li class="divider-vertical"></li>
65
+ <li class="">
66
+ <a href="./download.html">Customize</a>
67
+ </li>
68
+ <li class="">
69
+ <a href="./examples.html">Examples</a>
70
+ </li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="container">
78
+
79
+<!-- Masthead
80
+================================================== -->
81
+<header class="jumbotron subhead" id="overview">
82
+ <h1>Scaffolding</h1>
83
+ <p class="lead">Bootstrap is built on a responsive 12-column grid. We've also included fixed- and fluid-width layouts based on that system.</p>
84
+ <div class="subnav">
85
+ <ul class="nav nav-pills">
86
+ <li><a href="#global">Global styles</a></li>
87
+ <li><a href="#gridSystem">Grid system</a></li>
88
+ <li><a href="#fluidGridSystem">Fluid grid system</a></li>
89
+ <li><a href="#gridCustomization">Customizing</a></li>
90
+ <li><a href="#layouts">Layouts</a></li>
91
+ <li><a href="#responsive">Responsive design</a></li>
92
+ </ul>
93
+ </div>
94
+</header>
95
+
96
+
97
+
98
+
99
+<!-- Global Bootstrap settings
100
+================================================== -->
101
+<section id="global">
102
+ <div class="page-header">
103
+ <h1>Global styles <small>for CSS reset, typography, and links</small></h1>
104
+ </div>
105
+ <div class="row">
106
+ <div class="span4">
107
+ <h2>Requires HTML5 doctype</h2>
108
+ <p>Bootstrap makes use of HTML elements and CSS properties that require the use of the HTML5 doctype. Be sure to include it at the beginning of every Bootstrapped page in your project.</p>
109
+<pre class="prettyprint linenums">
110
+<!DOCTYPE html>
111
+<html lang="en">
112
+ ...
113
+</html>
114
+</pre>
115
+ </div><!-- /.span -->
116
+ <div class="span4">
117
+ <h2>Typography and links</h2>
118
+ <p>Within the <strong>scaffolding.less</strong> file, we set basic global display, typography, and link styles. Specifically, we:</p>
119
+ <ul>
120
+ <li>Remove margin on the body</li>
121
+ <li>Set <code>background-color: white;</code> on the <code>body</code></li>
122
+ <li>Use the <code>@baseFontFamily</code>, <code>@baseFontSize</code>, and <code>@baseLineHeight</code> attributes as our typographyic base</li>
123
+ <li>Set the global link color via <code>@linkColor</code> and apply link underlines only on <code>:hover</code></li>
124
+ </ul>
125
+ </div><!-- /.span -->
126
+ <div class="span4">
127
+ <h2>Reset via Normalize</h2>
128
+ <p>As of Bootstrap 2, the traditional CSS reset has evolved to make use of elements from <a href="http://necolas.github.com/normalize.css/" target="_blank">Normalize.css</a>, a project by <a href="http://twitter.com/necolas" target="_blank">Nicolas Gallagher</a> that also powers the <a href="http://html5boilerplate.com" target="_blank">HTML5 Boilerplate</a>.</p>
129
+ <p>The new reset can still be found in <strong>reset.less</strong>, but with many elements removed for brevity and accuracy.</p>
130
+ </div><!-- /.span -->
131
+ </div><!-- /.row -->
132
+</section>
133
+
134
+
135
+
136
+
137
+<!-- Grid system
138
+================================================== -->
139
+<section id="gridSystem">
140
+ <div class="page-header">
141
+ <h1>Default grid system <small>12 columns with a responsive twist</small></h1>
142
+ </div>
143
+
144
+ <div class="row show-grid">
145
+ <div class="span1">1</div>
146
+ <div class="span1">1</div>
147
+ <div class="span1">1</div>
148
+ <div class="span1">1</div>
149
+ <div class="span1">1</div>
150
+ <div class="span1">1</div>
151
+ <div class="span1">1</div>
152
+ <div class="span1">1</div>
153
+ <div class="span1">1</div>
154
+ <div class="span1">1</div>
155
+ <div class="span1">1</div>
156
+ <div class="span1">1</div>
157
+ </div>
158
+ <div class="row show-grid">
159
+ <div class="span4">4</div>
160
+ <div class="span4">4</div>
161
+ <div class="span4">4</div>
162
+ </div>
163
+ <div class="row show-grid">
164
+ <div class="span4">4</div>
165
+ <div class="span8">8</div>
166
+ </div>
167
+ <div class="row show-grid">
168
+ <div class="span6">6</div>
169
+ <div class="span6">6</div>
170
+ </div>
171
+ <div class="row show-grid">
172
+ <div class="span12">12</div>
173
+ </div>
174
+ <div class="row">
175
+ <div class="span4">
176
+ <p>The default grid system provided in Bootstrap utilizes <strong>12 columns</strong> that render out at widths of 724px, 940px (default without responsive CSS included), and 1170px. Below 767px viewports, the columns become fluid and stack vertically. </p>
177
+ </div><!-- /.span -->
178
+ <div class="span4">
179
+<pre class="prettyprint linenums">
180
+<div class="row">
181
+ <div class="span4">...</div>
182
+ <div class="span8">...</div>
183
+</div>
184
+</pre>
185
+ </div><!-- /.span -->
186
+ <div class="span4">
187
+ <p>As shown here, a basic layout can be created with two "columns", each spanning a number of the 12 foundational columns we defined as part of our grid system.</p>
188
+ </div><!-- /.span -->
189
+ </div><!-- /.row -->
190
+
191
+ <br>
192
+
193
+ <h2>Offsetting columns</h2>
194
+ <div class="row show-grid">
195
+ <div class="span4">4</div>
196
+ <div class="span4 offset4">4 offset 4</div>
197
+ </div><!-- /row -->
198
+ <div class="row show-grid">
199
+ <div class="span3 offset3">3 offset 3</div>
200
+ <div class="span3 offset3">3 offset 3</div>
201
+ </div><!-- /row -->
202
+ <div class="row show-grid">
203
+ <div class="span8 offset4">8 offset 4</div>
204
+ </div><!-- /row -->
205
+<pre class="prettyprint linenums">
206
+<div class="row">
207
+ <div class="span4">...</div>
208
+ <div class="span4 offset4">...</div>
209
+</div>
210
+</pre>
211
+
212
+ <br>
213
+
214
+ <h2>Nesting columns</h2>
215
+ <div class="row">
216
+ <div class="span6">
217
+ <p>With the static (non-fluid) grid system in Bootstrap, nesting is easy. To nest your content, just add a new <code>.row</code> and set of <code>.span*</code> columns within an existing <code>.span*</code> column.</p>
218
+ <h3>Example</h3>
219
+ <p>Nested rows should include a set of columns that add up to the number of columns of it's parent. For example, two nested <code>.span3</code> columns should be placed within a <code>.span6</code>.</p>
220
+ <div class="row show-grid">
221
+ <div class="span6">
222
+ Level 1 of column
223
+ <div class="row show-grid">
224
+ <div class="span3">
225
+ Level 2
226
+ </div>
227
+ <div class="span3">
228
+ Level 2
229
+ </div>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ </div><!-- /.span -->
234
+ <div class="span6">
235
+<pre class="prettyprint linenums">
236
+<div class="row">
237
+ <div class="span6">
238
+ Level 1 column
239
+ <div class="row">
240
+ <div class="span3">Level 2</div>
241
+ <div class="span3">Level 2</div>
242
+ </div>
243
+ </div>
244
+</div>
245
+</pre>
246
+ </div><!-- /.span -->
247
+ </div><!-- /.row -->
248
+</section>
249
+
250
+
251
+
252
+<!-- Fluid grid system
253
+================================================== -->
254
+<section id="fluidGridSystem">
255
+ <div class="page-header">
256
+ <h1>Fluid grid system <small>12 responsive, percent-based columns</small></h1>
257
+ </div>
258
+
259
+ <h2>Fluid columns</h2>
260
+ <div class="row-fluid show-grid">
261
+ <div class="span1">1</div>
262
+ <div class="span1">1</div>
263
+ <div class="span1">1</div>
264
+ <div class="span1">1</div>
265
+ <div class="span1">1</div>
266
+ <div class="span1">1</div>
267
+ <div class="span1">1</div>
268
+ <div class="span1">1</div>
269
+ <div class="span1">1</div>
270
+ <div class="span1">1</div>
271
+ <div class="span1">1</div>
272
+ <div class="span1">1</div>
273
+ </div>
274
+ <div class="row-fluid show-grid">
275
+ <div class="span4">4</div>
276
+ <div class="span4">4</div>
277
+ <div class="span4">4</div>
278
+ </div>
279
+ <div class="row-fluid show-grid">
280
+ <div class="span4">4</div>
281
+ <div class="span8">8</div>
282
+ </div>
283
+ <div class="row-fluid show-grid">
284
+ <div class="span6">6</div>
285
+ <div class="span6">6</div>
286
+ </div>
287
+ <div class="row-fluid show-grid">
288
+ <div class="span12">12</div>
289
+ </div>
290
+
291
+ <div class="row">
292
+ <div class="span4">
293
+ <h3>Percents, not pixels</h3>
294
+ <p>The fluid grid system uses percents for column widths instead of fixed pixels. It also has the same responsive variations as our fixed grid system, ensuring proper proportions for key screen resolutions and devices.</p>
295
+ </div><!-- /.span -->
296
+ <div class="span4">
297
+ <h3>Fluid rows</h3>
298
+ <p>Make any row fluid simply by changing <code>.row</code> to <code>.row-fluid</code>. The columns stay the exact same, making it super straightforward to flip between fixed and fluid layouts.</p>
299
+ </div><!-- /.span -->
300
+ <div class="span4">
301
+ <h3>Markup</h3>
302
+<pre class="prettyprint linenums">
303
+<div class="row-fluid">
304
+ <div class="span4">...</div>
305
+ <div class="span8">...</div>
306
+</div>
307
+</pre>
308
+ </div><!-- /.span -->
309
+ </div><!-- /.row -->
310
+
311
+ <h2>Fluid nesting</h2>
312
+ <div class="row">
313
+ <div class="span6">
314
+ <p>Nesting with fluid grids is a bit different: the number of nested columns doesn't need to match the parent. Instead, your columns are reset at each level because each row takes up 100% of the parent column.</p>
315
+ <div class="row-fluid show-grid">
316
+ <div class="span12">
317
+ Fluid 12
318
+ <div class="row-fluid show-grid">
319
+ <div class="span6">
320
+ Fluid 6
321
+ </div>
322
+ <div class="span6">
323
+ Fluid 6
324
+ </div>
325
+ </div>
326
+ </div>
327
+ </div>
328
+ </div><!-- /.span -->
329
+ <div class="span6">
330
+<pre class="prettyprint linenums">
331
+<div class="row-fluid">
332
+ <div class="span12">
333
+ Level 1 of column
334
+ <div class="row-fluid">
335
+ <div class="span6">Level 2</div>
336
+ <div class="span6">Level 2</div>
337
+ </div>
338
+ </div>
339
+</div>
340
+</pre>
341
+ </div><!-- /.span -->
342
+ </div><!-- /.row -->
343
+
344
+</section>
345
+
346
+
347
+
348
+<!-- Customizaton
349
+================================================== -->
350
+<section id="gridCustomization">
351
+ <div class="page-header">
352
+ <h1>Grid customization</h1>
353
+ </div>
354
+ <table class="table table-bordered table-striped">
355
+ <thead>
356
+ <tr>
357
+ <th>Variable</th>
358
+ <th>Default value</th>
359
+ <th>Description</th>
360
+ </tr>
361
+ </thead>
362
+ <tbody>
363
+ <tr>
364
+ <td><code>@gridColumns</code></td>
365
+ <td>12</td>
366
+ <td>Number of columns</td>
367
+ </tr>
368
+ <tr>
369
+ <td><code>@gridColumnWidth</code></td>
370
+ <td>60px</td>
371
+ <td>Width of each column</td>
372
+ </tr>
373
+ <tr>
374
+ <td><code>@gridGutterWidth</code></td>
375
+ <td>20px</td>
376
+ <td>Negative space between columns</td>
377
+ </tr>
378
+ </tbody>
379
+ </table>
380
+ <div class="row">
381
+ <div class="span4">
382
+ <h3>Variables in LESS</h3>
383
+ <p>Built into Bootstrap are a handful of variables for customizing the default 940px grid system, documented above. All variables for the grid are stored in variables.less.</p>
384
+ </div><!-- /.span -->
385
+ <div class="span4">
386
+ <h3>How to customize</h3>
387
+ <p>Modifying the grid means changing the three <code>@grid*</code> variables and recompiling Bootstrap. Change the grid variables in variables.less and use one of the <a href="less.html#compiling">four ways documented to recompile</a>. If you're adding more columns, be sure to add the CSS for those in grid.less.</p>
388
+ </div><!-- /.span -->
389
+ <div class="span4">
390
+ <h3>Staying responsive</h3>
391
+ <p>Customization of the grid only works at the default level, the 940px grid. To maintain the responsive aspects of Bootstrap, you'll also have to customize the grids in responsive.less.</p>
392
+ </div><!-- /.span -->
393
+ </div><!-- /.row -->
394
+
395
+</section>
396
+
397
+
398
+
399
+<!-- Layouts (Default and fluid)
400
+================================================== -->
401
+<section id="layouts">
402
+ <div class="page-header">
403
+ <h1>Layouts <small>Basic templates to create webpages</small></h1>
404
+ </div>
405
+
406
+ <div class="row">
407
+ <div class="span6">
408
+ <h2>Fixed layout</h2>
409
+ <p>The default and simple 940px-wide, centered layout for just about any website or page provided by a single <code><div class="container"></code>.</p>
410
+ <div class="mini-layout">
411
+ <div class="mini-layout-body"></div>
412
+ </div>
413
+<pre class="prettyprint linenums">
414
+<body>
415
+ <div class="container">
416
+ ...
417
+ </div>
418
+</body>
419
+</pre>
420
+ </div><!-- /.span -->
421
+ <div class="span6">
422
+ <h2>Fluid layout</h2>
423
+ <p><code><div class="container-fluid"></code> gives flexible page structure, min- and max-widths, and a left-hand sidebar. It's great for apps and docs.</p>
424
+ <div class="mini-layout fluid">
425
+ <div class="mini-layout-sidebar"></div>
426
+ <div class="mini-layout-body"></div>
427
+ </div>
428
+<pre class="prettyprint linenums">
429
+<div class="container-fluid">
430
+ <div class="row-fluid">
431
+ <div class="span2">
432
+ <!--Sidebar content-->
433
+ </div>
434
+ <div class="span10">
435
+ <!--Body content-->
436
+ </div>
437
+ </div>
438
+</div>
439
+</pre>
440
+ </div><!-- /.span -->
441
+ </div><!-- /.row -->
442
+</section>
443
+
444
+
445
+
446
+
447
+<!-- Responsive design
448
+================================================== -->
449
+<section id="responsive">
450
+ <div class="page-header">
451
+ <h1>Responsive design <small>Media queries for various devices and resolutions</small></h1>
452
+ </div>
453
+ <!-- Supported devices -->
454
+ <div class="row">
455
+ <div class="span4">
456
+ <p><img src="assets/img/responsive-illustrations.png" alt="Responsive devices"></p>
457
+ <h3>What they do</h3>
458
+ <p>Media queries allow for custom CSS based on a number of conditions—ratios, widths, display type, etc—but usually focuses around <code>min-width</code> and <code>max-width</code>.</p>
459
+ <ul>
460
+ <li>Modify the width of column in our grid</li>
461
+ <li>Stack elements instead of float wherever necessary</li>
462
+ <li>Resize headings and text to be more appropriate for devices</li>
463
+ </ul>
464
+ <p>Use media queries responsibly and only as a start to your mobile audiences. For larger projects, do consider dedicated code bases and not layers of media queries.</p>
465
+ </div><!-- /.span -->
466
+ <div class="span8">
467
+ <h2>Supported devices</h2>
468
+ <p>Bootstrap supports a handful of media queries in a single file to help make your projects more appropriate on different devices and screen resolutions. Here's what's included:</p>
469
+ <table class="table table-bordered table-striped">
470
+ <thead>
471
+ <tr>
472
+ <th>Label</th>
473
+ <th>Layout width</th>
474
+ <th>Column width</th>
475
+ <th>Gutter width</th>
476
+ </tr>
477
+ </thead>
478
+ <tbody>
479
+ <tr>
480
+ <td>Smartphones</td>
481
+ <td>480px and below</td>
482
+ <td class="muted" colspan="2">Fluid columns, no fixed widths</td>
483
+ </tr>
484
+ <tr>
485
+ <td>Smartphones to tablets</td>
486
+ <td>767px and below</td>
487
+ <td class="muted" colspan="2">Fluid columns, no fixed widths</td>
488
+ </tr>
489
+ <tr>
490
+ <td>Portrait tablets</td>
491
+ <td>768px and above</td>
492
+ <td>42px</td>
493
+ <td>20px</td>
494
+ </tr>
495
+ <tr>
496
+ <td>Default</td>
497
+ <td>980px and up</td>
498
+ <td>60px</td>
499
+ <td>20px</td>
500
+ </tr>
501
+ <tr>
502
+ <td>Large display</td>
503
+ <td>1200px and up</td>
504
+ <td>70px</td>
505
+ <td>30px</td>
506
+ </tr>
507
+ </tbody>
508
+ </table>
509
+
510
+ <h3>Requires meta tag</h3>
511
+ <p>To ensure devices display responsive pages properly, include the viewport meta tag.</p>
512
+ <pre class="prettyprint linenums"><meta name="viewport" content="width=device-width, initial-scale=1.0"></pre>
513
+ </div><!-- /.span -->
514
+ </div><!-- /.row -->
515
+
516
+ <br>
517
+
518
+ <!-- Media query code -->
519
+ <h2>Using the media queries</h2>
520
+ <div class="row">
521
+ <div class="span4">
522
+ <p>Bootstrap doesn't automatically include these media queries, but understanding and adding them is very easy and requires minimal setup. You have a few options for including the responsive features of Bootstrap:</p>
523
+ <ol>
524
+ <li>Use the compiled responsive version, bootstrap-responsive.css</li>
525
+ <li>Add @import "responsive.less" and recompile Bootstrap</li>
526
+ <li>Modify and recompile responsive.less as a separate file</li>
527
+ </ol>
528
+ <p><strong>Why not just include it?</strong> Truth be told, not everything needs to be responsive. Instead of encouraging developers to remove this feature, we figure it best to enable it.</p>
529
+ </div><!-- /.span -->
530
+ <div class="span8">
531
+<pre class="prettyprint linenums">
532
+ /* Landscape phones and down */
533
+ @media (max-width: 480px) { ... }
534
+
535
+ /* Landscape phone to portrait tablet */
536
+ @media (max-width: 767px) { ... }
537
+
538
+ /* Portrait tablet to landscape and desktop */
539
+ @media (min-width: 768px) and (max-width: 979px) { ... }
540
+
541
+ /* Large desktop */
542
+ @media (min-width: 1200px) { ... }
543
+</pre>
544
+ </div><!-- /.span -->
545
+ </div><!-- /.row -->
546
+ <br>
547
+
548
+ <!-- Responsive utility classes -->
549
+ <h2>Responsive utility classes</h2>
550
+ <div class="row">
551
+ <div class="span4">
552
+ <h3>What are they</h2>
553
+ <p>For faster mobile-friendly development, use these basic utility classes for showing and hiding content by device.</p>
554
+ <h3>When to use</h2>
555
+ <p>Use on a limited basis and avoid creating entirely different versions of the same site. Instead, use them to complement each device's presentation.</p>
556
+ <p>For example, you might show a <code><select></code> element for nav on mobile layouts, but not on tablets or desktops.</p>
557
+ </div><!-- /.span -->
558
+ <div class="span8">
559
+ <h3>Support classes</h3>
560
+ <p>Shown here is a table of the classes we support and their effect on a given media query layout (labeled by device). They can be found in <code>responsive.less</code>.</p>
561
+ <table class="table table-bordered table-striped responsive-utilities">
562
+ <thead>
563
+ <tr>
564
+ <th>Class</th>
565
+ <th>Phones <small>480px and below</small></th>
566
+ <th>Tablets <small>767px and below</small></th>
567
+ <th>Desktops <small>768px and above</small></th>
568
+ </tr>
569
+ </thead>
570
+ <tbody>
571
+ <tr>
572
+ <th><code>.visible-phone</code></th>
573
+ <td class="is-visible">Visible</td>
574
+ <td class="is-hidden">Hidden</td>
575
+ <td class="is-hidden">Hidden</td>
576
+ </tr>
577
+ <tr>
578
+ <th><code>.visible-tablet</code></th>
579
+ <td class="is-hidden">Hidden</td>
580
+ <td class="is-visible">Visible</td>
581
+ <td class="is-hidden">Hidden</td>
582
+ </tr>
583
+ <tr>
584
+ <th><code>.visible-desktop</code></th>
585
+ <td class="is-hidden">Hidden</td>
586
+ <td class="is-hidden">Hidden</td>
587
+ <td class="is-visible">Visible</td>
588
+ </tr>
589
+ <tr>
590
+ <th><code>.hidden-phone</code></th>
591
+ <td class="is-hidden">Hidden</td>
592
+ <td class="is-visible">Visible</td>
593
+ <td class="is-visible">Visible</td>
594
+ </tr>
595
+ <tr>
596
+ <th><code>.hidden-tablet</code></th>
597
+ <td class="is-visible">Visible</td>
598
+ <td class="is-hidden">Hidden</td>
599
+ <td class="is-visible">Visible</td>
600
+ </tr>
601
+ <tr>
602
+ <th><code>.hidden-desktop</code></th>
603
+ <td class="is-visible">Visible</td>
604
+ <td class="is-visible">Visible</td>
605
+ <td class="is-hidden">Hidden</td>
606
+ </tr>
607
+ </tbody>
608
+ </table>
609
+ <h3>Test case</h3>
610
+ <p>Resize your browser or load on different devices to test the above classes.</p>
611
+ <h4>Visible on...</h4>
612
+ <p>Green checkmarks indicate that class is visible in your current viewport.</p>
613
+ <ul class="responsive-utilities-test">
614
+ <li>Phone<span class="visible-phone">✔ Phone</span></li>
615
+ <li>Tablet<span class="visible-tablet">✔ Tablet</span></li>
616
+ <li>Desktop<span class="visible-desktop">✔ Desktop</span></li>
617
+ </ul>
618
+ <h4>Hidden on...</h4>
619
+ <p>Here, green checkmarks indicate that class is hidden in your current viewport.</p>
620
+ <ul class="responsive-utilities-test hidden-on">
621
+ <li>Phone<span class="hidden-phone">✔ Phone</span></li>
622
+ <li>Tablet<span class="hidden-tablet">✔ Tablet</span></li>
623
+ <li>Desktop<span class="hidden-desktop">✔ Desktop</span></li>
624
+ </ul>
625
+ </div><!-- /.span -->
626
+ </div><!-- /.row -->
627
+
628
+
629
+ <div class="row">
630
+ <div class="span4">
631
+ </div><!-- /.span -->
632
+ </div><!-- /.row -->
633
+</section>
634
+
635
+
636
+ <!-- Footer
637
+ ================================================== -->
638
+ <footer class="footer">
639
+ <p class="pull-right"><a href="#">Back to top</a></p>
640
+ <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
641
+ <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
642
+ <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
643
+ </footer>
644
+
645
+ </div><!-- /container -->
646
+
647
+
648
+
649
+ <!-- Le javascript
650
+ ================================================== -->
651
+ <!-- Placed at the end of the document so the pages load faster -->
652
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
653
+ <script src="assets/js/jquery.js"></script>
654
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
655
+ <script src="assets/js/bootstrap-transition.js"></script>
656
+ <script src="assets/js/bootstrap-alert.js"></script>
657
+ <script src="assets/js/bootstrap-modal.js"></script>
658
+ <script src="assets/js/bootstrap-dropdown.js"></script>
659
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
660
+ <script src="assets/js/bootstrap-tab.js"></script>
661
+ <script src="assets/js/bootstrap-tooltip.js"></script>
662
+ <script src="assets/js/bootstrap-popover.js"></script>
663
+ <script src="assets/js/bootstrap-button.js"></script>
664
+ <script src="assets/js/bootstrap-collapse.js"></script>
665
+ <script src="assets/js/bootstrap-carousel.js"></script>
666
+ <script src="assets/js/bootstrap-typeahead.js"></script>
667
+ <script src="assets/js/application.js"></script>
668
+
669
+
670
+ </body>
671
+</html>
docs/docs/likebutton/docs/templates/layout.mustache
new
+146
@@ -0,0 +1,146 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>{{title}}</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ {{#production}}
29
+ <script type="text/javascript">
30
+ var _gaq = _gaq || [];
31
+ _gaq.push(['_setAccount', 'UA-146052-10']);
32
+ _gaq.push(['_trackPageview']);
33
+ (function() {
34
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
35
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
36
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
37
+ })();
38
+ </script>
39
+ {{/production}}
40
+ </head>
41
+
42
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
43
+
44
+
45
+ <!-- Navbar
46
+ ================================================== -->
47
+ <div class="navbar navbar-fixed-top">
48
+ <div class="navbar-inner">
49
+ <div class="container">
50
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
51
+ <span class="icon-bar"></span>
52
+ <span class="icon-bar"></span>
53
+ <span class="icon-bar"></span>
54
+ </button>
55
+ <a class="brand" href="./index.html">Bootstrap</a>
56
+ <div class="nav-collapse collapse">
57
+ <ul class="nav">
58
+ <li class="{{index}}">
59
+ <a href="./index.html">{{_i}}Overview{{/i}}</a>
60
+ </li>
61
+ <li class="{{scaffolding}}">
62
+ <a href="./scaffolding.html">{{_i}}Scaffolding{{/i}}</a>
63
+ </li>
64
+ <li class="{{base-css}}">
65
+ <a href="./base-css.html">{{_i}}Base CSS{{/i}}</a>
66
+ </li>
67
+ <li class="{{components}}">
68
+ <a href="./components.html">{{_i}}Components{{/i}}</a>
69
+ </li>
70
+ <li class="{{javascript}}">
71
+ <a href="./javascript.html">{{_i}}Javascript plugins{{/i}}</a>
72
+ </li>
73
+ <li class="{{less}}">
74
+ <a href="./less.html">{{_i}}Using LESS{{/i}}</a>
75
+ </li>
76
+ <li class="divider-vertical"></li>
77
+ <li class="{{download}}">
78
+ <a href="./download.html">{{_i}}Customize{{/i}}</a>
79
+ </li>
80
+ <li class="{{examples}}">
81
+ <a href="./examples.html">{{_i}}Examples{{/i}}</a>
82
+ </li>
83
+ </ul>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ </div>
88
+
89
+ <div class="container">
90
+
91
+{{>body}}
92
+
93
+
94
+ <!-- Footer
95
+ ================================================== -->
96
+ <footer class="footer">
97
+ <p class="pull-right"><a href="#">{{_i}}Back to top{{/i}}</a></p>
98
+ <p>{{_i}}Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.{{/i}}</p>
99
+ <p>{{_i}}Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.{{/i}}</p>
100
+ <p>{{_i}}Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.{{/i}}</p>
101
+ </footer>
102
+
103
+ </div><!-- /container -->
104
+
105
+
106
+
107
+ <!-- Le javascript
108
+ ================================================== -->
109
+ <!-- Placed at the end of the document so the pages load faster -->
110
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
111
+ <script src="assets/js/jquery.js"></script>
112
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
113
+ <script src="assets/js/bootstrap-transition.js"></script>
114
+ <script src="assets/js/bootstrap-alert.js"></script>
115
+ <script src="assets/js/bootstrap-modal.js"></script>
116
+ <script src="assets/js/bootstrap-dropdown.js"></script>
117
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
118
+ <script src="assets/js/bootstrap-tab.js"></script>
119
+ <script src="assets/js/bootstrap-tooltip.js"></script>
120
+ <script src="assets/js/bootstrap-popover.js"></script>
121
+ <script src="assets/js/bootstrap-button.js"></script>
122
+ <script src="assets/js/bootstrap-collapse.js"></script>
123
+ <script src="assets/js/bootstrap-carousel.js"></script>
124
+ <script src="assets/js/bootstrap-typeahead.js"></script>
125
+ <script src="assets/js/application.js"></script>
126
+
127
+ {{#production}}
128
+ <!-- Analytics
129
+ ================================================== -->
130
+ <script>
131
+ var _gauges = _gauges || [];
132
+ (function() {
133
+ var t = document.createElement('script');
134
+ t.type = 'text/javascript';
135
+ t.async = true;
136
+ t.id = 'gauges-tracker';
137
+ t.setAttribute('data-site-id', '4f0dc9fef5a1f55508000013');
138
+ t.src = '//secure.gaug.es/track.js';
139
+ var s = document.getElementsByTagName('script')[0];
140
+ s.parentNode.insertBefore(t, s);
141
+ })();
142
+ </script>
143
+ {{/production}}
144
+
145
+ </body>
146
+</html>
docs/docs/likebutton/docs/templates/pages/base-css.mustache
new
+1594
@@ -0,0 +1,1594 @@
1
+<!-- Masthead
2
+================================================== -->
3
+<header class="jumbotron subhead" id="overview">
4
+ <h1>{{_i}}Base CSS{{/i}}</h1>
5
+ <p class="lead">{{_i}}On top of the scaffolding, basic HTML elements are styled and enhanced with extensible classes to provide a fresh, consistent look and feel.{{/i}}</p>
6
+ <div class="subnav">
7
+ <ul class="nav nav-pills">
8
+ <li><a href="#typography">{{_i}}Typography{{/i}}</a></li>
9
+ <li><a href="#code">{{_i}}Code{{/i}}</a></li>
10
+ <li><a href="#tables">{{_i}}Tables{{/i}}</a></li>
11
+ <li><a href="#forms">{{_i}}Forms{{/i}}</a></li>
12
+ <li><a href="#buttons">{{_i}}Buttons{{/i}}</a></li>
13
+ <li><a href="#icons">{{_i}}Icons by Glyphicons{{/i}}</a></li>
14
+ </ul>
15
+ </div>
16
+</header>
17
+
18
+
19
+<!-- Typography
20
+================================================== -->
21
+<section id="typography">
22
+ <div class="page-header">
23
+ <h1>{{_i}}Typography <small>Headings, paragraphs, lists, and other inline type elements</small>{{/i}}</h1>
24
+ </div>
25
+
26
+ <h2>{{_i}}Headings & body copy{{/i}}</h2>
27
+
28
+ <!-- Headings & Paragraph Copy -->
29
+ <div class="row">
30
+ <div class="span4">
31
+ <h3>{{_i}}Typographic scale{{/i}}</h3>
32
+ <p>{{_i}}The entire typographic grid is based on two Less variables in our variables.less file: <code>@baseFontSize</code> and <code>@baseLineHeight</code>. The first is the base font-size used throughout and the second is the base line-height.{{/i}}</p>
33
+ <p>{{_i}}We use those variables, and some math, to create the margins, paddings, and line-heights of all our type and more.{{/i}}</p>
34
+ </div>
35
+ <div class="span4">
36
+ <h3>{{_i}}Example body text{{/i}}</h3>
37
+ <p>Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula.</p>
38
+ <h3>{{_i}}Lead body copy{{/i}}</h3>
39
+ <p>{{_i}}Make a paragraph stand out by adding <code>.lead</code>.{{/i}}</p>
40
+ <p class="lead">Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus.</p>
41
+ </div>
42
+ <div class="span4">
43
+ <div class="well">
44
+ <h1>h1. {{_i}}Heading 1{{/i}}</h1>
45
+ <h2>h2. {{_i}}Heading 2{{/i}}</h2>
46
+ <h3>h3. {{_i}}Heading 3{{/i}}</h3>
47
+ <h4>h4. {{_i}}Heading 4{{/i}}</h4>
48
+ <h5>h5. {{_i}}Heading 5{{/i}}</h5>
49
+ <h6>h6. {{_i}}Heading 6{{/i}}</h6>
50
+ </div>
51
+ </div>
52
+ </div>
53
+
54
+ <!-- Misc Elements -->
55
+ <h2>{{_i}}Emphasis, address, and abbreviation{{/i}}</h2>
56
+ <table class="table table-bordered table-striped">
57
+ <thead>
58
+ <tr>
59
+ <th>{{_i}}Element{{/i}}</th>
60
+ <th>{{_i}}Usage{{/i}}</th>
61
+ <th>{{_i}}Optional{{/i}}</th>
62
+ </tr>
63
+ </thead>
64
+ <tbody>
65
+ <tr>
66
+ <td>
67
+ <code><strong></code>
68
+ </td>
69
+ <td>
70
+ {{_i}}For emphasizing a snippet of text with <strong>important</strong>{{/i}}
71
+ </td>
72
+ <td>
73
+ <span class="muted">{{_i}}None{{/i}}</span>
74
+ </td>
75
+ </tr>
76
+ <tr>
77
+ <td>
78
+ <code><em></code>
79
+ </td>
80
+ <td>
81
+ {{_i}}For emphasizing a snippet of text with <em>stress</em>{{/i}}
82
+ </td>
83
+ <td>
84
+ <span class="muted">{{_i}}None{{/i}}</span>
85
+ </td>
86
+ </tr>
87
+ <tr>
88
+ <td>
89
+ <code><abbr></code>
90
+ </td>
91
+ <td>
92
+ {{_i}}Wraps abbreviations and acronyms to show the expanded version on hover{{/i}}
93
+ </td>
94
+ <td>
95
+ <p>{{_i}}Include optional <code>title</code> attribute for expanded text{{/i}}</p>
96
+ {{_i}}Use <code>.initialism</code> class for uppercase abbreviations.{{/i}}
97
+ </td>
98
+ </tr>
99
+ <tr>
100
+ <td>
101
+ <code><address></code>
102
+ </td>
103
+ <td>
104
+ {{_i}}For contact information for its nearest ancestor or the entire body of work{{/i}}
105
+ </td>
106
+ <td>
107
+ {{_i}}Preserve formatting by ending all lines with <code><br></code>{{/i}}
108
+ </td>
109
+ </tr>
110
+ </tbody>
111
+ </table>
112
+
113
+ <div class="row">
114
+ <div class="span4">
115
+ <h3>{{_i}}Using emphasis{{/i}}</h3>
116
+ <p><a href="#">Fusce dapibus</a>, <strong>tellus ac cursus commodo</strong>, <em>tortor mauris condimentum nibh</em>, ut fermentum massa justo sit amet risus. Maecenas faucibus mollis interdum. Nulla vitae elit libero, a pharetra augue.</p>
117
+ <p>{{_i}}<strong>Note:</strong> Feel free to use <code><b></code> and <code><i></code> in HTML5, but their usage has changed a bit. <code><b></code> is meant to highlight words or phrases without conveying additional importance while <code><i></code> is mostly for voice, technical terms, etc.{{/i}}</p>
118
+ </div>
119
+ <div class="span4">
120
+ <h3>{{_i}}Example addresses{{/i}}</h3>
121
+ <p>{{_i}}Here are two examples of how the <code><address></code> tag can be used:{{/i}}</p>
122
+ <address>
123
+ <strong>Twitter, Inc.</strong><br>
124
+ 795 Folsom Ave, Suite 600<br>
125
+ San Francisco, CA 94107<br>
126
+ <abbr title="Phone">P:</abbr> (123) 456-7890
127
+ </address>
128
+ <address>
129
+ <strong>{{_i}}Full Name{{/i}}</strong><br>
130
+ <a href="mailto:#">{{_i}}first.last@gmail.com{{/i}}</a>
131
+ </address>
132
+ </div>
133
+ <div class="span4">
134
+ <h3>{{_i}}Example abbreviations{{/i}}</h3>
135
+ <p>{{_i}}Abbreviations with a <code>title</code> attribute have a light dotted bottom border and a help cursor on hover. This gives users extra indication something will be shown on hover.{{/i}}</p>
136
+ <p>{{_i}}Add the <code>initialism</code> class to an abbreviation to increase typographic harmony by giving it a slightly smaller text size.{{/i}}</p>
137
+ <p>{{_i}}<abbr title="HyperText Markup Language" class="initialism">HTML</abbr> is the best thing since sliced bread.{{/i}}</p>
138
+ <p>{{_i}}An abbreviation of the word attribute is <abbr title="attribute">attr</abbr>.{{/i}}</p>
139
+ </div>
140
+ </div>
141
+
142
+
143
+ <!-- Blockquotes -->
144
+ <h2>{{_i}}Blockquotes{{/i}}</h2>
145
+ <table class="table table-bordered table-striped">
146
+ <thead>
147
+ <tr>
148
+ <th>{{_i}}Element{{/i}}</th>
149
+ <th>{{_i}}Usage{{/i}}</th>
150
+ <th>{{_i}}Optional{{/i}}</th>
151
+ </tr>
152
+ </thead>
153
+ <tbody>
154
+ <tr>
155
+ <td>
156
+ <code><blockquote></code>
157
+ </td>
158
+ <td>
159
+ {{_i}}Block-level element for quoting content from another source{{/i}}
160
+ </td>
161
+ <td>
162
+ <p>{{_i}}Add <code>cite</code> attribute for source URL{{/i}}</p>
163
+ {{_i}}Use <code>.pull-left</code> and <code>.pull-right</code> classes for floated options{{/i}}
164
+ </td>
165
+ </tr>
166
+ <tr>
167
+ <td>
168
+ <code><small></code>
169
+ </td>
170
+ <td>
171
+ {{_i}}Optional element for adding a user-facing citation, typically an author with title of work{{/i}}
172
+ </td>
173
+ <td>
174
+ {{_i}}Place the <code><cite></code> around the title or name of source{{/i}}
175
+ </td>
176
+ </tr>
177
+ </tbody>
178
+ </table>
179
+ <div class="row">
180
+ <div class="span4">
181
+ <p>{{_i}}To include a blockquote, wrap <code><blockquote></code> around any <abbr title="HyperText Markup Language">HTML</abbr> as the quote. For straight quotes we recommend a <code><p></code>.{{/i}}</p>
182
+ <p>{{_i}}Include an optional <code><small></code> element to cite your source and you'll get an em dash <code>&mdash;</code> before it for styling purposes.{{/i}}</p>
183
+ </div>
184
+ <div class="span8">
185
+<pre class="prettyprint linenums">
186
+<blockquote>
187
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante venenatis.</p>
188
+ <small>{{_i}}Someone famous{{/i}}</small>
189
+</blockquote>
190
+</pre>
191
+ </div>
192
+ </div><!--/row-->
193
+
194
+ <h3>{{_i}}Example blockquotes{{/i}}</h3>
195
+ <div class="row">
196
+ <div class="span6">
197
+ <p>{{_i}}Default blockquotes are styled as such:{{/i}}</p>
198
+ <blockquote>
199
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante venenatis.</p>
200
+ <small>{{_i}}Someone famous in <cite title="">Body of work</cite>{{/i}}</small>
201
+ </blockquote>
202
+ </div>
203
+ <div class="span6">
204
+ <p>{{_i}}To float your blockquote to the right, add <code>class="pull-right"</code>:{{/i}}</p>
205
+ <blockquote class="pull-right">
206
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante venenatis.</p>
207
+ <small>{{_i}}Someone famous in <cite title="">Body of work</cite>{{/i}}</small>
208
+ </blockquote>
209
+ </div>
210
+ </div>
211
+
212
+
213
+ <!-- Lists -->
214
+ <h2>{{_i}}Lists{{/i}}</h2>
215
+ <div class="row">
216
+ <div class="span4">
217
+ <h3>{{_i}}Unordered{{/i}}</h3>
218
+ <p><code><ul></code></p>
219
+ <ul>
220
+ <li>Lorem ipsum dolor sit amet</li>
221
+ <li>Consectetur adipiscing elit</li>
222
+ <li>Integer molestie lorem at massa</li>
223
+ <li>Facilisis in pretium nisl aliquet</li>
224
+ <li>Nulla volutpat aliquam velit
225
+ <ul>
226
+ <li>Phasellus iaculis neque</li>
227
+ <li>Purus sodales ultricies</li>
228
+ <li>Vestibulum laoreet porttitor sem</li>
229
+ <li>Ac tristique libero volutpat at</li>
230
+ </ul>
231
+ </li>
232
+ <li>Faucibus porta lacus fringilla vel</li>
233
+ <li>Aenean sit amet erat nunc</li>
234
+ <li>Eget porttitor lorem</li>
235
+ </ul>
236
+ </div>
237
+ <div class="span4">
238
+ <h3>{{_i}}Unstyled{{/i}}</h3>
239
+ <p><code><ul class="unstyled"></code></p>
240
+ <ul class="unstyled">
241
+ <li>Lorem ipsum dolor sit amet</li>
242
+ <li>Consectetur adipiscing elit</li>
243
+ <li>Integer molestie lorem at massa</li>
244
+ <li>Facilisis in pretium nisl aliquet</li>
245
+ <li>Nulla volutpat aliquam velit
246
+ <ul>
247
+ <li>Phasellus iaculis neque</li>
248
+ <li>Purus sodales ultricies</li>
249
+ <li>Vestibulum laoreet porttitor sem</li>
250
+ <li>Ac tristique libero volutpat at</li>
251
+ </ul>
252
+ </li>
253
+ <li>Faucibus porta lacus fringilla vel</li>
254
+ <li>Aenean sit amet erat nunc</li>
255
+ <li>Eget porttitor lorem</li>
256
+ </ul>
257
+ </div>
258
+ <div class="span4">
259
+ <h3>{{_i}}Ordered{{/i}}</h3>
260
+ <p><code><ol></code></p>
261
+ <ol>
262
+ <li>Lorem ipsum dolor sit amet</li>
263
+ <li>Consectetur adipiscing elit</li>
264
+ <li>Integer molestie lorem at massa</li>
265
+ <li>Facilisis in pretium nisl aliquet</li>
266
+ <li>Nulla volutpat aliquam velit</li>
267
+ <li>Faucibus porta lacus fringilla vel</li>
268
+ <li>Aenean sit amet erat nunc</li>
269
+ <li>Eget porttitor lorem</li>
270
+ </ol>
271
+ </div>
272
+ </div><!-- /row -->
273
+ <br>
274
+ <div class="row">
275
+ <div class="span4">
276
+ <h3>{{_i}}Description{{/i}}</h3>
277
+ <p><code><dl></code></p>
278
+ <dl>
279
+ <dt>{{_i}}Description lists{{/i}}</dt>
280
+ <dd>{{_i}}A description list is perfect for defining terms.{{/i}}</dd>
281
+ <dt>Euismod</dt>
282
+ <dd>Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.</dd>
283
+ <dd>Donec id elit non mi porta gravida at eget metus.</dd>
284
+ <dt>Malesuada porta</dt>
285
+ <dd>Etiam porta sem malesuada magna mollis euismod.</dd>
286
+ </dl>
287
+ </div>
288
+ <div class="span8">
289
+ <h3>{{_i}}Horizontal description{{/i}}</h3>
290
+ <p><code><dl class="dl-horizontal"></code></p>
291
+ <dl class="dl-horizontal">
292
+ <dt>{{_i}}Description lists{{/i}}</dt>
293
+ <dd>{{_i}}A description list is perfect for defining terms.{{/i}}</dd>
294
+ <dt>Euismod</dt>
295
+ <dd>Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.</dd>
296
+ <dd>Donec id elit non mi porta gravida at eget metus.</dd>
297
+ <dt>Malesuada porta</dt>
298
+ <dd>Etiam porta sem malesuada magna mollis euismod.</dd>
299
+ <dt>Felis euismod semper eget lacinia</dt>
300
+ <dd>Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</dd>
301
+ </dl>
302
+ <hr>
303
+ <p>
304
+ <span class="label label-info">{{_i}}Heads up!{{/i}}</span>
305
+ {{_i}}Horizontal description lists will truncate terms that are too long to fit in the left column fix <code>text-overflow</code>. In narrower viewports, they will change to the default stacked layout.{{/i}}
306
+ </p>
307
+ </div>
308
+ </div><!-- /row -->
309
+</section>
310
+
311
+
312
+
313
+<!-- Code
314
+================================================== -->
315
+<section id="code">
316
+ <div class="page-header">
317
+ <h1>{{_i}}Code{{/i}} <small>{{_i}}Inline and block code snippets{{/i}}</small></h1>
318
+ </div>
319
+ <div class="row">
320
+ <div class="span4">
321
+ <h2>Inline</h2>
322
+ <p>Wrap inline snippets of code with <code><code></code>.</p>
323
+<pre class="prettyprint linenums">
324
+{{_i}}For example, <code>section</code> should be wrapped as inline.{{/i}}
325
+</pre>
326
+ </div><!--/span-->
327
+ <div class="span4">
328
+ <h2>Basic block</h2>
329
+ <p>{{_i}}Use <code><pre></code> for multiple lines of code. Be sure to escape any angle brackets in the code for proper rendering.{{/i}}</p>
330
+<pre>
331
+<p>{{_i}}Sample text here...{{/i}}</p>
332
+</pre>
333
+<pre class="prettyprint linenums" style="margin-bottom: 9px;">
334
+<pre>
335
+ &lt;p&gt;{{_i}}Sample text here...{{/i}}&lt;/p&gt;
336
+</pre>
337
+</pre>
338
+ <p>{{_i}}<strong>Note:</strong> Be sure to keep code within <code><pre></code> tags as close to the left as possible; it will render all tabs.{{/i}}</p>
339
+ <p>{{_i}}You may optionally add the <code>.pre-scrollable</code> class which will set a max-height of 350px and provide a y-axis scrollbar.{{/i}}</p>
340
+ </div><!--/span-->
341
+ <div class="span4">
342
+ <h2>Google Prettify</h2>
343
+ <p>Take the same <code><pre></code> element and add two optional classes for enhanced rendering.</p>
344
+<pre class="prettyprint linenums" style="margin-bottom: 9px;">
345
+<p>{{_i}}Sample text here...{{/i}}</p>
346
+</pre>
347
+<pre class="prettyprint linenums" style="margin-bottom: 9px;">
348
+<pre class="prettyprint
349
+ linenums">
350
+ &lt;p&gt;{{_i}}Sample text here...{{/i}}&lt;/p&gt;
351
+</pre>
352
+</pre>
353
+ <p>{{_i}}<a href="http://code.google.com/p/google-code-prettify/">Download google-code-prettify</a> and view the readme for <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html">how to use</a>.{{/i}}</p>
354
+ </div><!--/span-->
355
+ </div><!--/row-->
356
+</section>
357
+
358
+
359
+
360
+<!-- Tables
361
+================================================== -->
362
+<section id="tables">
363
+ <div class="page-header">
364
+ <h1>{{_i}}Tables <small>For, you guessed it, tabular data</small>{{/i}}</h1>
365
+ </div>
366
+
367
+ <h2>{{_i}}Table markup{{/i}}</h2>
368
+ <div class="row">
369
+ <div class="span8">
370
+ <table class="table table-bordered table-striped">
371
+ <colgroup>
372
+ <col class="span1">
373
+ <col class="span7">
374
+ </colgroup>
375
+ <thead>
376
+ <tr>
377
+ <th>{{_i}}Tag{{/i}}</th>
378
+ <th>{{_i}}Description{{/i}}</th>
379
+ </tr>
380
+ </thead>
381
+ <tbody>
382
+ <tr>
383
+ <td>
384
+ <code><table></code>
385
+ </td>
386
+ <td>
387
+ {{_i}}Wrapping element for displaying data in a tabular format{{/i}}
388
+ </td>
389
+ </tr>
390
+ <tr>
391
+ <td>
392
+ <code><thead></code>
393
+ </td>
394
+ <td>
395
+ {{_i}}Container element for table header rows (<code><tr></code>) to label table columns{{/i}}
396
+ </td>
397
+ </tr>
398
+ <tr>
399
+ <td>
400
+ <code><tbody></code>
401
+ </td>
402
+ <td>
403
+ {{_i}}Container element for table rows (<code><tr></code>) in the body of the table{{/i}}
404
+ </td>
405
+ </tr>
406
+ <tr>
407
+ <td>
408
+ <code><tr></code>
409
+ </td>
410
+ <td>
411
+ {{_i}}Container element for a set of table cells (<code><td></code> or <code><th></code>) that appears on a single row{{/i}}
412
+ </td>
413
+ </tr>
414
+ <tr>
415
+ <td>
416
+ <code><td></code>
417
+ </td>
418
+ <td>
419
+ {{_i}}Default table cell{{/i}}
420
+ </td>
421
+ </tr>
422
+ <tr>
423
+ <td>
424
+ <code><th></code>
425
+ </td>
426
+ <td>
427
+ {{_i}}Special table cell for column (or row, depending on scope and placement) labels{{/i}}<br>
428
+ {{_i}}Must be used within a <code><thead></code>{{/i}}
429
+ </td>
430
+ </tr>
431
+ <tr>
432
+ <td>
433
+ <code><caption></code>
434
+ </td>
435
+ <td>
436
+ {{_i}}Description or summary of what the table holds, especially useful for screen readers{{/i}}
437
+ </td>
438
+ </tr>
439
+ </tbody>
440
+ </table>
441
+ </div>
442
+ <div class="span4">
443
+<pre class="prettyprint linenums">
444
+<table>
445
+ <thead>
446
+ <tr>
447
+ <th>…</th>
448
+ <th>…</th>
449
+ </tr>
450
+ </thead>
451
+ <tbody>
452
+ <tr>
453
+ <td>…</td>
454
+ <td>…</td>
455
+ </tr>
456
+ </tbody>
457
+</table>
458
+</pre>
459
+ </div>
460
+ </div>
461
+
462
+ <h2>{{_i}}Table options{{/i}}</h2>
463
+ <table class="table table-bordered table-striped">
464
+ <thead>
465
+ <tr>
466
+ <th>{{_i}}Name{{/i}}</th>
467
+ <th>{{_i}}Class{{/i}}</th>
468
+ <th>{{_i}}Description{{/i}}</th>
469
+ </tr>
470
+ </thead>
471
+ <tbody>
472
+ <tr>
473
+ <td>{{_i}}Default{{/i}}</td>
474
+ <td class="muted">{{_i}}None{{/i}}</td>
475
+ <td>{{_i}}No styles, just columns and rows{{/i}}</td>
476
+ </tr>
477
+ <tr>
478
+ <td>{{_i}}Basic{{/i}}</td>
479
+ <td>
480
+ <code>.table</code>
481
+ </td>
482
+ <td>{{_i}}Only horizontal lines between rows{{/i}}</td>
483
+ </tr>
484
+ <tr>
485
+ <td>{{_i}}Bordered{{/i}}</td>
486
+ <td>
487
+ <code>.table-bordered</code>
488
+ </td>
489
+ <td>{{_i}}Rounds corners and adds outer border{{/i}}</td>
490
+ </tr>
491
+ <tr>
492
+ <td>{{_i}}Zebra-stripe{{/i}}</td>
493
+ <td>
494
+ <code>.table-striped</code>
495
+ </td>
496
+ <td>{{_i}}Adds light gray background color to odd rows (1, 3, 5, etc){{/i}}</td>
497
+ </tr>
498
+ <tr>
499
+ <td>{{_i}}Condensed{{/i}}</td>
500
+ <td>
501
+ <code>.table-condensed</code>
502
+ </td>
503
+ <td>{{_i}}Cuts vertical padding in half, from 8px to 4px, within all <code>td</code> and <code>th</code> elements{{/i}}</td>
504
+ </tr>
505
+ </tbody>
506
+ </table>
507
+
508
+
509
+ <h2>{{_i}}Example tables{{/i}}</h2>
510
+
511
+ <h3>1. {{_i}}Default table styles{{/i}}</h3>
512
+ <div class="row">
513
+ <div class="span4">
514
+ <p>{{_i}}Tables are automatically styled with only a few borders to ensure readability and maintain structure. With 2.0, the <code>.table</code> class is required.{{/i}}</p>
515
+<pre class="prettyprint linenums">
516
+<table class="table">
517
+ …
518
+</table></pre>
519
+ </div>
520
+ <div class="span8">
521
+ <table class="table">
522
+ <thead>
523
+ <tr>
524
+ <th>#</th>
525
+ <th>{{_i}}First Name{{/i}}</th>
526
+ <th>{{_i}}Last Name{{/i}}</th>
527
+ <th>{{_i}}Username{{/i}}</th>
528
+ </tr>
529
+ </thead>
530
+ <tbody>
531
+ <tr>
532
+ <td>1</td>
533
+ <td>Mark</td>
534
+ <td>Otto</td>
535
+ <td>@mdo</td>
536
+ </tr>
537
+ <tr>
538
+ <td>2</td>
539
+ <td>Jacob</td>
540
+ <td>Thornton</td>
541
+ <td>@fat</td>
542
+ </tr>
543
+ <tr>
544
+ <td>3</td>
545
+ <td>Larry</td>
546
+ <td>the Bird</td>
547
+ <td>@twitter</td>
548
+ </tr>
549
+ </tbody>
550
+ </table>
551
+ </div>
552
+ </div>
553
+
554
+
555
+ <h3>2. {{_i}}Striped table{{/i}}</h3>
556
+ <div class="row">
557
+ <div class="span4">
558
+ <p>{{_i}}Get a little fancy with your tables by adding zebra-striping—just add the <code>.table-striped</code> class.{{/i}}</p>
559
+ <p class="muted">{{_i}}<strong>Note:</strong> Striped tables use the <code>:nth-child</code> CSS selector and is not available in IE7-IE8.{{/i}}</p>
560
+<pre class="prettyprint linenums" style="margin-bottom: 18px;">
561
+<table class="table table-striped">
562
+ …
563
+</table></pre>
564
+ </div>
565
+ <div class="span8">
566
+ <table class="table table-striped">
567
+ <thead>
568
+ <tr>
569
+ <th>#</th>
570
+ <th>{{_i}}First Name{{/i}}</th>
571
+ <th>{{_i}}Last Name{{/i}}</th>
572
+ <th>{{_i}}Username{{/i}}</th>
573
+ </tr>
574
+ </thead>
575
+ <tbody>
576
+ <tr>
577
+ <td>1</td>
578
+ <td>Mark</td>
579
+ <td>Otto</td>
580
+ <td>@mdo</td>
581
+ </tr>
582
+ <tr>
583
+ <td>2</td>
584
+ <td>Jacob</td>
585
+ <td>Thornton</td>
586
+ <td>@fat</td>
587
+ </tr>
588
+ <tr>
589
+ <td>3</td>
590
+ <td>Larry</td>
591
+ <td>the Bird</td>
592
+ <td>@twitter</td>
593
+ </tr>
594
+ </tbody>
595
+ </table>
596
+ </div>
597
+ </div>
598
+
599
+
600
+ <h3>3. {{_i}}Bordered table{{/i}}</h3>
601
+ <div class="row">
602
+ <div class="span4">
603
+ <p>{{_i}}Add borders around the entire table and rounded corners for aesthetic purposes.{{/i}}</p>
604
+<pre class="prettyprint linenums">
605
+<table class="table table-bordered">
606
+ …
607
+</table></pre>
608
+ </div>
609
+ <div class="span8">
610
+ <table class="table table-bordered">
611
+ <thead>
612
+ <tr>
613
+ <th>#</th>
614
+ <th>{{_i}}First Name{{/i}}</th>
615
+ <th>{{_i}}Last Name{{/i}}</th>
616
+ <th>{{_i}}Username{{/i}}</th>
617
+ </tr>
618
+ </thead>
619
+ <tbody>
620
+ <tr>
621
+ <td rowspan="2">1</td>
622
+ <td>Mark</td>
623
+ <td>Otto</td>
624
+ <td>@mdo</td>
625
+ </tr>
626
+ <tr>
627
+ <td>Mark</td>
628
+ <td>Otto</td>
629
+ <td>@TwBootstrap</td>
630
+ </tr>
631
+ <tr>
632
+ <td>2</td>
633
+ <td>Jacob</td>
634
+ <td>Thornton</td>
635
+ <td>@fat</td>
636
+ </tr>
637
+ <tr>
638
+ <td>3</td>
639
+ <td colspan="2">Larry the Bird</td>
640
+ <td>@twitter</td>
641
+ </tr>
642
+ </tbody>
643
+ </table>
644
+ </div>
645
+ </div>
646
+
647
+
648
+ <h3>4. {{_i}}Condensed table{{/i}}</h3>
649
+ <div class="row">
650
+ <div class="span4">
651
+ <p>{{_i}}Make your tables more compact by adding the <code>.table-condensed</code> class to cut table cell padding in half (from 8px to 4px).{{/i}}</p>
652
+<pre class="prettyprint linenums" style="margin-bottom: 18px;">
653
+<table class="table table-condensed">
654
+ …
655
+</table></pre>
656
+ </div>
657
+ <div class="span8">
658
+ <table class="table table-condensed">
659
+ <thead>
660
+ <tr>
661
+ <th>#</th>
662
+ <th>{{_i}}First Name{{/i}}</th>
663
+ <th>{{_i}}Last Name{{/i}}</th>
664
+ <th>{{_i}}Username{{/i}}</th>
665
+ </tr>
666
+ </thead>
667
+ <tbody>
668
+ <tr>
669
+ <td>1</td>
670
+ <td>Mark</td>
671
+ <td>Otto</td>
672
+ <td>@mdo</td>
673
+ </tr>
674
+ <tr>
675
+ <td>2</td>
676
+ <td>Jacob</td>
677
+ <td>Thornton</td>
678
+ <td>@fat</td>
679
+ </tr>
680
+ <tr>
681
+ <td>3</td>
682
+ <td colspan="2">Larry the Bird</td>
683
+ <td>@twitter</td>
684
+ </tr>
685
+ </tbody>
686
+ </table>
687
+ </div>
688
+ </div>
689
+
690
+
691
+
692
+ <h3>5. {{_i}}Combine them all!{{/i}}</h3>
693
+ <div class="row">
694
+ <div class="span4">
695
+ <p>{{_i}}Feel free to combine any of the table classes to achieve different looks by utilizing any of the available classes.{{/i}}</p>
696
+<pre class="prettyprint linenums" style="margin-bottom: 18px;">
697
+<table class="table table-striped table-bordered table-condensed">
698
+ ...
699
+</table></pre>
700
+ </div>
701
+ <div class="span8">
702
+ <table class="table table-striped table-bordered table-condensed">
703
+ <thead>
704
+ <tr>
705
+ <th></th>
706
+ <th colspan="2">{{_i}}Full name{{/i}}</th>
707
+ <th></th>
708
+ </tr>
709
+ <tr>
710
+ <th>#</th>
711
+ <th>{{_i}}First Name{{/i}}</th>
712
+ <th>{{_i}}Last Name{{/i}}</th>
713
+ <th>{{_i}}Username{{/i}}</th>
714
+ </tr>
715
+ </thead>
716
+ <tbody>
717
+ <tr>
718
+ <tr>
719
+ <td>1</td>
720
+ <td>Mark</td>
721
+ <td>Otto</td>
722
+ <td>@mdo</td>
723
+ </tr>
724
+ <tr>
725
+ <td>2</td>
726
+ <td>Jacob</td>
727
+ <td>Thornton</td>
728
+ <td>@fat</td>
729
+ </tr>
730
+ <tr>
731
+ <td>3</td>
732
+ <td colspan="2">Larry the Bird</td>
733
+ <td>@twitter</td>
734
+ </tr>
735
+ </tbody>
736
+ </table>
737
+ </div>
738
+ </div>
739
+</section>
740
+
741
+
742
+
743
+<!-- Forms
744
+================================================== -->
745
+<section id="forms">
746
+ <div class="page-header">
747
+ <h1>{{_i}}Forms{{/i}}</h1>
748
+ </div>
749
+ <div class="row">
750
+ <div class="span4">
751
+ <h2>{{_i}}Flexible HTML and CSS{{/i}}</h2>
752
+ <p>{{_i}}The best part about forms in Bootstrap is that all your inputs and controls look great no matter how you build them in your markup. No superfluous HTML is required, but we provide the patterns for those who require it.{{/i}}</p>
753
+ <p>{{_i}}More complicated layouts come with succinct and scalable classes for easy styling and event binding, so you're covered at every step.{{/i}}</p>
754
+ </div>
755
+ <div class="span4">
756
+ <h2>{{_i}}Four layouts included{{/i}}</h2>
757
+ <p>{{_i}}Bootstrap comes with support for four types of form layouts:{{/i}}</p>
758
+ <ul>
759
+ <li>{{_i}}Vertical (default){{/i}}</li>
760
+ <li>{{_i}}Search{{/i}}</li>
761
+ <li>{{_i}}Inline{{/i}}</li>
762
+ <li>{{_i}}Horizontal{{/i}}</li>
763
+ </ul>
764
+ <p>{{_i}}Different types of form layouts require some changes to markup, but the controls themselves remain and behave the same.{{/i}}</p>
765
+ </div>
766
+ <div class="span4">
767
+ <h2>{{_i}}Control states and more{{/i}}</h2>
768
+ <p>{{_i}}Bootstrap's forms include styles for all the base form controls like input, textarea, and select you'd expect. But it also comes with a number of custom components like appended and prepended inputs and support for lists of checkboxes.{{/i}}</p>
769
+ <p>{{_i}}States like error, warning, and success are included for each type of form control. Also included are styles for disabled controls.{{/i}}</p>
770
+ </div>
771
+ </div>
772
+
773
+ <h2>{{_i}}Four types of forms{{/i}}</h2>
774
+ <p>{{_i}}Bootstrap provides simple markup and styles for four styles of common web forms.{{/i}}</p>
775
+ <table class="table table-bordered table-striped">
776
+ <thead>
777
+ <tr>
778
+ <th>{{_i}}Name{{/i}}</th>
779
+ <th>{{_i}}Class{{/i}}</th>
780
+ <th>{{_i}}Description{{/i}}</th>
781
+ </tr>
782
+ </thead>
783
+ <tbody>
784
+ <tr>
785
+ <th>{{_i}}Vertical (default){{/i}}</th>
786
+ <td><code>.form-vertical</code> <span class="muted">({{_i}}not required{{/i}})</span></td>
787
+ <td>{{_i}}Stacked, left-aligned labels over controls{{/i}}</td>
788
+ </tr>
789
+ <tr>
790
+ <th>{{_i}}Inline{{/i}}</th>
791
+ <td><code>.form-inline</code></td>
792
+ <td>{{_i}}Left-aligned label and inline-block controls for compact style{{/i}}</td>
793
+ </tr>
794
+ <tr>
795
+ <th>{{_i}}Search{{/i}}</th>
796
+ <td><code>.form-search</code></td>
797
+ <td>{{_i}}Extra-rounded text input for a typical search aesthetic{{/i}}</td>
798
+ </tr>
799
+ <tr>
800
+ <th>{{_i}}Horizontal{{/i}}</th>
801
+ <td><code>.form-horizontal</code></td>
802
+ <td>{{_i}}Float left, right-aligned labels on same line as controls{{/i}}</td>
803
+ </tr>
804
+ </tbody>
805
+ </table>
806
+
807
+
808
+ <h2>{{_i}}Example forms <small>using just form controls, no extra markup</small>{{/i}}</h2>
809
+ <div class="row">
810
+ <div class="span6">
811
+ <h3>{{_i}}Basic form{{/i}}</h3>
812
+ <p>{{_i}}Smart and lightweight defaults without extra markup.{{/i}}</p>
813
+ <form class="well">
814
+ <label>{{_i}}Label name{{/i}}</label>
815
+ <input type="text" class="span3" placeholder="{{_i}}Type something…{{/i}}">
816
+ <p class="help-block">{{_i}}Example block-level help text here.{{/i}}</p>
817
+ <label class="checkbox">
818
+ <input type="checkbox"> {{_i}}Check me out{{/i}}
819
+ </label>
820
+ <button type="submit" class="btn">{{_i}}Submit{{/i}}</button>
821
+ </form>
822
+<pre class="prettyprint linenums">
823
+<form class="well">
824
+ <label>{{_i}}Label name{{/i}}</label>
825
+ <input type="text" class="span3" placeholder="{{_i}}Type something…{{/i}}">
826
+ <span class="help-block">Example block-level help text here.</span>
827
+ <label class="checkbox">
828
+ <input type="checkbox"> {{_i}}Check me out{{/i}}
829
+ </label>
830
+ <button type="submit" class="btn">{{_i}}Submit{{/i}}</button>
831
+</form>
832
+</pre>
833
+ </div>
834
+ <div class="span6">
835
+ <h3>{{_i}}Search form{{/i}}</h3>
836
+ <p>{{_i}}Add <code>.form-search</code> to the form and <code>.search-query</code> to the <code>input</code>.{{/i}}</p>
837
+ <form class="well form-search">
838
+ <input type="text" class="input-medium search-query">
839
+ <button type="submit" class="btn">{{_i}}Search{{/i}}</button>
840
+ </form>
841
+<pre class="prettyprint linenums">
842
+<form class="well form-search">
843
+ <input type="text" class="input-medium search-query">
844
+ <button type="submit" class="btn">{{_i}}Search{{/i}}</button>
845
+</form>
846
+</pre>
847
+
848
+ <h3>{{_i}}Inline form{{/i}}</h3>
849
+ <p>{{_i}}Add <code>.form-inline</code> to finesse the vertical alignment and spacing of form controls.{{/i}}</p>
850
+ <form class="well form-inline">
851
+ <input type="text" class="input-small" placeholder="{{_i}}Email{{/i}}">
852
+ <input type="password" class="input-small" placeholder="{{_i}}Password{{/i}}">
853
+ <label class="checkbox">
854
+ <input type="checkbox"> {{_i}}Remember me{{/i}}
855
+ </label>
856
+ <button type="submit" class="btn">{{_i}}Sign in{{/i}}</button>
857
+ </form>
858
+<pre class="prettyprint linenums">
859
+<form class="well form-inline">
860
+ <input type="text" class="input-small" placeholder="{{_i}}Email{{/i}}">
861
+ <input type="password" class="input-small" placeholder="{{_i}}Password{{/i}}">
862
+ <label class="checkbox">
863
+ <input type="checkbox"> {{_i}}Remember me{{/i}}
864
+ </label>
865
+ <button type="submit" class="btn">{{_i}}Sign in{{/i}}</button>
866
+</form>
867
+</pre>
868
+ </div><!-- /.span -->
869
+ </div><!-- /row -->
870
+
871
+ <br>
872
+
873
+ <h2>{{_i}}Horizontal forms{{/i}}</h2>
874
+ <div class="row">
875
+ <div class="span4">
876
+ <p>{{_i}}{{/i}}</p>
877
+ <p>{{_i}}Shown on the right are all the default form controls we support. Here's the bulleted list:{{/i}}</p>
878
+ <ul>
879
+ <li>{{_i}}text inputs (text, password, email, etc){{/i}}</li>
880
+ <li>{{_i}}checkbox{{/i}}</li>
881
+ <li>{{_i}}radio{{/i}}</li>
882
+ <li>{{_i}}select{{/i}}</li>
883
+ <li>{{_i}}multiple select{{/i}}</li>
884
+ <li>{{_i}}file input{{/i}}</li>
885
+ <li>{{_i}}textarea{{/i}}</li>
886
+ </ul>
887
+ </div><!-- /.span -->
888
+ <div class="span8">
889
+ <form class="form-horizontal">
890
+ <fieldset>
891
+ <div class="control-group">
892
+ <label class="control-label" for="input01">{{_i}}Text input{{/i}}</label>
893
+ <div class="controls">
894
+ <input type="text" class="input-xlarge" id="input01">
895
+ <p class="help-block">{{_i}}In addition to freeform text, any HTML5 text-based input appears like so.{{/i}}</p>
896
+ </div>
897
+ </div>
898
+ <div class="control-group">
899
+ <label class="control-label" for="optionsCheckbox">{{_i}}Checkbox{{/i}}</label>
900
+ <div class="controls">
901
+ <label class="checkbox">
902
+ <input type="checkbox" id="optionsCheckbox" value="option1">
903
+ {{_i}}Option one is this and that—be sure to include why it's great{{/i}}
904
+ </label>
905
+ </div>
906
+ </div>
907
+ <div class="control-group">
908
+ <label class="control-label" for="select01">{{_i}}Select list{{/i}}</label>
909
+ <div class="controls">
910
+ <select id="select01">
911
+ <option>something</option>
912
+ <option>2</option>
913
+ <option>3</option>
914
+ <option>4</option>
915
+ <option>5</option>
916
+ </select>
917
+ </div>
918
+ </div>
919
+ <div class="control-group">
920
+ <label class="control-label" for="multiSelect">{{_i}}Multicon-select{{/i}}</label>
921
+ <div class="controls">
922
+ <select multiple="multiple" id="multiSelect">
923
+ <option>1</option>
924
+ <option>2</option>
925
+ <option>3</option>
926
+ <option>4</option>
927
+ <option>5</option>
928
+ </select>
929
+ </div>
930
+ </div>
931
+ <div class="control-group">
932
+ <label class="control-label" for="fileInput">{{_i}}File input{{/i}}</label>
933
+ <div class="controls">
934
+ <input class="input-file" id="fileInput" type="file">
935
+ </div>
936
+ </div>
937
+ <div class="control-group">
938
+ <label class="control-label" for="textarea">{{_i}}Textarea{{/i}}</label>
939
+ <div class="controls">
940
+ <textarea class="input-xlarge" id="textarea" rows="3"></textarea>
941
+ </div>
942
+ </div>
943
+ <div class="form-actions">
944
+ <button type="submit" class="btn btn-primary">{{_i}}Save changes{{/i}}</button>
945
+ <button class="btn">{{_i}}Cancel{{/i}}</button>
946
+ </div>
947
+ </fieldset>
948
+ </form>
949
+ <h3>{{_i}}Example markup{{/i}}</h3>
950
+ <p>{{_i}}Given the above example form layout, here's the markup associated with the first input and control group. The <code>.control-group</code>, <code>.control-label</code>, and <code>.controls</code> classes are all required for styling.{{/i}}</p>
951
+<pre class="prettyprint linenums">
952
+<form class="form-horizontal">
953
+ <fieldset>
954
+ <legend>{{_i}}Legend text{{/i}}</legend>
955
+ <div class="control-group">
956
+ <label class="control-label" for="input01">{{_i}}Text input{{/i}}</label>
957
+ <div class="controls">
958
+ <input type="text" class="input-xlarge" id="input01">
959
+ <p class="help-block">{{_i}}Supporting help text{{/i}}</p>
960
+ </div>
961
+ </div>
962
+ </fieldset>
963
+</form>
964
+</pre>
965
+ </div>
966
+ </div>
967
+
968
+ <br>
969
+
970
+ <h2>{{_i}}Form control states{{/i}}</h2>
971
+ <div class="row">
972
+ <div class="span4">
973
+ <p>{{_i}}Bootstrap features styles for browser-supported focused and <code>disabled</code> states. We remove the default Webkit <code>outline</code> and apply a <code>box-shadow</code> in its place for <code>:focus</code>.{{/i}}</p>
974
+ <hr>
975
+ <h3>{{_i}}Form validation{{/i}}</h3>
976
+ <p>{{_i}}It also includes validation styles for errors, warnings, and success. To use, add the error class to the surrounding <code>.control-group</code>.{{/i}}</p>
977
+<pre class="prettyprint linenums">
978
+<fieldset
979
+ class="control-group error">
980
+ …
981
+</fieldset>
982
+</pre>
983
+ </div>
984
+ <div class="span8">
985
+ <form class="form-horizontal">
986
+ <fieldset>
987
+ <div class="control-group">
988
+ <label class="control-label" for="focusedInput">{{_i}}Focused input{{/i}}</label>
989
+ <div class="controls">
990
+ <input class="input-xlarge focused" id="focusedInput" type="text" value="{{_i}}This is focused…{{/i}}">
991
+ </div>
992
+ </div>
993
+ <div class="control-group">
994
+ <label class="control-label">Uneditable input</label>
995
+ <div class="controls">
996
+ <span class="input-xlarge uneditable-input">Some value here</span>
997
+ </div>
998
+ </div>
999
+ <div class="control-group">
1000
+ <label class="control-label" for="disabledInput">{{_i}}Disabled input{{/i}}</label>
1001
+ <div class="controls">
1002
+ <input class="input-xlarge disabled" id="disabledInput" type="text" placeholder="{{_i}}Disabled input here…{{/i}}" disabled>
1003
+ </div>
1004
+ </div>
1005
+ <div class="control-group">
1006
+ <label class="control-label" for="optionsCheckbox2">{{_i}}Disabled checkbox{{/i}}</label>
1007
+ <div class="controls">
1008
+ <label class="checkbox">
1009
+ <input type="checkbox" id="optionsCheckbox2" value="option1" disabled>
1010
+ {{_i}}This is a disabled checkbox{{/i}}
1011
+ </label>
1012
+ </div>
1013
+ </div>
1014
+ <div class="control-group warning">
1015
+ <label class="control-label" for="inputWarning">{{_i}}Input with warning{{/i}}</label>
1016
+ <div class="controls">
1017
+ <input type="text" id="inputWarning">
1018
+ <span class="help-inline">{{_i}}Something may have gone wrong{{/i}}</span>
1019
+ </div>
1020
+ </div>
1021
+ <div class="control-group error">
1022
+ <label class="control-label" for="inputError">{{_i}}Input with error{{/i}}</label>
1023
+ <div class="controls">
1024
+ <input type="text" id="inputError">
1025
+ <span class="help-inline">{{_i}}Please correct the error{{/i}}</span>
1026
+ </div>
1027
+ </div>
1028
+ <div class="control-group success">
1029
+ <label class="control-label" for="inputSuccess">{{_i}}Input with success{{/i}}</label>
1030
+ <div class="controls">
1031
+ <input type="text" id="inputSuccess">
1032
+ <span class="help-inline">{{_i}}Woohoo!{{/i}}</span>
1033
+ </div>
1034
+ </div>
1035
+ <div class="control-group success">
1036
+ <label class="control-label" for="selectError">{{_i}}Select with success{{/i}}</label>
1037
+ <div class="controls">
1038
+ <select id="selectError">
1039
+ <option>1</option>
1040
+ <option>2</option>
1041
+ <option>3</option>
1042
+ <option>4</option>
1043
+ <option>5</option>
1044
+ </select>
1045
+ <span class="help-inline">{{_i}}Woohoo!{{/i}}</span>
1046
+ </div>
1047
+ </div>
1048
+ <div class="form-actions">
1049
+ <button type="submit" class="btn btn-primary">{{_i}}Save changes{{/i}}</button>
1050
+ <button class="btn">{{_i}}Cancel{{/i}}</button>
1051
+ </div>
1052
+ </fieldset>
1053
+ </form>
1054
+ </div>
1055
+ </div>
1056
+
1057
+ <br>
1058
+
1059
+ <h2>{{_i}}Extending form controls{{/i}}</h2>
1060
+ <div class="row">
1061
+ <div class="span4">
1062
+ <h3>{{_i}}Prepend & append inputs{{/i}}</h3>
1063
+ <p>{{_i}}Input groups—with appended or prepended text—provide an easy way to give more context for your inputs. Great examples include the @ sign for Twitter usernames or $ for finances.{{/i}}</p>
1064
+ <hr>
1065
+ <h3>{{_i}}Checkboxes and radios{{/i}}</h3>
1066
+ <p>{{_i}}Up to v1.4, Bootstrap required extra markup around checkboxes and radios to stack them. Now, it's a simple matter of repeating the <code><label class="checkbox"></code> that wraps the <code><input type="checkbox"></code>.{{/i}}</p>
1067
+ <p>{{_i}}Inline checkboxes and radios are also supported. Just add <code>.inline</code> to any <code>.checkbox</code> or <code>.radio</code> and you're done.{{/i}}</p>
1068
+ <hr>
1069
+ <h4>{{_i}}Inline forms and append/prepend{{/i}}</h4>
1070
+ <p>{{_i}}To use prepend or append inputs in an inline form, be sure to place the <code>.add-on</code> and <code>input</code> on the same line, without spaces.{{/i}}</p>
1071
+ <hr>
1072
+ <h4>{{_i}}Form help text{{/i}}</h4>
1073
+ <p>{{_i}}To add help text for your form inputs, include inline help text with <code><span class="help-inline"></code> or a help text block with <code><p class="help-block"></code> after the input element.{{/i}}</p>
1074
+ </div>
1075
+ <div class="span8">
1076
+ <form class="form-horizontal">
1077
+ <fieldset>
1078
+ <div class="control-group">
1079
+ <label class="control-label">{{_i}}Form grid sizes{{/i}}</label>
1080
+ <div class="controls docs-input-sizes">
1081
+ <input class="span1" type="text" placeholder=".span1">
1082
+ <input class="span2" type="text" placeholder=".span2">
1083
+ <input class="span3" type="text" placeholder=".span3">
1084
+ <select class="span1">
1085
+ <option>1</option>
1086
+ <option>2</option>
1087
+ <option>3</option>
1088
+ <option>4</option>
1089
+ <option>5</option>
1090
+ </select>
1091
+ <select class="span2">
1092
+ <option>1</option>
1093
+ <option>2</option>
1094
+ <option>3</option>
1095
+ <option>4</option>
1096
+ <option>5</option>
1097
+ </select>
1098
+ <select class="span3">
1099
+ <option>1</option>
1100
+ <option>2</option>
1101
+ <option>3</option>
1102
+ <option>4</option>
1103
+ <option>5</option>
1104
+ </select>
1105
+ <p class="help-block">{{_i}}Use the same <code>.span*</code> classes from the grid system for input sizes.{{/i}}</p>
1106
+ </div>
1107
+ </div>
1108
+ <div class="control-group">
1109
+ <label class="control-label">{{_i}}Alternate sizes{{/i}}</label>
1110
+ <div class="controls docs-input-sizes">
1111
+ <input class="input-mini" type="text" placeholder=".input-mini">
1112
+ <input class="input-small" type="text" placeholder=".input-small">
1113
+ <input class="input-medium" type="text" placeholder=".input-medium">
1114
+ <p class="help-block">{{_i}}You may also use static classes that don't map to the grid, adapt to the responsive CSS styles, or account for varying types of controls (e.g., <code>input</code> vs. <code>select</code>).{{/i}}</p>
1115
+ </div>
1116
+ </div>
1117
+ <div class="control-group">
1118
+ <label class="control-label" for="prependedInput">{{_i}}Prepended text{{/i}}</label>
1119
+ <div class="controls">
1120
+ <div class="input-prepend">
1121
+ <span class="add-on">@</span><input class="span2" id="prependedInput" size="16" type="text">
1122
+ </div>
1123
+ <p class="help-block">{{_i}}Here's some help text{{/i}}</p>
1124
+ </div>
1125
+ </div>
1126
+ <div class="control-group">
1127
+ <label class="control-label" for="appendedInput">{{_i}}Appended text{{/i}}</label>
1128
+ <div class="controls">
1129
+ <div class="input-append">
1130
+ <input class="span2" id="appendedInput" size="16" type="text"><span class="add-on">.00</span>
1131
+ </div>
1132
+ <span class="help-inline">{{_i}}Here's more help text{{/i}}</span>
1133
+ </div>
1134
+ </div>
1135
+ <div class="control-group">
1136
+ <label class="control-label" for="appendedPrependedInput">{{_i}}Append and prepend{{/i}}</label>
1137
+ <div class="controls">
1138
+ <div class="input-prepend input-append">
1139
+ <span class="add-on">$</span><input class="span2" id="appendedPrependedInput" size="16" type="text"><span class="add-on">.00</span>
1140
+ </div>
1141
+ </div>
1142
+ </div>
1143
+ <div class="control-group">
1144
+ <label class="control-label" for="appendedInputButton">{{_i}}Append with button{{/i}}</label>
1145
+ <div class="controls">
1146
+ <div class="input-append">
1147
+ <input class="span2" id="appendedInputButton" size="16" type="text"><button class="btn" type="button">Go!</button>
1148
+ </div>
1149
+ </div>
1150
+ </div>
1151
+ <div class="control-group">
1152
+ <label class="control-label" for="appendedInputButtons">{{_i}}Two-button append{{/i}}</label>
1153
+ <div class="controls">
1154
+ <div class="input-append">
1155
+ <input class="span2" id="appendedInputButtons" size="16" type="text"><button class="btn" type="button">Search</button><button class="btn" type="button">Options</button>
1156
+ </div>
1157
+ </div>
1158
+ </div>
1159
+ <div class="control-group">
1160
+ <label class="control-label" for="inlineCheckboxes">{{_i}}Inline checkboxes{{/i}}</label>
1161
+ <div class="controls">
1162
+ <label class="checkbox inline">
1163
+ <input type="checkbox" id="inlineCheckbox1" value="option1"> 1
1164
+ </label>
1165
+ <label class="checkbox inline">
1166
+ <input type="checkbox" id="inlineCheckbox2" value="option2"> 2
1167
+ </label>
1168
+ <label class="checkbox inline">
1169
+ <input type="checkbox" id="inlineCheckbox3" value="option3"> 3
1170
+ </label>
1171
+ </div>
1172
+ </div>
1173
+ <div class="control-group">
1174
+ <label class="control-label" for="optionsCheckboxList">{{_i}}Checkboxes{{/i}}</label>
1175
+ <div class="controls">
1176
+ <label class="checkbox">
1177
+ <input type="checkbox" name="optionsCheckboxList1" value="option1">
1178
+ {{_i}}Option one is this and that—be sure to include why it's great{{/i}}
1179
+ </label>
1180
+ <label class="checkbox">
1181
+ <input type="checkbox" name="optionsCheckboxList2" value="option2">
1182
+ {{_i}}Option two can also be checked and included in form results{{/i}}
1183
+ </label>
1184
+ <label class="checkbox">
1185
+ <input type="checkbox" name="optionsCheckboxList3" value="option3">
1186
+ {{_i}}Option three can—yes, you guessed it—also be checked and included in form results{{/i}}
1187
+ </label>
1188
+ <p class="help-block">{{_i}}<strong>Note:</strong> Labels surround all the options for much larger click areas and a more usable form.{{/i}}</p>
1189
+ </div>
1190
+ </div>
1191
+ <div class="control-group">
1192
+ <label class="control-label">{{_i}}Radio buttons{{/i}}</label>
1193
+ <div class="controls">
1194
+ <label class="radio">
1195
+ <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
1196
+ {{_i}}Option one is this and that—be sure to include why it's great{{/i}}
1197
+ </label>
1198
+ <label class="radio">
1199
+ <input type="radio" name="optionsRadios" id="optionsRadios2" value="option2">
1200
+ {{_i}}Option two can be something else and selecting it will deselect option one{{/i}}
1201
+ </label>
1202
+ </div>
1203
+ </div>
1204
+ <div class="form-actions">
1205
+ <button type="submit" class="btn btn-primary">{{_i}}Save changes{{/i}}</button>
1206
+ <button class="btn">{{_i}}Cancel{{/i}}</button>
1207
+ </div>
1208
+ </fieldset>
1209
+ </form>
1210
+ </div>
1211
+ </div><!-- /row -->
1212
+</section>
1213
+
1214
+
1215
+
1216
+<!-- Buttons
1217
+================================================== -->
1218
+<section id="buttons">
1219
+ <div class="page-header">
1220
+ <h1>{{_i}}Buttons{{/i}}</h1>
1221
+ </div>
1222
+ <table class="table table-bordered table-striped">
1223
+ <thead>
1224
+ <tr>
1225
+ <th>{{_i}}Button{{/i}}</th>
1226
+ <th>{{_i}}class=""{{/i}}</th>
1227
+ <th>{{_i}}Description{{/i}}</th>
1228
+ </tr>
1229
+ </thead>
1230
+ <tbody>
1231
+ <tr>
1232
+ <td><button class="btn" href="#">{{_i}}Default{{/i}}</button></td>
1233
+ <td><code>btn</code></td>
1234
+ <td>{{_i}}Standard gray button with gradient{{/i}}</td>
1235
+ </tr>
1236
+ <tr>
1237
+ <td><button class="btn btn-primary" href="#">{{_i}}Primary{{/i}}</button></td>
1238
+ <td><code>btn btn-primary</code></td>
1239
+ <td>{{_i}}Provides extra visual weight and identifies the primary action in a set of buttons{{/i}}</td>
1240
+ </tr>
1241
+ <tr>
1242
+ <td><button class="btn btn-info" href="#">{{_i}}Info{{/i}}</button></td>
1243
+ <td><code>btn btn-info</code></td>
1244
+ <td>{{_i}}Used as an alternative to the default styles{{/i}}</td>
1245
+ </tr>
1246
+ <tr>
1247
+ <td><button class="btn btn-success" href="#">{{_i}}Success{{/i}}</button></td>
1248
+ <td><code>btn btn-success</code></td>
1249
+ <td>{{_i}}Indicates a successful or positive action{{/i}}</td>
1250
+ </tr>
1251
+ <tr>
1252
+ <td><button class="btn btn-warning" href="#">{{_i}}Warning{{/i}}</button></td>
1253
+ <td><code>btn btn-warning</code></td>
1254
+ <td>{{_i}}Indicates caution should be taken with this action{{/i}}</td>
1255
+ </tr>
1256
+ <tr>
1257
+ <td><button class="btn btn-danger" href="#">{{_i}}Danger{{/i}}</button></td>
1258
+ <td><code>btn btn-danger</code></td>
1259
+ <td>{{_i}}Indicates a dangerous or potentially negative action{{/i}}</td>
1260
+ </tr>
1261
+ <tr>
1262
+ <td><button class="btn btn-inverse" href="#">{{_i}}Inverse{{/i}}</button></td>
1263
+ <td><code>btn btn-inverse</code></td>
1264
+ <td>{{_i}}Alternate dark gray button, not tied to a semantic action or use{{/i}}</td>
1265
+ </tr>
1266
+ </tbody>
1267
+ </table>
1268
+
1269
+ <div class="row">
1270
+ <div class="span4">
1271
+ <h3>{{_i}}Buttons for actions{{/i}}</h3>
1272
+ <p>{{_i}}As a convention, buttons should only be used for actions while hyperlinks are to be used for objects. For instance, "Download" should be a button while "recent activity" should be a link.{{/i}}</p>
1273
+ <p>{{_i}}Button styles can be applied to anything with the <code>.btn</code> class applied. However, typically you'll want to apply these to only <code><a></code> and <code><button></code> elements.{{/i}}</p>
1274
+ <h3>{{_i}}Cross browser compatibility{{/i}}</h3>
1275
+ <p>{{_i}}IE9 doesn't crop background gradients on rounded corners, so we remove it. Related, IE9 jankifies disabled <code>button</code> elements, rendering text gray with a nasty text-shadow that we cannot fix.{{/i}}</p>
1276
+ </div>
1277
+ <div class="span4">
1278
+ <h3>{{_i}}Multiple sizes{{/i}}</h3>
1279
+ <p>{{_i}}Fancy larger or smaller buttons? Add <code>.btn-large</code>, <code>.btn-small</code>, or <code>.btn-mini</code> for two additional sizes.{{/i}}</p>
1280
+ <p>
1281
+ <button class="btn btn-large btn-primary">{{_i}}Primary action{{/i}}</button>
1282
+ <button class="btn btn-large">{{_i}}Action{{/i}}</button>
1283
+ </p>
1284
+ <p>
1285
+ <button class="btn btn-small btn-primary">{{_i}}Primary action{{/i}}</button>
1286
+ <button class="btn btn-small">{{_i}}Action{{/i}}</button>
1287
+ </p>
1288
+ <p>
1289
+ <button class="btn btn-mini btn-primary">{{_i}}Primary action{{/i}}</button>
1290
+ <button class="btn btn-mini">{{_i}}Action{{/i}}</button>
1291
+ </p>
1292
+ <br>
1293
+ <h3>{{_i}}Disabled state{{/i}}</h3>
1294
+ <p>{{_i}}For disabled buttons, add the <code>.disabled</code> class to links and the <code>disabled</code> attribute for <code><button></code> elements.{{/i}}</p>
1295
+ <p>
1296
+ <a href="#" class="btn btn-large btn-primary disabled">{{_i}}Primary link{{/i}}</a>
1297
+ <a href="#" class="btn btn-large disabled">{{_i}}Link{{/i}}</a>
1298
+ </p>
1299
+ <p style="margin-bottom: 18px;">
1300
+ <button class="btn btn-large btn-primary disabled" disabled="disabled">{{_i}}Primary button{{/i}}</button>
1301
+ <button class="btn btn-large" disabled>{{_i}}Button{{/i}}</button>
1302
+ </p>
1303
+ <p>
1304
+ <span class="label label-info">{{_i}}Heads up!{{/i}}</span>
1305
+ {{_i}}We use <code>.disabled</code> as a utility class here, similar to the common <code>.active</code> class, so no prefix is required.{{/i}}
1306
+ </p>
1307
+ </div>
1308
+ <div class="span4">
1309
+ <h3>{{_i}}One class, multiple tags{{/i}}</h3>
1310
+ <p>{{_i}}Use the <code>.btn</code> class on an <code><a></code>, <code><button></code>, or <code><input></code> element.{{/i}}</p>
1311
+<form>
1312
+<a class="btn" href="">{{_i}}Link{{/i}}</a>
1313
+<button class="btn" type="submit">{{_i}}Button{{/i}}</button>
1314
+<input class="btn" type="button" value="{{_i}}Input{{/i}}">
1315
+<input class="btn" type="submit" value="{{_i}}Submit{{/i}}">
1316
+</form>
1317
+<pre class="prettyprint linenums">
1318
+<a class="btn" href="">{{_i}}Link{{/i}}</a>
1319
+<button class="btn" type="submit">
1320
+ {{_i}}Button{{/i}}
1321
+</button>
1322
+<input class="btn" type="button"
1323
+ value="{{_i}}Input{{/i}}">
1324
+<input class="btn" type="submit"
1325
+ value="{{_i}}Submit{{/i}}">
1326
+</pre>
1327
+ <p>{{_i}}As a best practice, try to match the element for you context to ensure matching cross-browser rendering. If you have an <code>input</code>, use an <code><input type="submit"></code> for your button.{{/i}}</p>
1328
+ </div>
1329
+ </div>
1330
+</section>
1331
+
1332
+
1333
+
1334
+<!-- Icons
1335
+================================================== -->
1336
+<section id="icons">
1337
+ <div class="page-header">
1338
+ <h1>{{_i}}Icons <small>Graciously provided by <a href="http://glyphicons.com" target="_blank">Glyphicons</a></small>{{/i}}</h1>
1339
+ </div>
1340
+ <div class="row">
1341
+ <div class="span3">
1342
+ <ul class="the-icons">
1343
+ <li><i class="icon-glass"></i> icon-glass</li>
1344
+ <li><i class="icon-music"></i> icon-music</li>
1345
+ <li><i class="icon-search"></i> icon-search</li>
1346
+ <li><i class="icon-envelope"></i> icon-envelope</li>
1347
+ <li><i class="icon-heart"></i> icon-heart</li>
1348
+ <li><i class="icon-star"></i> icon-star</li>
1349
+ <li><i class="icon-star-empty"></i> icon-star-empty</li>
1350
+ <li><i class="icon-user"></i> icon-user</li>
1351
+ <li><i class="icon-film"></i> icon-film</li>
1352
+ <li><i class="icon-th-large"></i> icon-th-large</li>
1353
+ <li><i class="icon-th"></i> icon-th</li>
1354
+ <li><i class="icon-th-list"></i> icon-th-list</li>
1355
+ <li><i class="icon-ok"></i> icon-ok</li>
1356
+ <li><i class="icon-remove"></i> icon-remove</li>
1357
+ <li><i class="icon-zoom-in"></i> icon-zoom-in</li>
1358
+ <li><i class="icon-zoom-out"></i> icon-zoom-out</li>
1359
+ <li><i class="icon-off"></i> icon-off</li>
1360
+ <li><i class="icon-signal"></i> icon-signal</li>
1361
+ <li><i class="icon-cog"></i> icon-cog</li>
1362
+ <li><i class="icon-trash"></i> icon-trash</li>
1363
+ <li><i class="icon-home"></i> icon-home</li>
1364
+ <li><i class="icon-file"></i> icon-file</li>
1365
+ <li><i class="icon-time"></i> icon-time</li>
1366
+ <li><i class="icon-road"></i> icon-road</li>
1367
+ <li><i class="icon-download-alt"></i> icon-download-alt</li>
1368
+ <li><i class="icon-download"></i> icon-download</li>
1369
+ <li><i class="icon-upload"></i> icon-upload</li>
1370
+ <li><i class="icon-inbox"></i> icon-inbox</li>
1371
+ <li><i class="icon-play-circle"></i> icon-play-circle</li>
1372
+ <li><i class="icon-repeat"></i> icon-repeat</li>
1373
+ <li><i class="icon-refresh"></i> icon-refresh</li>
1374
+ <li><i class="icon-list-alt"></i> icon-list-alt</li>
1375
+ <li><i class="icon-lock"></i> icon-lock</li>
1376
+ <li><i class="icon-flag"></i> icon-flag</li>
1377
+ <li><i class="icon-headphones"></i> icon-headphones</li>
1378
+ </ul>
1379
+ </div>
1380
+ <div class="span3">
1381
+ <ul class="the-icons">
1382
+ <li><i class="icon-volume-off"></i> icon-volume-off</li>
1383
+ <li><i class="icon-volume-down"></i> icon-volume-down</li>
1384
+ <li><i class="icon-volume-up"></i> icon-volume-up</li>
1385
+ <li><i class="icon-qrcode"></i> icon-qrcode</li>
1386
+ <li><i class="icon-barcode"></i> icon-barcode</li>
1387
+ <li><i class="icon-tag"></i> icon-tag</li>
1388
+ <li><i class="icon-tags"></i> icon-tags</li>
1389
+ <li><i class="icon-book"></i> icon-book</li>
1390
+ <li><i class="icon-bookmark"></i> icon-bookmark</li>
1391
+ <li><i class="icon-print"></i> icon-print</li>
1392
+ <li><i class="icon-camera"></i> icon-camera</li>
1393
+ <li><i class="icon-font"></i> icon-font</li>
1394
+ <li><i class="icon-bold"></i> icon-bold</li>
1395
+ <li><i class="icon-italic"></i> icon-italic</li>
1396
+ <li><i class="icon-text-height"></i> icon-text-height</li>
1397
+ <li><i class="icon-text-width"></i> icon-text-width</li>
1398
+ <li><i class="icon-align-left"></i> icon-align-left</li>
1399
+ <li><i class="icon-align-center"></i> icon-align-center</li>
1400
+ <li><i class="icon-align-right"></i> icon-align-right</li>
1401
+ <li><i class="icon-align-justify"></i> icon-align-justify</li>
1402
+ <li><i class="icon-list"></i> icon-list</li>
1403
+ <li><i class="icon-indent-left"></i> icon-indent-left</li>
1404
+ <li><i class="icon-indent-right"></i> icon-indent-right</li>
1405
+ <li><i class="icon-facetime-video"></i> icon-facetime-video</li>
1406
+ <li><i class="icon-picture"></i> icon-picture</li>
1407
+ <li><i class="icon-pencil"></i> icon-pencil</li>
1408
+ <li><i class="icon-map-marker"></i> icon-map-marker</li>
1409
+ <li><i class="icon-adjust"></i> icon-adjust</li>
1410
+ <li><i class="icon-tint"></i> icon-tint</li>
1411
+ <li><i class="icon-edit"></i> icon-edit</li>
1412
+ <li><i class="icon-share"></i> icon-share</li>
1413
+ <li><i class="icon-check"></i> icon-check</li>
1414
+ <li><i class="icon-move"></i> icon-move</li>
1415
+ <li><i class="icon-step-backward"></i> icon-step-backward</li>
1416
+ <li><i class="icon-fast-backward"></i> icon-fast-backward</li>
1417
+ </ul>
1418
+ </div>
1419
+ <div class="span3">
1420
+ <ul class="the-icons">
1421
+ <li><i class="icon-backward"></i> icon-backward</li>
1422
+ <li><i class="icon-play"></i> icon-play</li>
1423
+ <li><i class="icon-pause"></i> icon-pause</li>
1424
+ <li><i class="icon-stop"></i> icon-stop</li>
1425
+ <li><i class="icon-forward"></i> icon-forward</li>
1426
+ <li><i class="icon-fast-forward"></i> icon-fast-forward</li>
1427
+ <li><i class="icon-step-forward"></i> icon-step-forward</li>
1428
+ <li><i class="icon-eject"></i> icon-eject</li>
1429
+ <li><i class="icon-chevron-left"></i> icon-chevron-left</li>
1430
+ <li><i class="icon-chevron-right"></i> icon-chevron-right</li>
1431
+ <li><i class="icon-plus-sign"></i> icon-plus-sign</li>
1432
+ <li><i class="icon-minus-sign"></i> icon-minus-sign</li>
1433
+ <li><i class="icon-remove-sign"></i> icon-remove-sign</li>
1434
+ <li><i class="icon-ok-sign"></i> icon-ok-sign</li>
1435
+ <li><i class="icon-question-sign"></i> icon-question-sign</li>
1436
+ <li><i class="icon-info-sign"></i> icon-info-sign</li>
1437
+ <li><i class="icon-screenshot"></i> icon-screenshot</li>
1438
+ <li><i class="icon-remove-circle"></i> icon-remove-circle</li>
1439
+ <li><i class="icon-ok-circle"></i> icon-ok-circle</li>
1440
+ <li><i class="icon-ban-circle"></i> icon-ban-circle</li>
1441
+ <li><i class="icon-arrow-left"></i> icon-arrow-left</li>
1442
+ <li><i class="icon-arrow-right"></i> icon-arrow-right</li>
1443
+ <li><i class="icon-arrow-up"></i> icon-arrow-up</li>
1444
+ <li><i class="icon-arrow-down"></i> icon-arrow-down</li>
1445
+ <li><i class="icon-share-alt"></i> icon-share-alt</li>
1446
+ <li><i class="icon-resize-full"></i> icon-resize-full</li>
1447
+ <li><i class="icon-resize-small"></i> icon-resize-small</li>
1448
+ <li><i class="icon-plus"></i> icon-plus</li>
1449
+ <li><i class="icon-minus"></i> icon-minus</li>
1450
+ <li><i class="icon-asterisk"></i> icon-asterisk</li>
1451
+ <li><i class="icon-exclamation-sign"></i> icon-exclamation-sign</li>
1452
+ <li><i class="icon-gift"></i> icon-gift</li>
1453
+ <li><i class="icon-leaf"></i> icon-leaf</li>
1454
+ <li><i class="icon-fire"></i> icon-fire</li>
1455
+ <li><i class="icon-eye-open"></i> icon-eye-open</li>
1456
+ </ul>
1457
+ </div>
1458
+ <div class="span3">
1459
+ <ul class="the-icons">
1460
+ <li><i class="icon-eye-close"></i> icon-eye-close</li>
1461
+ <li><i class="icon-warning-sign"></i> icon-warning-sign</li>
1462
+ <li><i class="icon-plane"></i> icon-plane</li>
1463
+ <li><i class="icon-calendar"></i> icon-calendar</li>
1464
+ <li><i class="icon-random"></i> icon-random</li>
1465
+ <li><i class="icon-comment"></i> icon-comment</li>
1466
+ <li><i class="icon-magnet"></i> icon-magnet</li>
1467
+ <li><i class="icon-chevron-up"></i> icon-chevron-up</li>
1468
+ <li><i class="icon-chevron-down"></i> icon-chevron-down</li>
1469
+ <li><i class="icon-retweet"></i> icon-retweet</li>
1470
+ <li><i class="icon-shopping-cart"></i> icon-shopping-cart</li>
1471
+ <li><i class="icon-folder-close"></i> icon-folder-close</li>
1472
+ <li><i class="icon-folder-open"></i> icon-folder-open</li>
1473
+ <li><i class="icon-resize-vertical"></i> icon-resize-vertical</li>
1474
+ <li><i class="icon-resize-horizontal"></i> icon-resize-horizontal</li>
1475
+ <li><i class="icon-hdd"></i> icon-hdd</li>
1476
+ <li><i class="icon-bullhorn"></i> icon-bullhorn</li>
1477
+ <li><i class="icon-bell"></i> icon-bell</li>
1478
+ <li><i class="icon-certificate"></i> icon-certificate</li>
1479
+ <li><i class="icon-thumbs-up"></i> icon-thumbs-up</li>
1480
+ <li><i class="icon-thumbs-down"></i> icon-thumbs-down</li>
1481
+ <li><i class="icon-hand-right"></i> icon-hand-right</li>
1482
+ <li><i class="icon-hand-left"></i> icon-hand-left</li>
1483
+ <li><i class="icon-hand-up"></i> icon-hand-up</li>
1484
+ <li><i class="icon-hand-down"></i> icon-hand-down</li>
1485
+ <li><i class="icon-circle-arrow-right"></i> icon-circle-arrow-right</li>
1486
+ <li><i class="icon-circle-arrow-left"></i> icon-circle-arrow-left</li>
1487
+ <li><i class="icon-circle-arrow-up"></i> icon-circle-arrow-up</li>
1488
+ <li><i class="icon-circle-arrow-down"></i> icon-circle-arrow-down</li>
1489
+ <li><i class="icon-globe"></i> icon-globe</li>
1490
+ <li><i class="icon-wrench"></i> icon-wrench</li>
1491
+ <li><i class="icon-tasks"></i> icon-tasks</li>
1492
+ <li><i class="icon-filter"></i> icon-filter</li>
1493
+ <li><i class="icon-briefcase"></i> icon-briefcase</li>
1494
+ <li><i class="icon-fullscreen"></i> icon-fullscreen</li>
1495
+ </ul>
1496
+ </div>
1497
+ </div>
1498
+
1499
+ <br>
1500
+
1501
+ <div class="row">
1502
+ <div class="span4">
1503
+ <h3>{{_i}}Built as a sprite{{/i}}</h3>
1504
+ <p>{{_i}}Instead of making every icon an extra request, we've compiled them into a sprite—a bunch of images in one file that uses CSS to position the images with <code>background-position</code>. This is the same method we use on Twitter.com and it has worked well for us.{{/i}}</p>
1505
+ <p>{{_i}}All icons classes are prefixed with <code>.icon-</code> for proper namespacing and scoping, much like our other components. This will help avoid conflicts with other tools.{{/i}}</p>
1506
+ <p>{{_i}}<a href="http://glyphicons.com" target="_blank">Glyphicons</a> has granted us use of the Halflings set in our open-source toolkit so long as we provide a link and credit here in the docs. Please consider doing the same in your projects.{{/i}}</p>
1507
+ </div>
1508
+ <div class="span4">
1509
+ <h3>{{_i}}How to use{{/i}}</h3>
1510
+ <p>{{_i}}Bootstrap uses an <code><i></code> tag for all icons, but they have no case class—only a shared prefix. To use, place the following code just about anywhere:{{/i}}</p>
1511
+<pre class="prettyprint linenums">
1512
+<i class="icon-search"></i>
1513
+</pre>
1514
+ <p>{{_i}}There are also styles available for inverted (white) icons, made ready with one extra class:{{/i}}</p>
1515
+<pre class="prettyprint linenums">
1516
+<i class="icon-search icon-white"></i>
1517
+</pre>
1518
+ <p>{{_i}}There are 140 classes to choose from for your icons. Just add an <code><i></code> tag with the right classes and you're set. You can find the full list in <strong>sprites.less</strong> or right here in this document.{{/i}}</p>
1519
+ <p>
1520
+ <span class="label label-info">{{_i}}Heads up!{{/i}}</span>
1521
+ {{_i}}When using beside strings of text, as in buttons or nav links, be sure to leave a space after the <code><i></code> tag for proper spacing.{{/i}}
1522
+ </p>
1523
+ </div>
1524
+ <div class="span4">
1525
+ <h3>{{_i}}Use cases{{/i}}</h3>
1526
+ <p>{{_i}}Icons are great, but where would one use them? Here are a few ideas:{{/i}}</p>
1527
+ <ul>
1528
+ <li>{{_i}}As visuals for your sidebar navigation{{/i}}</li>
1529
+ <li>{{_i}}For a purely icon-driven navigation{{/i}}</li>
1530
+ <li>{{_i}}For buttons to help convey the meaning of an action{{/i}}</li>
1531
+ <li>{{_i}}With links to share context on a user's destination{{/i}}</li>
1532
+ </ul>
1533
+ <p>{{_i}}Essentially, anywhere you can put an <code><i></code> tag, you can put an icon.{{/i}}</p>
1534
+ </div>
1535
+ </div>
1536
+
1537
+ <h3>{{_i}}Examples{{/i}}</h3>
1538
+ <p>{{_i}}Use them in buttons, button groups for a toolbar, navigation, or prepended form inputs.{{/i}}</p>
1539
+ <div class="row">
1540
+ <div class="span4">
1541
+ <div class="btn-toolbar" style="margin-bottom: 9px">
1542
+ <div class="btn-group">
1543
+ <a class="btn" href="#"><i class="icon-align-left"></i></a>
1544
+ <a class="btn" href="#"><i class="icon-align-center"></i></a>
1545
+ <a class="btn" href="#"><i class="icon-align-right"></i></a>
1546
+ <a class="btn" href="#"><i class="icon-align-justify"></i></a>
1547
+ </div>
1548
+ <div class="btn-group">
1549
+ <a class="btn btn-primary" href="#"><i class="icon-user icon-white"></i> {{_i}}User{{/i}}</a>
1550
+ <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#"><span class="caret"></span></a>
1551
+ <ul class="dropdown-menu">
1552
+ <li><a href="#"><i class="icon-pencil"></i> {{_i}}Edit{{/i}}</a></li>
1553
+ <li><a href="#"><i class="icon-trash"></i> {{_i}}Delete{{/i}}</a></li>
1554
+ <li><a href="#"><i class="icon-ban-circle"></i> {{_i}}Ban{{/i}}</a></li>
1555
+ <li class="divider"></li>
1556
+ <li><a href="#"><i class="i"></i> {{_i}}Make admin{{/i}}</a></li>
1557
+ </ul>
1558
+ </div>
1559
+ </div>
1560
+ <p>
1561
+ <a class="btn" href="#"><i class="icon-refresh"></i> {{_i}}Refresh{{/i}}</a>
1562
+ <a class="btn btn-success" href="#"><i class="icon-shopping-cart icon-white"></i> {{_i}}Checkout{{/i}}</a>
1563
+ <a class="btn btn-danger" href="#"><i class="icon-trash icon-white"></i> {{_i}}Delete{{/i}}</a>
1564
+ </p>
1565
+ <p>
1566
+ <a class="btn btn-large" href="#"><i class="icon-comment"></i> {{_i}}Comment{{/i}}</a>
1567
+ <a class="btn btn-small" href="#"><i class="icon-cog"></i> {{_i}}Settings{{/i}}</a>
1568
+ <a class="btn btn-small btn-info" href="#"><i class="icon-info-sign icon-white"></i> {{_i}}More Info{{/i}}</a>
1569
+ </p>
1570
+ </div>
1571
+ <div class="span4">
1572
+ <div class="well" style="padding: 8px 0;">
1573
+ <ul class="nav nav-list">
1574
+ <li class="active"><a href="#"><i class="icon-home icon-white"></i> {{_i}}Home{{/i}}</a></li>
1575
+ <li><a href="#"><i class="icon-book"></i> {{_i}}Library{{/i}}</a></li>
1576
+ <li><a href="#"><i class="icon-pencil"></i> {{_i}}Applications{{/i}}</a></li>
1577
+ <li><a href="#"><i class="i"></i> {{_i}}Misc{{/i}}</a></li>
1578
+ </ul>
1579
+ </div> <!-- /well -->
1580
+ </div>
1581
+ <div class="span4">
1582
+ <form>
1583
+ <div class="control-group">
1584
+ <label class="control-label" for="inputIcon">{{_i}}Email address{{/i}}</label>
1585
+ <div class="controls">
1586
+ <div class="input-prepend">
1587
+ <span class="add-on"><i class="icon-envelope"></i></span><input class="span2" id="inputIcon" type="text">
1588
+ </div>
1589
+ </div>
1590
+ </div>
1591
+ </form>
1592
+ </div>
1593
+ </div>
1594
+</section>
docs/docs/likebutton/docs/templates/pages/components.mustache
new
+1815
@@ -0,0 +1,1815 @@
1
+<!-- Masthead
2
+================================================== -->
3
+<header class="jumbotron subhead" id="overview">
4
+ <h1>{{_i}}Components{{/i}}</h1>
5
+ <p class="lead">{{_i}}Dozens of reusable components are built into Bootstrap to provide navigation, alerts, popovers, and much more.{{/i}}</p>
6
+ <div class="subnav">
7
+ <ul class="nav nav-pills">
8
+ <li class="dropdown">
9
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">{{_i}}Buttons{{/i}} <b class="caret"></b></a>
10
+ <ul class="dropdown-menu">
11
+ <li><a href="#buttonGroups">{{_i}}Button groups{{/i}}</a></li>
12
+ <li><a href="#buttonDropdowns">{{_i}}Button dropdowns{{/i}}</a></li>
13
+ </ul>
14
+ </li>
15
+ <li class="dropdown">
16
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">{{_i}}Navigation{{/i}} <b class="caret"></b></a>
17
+ <ul class="dropdown-menu">
18
+ <li><a href="#navs">{{_i}}Nav, tabs, pills{{/i}}</a></li>
19
+ <li><a href="#navbar">{{_i}}Navbar{{/i}}</a></li>
20
+ <li><a href="#breadcrumbs">{{_i}}Breadcrumbs{{/i}}</a></li>
21
+ <li><a href="#pagination">{{_i}}Pagination{{/i}}</a></li>
22
+ </ul>
23
+ </li>
24
+ <li><a href="#labels">{{_i}}Labels{{/i}}</a></li>
25
+ <li><a href="#badges">{{_i}}Badges{{/i}}</a></li>
26
+ <li><a href="#typography">{{_i}}Typography{{/i}}</a></li>
27
+ <li><a href="#thumbnails">{{_i}}Thumbnails{{/i}}</a></li>
28
+ <li><a href="#alerts">{{_i}}Alerts{{/i}}</a></li>
29
+ <li><a href="#progress">{{_i}}Progress bars{{/i}}</a></li>
30
+ <li><a href="#misc">{{_i}}Miscellaneous{{/i}}</a></li>
31
+ </ul>
32
+ </div>
33
+</header>
34
+
35
+
36
+
37
+<!-- Button Groups
38
+================================================== -->
39
+<section id="buttonGroups">
40
+ <div class="page-header">
41
+ <h1>{{_i}}Button groups{{/i}} <small>{{_i}}Join buttons for more toolbar-like functionality{{/i}}</small></h1>
42
+ </div>
43
+ <div class="row">
44
+ <div class="span4">
45
+ <h3>{{_i}}Button groups{{/i}}</h3>
46
+ <p>{{_i}}Use button groups to join multiple buttons together as one composite component. Build them with a series of <code><a></code> or <code><button></code> elements.{{/i}}</p>
47
+ <h3>{{_i}}Best practices{{/i}}</h3>
48
+ <p>{{_i}}We recommend the following guidelines for using button groups and toolbars:{{/i}}</p>
49
+ <ul>
50
+ <li>{{_i}}Always use the same element in a single button group, <code><a></code> or <code><button></code>.{{/i}}</li>
51
+ <li>{{_i}}Don't mix buttons of different colors in the same button group.{{/i}}</li>
52
+ <li>{{_i}}Use icons in addition to or instead of text, but be sure include alt and title text where appropriate.{{/i}}</li>
53
+ </ul>
54
+ <p>{{_i}}<span class="label label-info">Related</span> Button groups with dropdowns (see below) should be called out separately and always include a dropdown caret to indicate intended behavior.{{/i}}</p>
55
+ </div>
56
+ <div class="span4">
57
+ <h3>{{_i}}Default example{{/i}}</h3>
58
+ <p>{{_i}}Here's how the HTML looks for a standard button group built with anchor tag buttons:{{/i}}</p>
59
+ <div class="">
60
+ <div class="btn-group" style="margin: 9px 0;">
61
+ <button class="btn">{{_i}}Left{{/i}}</button>
62
+ <button class="btn">{{_i}}Middle{{/i}}</button>
63
+ <button class="btn">{{_i}}Right{{/i}}</button>
64
+ </div>
65
+ </div>
66
+<pre class="prettyprint linenums">
67
+<div class="btn-group">
68
+ <button class="btn">1</button>
69
+ <button class="btn">2</button>
70
+ <button class="btn">3</button>
71
+</div>
72
+</pre>
73
+ <h3>{{_i}}Toolbar example{{/i}}</h3>
74
+ <p>{{_i}}Combine sets of <code><div class="btn-group"></code> into a <code><div class="btn-toolbar"></code> for more complex components.{{/i}}</p>
75
+ <div class="btn-toolbar">
76
+ <div class="btn-group">
77
+ <button class="btn">1</button>
78
+ <button class="btn">2</button>
79
+ <button class="btn">3</button>
80
+ <button class="btn">4</button>
81
+ </div>
82
+ <div class="btn-group">
83
+ <button class="btn">5</button>
84
+ <button class="btn">6</button>
85
+ <button class="btn">7</button>
86
+ </div>
87
+ <div class="btn-group">
88
+ <button class="btn">8</button>
89
+ </div>
90
+ </div>
91
+<pre class="prettyprint linenums">
92
+<div class="btn-toolbar">
93
+ <div class="btn-group">
94
+ ...
95
+ </div>
96
+</div>
97
+</pre>
98
+ </div>
99
+ <div class="span4">
100
+ <h3>{{_i}}Checkbox and radio flavors{{/i}}</h3>
101
+ <p>{{_i}}Button groups can also function as radios, where only one button may be active, or checkboxes, where any number of buttons may be active. View <a href="./javascript.html#buttons">the Javascript docs</a> for that.{{/i}}</p>
102
+ <p><a class="btn js-btn" href="./javascript.html#buttons">{{_i}}Get the javascript »{{/i}}</a></p>
103
+ <h3>{{_i}}Dropdowns in button groups{{/i}}</h3>
104
+ <p><span class="label label-info">{{_i}}Heads up!{{/i}}</span> {{_i}}Buttons with dropdowns must be individually wrapped in their own <code>.btn-group</code> within a <code>.btn-toolbar</code> for proper rendering.{{/i}}</p>
105
+ </div>
106
+ </div>
107
+</section>
108
+
109
+
110
+
111
+<!-- Split button dropdowns
112
+================================================== -->
113
+<section id="buttonDropdowns">
114
+ <div class="page-header">
115
+ <h1>{{_i}}Button dropdown menus{{/i}} <small>{{_i}}Built on button groups to provide contextual menus{{/i}}</small></h1>
116
+ </div>
117
+
118
+ <h2>{{_i}}Button dropdowns{{/i}}</h2>
119
+ <div class="row">
120
+ <div class="span4">
121
+ <h3>{{_i}}Overview and examples{{/i}}</h3>
122
+ <p>{{_i}}Use any button to trigger a dropdown menu by placing it within a <code>.btn-group</code> and providing the proper menu markup.{{/i}}</p>
123
+ <div class="btn-toolbar" style="margin-top: 18px;">
124
+ <div class="btn-group">
125
+ <button class="btn dropdown-toggle" data-toggle="dropdown">{{_i}}Action{{/i}} <span class="caret"></span></button>
126
+ <ul class="dropdown-menu">
127
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
128
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
129
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
130
+ <li class="divider"></li>
131
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
132
+ </ul>
133
+ </div><!-- /btn-group -->
134
+ <div class="btn-group">
135
+ <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">{{_i}}Action{{/i}} <span class="caret"></span></button>
136
+ <ul class="dropdown-menu">
137
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
138
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
139
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
140
+ <li class="divider"></li>
141
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
142
+ </ul>
143
+ </div><!-- /btn-group -->
144
+ <div class="btn-group">
145
+ <button class="btn btn-danger dropdown-toggle" data-toggle="dropdown">{{_i}}Danger{{/i}} <span class="caret"></span></button>
146
+ <ul class="dropdown-menu">
147
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
148
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
149
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
150
+ <li class="divider"></li>
151
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
152
+ </ul>
153
+ </div><!-- /btn-group -->
154
+ </div>
155
+ <div class="btn-toolbar">
156
+ <div class="btn-group">
157
+ <button class="btn btn-warning dropdown-toggle" data-toggle="dropdown">{{_i}}Warning{{/i}} <span class="caret"></span></button>
158
+ <ul class="dropdown-menu">
159
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
160
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
161
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
162
+ <li class="divider"></li>
163
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
164
+ </ul>
165
+ </div><!-- /btn-group -->
166
+ <div class="btn-group">
167
+ <button class="btn btn-success dropdown-toggle" data-toggle="dropdown">{{_i}}Success{{/i}} <span class="caret"></span></button>
168
+ <ul class="dropdown-menu">
169
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
170
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
171
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
172
+ <li class="divider"></li>
173
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
174
+ </ul>
175
+ </div><!-- /btn-group -->
176
+ <div class="btn-group">
177
+ <button class="btn btn-info dropdown-toggle" data-toggle="dropdown">{{_i}}Info{{/i}} <span class="caret"></span></button>
178
+ <ul class="dropdown-menu">
179
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
180
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
181
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
182
+ <li class="divider"></li>
183
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
184
+ </ul>
185
+ </div><!-- /btn-group -->
186
+ <div class="btn-group">
187
+ <button class="btn btn-inverse dropdown-toggle" data-toggle="dropdown">{{_i}}Inverse{{/i}} <span class="caret"></span></button>
188
+ <ul class="dropdown-menu">
189
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
190
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
191
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
192
+ <li class="divider"></li>
193
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
194
+ </ul>
195
+ </div><!-- /btn-group -->
196
+ </div><!-- /btn-toolbar -->
197
+ </div>
198
+ <div class="span8">
199
+ <h3>{{_i}}Example markup{{/i}}</h3>
200
+ <p>{{_i}}Similar to a button group, our markup uses regular button markup, but with a handful of additions to refine the style and support Bootstrap's dropdown jQuery plugin.{{/i}}</p>
201
+<pre class="prettyprint linenums">
202
+<div class="btn-group">
203
+ <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
204
+ {{_i}}Action{{/i}}
205
+ <span class="caret"></span>
206
+ </a>
207
+ <ul class="dropdown-menu">
208
+ <!-- {{_i}}dropdown menu links{{/i}} -->
209
+ </ul>
210
+</div>
211
+</pre>
212
+ </div>
213
+ </div>
214
+ <div class="row">
215
+ <div class="span4">
216
+ <h3>{{_i}}Works with all button sizes{{/i}}</h3>
217
+ <p>{{_i}}Button dropdowns work at any size. your button sizes to <code>.btn-large</code>, <code>.btn-small</code>, or <code>.btn-mini</code>.{{/i}}</p>
218
+ <div class="btn-toolbar" style="margin-top: 18px;">
219
+ <div class="btn-group">
220
+ <button class="btn btn-large dropdown-toggle" data-toggle="dropdown">{{_i}}Large button{{/i}} <span class="caret"></span></button>
221
+ <ul class="dropdown-menu">
222
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
223
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
224
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
225
+ <li class="divider"></li>
226
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
227
+ </ul>
228
+ </div><!-- /btn-group -->
229
+ <div class="btn-group">
230
+ <button class="btn btn-small dropdown-toggle" data-toggle="dropdown">{{_i}}Small button{{/i}} <span class="caret"></span></button>
231
+ <ul class="dropdown-menu">
232
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
233
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
234
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
235
+ <li class="divider"></li>
236
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
237
+ </ul>
238
+ </div><!-- /btn-group -->
239
+ <div class="btn-group">
240
+ <button class="btn btn-mini dropdown-toggle" data-toggle="dropdown">{{_i}}Mini button{{/i}} <span class="caret"></span></button>
241
+ <ul class="dropdown-menu">
242
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
243
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
244
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
245
+ <li class="divider"></li>
246
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
247
+ </ul>
248
+ </div><!-- /btn-group -->
249
+ </div><!-- /btn-toolbar -->
250
+ </div><!--/span-->
251
+ <div class="span4">
252
+ <h3>{{_i}}Requires javascript{{/i}}</h3>
253
+ <p>{{_i}}Button dropdowns require the <a href="./javascript.html#dropdowns">Bootstrap dropdown plugin</a> to function.{{/i}}</p>
254
+ <p>{{_i}}In some cases—like mobile—dropdown menus will extend outside the viewport. You need to resolve the alignment manually or with custom javascript.{{/i}}</p>
255
+ </div><!--/span-->
256
+ </div><!--/row-->
257
+ <br>
258
+
259
+ <h2>{{_i}}Split button dropdowns{{/i}}</h2>
260
+ <div class="row">
261
+ <div class="span4">
262
+ <h3>{{_i}}Overview and examples{{/i}}</h3>
263
+ <p>{{_i}}Building on the button group styles and markup, we can easily create a split button. Split buttons feature a standard action on the left and a dropdown toggle on the right with contextual links.{{/i}}</p>
264
+ <div class="btn-toolbar" style="margin-top: 18px;">
265
+ <div class="btn-group">
266
+ <button class="btn">{{_i}}Action{{/i}}</button>
267
+ <button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
268
+ <ul class="dropdown-menu">
269
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
270
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
271
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
272
+ <li class="divider"></li>
273
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
274
+ </ul>
275
+ </div><!-- /btn-group -->
276
+ <div class="btn-group">
277
+ <button class="btn btn-primary">{{_i}}Action{{/i}}</button>
278
+ <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
279
+ <ul class="dropdown-menu">
280
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
281
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
282
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
283
+ <li class="divider"></li>
284
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
285
+ </ul>
286
+ </div><!-- /btn-group -->
287
+ <div class="btn-group">
288
+ <button class="btn btn-danger">{{_i}}Danger{{/i}}</button>
289
+ <button class="btn btn-danger dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
290
+ <ul class="dropdown-menu">
291
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
292
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
293
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
294
+ <li class="divider"></li>
295
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
296
+ </ul>
297
+ </div><!-- /btn-group -->
298
+ </div>
299
+ <div class="btn-toolbar">
300
+ <div class="btn-group">
301
+ <button class="btn btn-warning">{{_i}}Warning{{/i}}</button>
302
+ <button class="btn btn-warning dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
303
+ <ul class="dropdown-menu">
304
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
305
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
306
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
307
+ <li class="divider"></li>
308
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
309
+ </ul>
310
+ </div><!-- /btn-group -->
311
+ <div class="btn-group">
312
+ <button class="btn btn-success">{{_i}}Success{{/i}}</button>
313
+ <button class="btn btn-success dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
314
+ <ul class="dropdown-menu">
315
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
316
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
317
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
318
+ <li class="divider"></li>
319
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
320
+ </ul>
321
+ </div><!-- /btn-group -->
322
+ <div class="btn-group">
323
+ <button class="btn btn-info">{{_i}}Info{{/i}}</button>
324
+ <button class="btn btn-info dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
325
+ <ul class="dropdown-menu">
326
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
327
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
328
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
329
+ <li class="divider"></li>
330
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
331
+ </ul>
332
+ </div><!-- /btn-group -->
333
+ </div>
334
+ <div class="btn-toolbar">
335
+ <div class="btn-group">
336
+ <button class="btn btn-inverse">{{_i}}Inverse{{/i}}</button>
337
+ <button class="btn btn-inverse dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
338
+ <ul class="dropdown-menu">
339
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
340
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
341
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
342
+ <li class="divider"></li>
343
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
344
+ </ul>
345
+ </div><!-- /btn-group -->
346
+ </div><!-- /btn-toolbar -->
347
+ <h3>{{_i}}Sizes{{/i}}</h3>
348
+ <p>{{_i}}Utilize the extra button classes <code>.btn-mini</code>, <code>.btn-small</code>, or <code>.btn-large</code> for sizing.{{/i}}</p>
349
+ <div class="btn-toolbar">
350
+ <div class="btn-group">
351
+ <button class="btn btn-large">{{_i}}Large action{{/i}}</button>
352
+ <button class="btn btn-large dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
353
+ <ul class="dropdown-menu">
354
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
355
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
356
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
357
+ <li class="divider"></li>
358
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
359
+ </ul>
360
+ </div><!-- /btn-group -->
361
+ </div><!-- /btn-toolbar -->
362
+ <div class="btn-toolbar">
363
+ <div class="btn-group">
364
+ <button class="btn btn-small">{{_i}}Small action{{/i}}</button>
365
+ <button class="btn btn-small dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
366
+ <ul class="dropdown-menu">
367
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
368
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
369
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
370
+ <li class="divider"></li>
371
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
372
+ </ul>
373
+ </div><!-- /btn-group -->
374
+ </div><!-- /btn-toolbar -->
375
+ <div class="btn-toolbar">
376
+ <div class="btn-group">
377
+ <button class="btn btn-mini">{{_i}}Mini action{{/i}}</button>
378
+ <button class="btn btn-mini dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
379
+ <ul class="dropdown-menu">
380
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
381
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
382
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
383
+ <li class="divider"></li>
384
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
385
+ </ul>
386
+ </div><!-- /btn-group -->
387
+ </div><!-- /btn-toolbar -->
388
+<pre class="prettyprint linenums">
389
+<div class="btn-group">
390
+ ...
391
+ <ul class="dropdown-menu pull-right">
392
+ <!-- {{_i}}dropdown menu links{{/i}} -->
393
+ </ul>
394
+</div>
395
+</pre>
396
+ </div>
397
+ <div class="span8">
398
+ <h3>{{_i}}Example markup{{/i}}</h3>
399
+ <p>{{_i}}We expand on the normal button dropdowns to provide a second button action that operates as a separate dropdown trigger.{{/i}}</p>
400
+<pre class="prettyprint linenums">
401
+<div class="btn-group">
402
+ <button class="btn">{{_i}}Action{{/i}}</button>
403
+ <button class="btn dropdown-toggle" data-toggle="dropdown">
404
+ <span class="caret"></span>
405
+ </button>
406
+ <ul class="dropdown-menu">
407
+ <!-- {{_i}}dropdown menu links{{/i}} -->
408
+ </ul>
409
+</div>
410
+</pre>
411
+ <h3>{{_i}}Dropup menus{{/i}}</h3>
412
+ <p>{{_i}}Dropdown menus can also be toggled from the bottom up by adding a single class to the immediate parent of <code>.dropdown-menu</code>. It will flip the direction of the <code>.caret</code> and reposition the menu itself to move from the bottom up instead of top down.{{/i}}</p>
413
+ <div class="btn-toolbar" style="margin-top: 9px;">
414
+ <div class="btn-group dropup">
415
+ <button class="btn">{{_i}}Dropup{{/i}}</button>
416
+ <button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
417
+ <ul class="dropdown-menu">
418
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
419
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
420
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
421
+ <li class="divider"></li>
422
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
423
+ </ul>
424
+ </div><!-- /btn-group -->
425
+ <div class="btn-group dropup">
426
+ <button class="btn primary">{{_i}}Right dropup{{/i}}</button>
427
+ <button class="btn primary dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>
428
+ <ul class="dropdown-menu pull-right">
429
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
430
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
431
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
432
+ <li class="divider"></li>
433
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
434
+ </ul>
435
+ </div><!-- /btn-group -->
436
+ </div>
437
+<pre class="prettyprint linenums">
438
+<div class="btn-group dropup">
439
+ <button class="btn">{{_i}}Dropup{{/i}}</button>
440
+ <button class="btn dropdown-toggle" data-toggle="dropdown">
441
+ <span class="caret"></span>
442
+ </button>
443
+ <ul class="dropdown-menu">
444
+ <!-- {{_i}}dropdown menu links{{/i}} -->
445
+ </ul>
446
+</div>
447
+</pre>
448
+
449
+ </div>
450
+ </div>
451
+</section>
452
+
453
+
454
+
455
+<!-- Nav, Tabs, & Pills
456
+================================================== -->
457
+<section id="navs">
458
+ <div class="page-header">
459
+ <h1>{{_i}}Nav, tabs, and pills{{/i}} <small>{{_i}}Highly customizable list-style navigation{{/i}}</small></h1>
460
+ </div>
461
+
462
+ <h2>{{_i}}Lightweight defaults{{/i}} <small>{{_i}}Same markup, different classes{{/i}}</small></h2>
463
+ <div class="row">
464
+ <div class="span4">
465
+ <h3>{{_i}}Powerful base class{{/i}}</h3>
466
+ <p>{{_i}}All nav components here—tabs, pills, and lists—<strong>share the same base markup and styles</strong> through the <code>.nav</code> class.{{/i}}</p>
467
+ <h3>{{_i}}When to use{{/i}}</h3>
468
+ <p>{{_i}}Tabs and pills are great for sections of content or navigating between pages of related content.{{/i}}</p>
469
+ <h3>{{_i}}Component alignment{{/i}}</h3>
470
+ <p>{{_i}}To align nav links, use the <code>.pull-left</code> or <code>.pull-right</code> utility classes. Both classes will add a CSS float in the specified direction.{{/i}}</p>
471
+ </div>
472
+ <div class="span4">
473
+ <h3>{{_i}}Basic tabs{{/i}}</h3>
474
+ <p>{{_i}}Take a regular <code><ul></code> of links and add <code>.nav-tabs</code>:{{/i}}</p>
475
+ <ul class="nav nav-tabs">
476
+ <li class="active"><a href="#">{{_i}}Home{{/i}}</a></li>
477
+ <li><a href="#">{{_i}}Profile{{/i}}</a></li>
478
+ <li><a href="#">{{_i}}Messages{{/i}}</a></li>
479
+ </ul>
480
+<pre class="prettyprint linenums">
481
+<ul class="nav nav-tabs">
482
+ <li class="active">
483
+ <a href="#">{{_i}}Home{{/i}}</a>
484
+ </li>
485
+ <li><a href="#">...</a></li>
486
+ <li><a href="#">...</a></li>
487
+</ul>
488
+</pre>
489
+ </div>
490
+ <div class="span4">
491
+ <h3>{{_i}}Basic pills{{/i}}</h3>
492
+ <p>{{_i}}Take that same HTML, but use <code>.nav-pills</code> instead:{{/i}}</p>
493
+ <ul class="nav nav-pills">
494
+ <li class="active"><a href="#">{{_i}}Home{{/i}}</a></li>
495
+ <li><a href="#">{{_i}}Profile{{/i}}</a></li>
496
+ <li><a href="#">{{_i}}Messages{{/i}}</a></li>
497
+ </ul>
498
+<pre class="prettyprint linenums">
499
+<ul class="nav nav-pills">
500
+ <li class="active">
501
+ <a href="#">{{_i}}Home{{/i}}</a>
502
+ </li>
503
+ <li><a href="#">...</a></li>
504
+ <li><a href="#">...</a></li>
505
+</ul>
506
+</pre>
507
+ </div>
508
+ </div>
509
+
510
+ <h2>{{_i}}Stackable{{/i}} <small>{{_i}}Make tabs or pills vertical{{/i}}</small></h2>
511
+ <div class="row">
512
+ <div class="span4">
513
+ <h3>{{_i}}How to stack 'em{{/i}}</h3>
514
+ <p>{{_i}}As tabs and pills are horizontal by default, just add a second class, <code>.nav-stacked</code>, to make them appear vertically stacked.{{/i}}</p>
515
+ </div>
516
+ <div class="span4">
517
+ <h3>{{_i}}Stacked tabs{{/i}}</h3>
518
+ <ul class="nav nav-tabs nav-stacked">
519
+ <li class="active"><a href="#">{{_i}}Home{{/i}}</a></li>
520
+ <li><a href="#">{{_i}}Profile{{/i}}</a></li>
521
+ <li><a href="#">{{_i}}Messages{{/i}}</a></li>
522
+ </ul>
523
+<pre class="prettyprint linenums">
524
+<ul class="nav nav-tabs nav-stacked">
525
+ ...
526
+</ul>
527
+</pre>
528
+ </div>
529
+ <div class="span4">
530
+ <h3>{{_i}}Stacked pills{{/i}}</h3>
531
+ <ul class="nav nav-pills nav-stacked">
532
+ <li class="active"><a href="#">{{_i}}Home{{/i}}</a></li>
533
+ <li><a href="#">{{_i}}Profile{{/i}}</a></li>
534
+ <li><a href="#">{{_i}}Messages{{/i}}</a></li>
535
+ </ul>
536
+<pre class="prettyprint linenums">
537
+<ul class="nav nav-pills nav-stacked">
538
+ ...
539
+</ul>
540
+</pre>
541
+ </div>
542
+ </div>
543
+
544
+ <h2>{{_i}}Dropdowns{{/i}} <small>{{_i}}For advanced nav components{{/i}}</small></h2>
545
+ <div class="row">
546
+ <div class="span4">
547
+ <h3>{{_i}}Rich menus made easy{{/i}}</h3>
548
+ <p>{{_i}}Dropdown menus in Bootstrap tabs and pills are super easy and require only a little extra HTML and a lightweight jQuery plugin.{{/i}}</p>
549
+ <p>{{_i}}Head over to the Javascript page to read the docs on <a href="./javascript.html#tabs">initializing dropdowns</a> in Bootstrap.{{/i}}</p>
550
+ </div>
551
+ <div class="span4">
552
+ <h3>{{_i}}Tabs with dropdowns{{/i}}</h3>
553
+ <ul class="nav nav-tabs">
554
+ <li class="active"><a href="#">{{_i}}Home{{/i}}</a></li>
555
+ <li><a href="#">{{_i}}Help{{/i}}</a></li>
556
+ <li class="dropdown">
557
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">{{_i}}Dropdown{{/i}} <b class="caret"></b></a>
558
+ <ul class="dropdown-menu">
559
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
560
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
561
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
562
+ <li class="divider"></li>
563
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
564
+ </ul>
565
+ </li>
566
+ </ul>
567
+<pre class="prettyprint linenums">
568
+<ul class="nav nav-tabs">
569
+ <li class="dropdown">
570
+ <a class="dropdown-toggle"
571
+ data-toggle="dropdown"
572
+ href="#">
573
+ {{_i}}Dropdown{{/i}}
574
+ <b class="caret"></b>
575
+ </a>
576
+ <ul class="dropdown-menu">
577
+ <!-- {{_i}}links{{/i}} -->
578
+ </ul>
579
+ </li>
580
+</ul>
581
+</pre>
582
+ </div>
583
+ <div class="span4">
584
+ <h3>{{_i}}Pills with dropdowns{{/i}}</h3>
585
+ <ul class="nav nav-pills">
586
+ <li class="active"><a href="#">{{_i}}Home{{/i}}</a></li>
587
+ <li><a href="#">{{_i}}Help{{/i}}</a></li>
588
+ <li class="dropdown">
589
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">{{_i}}Dropdown{{/i}} <b class="caret"></b></a>
590
+ <ul class="dropdown-menu">
591
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
592
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
593
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
594
+ <li class="divider"></li>
595
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
596
+ </ul>
597
+ </li>
598
+ </ul>
599
+<pre class="prettyprint linenums">
600
+<ul class="nav nav-pills">
601
+ <li class="dropdown">
602
+ <a class="dropdown-toggle"
603
+ data-toggle="dropdown"
604
+ href="#">
605
+ {{_i}}Dropdown{{/i}}
606
+ <b class="caret"></b>
607
+ </a>
608
+ <ul class="dropdown-menu">
609
+ <!-- {{_i}}links{{/i}} -->
610
+ </ul>
611
+ </li>
612
+</ul>
613
+</pre>
614
+ </div>
615
+ </div>
616
+
617
+ <h2>{{_i}}Nav lists{{/i}} <small>{{_i}}Build simple stacked navs, great for sidebars{{/i}}</small></h2>
618
+ <div class="row">
619
+ <div class="span4">
620
+ <h3>{{_i}}Application-style navigation{{/i}}</h3>
621
+ <p>{{_i}}Nav lists provide a simple and easy way to build groups of nav links with optional headers. They're best used in sidebars like the Finder in OS X.{{/i}}</p>
622
+ <p>{{_i}}Structurally, they're built on the same core nav styles as tabs and pills, so usage and customization are straightforward.{{/i}}</p>
623
+ <hr>
624
+ <h4>{{_i}}With icons{{/i}}</h4>
625
+ <p>{{_i}}Nav lists are also easy to equip with icons. Add the proper <code><i></code> tag with class and you're set.{{/i}}</p>
626
+ <h4>{{_i}}Horizontal dividers{{/i}}</h4>
627
+ <p>{{_i}}Add a horizontal divider by creating an empty list item with the class <code>.divider</code>, like so:{{/i}}</p>
628
+<pre class="prettyprint linenums">
629
+<ul class="nav nav-list">
630
+ ...
631
+ <li class="divider"></li>
632
+ ...
633
+</ul>
634
+</pre>
635
+ </div>
636
+ <div class="span4">
637
+ <h3>{{_i}}Example nav list{{/i}}</h3>
638
+ <p>{{_i}}Take a list of links and add <code>class="nav nav-list"</code>:{{/i}}</p>
639
+ <div class="well" style="padding: 8px 0;">
640
+ <ul class="nav nav-list">
641
+ <li class="nav-header">{{_i}}List header{{/i}}</li>
642
+ <li class="active"><a href="#">{{_i}}Home{{/i}}</a></li>
643
+ <li><a href="#">{{_i}}Library{{/i}}</a></li>
644
+ <li><a href="#">{{_i}}Applications{{/i}}</a></li>
645
+ <li class="nav-header">{{_i}}Another list header{{/i}}</li>
646
+ <li><a href="#">{{_i}}Profile{{/i}}</a></li>
647
+ <li><a href="#">{{_i}}Settings{{/i}}</a></li>
648
+ <li class="divider"></li>
649
+ <li><a href="#">{{_i}}Help{{/i}}</a></li>
650
+ </ul>
651
+ </div> <!-- /well -->
652
+<pre class="prettyprint linenums">
653
+<ul class="nav nav-list">
654
+ <li class="nav-header">
655
+ {{_i}}List header{{/i}}
656
+ </li>
657
+ <li class="active">
658
+ <a href="#">{{_i}}Home{{/i}}</a>
659
+ </li>
660
+ <li>
661
+ <a href="#">{{_i}}Library{{/i}}</a>
662
+ </li>
663
+ ...
664
+</ul>
665
+</pre>
666
+ </div>
667
+ <div class="span4">
668
+ <h3>{{_i}}Example with icons{{/i}}</h3>
669
+ <p>{{_i}}Same example, but with <code><i></code> tags for icons.{{/i}}</p>
670
+ <div class="well" style="padding: 8px 0;">
671
+ <ul class="nav nav-list">
672
+ <li class="nav-header">{{_i}}List header{{/i}}</li>
673
+ <li class="active"><a href="#"><i class="icon-white icon-home"></i> {{_i}}Home{{/i}}</a></li>
674
+ <li><a href="#"><i class="icon-book"></i> {{_i}}Library{{/i}}</a></li>
675
+ <li><a href="#"><i class="icon-pencil"></i> {{_i}}Applications{{/i}}</a></li>
676
+ <li class="nav-header">{{_i}}Another list header{{/i}}</li>
677
+ <li><a href="#"><i class="icon-user"></i> {{_i}}Profile{{/i}}</a></li>
678
+ <li><a href="#"><i class="icon-cog"></i> {{_i}}Settings{{/i}}</a></li>
679
+ <li class="divider"></li>
680
+ <li><a href="#"><i class="icon-flag"></i> {{_i}}Help{{/i}}</a></li>
681
+ </ul>
682
+ </div> <!-- /well -->
683
+<pre class="prettyprint linenums">
684
+<ul class="nav nav-list">
685
+ ...
686
+ <li>
687
+ <a href="#">
688
+ <i class="icon-book"></i>
689
+ {{_i}}Library{{/i}}
690
+ </a>
691
+ </li>
692
+ ...
693
+</ul>
694
+</pre>
695
+ </div>
696
+ </div>
697
+
698
+
699
+ <h2>{{_i}}Tabbable nav{{/i}} <small>{{_i}}Bring tabs to life via javascript{{/i}}</small></h2>
700
+ <div class="row">
701
+ <div class="span4">
702
+ <h3>{{_i}}What's included{{/i}}</h3>
703
+ <p>{{_i}}Bring your tabs to life with a simple plugin to toggle between content via tabs. Bootstrap integrates tabbable tabs in four styles: top (default), right, bottom, and left.{{/i}}</p>
704
+ <p>{{_i}}Changing between them is easy and only requires changing very little markup.{{/i}}</p>
705
+ <hr>
706
+ <h4>{{_i}}Fade in tabs{{/i}}</h4>
707
+ <p>{{_i}}To make tabs fade in, add <code>.fade</code> to each <code>.tab-pane</code>.{{/i}}</p>
708
+ <hr>
709
+ <h4>{{_i}}Requires jQuery plugin{{/i}}</h4>
710
+ <p>{{_i}}All tabbable tabs are powered by our lightweight jQuery plugin. Read more about how to bring tabbable tabs to life <a href="./javascript.html#tabs">on the javascript docs page</a>.{{/i}}</p>
711
+ <p><a class="btn" href="./javascript.html#tabs">{{_i}}Get the javascript →{{/i}}</a></p>
712
+ </div>
713
+ <div class="span8">
714
+ <h3>{{_i}}Tabbable example{{/i}}</h3>
715
+ <p>{{_i}}To make tabs tabbable, create a <code>.tab-pane</code> with unique ID for every tab and wrap them in <code>.tab-content</code>.{{/i}}</p>
716
+ <div class="tabbable" style="margin-bottom: 18px;">
717
+ <ul class="nav nav-tabs">
718
+ <li class="active"><a href="#tab1" data-toggle="tab">{{_i}}Section 1{{/i}}</a></li>
719
+ <li><a href="#tab2" data-toggle="tab">{{_i}}Section 2{{/i}}</a></li>
720
+ <li><a href="#tab3" data-toggle="tab">{{_i}}Section 3{{/i}}</a></li>
721
+ </ul>
722
+ <div class="tab-content" style="padding-bottom: 9px; border-bottom: 1px solid #ddd;">
723
+ <div class="tab-pane active" id="tab1">
724
+ <p>{{_i}}I'm in Section 1.{{/i}}</p>
725
+ </div>
726
+ <div class="tab-pane" id="tab2">
727
+ <p>{{_i}}Howdy, I'm in Section 2.{{/i}}</p>
728
+ </div>
729
+ <div class="tab-pane" id="tab3">
730
+ <p>{{_i}}What up girl, this is Section 3.{{/i}}</p>
731
+ </div>
732
+ </div>
733
+ </div> <!-- /tabbable -->
734
+ <p>{{_i}}For right or left aligned tabs, wrap the <code>.nav-tabs</code> and <code>.tab-content</code> in <code>.tabbable</code>.{{/i}}</p>
735
+
736
+ <h3>{{_i}}Straightforward markup{{/i}}</h3>
737
+ <p>{{_i}}Using tabbable tabs requires a wrapping div, a set of tabs, and a set of tabbable panes of content.{{/i}}</p>
738
+<pre class="prettyprint linenums">
739
+<div class="tabbable"> <!-- Only required for left/right tabs -->
740
+ <ul class="nav nav-tabs">
741
+ <li class="active"><a href="#tab1" data-toggle="tab">{{_i}}Section 1{{/i}}</a></li>
742
+ <li><a href="#tab2" data-toggle="tab">{{_i}}Section 2{{/i}}</a></li>
743
+ </ul>
744
+ <div class="tab-content">
745
+ <div class="tab-pane active" id="tab1">
746
+ <p>{{_i}}I'm in Section 1.{{/i}}</p>
747
+ </div>
748
+ <div class="tab-pane" id="tab2">
749
+ <p>{{_i}}Howdy, I'm in Section 2.{{/i}}</p>
750
+ </div>
751
+ </div>
752
+</div>
753
+</pre>
754
+ </div>
755
+ </div>
756
+
757
+
758
+ <h3>{{_i}}Tabbable in any direction{{/i}}</h3>
759
+ <div class="row">
760
+ <div class="span4">
761
+ <h4>{{_i}}Tabs on the bottom{{/i}}</h4>
762
+ <p>{{_i}}Flip the order of the HTML and add a class to put tabs on the bottom.{{/i}}</p>
763
+ <div class="tabbable tabs-below">
764
+ <div class="tab-content">
765
+ <div class="tab-pane active" id="A">
766
+ <p>{{_i}}I'm in Section A.{{/i}}</p>
767
+ </div>
768
+ <div class="tab-pane" id="B">
769
+ <p>{{_i}}Howdy, I'm in Section B.{{/i}}</p>
770
+ </div>
771
+ <div class="tab-pane" id="C">
772
+ <p>{{_i}}What up girl, this is Section C.{{/i}}</p>
773
+ </div>
774
+ </div>
775
+ <ul class="nav nav-tabs">
776
+ <li class="active"><a href="#A" data-toggle="tab">{{_i}}Section 1{{/i}}</a></li>
777
+ <li><a href="#B" data-toggle="tab">{{_i}}Section 2{{/i}}</a></li>
778
+ <li><a href="#C" data-toggle="tab">{{_i}}Section 3{{/i}}</a></li>
779
+ </ul>
780
+ </div> <!-- /tabbable -->
781
+<pre class="prettyprint linenums" style="margin-top: 11px;">
782
+<div class="tabbable tabs-below">
783
+ <div class="tab-content">
784
+ ...
785
+ </div>
786
+ <ul class="nav nav-tabs">
787
+ ...
788
+ </ul>
789
+</div>
790
+</pre>
791
+ </div>
792
+ <div class="span4">
793
+ <h4>{{_i}}Tabs on the left{{/i}}</h4>
794
+ <p>{{_i}}Swap the class to put tabs on the left.{{/i}}</p>
795
+ <div class="tabbable tabs-left">
796
+ <ul class="nav nav-tabs">
797
+ <li class="active"><a href="#lA" data-toggle="tab">{{_i}}Section 1{{/i}}</a></li>
798
+ <li><a href="#lB" data-toggle="tab">{{_i}}Section 2{{/i}}</a></li>
799
+ <li><a href="#lC" data-toggle="tab">{{_i}}Section 3{{/i}}</a></li>
800
+ </ul>
801
+ <div class="tab-content">
802
+ <div class="tab-pane active" id="lA">
803
+ <p>{{_i}}I'm in Section A.{{/i}}</p>
804
+ </div>
805
+ <div class="tab-pane" id="lB">
806
+ <p>{{_i}}Howdy, I'm in Section B.{{/i}}</p>
807
+ </div>
808
+ <div class="tab-pane" id="lC">
809
+ <p>{{_i}}What up girl, this is Section C.{{/i}}</p>
810
+ </div>
811
+ </div>
812
+ </div> <!-- /tabbable -->
813
+<pre class="prettyprint linenums">
814
+<div class="tabbable tabs-left">
815
+ <ul class="nav nav-tabs">
816
+ ...
817
+ </ul>
818
+ <div class="tab-content">
819
+ ...
820
+ </div>
821
+</div>
822
+</pre>
823
+ </div>
824
+ <div class="span4">
825
+ <h4>{{_i}}Tabs on the right{{/i}}</h4>
826
+ <p>{{_i}}Swap the class to put tabs on the right.{{/i}}</p>
827
+ <div class="tabbable tabs-right">
828
+ <ul class="nav nav-tabs">
829
+ <li class="active"><a href="#rA" data-toggle="tab">{{_i}}Section 1{{/i}}</a></li>
830
+ <li><a href="#rB" data-toggle="tab">{{_i}}Section 2{{/i}}</a></li>
831
+ <li><a href="#rC" data-toggle="tab">{{_i}}Section 3{{/i}}</a></li>
832
+ </ul>
833
+ <div class="tab-content">
834
+ <div class="tab-pane active" id="rA">
835
+ <p>{{_i}}I'm in Section A.{{/i}}</p>
836
+ </div>
837
+ <div class="tab-pane" id="rB">
838
+ <p>{{_i}}Howdy, I'm in Section B.{{/i}}</p>
839
+ </div>
840
+ <div class="tab-pane" id="rC">
841
+ <p>{{_i}}What up girl, this is Section C.{{/i}}</p>
842
+ </div>
843
+ </div>
844
+ </div> <!-- /tabbable -->
845
+<pre class="prettyprint linenums">
846
+<div class="tabbable tabs-right">
847
+ <ul class="nav nav-tabs">
848
+ ...
849
+ </ul>
850
+ <div class="tab-content">
851
+ ...
852
+ </div>
853
+</div>
854
+</pre>
855
+ </div>
856
+ </div>
857
+
858
+</section>
859
+
860
+
861
+
862
+<!-- Navbar
863
+================================================== -->
864
+<section id="navbar">
865
+ <div class="page-header">
866
+ <h1>{{_i}}Navbar{{/i}}</h1>
867
+ </div>
868
+ <h2>{{_i}}Static navbar example{{/i}}</h2>
869
+ <p>{{_i}}An example of a static (not fixed to the top) navbar with project name, navigation, and search form.{{/i}}</p>
870
+ <div class="navbar">
871
+ <div class="navbar-inner">
872
+ <div class="container">
873
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
874
+ <span class="icon-bar"></span>
875
+ <span class="icon-bar"></span>
876
+ <span class="icon-bar"></span>
877
+ </a>
878
+ <a class="brand" href="#">{{_i}}Project name{{/i}}</a>
879
+ <div class="nav-collapse">
880
+ <ul class="nav">
881
+ <li class="active"><a href="#">{{_i}}Home{{/i}}</a></li>
882
+ <li><a href="#">{{_i}}Link{{/i}}</a></li>
883
+ <li><a href="#">{{_i}}Link{{/i}}</a></li>
884
+ <li><a href="#">{{_i}}Link{{/i}}</a></li>
885
+ <li class="dropdown">
886
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{_i}}Dropdown{{/i}} <b class="caret"></b></a>
887
+ <ul class="dropdown-menu">
888
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
889
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
890
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
891
+ <li class="divider"></li>
892
+ <li class="nav-header">Nav header</li>
893
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
894
+ <li><a href="#">{{_i}}One more separated link{{/i}}</a></li>
895
+ </ul>
896
+ </li>
897
+ </ul>
898
+ <form class="navbar-search pull-left" action="">
899
+ <input type="text" class="search-query span2" placeholder="Search">
900
+ </form>
901
+ <ul class="nav pull-right">
902
+ <li><a href="#">{{_i}}Link{{/i}}</a></li>
903
+ <li class="divider-vertical"></li>
904
+ <li class="dropdown">
905
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{_i}}Dropdown{{/i}} <b class="caret"></b></a>
906
+ <ul class="dropdown-menu">
907
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
908
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
909
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
910
+ <li class="divider"></li>
911
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
912
+ </ul>
913
+ </li>
914
+ </ul>
915
+ </div><!-- /.nav-collapse -->
916
+ </div>
917
+ </div><!-- /navbar-inner -->
918
+ </div><!-- /navbar -->
919
+
920
+ <div class="row">
921
+ <div class="span8">
922
+ <h3>{{_i}}Navbar scaffolding{{/i}}</h3>
923
+ <p>{{_i}}The navbar requires only a few divs to structure it well for static or fixed display.{{/i}}</p>
924
+<pre class="prettyprint linenums">
925
+<div class="navbar">
926
+ <div class="navbar-inner">
927
+ <div class="container">
928
+ ...
929
+ </div>
930
+ </div>
931
+</div>
932
+</pre>
933
+ <h3>{{_i}}Fixed navbar{{/i}}</h3>
934
+ <p>{{_i}}Fix the navbar to the top or bottom of the viewport with an additional class on the outermost div, <code>.navbar</code>.{{/i}}</p>
935
+ <div class="row">
936
+ <div class="span4">
937
+<pre class="prettyprint linenums">
938
+<div class="navbar navbar-fixed-top">
939
+ ...
940
+</div>
941
+</pre>
942
+ </div><!--/span-->
943
+ <div class="span4">
944
+<pre class="prettyprint linenums">
945
+<div class="navbar navbar-fixed-bottom">
946
+ ...
947
+</div>
948
+</pre>
949
+ </div><!--/span-->
950
+ </div><!--/row-->
951
+ <p>{{_i}}When you affix the navbar, remember to account for the hidden area underneath. Add 40px or more of padding to the <code><body></code>. Be sure to add this after the core Bootstrap CSS and before the optional responsive CSS.{{/i}}</p>
952
+ <h3>{{_i}}Brand name{{/i}}</h3>
953
+ <p>{{_i}}A simple link to show your brand or project name only requires an anchor tag.{{/i}}</p>
954
+<pre class="prettyprint linenums">
955
+<a class="brand" href="#">
956
+ {{_i}}Project name{{/i}}
957
+</a>
958
+</pre>
959
+ <h3>{{_i}}Forms in navbar{{/i}}</h3>
960
+ <p>{{_i}}To properly style and position a form within the navbar, add the appropriate classes as shown below. For a default form, include <code>.navbar-form</code> and either <code>.pull-left</code> or <code>.pull-right</code> to properly align it.{{/i}}</p>
961
+<pre class="prettyprint linenums">
962
+<form class="navbar-form pull-left">
963
+ <input type="text" class="span2">
964
+</form>
965
+</pre>
966
+ <p>{{_i}}For a more customized search form, add <code>.navbar-search</code> to the <code>form</code> and <code>.search-query</code> to the input for specialized styles in the navbar.{{/i}}</p>
967
+<pre class="prettyprint linenums">
968
+<form class="navbar-search pull-left">
969
+ <input type="text" class="search-query" placeholder="{{_i}}Search{{/i}}">
970
+</form>
971
+</pre>
972
+ <h3>{{_i}}Optional responsive variation{{/i}}</h3>
973
+ <p>{{_i}}Depending on the amount of content in your topbar, you might want to implement the responsive options. To do so, wrap your nav content in a containing div, <code>.nav-collapse.collapse</code>, and add the navbar toggle button, <code>.btn-navbar</code>.{{/i}}</p>
974
+<pre class="prettyprint linenums">
975
+<div class="navbar">
976
+ <div class="navbar-inner">
977
+ <div class="container">
978
+
979
+ <!-- {{_i}}.btn-navbar is used as the toggle for collapsed navbar content{{/i}} -->
980
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
981
+ <span class="icon-bar"></span>
982
+ <span class="icon-bar"></span>
983
+ <span class="icon-bar"></span>
984
+ </a>
985
+
986
+ <!-- {{_i}}Be sure to leave the brand out there if you want it shown{{/i}} -->
987
+ <a class="brand" href="#">{{_i}}Project name{{/i}}</a>
988
+
989
+ <!-- {{_i}}Everything you want hidden at 940px or less, place within here{{/i}} -->
990
+ <div class="nav-collapse">
991
+ <!-- .nav, .navbar-search, .navbar-form, etc -->
992
+ </div>
993
+
994
+ </div>
995
+ </div>
996
+</div>
997
+</pre>
998
+ <div class="alert alert-info">
999
+ <strong>{{_i}}Heads up!{{/i}}</strong> The responsive navbar requires the <a href="./javascript.html#collapse">collapse plugin</a> and <a href="./scaffolding.html#responsive">responsive Bootstrap CSS file</a>.
1000
+ </div>
1001
+
1002
+ </div><!-- /.span -->
1003
+ <div class="span4">
1004
+ <h3>{{_i}}Nav links{{/i}}</h3>
1005
+ <p>{{_i}}Nav items are simple to add via unordered lists.{{/i}}</p>
1006
+<pre class="prettyprint linenums">
1007
+<ul class="nav">
1008
+ <li class="active">
1009
+ <a href="#">{{_i}}Home{{/i}}</a>
1010
+ </li>
1011
+ <li><a href="#">{{_i}}Link{{/i}}</a></li>
1012
+ <li><a href="#">{{_i}}Link{{/i}}</a></li>
1013
+</ul>
1014
+</pre>
1015
+ <p>{{_i}}You can easily add dividers to your nav links with an empty list item and a simple class. Just add this between links:{{/i}}</p>
1016
+<pre class="prettyprint linenums">
1017
+<ul class="nav">
1018
+ ...
1019
+ <li class="divider-vertical"></li>
1020
+ ...
1021
+</ul>
1022
+</pre>
1023
+ <h3>{{_i}}Component alignment{{/i}}</h3>
1024
+ <p>{{_i}}To align a nav, search form, or text, use the <code>.pull-left</code> or <code>.pull-right</code> utility classes. Both classes will add a CSS float in the specified direction.{{/i}}</p>
1025
+ <h3>{{_i}}Adding dropdown menus{{/i}}</h3>
1026
+ <p>{{_i}}Adding dropdowns and dropups to the nav is super simple, but does require the use of <a href="./javascript.html#dropdowns">our javascript plugin</a>.{{/i}}</p>
1027
+<pre class="prettyprint linenums">
1028
+<ul class="nav">
1029
+ <li class="dropdown">
1030
+ <a href="#"
1031
+ class="dropdown-toggle"
1032
+ data-toggle="dropdown">
1033
+ {{_i}}Account{{/i}}
1034
+ <b class="caret"></b>
1035
+ </a>
1036
+ <ul class="dropdown-menu">
1037
+ ...
1038
+ </ul>
1039
+ </li>
1040
+</ul>
1041
+</pre>
1042
+ <p><a class="btn" href="./javascript.html#dropdowns">{{_i}}Get the javascript →{{/i}}</a></p>
1043
+ <hr>
1044
+ <h3>{{_i}}Text in the navbar{{/i}}</h3>
1045
+ <p>{{_i}}Wrap strings of text in a <code><.navbar-text></code>, usually on a <code><p></code> tag for proper leading and color.{{/i}}</p>
1046
+ </div><!-- /.span -->
1047
+ </div><!-- /.row -->
1048
+
1049
+</section>
1050
+
1051
+
1052
+
1053
+<!-- Breadcrumbs
1054
+================================================== -->
1055
+<section id="breadcrumbs">
1056
+ <div class="page-header">
1057
+ <h1>{{_i}}Breadcrumbs{{/i}} <small></small></h1>
1058
+ </div>
1059
+
1060
+ <div class="row">
1061
+ <div class="span6">
1062
+ <h3>{{_i}}Why use them{{/i}}</h3>
1063
+ <p>{{_i}}Breadcrumb navigation is used as a way to show users where they are within an app or a site, but not for primary navigation. Keep their use sparse and succinct to be most effective.{{/i}}</p>
1064
+
1065
+ <h3>{{_i}}Examples{{/i}}</h3>
1066
+ <p>{{_i}}A single example shown as it might be displayed across multiple pages.{{/i}}</p>
1067
+ <ul class="breadcrumb">
1068
+ <li class="active">{{_i}}Home{{/i}}</li>
1069
+ </ul>
1070
+ <ul class="breadcrumb">
1071
+ <li><a href="#">{{_i}}Home{{/i}}</a> <span class="divider">/</span></li>
1072
+ <li class="active">{{_i}}Library{{/i}}</li>
1073
+ </ul>
1074
+ <ul class="breadcrumb">
1075
+ <li><a href="#">{{_i}}Home{{/i}}</a> <span class="divider">/</span></li>
1076
+ <li><a href="#">{{_i}}Library{{/i}}</a> <span class="divider">/</span></li>
1077
+ <li class="active">{{_i}}Data{{/i}}</li>
1078
+ </ul>
1079
+ </div>
1080
+ <div class="span6">
1081
+ <h3>{{_i}}Markup{{/i}}</h3>
1082
+ <p>{{_i}}HTML is your standard unordered list with links.{{/i}}</p>
1083
+<pre class="prettyprint linenums">
1084
+<ul class="breadcrumb">
1085
+ <li>
1086
+ <a href="#">{{_i}}Home{{/i}}</a> <span class="divider">/</span>
1087
+ </li>
1088
+ <li>
1089
+ <a href="#">{{_i}}Library{{/i}}</a> <span class="divider">/</span>
1090
+ </li>
1091
+ <li class="active">{{_i}}Data{{/i}}</li>
1092
+</ul>
1093
+</pre>
1094
+ </div>
1095
+ </div>
1096
+
1097
+</section>
1098
+
1099
+
1100
+
1101
+<!-- Pagination
1102
+================================================== -->
1103
+<section id="pagination">
1104
+ <div class="page-header">
1105
+ <h1>{{_i}}Pagination{{/i}} <small>{{_i}}Two options for paging through content{{/i}}</small></h1>
1106
+ </div>
1107
+
1108
+ <h2>{{_i}}Multicon-page pagination{{/i}}</h2>
1109
+ <div class="row">
1110
+ <div class="span4">
1111
+ <h3>{{_i}}When to use{{/i}}</h3>
1112
+ <p>{{_i}}Ultra simplistic and minimally styled pagination inspired by Rdio, great for apps and search results. The large block is hard to miss, easily scalable, and provides large click areas.{{/i}}</p>
1113
+ <h3>{{_i}}Stateful page links{{/i}}</h3>
1114
+ <p>{{_i}}Links are customizable and work in a number of circumstances with the right class. <code>.disabled</code> for unclickable links and <code>.active</code> for current page.{{/i}}</p>
1115
+ <h3>{{_i}}Flexible alignment{{/i}}</h3>
1116
+ <p>{{_i}}Add either of two optional classes to change the alignment of pagination links: <code>.pagination-centered</code> and <code>.pagination-right</code>.{{/i}}</p>
1117
+ </div>
1118
+ <div class="span4">
1119
+ <h3>{{_i}}Examples{{/i}}</h3>
1120
+ <p>{{_i}}The default pagination component is flexible and works in a number of variations.{{/i}}</p>
1121
+ <div class="pagination">
1122
+ <ul>
1123
+ <li class="disabled"><a href="#">«</a></li>
1124
+ <li class="active"><a href="#">1</a></li>
1125
+ <li><a href="#">2</a></li>
1126
+ <li><a href="#">3</a></li>
1127
+ <li><a href="#">4</a></li>
1128
+ <li><a href="#">»</a></li>
1129
+ </ul>
1130
+ </div>
1131
+ <div class="pagination">
1132
+ <ul>
1133
+ <li><a href="#">«</a></li>
1134
+ <li><a href="#">10</a></li>
1135
+ <li class="active"><a href="#">11</a></li>
1136
+ <li><a href="#">12</a></li>
1137
+ <li><a href="#">»</a></li>
1138
+ </ul>
1139
+ </div>
1140
+ <div class="pagination">
1141
+ <ul>
1142
+ <li><a href="#">«</a></li>
1143
+ <li class="active"><a href="#">10</a></li>
1144
+ <li class="disabled"><a href="#">...</a></li>
1145
+ <li><a href="#">20</a></li>
1146
+ <li><a href="#">»</a></li>
1147
+ </ul>
1148
+ </div>
1149
+ <div class="pagination pagination-centered">
1150
+ <ul>
1151
+ <li class="active"><a href="#">1</a></li>
1152
+ <li><a href="#">2</a></li>
1153
+ <li><a href="#">3</a></li>
1154
+ <li><a href="#">4</a></li>
1155
+ <li><a href="#">5</a></li>
1156
+ </ul>
1157
+ </div>
1158
+ </div>
1159
+ <div class="span4">
1160
+ <h3>{{_i}}Markup{{/i}}</h3>
1161
+ <p>{{_i}}Wrapped in a <code><div></code>, pagination is just a <code><ul></code>.{{/i}}</p>
1162
+<pre class="prettyprint linenums">
1163
+<div class="pagination">
1164
+ <ul>
1165
+ <li><a href="#">Prev</a></li>
1166
+ <li class="active">
1167
+ <a href="#">1</a>
1168
+ </li>
1169
+ <li><a href="#">2</a></li>
1170
+ <li><a href="#">3</a></li>
1171
+ <li><a href="#">4</a></li>
1172
+ <li><a href="#">Next</a></li>
1173
+ </ul>
1174
+</div>
1175
+</pre>
1176
+ </div>
1177
+ </div><!-- /row -->
1178
+
1179
+ <h2>{{_i}}Pager{{/i}} <small>{{_i}}For quick previous and next links{{/i}}</small></h2>
1180
+ <div class="row">
1181
+ <div class="span4">
1182
+ <h3>{{_i}}About pager{{/i}}</h3>
1183
+ <p>{{_i}}The pager component is a set of links for simple pagination implementations with light markup and even lighter styles. It's great for simple sites like blogs or magazines.{{/i}}</p>
1184
+ <h4>{{_i}}Optional disabled state{{/i}}</h4>
1185
+ <p>{{_i}}Pager links also use the general <code>.disabled</code> class from the pagination.{{/i}}</p>
1186
+ </div>
1187
+ <div class="span4">
1188
+ <h3>{{_i}}Default example{{/i}}</h3>
1189
+ <p>{{_i}}By default, the pager centers links.{{/i}}</p>
1190
+ <ul class="pager">
1191
+ <li><a href="#">{{_i}}Previous{{/i}}</a></li>
1192
+ <li><a href="#">{{_i}}Next{{/i}}</a></li>
1193
+ </ul>
1194
+<pre class="prettyprint linenums">
1195
+<ul class="pager">
1196
+ <li>
1197
+ <a href="#">{{_i}}Previous{{/i}}</a>
1198
+ </li>
1199
+ <li>
1200
+ <a href="#">{{_i}}Next{{/i}}</a>
1201
+ </li>
1202
+</ul>
1203
+</pre>
1204
+ </div>
1205
+ <div class="span4">
1206
+ <h3>{{_i}}Aligned links{{/i}}</h3>
1207
+ <p>{{_i}}Alternatively, you can align each link to the sides:{{/i}}</p>
1208
+ <ul class="pager">
1209
+ <li class="previous"><a href="#">{{_i}}← Older{{/i}}</a></li>
1210
+ <li class="next"><a href="#">{{_i}}Newer →{{/i}}</a></li>
1211
+ </ul>
1212
+<pre class="prettyprint linenums">
1213
+<ul class="pager">
1214
+ <li class="previous">
1215
+ <a href="#">{{_i}}&larr; Older{{/i}}</a>
1216
+ </li>
1217
+ <li class="next">
1218
+ <a href="#">{{_i}}Newer &rarr;{{/i}}</a>
1219
+ </li>
1220
+</ul>
1221
+</pre>
1222
+ </div>
1223
+ </div><!-- /row -->
1224
+</section>
1225
+
1226
+
1227
+
1228
+<!-- Labels
1229
+================================================== -->
1230
+<section id="labels">
1231
+ <div class="page-header">
1232
+ <h1>{{_i}}Inline labels{{/i}} <small>{{_i}}Label and annotate text{{/i}}</small></h1>
1233
+ </div>
1234
+ <table class="table table-bordered table-striped">
1235
+ <thead>
1236
+ <tr>
1237
+ <th>{{_i}}Labels{{/i}}</th>
1238
+ <th>{{_i}}Markup{{/i}}</th>
1239
+ </tr>
1240
+ </thead>
1241
+ <tbody>
1242
+ <tr>
1243
+ <td>
1244
+ <span class="label">{{_i}}Default{{/i}}</span>
1245
+ </td>
1246
+ <td>
1247
+ <code><span class="label">{{_i}}Default{{/i}}</span></code>
1248
+ </td>
1249
+ </tr>
1250
+ <tr>
1251
+ <td>
1252
+ <span class="label label-success">{{_i}}Success{{/i}}</span>
1253
+ </td>
1254
+ <td>
1255
+ <code><span class="label label-success">{{_i}}Success{{/i}}</span></code>
1256
+ </td>
1257
+ </tr>
1258
+ <tr>
1259
+ <td>
1260
+ <span class="label label-warning">{{_i}}Warning{{/i}}</span>
1261
+ </td>
1262
+ <td>
1263
+ <code><span class="label label-warning">{{_i}}Warning{{/i}}</span></code>
1264
+ </td>
1265
+ </tr>
1266
+ <tr>
1267
+ <td>
1268
+ <span class="label label-important">{{_i}}Important{{/i}}</span>
1269
+ </td>
1270
+ <td>
1271
+ <code><span class="label label-important">{{_i}}Important{{/i}}</span></code>
1272
+ </td>
1273
+ </tr>
1274
+ <tr>
1275
+ <td>
1276
+ <span class="label label-info">{{_i}}Info{{/i}}</span>
1277
+ </td>
1278
+ <td>
1279
+ <code><span class="label label-info">{{_i}}Info{{/i}}</span></code>
1280
+ </td>
1281
+ </tr>
1282
+ <tr>
1283
+ <td>
1284
+ <span class="label label-inverse">{{_i}}Inverse{{/i}}</span>
1285
+ </td>
1286
+ <td>
1287
+ <code><span class="label label-inverse">{{_i}}Inverse{{/i}}</span></code>
1288
+ </td>
1289
+ </tr>
1290
+ </tbody>
1291
+ </table>
1292
+</section>
1293
+
1294
+
1295
+
1296
+<!-- Badges
1297
+================================================== -->
1298
+<section id="badges">
1299
+ <div class="page-header">
1300
+ <h1>{{_i}}Badges{{/i}} <small>{{_i}}Indicators and unread counts{{/i}}</small></h1>
1301
+ </div>
1302
+ <div class="row">
1303
+ <div class="span4">
1304
+ <h3>About</h3>
1305
+ <p>{{_i}}Badges are small, simple components for displaying an indicator or count of some sort. They're commonly found in email clients like Mail.app or on mobile apps for push notifications.{{/i}}</p>
1306
+ </div><!-- /.span -->
1307
+ <div class="span8">
1308
+ <h3>Available classes</h3>
1309
+ <table class="table table-bordered table-striped">
1310
+ <thead>
1311
+ <tr>
1312
+ <th>{{_i}}Name{{/i}}</th>
1313
+ <th>{{_i}}Example{{/i}}</th>
1314
+ <th>{{_i}}Markup{{/i}}</th>
1315
+ </tr>
1316
+ </thead>
1317
+ <tbody>
1318
+ <tr>
1319
+ <td>
1320
+ {{_i}}Default{{/i}}
1321
+ </td>
1322
+ <td>
1323
+ <span class="badge">1</span>
1324
+ </td>
1325
+ <td>
1326
+ <code><span class="badge">1</span></code>
1327
+ </td>
1328
+ </tr>
1329
+ <tr>
1330
+ <td>
1331
+ {{_i}}Success{{/i}}
1332
+ </td>
1333
+ <td>
1334
+ <span class="badge badge-success">2</span>
1335
+ </td>
1336
+ <td>
1337
+ <code><span class="badge badge-success">2</span></code>
1338
+ </td>
1339
+ </tr>
1340
+ <tr>
1341
+ <td>
1342
+ {{_i}}Warning{{/i}}
1343
+ </td>
1344
+ <td>
1345
+ <span class="badge badge-warning">4</span>
1346
+ </td>
1347
+ <td>
1348
+ <code><span class="badge badge-warning">4</span></code>
1349
+ </td>
1350
+ </tr>
1351
+ <tr>
1352
+ <td>
1353
+ {{_i}}Important{{/i}}
1354
+ </td>
1355
+ <td>
1356
+ <span class="badge badge-important">6</span>
1357
+ </td>
1358
+ <td>
1359
+ <code><span class="badge badge-important">6</span></code>
1360
+ </td>
1361
+ </tr>
1362
+ <tr>
1363
+ <td>
1364
+ {{_i}}Info{{/i}}
1365
+ </td>
1366
+ <td>
1367
+ <span class="badge badge-info">8</span>
1368
+ </td>
1369
+ <td>
1370
+ <code><span class="badge badge-info">8</span></code>
1371
+ </td>
1372
+ </tr>
1373
+ <tr>
1374
+ <td>
1375
+ {{_i}}Inverse{{/i}}
1376
+ </td>
1377
+ <td>
1378
+ <span class="badge badge-inverse">10</span>
1379
+ </td>
1380
+ <td>
1381
+ <code><span class="badge badge-inverse">10</span></code>
1382
+ </td>
1383
+ </tr>
1384
+ </tbody>
1385
+ </table>
1386
+ </div><!-- /.span -->
1387
+ </div><!-- /.row -->
1388
+</section>
1389
+
1390
+
1391
+
1392
+<!-- Typographic components
1393
+================================================== -->
1394
+<section id="typography">
1395
+ <div class="page-header">
1396
+ <h1>{{_i}}Typographic components{{/i}} <small>{{_i}}Page header and hero unit for segmenting content{{/i}}</small></h1>
1397
+ </div>
1398
+ <h2>{{_i}}Hero unit{{/i}}</h2>
1399
+ <div class="row">
1400
+ <div class="span4">
1401
+ <p>{{_i}}Bootstrap provides a lightweight, flexible component called a hero unit to showcase content on your site. It works well on marketing and content-heavy sites.{{/i}}</p>
1402
+ <h3>{{_i}}Markup{{/i}}</h3>
1403
+ <p>{{_i}}Wrap your content in a <code>div</code> like so:{{/i}}</p>
1404
+<pre class="prettyprint linenums">
1405
+<div class="hero-unit">
1406
+ <h1>{{_i}}Heading{{/i}}</h1>
1407
+ <p>{{_i}}Tagline{{/i}}</p>
1408
+ <p>
1409
+ <a class="btn btn-primary btn-large">
1410
+ {{_i}}Learn more{{/i}}
1411
+ </a>
1412
+ </p>
1413
+</div>
1414
+</pre>
1415
+ </div>
1416
+ <div class="span8">
1417
+ <div class="hero-unit">
1418
+ <h1>{{_i}}Hello, world!{{/i}}</h1>
1419
+ <p>{{_i}}This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.{{/i}}</p>
1420
+ <p><a class="btn btn-primary btn-large">{{_i}}Learn more{{/i}}</a></p>
1421
+ </div>
1422
+ </div>
1423
+ </div><!-- /row -->
1424
+ <h2>{{_i}}Page header{{/i}}</h2>
1425
+ <div class="row">
1426
+ <div class="span4">
1427
+ <p>{{_i}}A simple shell for an <code>h1</code> to appropriately space out and segment sections of content on a page. It can utilize the <code>h1</code>'s default <code>small</code>, element as well most other components (with additional styles).{{/i}}</p>
1428
+ </div>
1429
+ <div class="span8">
1430
+ <div class="page-header">
1431
+ <h1>{{_i}}Example page header{{/i}} <small>{{_i}}Subtext for header{{/i}}</small></h1>
1432
+ </div>
1433
+<pre class="prettyprint linenums">
1434
+<div class="page-header">
1435
+ <h1>{{_i}}Example page header{{/i}}</h1>
1436
+</div>
1437
+</pre>
1438
+ </div>
1439
+ </div><!-- /row -->
1440
+</section>
1441
+
1442
+
1443
+
1444
+<!-- Thumbnails
1445
+================================================== -->
1446
+<section id="thumbnails">
1447
+ <div class="page-header">
1448
+ <h1>{{_i}}Thumbnails{{/i}} <small>{{_i}}Grids of images, videos, text, and more{{/i}}</small></h1>
1449
+ </div>
1450
+
1451
+ <div class="row">
1452
+ <div class="span6">
1453
+ <h2>{{_i}}Default thumbnails{{/i}}</h2>
1454
+ <p>{{_i}}By default, Bootstrap's thumbnails are designed to showcase linked images with minimal required markup.{{/i}}</p>
1455
+ <ul class="thumbnails">
1456
+ <li class="span3">
1457
+ <a href="#" class="thumbnail">
1458
+ <img src="http://placehold.it/260x180" alt="">
1459
+ </a>
1460
+ </li>
1461
+ <li class="span3">
1462
+ <a href="#" class="thumbnail">
1463
+ <img src="http://placehold.it/260x180" alt="">
1464
+ </a>
1465
+ </li>
1466
+ <li class="span3">
1467
+ <a href="#" class="thumbnail">
1468
+ <img src="http://placehold.it/260x180" alt="">
1469
+ </a>
1470
+ </li>
1471
+ <li class="span3">
1472
+ <a href="#" class="thumbnail">
1473
+ <img src="http://placehold.it/260x180" alt="">
1474
+ </a>
1475
+ </li>
1476
+ </ul>
1477
+ </div>
1478
+ <div class="span6">
1479
+ <h2>{{_i}}Highly customizable{{/i}}</h2>
1480
+ <p>{{_i}}With a bit of extra markup, it's possible to add any kind of HTML content like headings, paragraphs, or buttons into thumbnails.{{/i}}</p>
1481
+ <ul class="thumbnails">
1482
+ <li class="span3">
1483
+ <div class="thumbnail">
1484
+ <img src="http://placehold.it/260x180" alt="">
1485
+ <div class="caption">
1486
+ <h5>{{_i}}Thumbnail label{{/i}}</h5>
1487
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1488
+ <p><a href="#" class="btn btn-primary">{{_i}}Action{{/i}}</a> <a href="#" class="btn">{{_i}}Action{{/i}}</a></p>
1489
+ </div>
1490
+ </div>
1491
+ </li>
1492
+ <li class="span3">
1493
+ <div class="thumbnail">
1494
+ <img src="http://placehold.it/260x180" alt="">
1495
+ <div class="caption">
1496
+ <h5>{{_i}}Thumbnail label{{/i}}</h5>
1497
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1498
+ <p><a href="#" class="btn btn-primary">{{_i}}Action{{/i}}</a> <a href="#" class="btn">{{_i}}Action{{/i}}</a></p>
1499
+ </div>
1500
+ </div>
1501
+ </li>
1502
+ </ul>
1503
+ </div>
1504
+ </div>
1505
+
1506
+ <div class="row">
1507
+ <div class="span4">
1508
+ <h3>{{_i}}Why use thumbnails{{/i}}</h3>
1509
+ <p>{{_i}}Thumbnails (previously <code>.media-grid</code> up until v1.4) are great for grids of photos or videos, image search results, retail products, portfolios, and much more. They can be links or static content.{{/i}}</p>
1510
+ </div>
1511
+ <div class="span4">
1512
+ <h3>{{_i}}Simple, flexible markup{{/i}}</h3>
1513
+ <p>{{_i}}Thumbnail markup is simple—a <code>ul</code> with any number of <code>li</code> elements is all that is required. It's also super flexible, allowing for any type of content with just a bit more markup to wrap your contents.{{/i}}</p>
1514
+ </div>
1515
+ <div class="span4">
1516
+ <h3>{{_i}}Uses grid column sizes{{/i}}</h3>
1517
+ <p>{{_i}}Lastly, the thumbnails component uses existing grid system classes—like <code>.span2</code> or <code>.span3</code>—for control of thumbnail dimensions.{{/i}}</p>
1518
+ </div>
1519
+ </div>
1520
+
1521
+ <div class="row">
1522
+ <div class="span6">
1523
+ <h2>{{_i}}The markup{{/i}}</h2>
1524
+ <p>{{_i}}As mentioned previously, the required markup for thumbnails is light and straightforward. Here's a look at the default setup <strong>for linked images</strong>:{{/i}}</p>
1525
+<pre class="prettyprint linenums">
1526
+<ul class="thumbnails">
1527
+ <li class="span3">
1528
+ <a href="#" class="thumbnail">
1529
+ <img src="http://placehold.it/260x180" alt="">
1530
+ </a>
1531
+ </li>
1532
+ ...
1533
+</ul>
1534
+</pre>
1535
+ <p>{{_i}}For custom HTML content in thumbnails, the markup changes slightly. To allow block level content anywhere, we swap the <code><a></code> for a <code><div></code> like so:{{/i}}</p>
1536
+<pre class="prettyprint linenums">
1537
+<ul class="thumbnails">
1538
+ <li class="span3">
1539
+ <div class="thumbnail">
1540
+ <img src="http://placehold.it/260x180" alt="">
1541
+ <h5>{{_i}}Thumbnail label{{/i}}</h5>
1542
+ <p>{{_i}}Thumbnail caption right here...{{/i}}</p>
1543
+ </div>
1544
+ </li>
1545
+ ...
1546
+</ul>
1547
+</pre>
1548
+ </div>
1549
+ <div class="span6">
1550
+ <h2>{{_i}}More examples{{/i}}</h2>
1551
+ <p>{{_i}}Explore all your options with the various grid classes available to you. You can also mix and match different sizes.{{/i}}</p>
1552
+ <ul class="thumbnails">
1553
+ <li class="span4">
1554
+ <a href="#" class="thumbnail">
1555
+ <img src="http://placehold.it/360x268" alt="">
1556
+ </a>
1557
+ </li>
1558
+ <li class="span2">
1559
+ <a href="#" class="thumbnail">
1560
+ <img src="http://placehold.it/160x120" alt="">
1561
+ </a>
1562
+ </li>
1563
+ <li class="span2">
1564
+ <a href="#" class="thumbnail">
1565
+ <img src="http://placehold.it/160x120" alt="">
1566
+ </a>
1567
+ </li>
1568
+ <li class="span2">
1569
+ <a href="#" class="thumbnail">
1570
+ <img src="http://placehold.it/160x120" alt="">
1571
+ </a>
1572
+ </li>
1573
+ <li class="span2">
1574
+ <a href="#" class="thumbnail">
1575
+ <img src="http://placehold.it/160x120" alt="">
1576
+ </a>
1577
+ </li>
1578
+ <li class="span2">
1579
+ <a href="#" class="thumbnail">
1580
+ <img src="http://placehold.it/160x120" alt="">
1581
+ </a>
1582
+ </li>
1583
+ </ul>
1584
+ </div>
1585
+ </div>
1586
+
1587
+</section>
1588
+
1589
+
1590
+
1591
+<!-- Alerts
1592
+================================================== -->
1593
+<section id="alerts">
1594
+ <div class="page-header">
1595
+ <h1>{{_i}}Alerts{{/i}} <small>{{_i}}Styles for success, warning, and error messages{{/i}}</small></h1>
1596
+ </div>
1597
+
1598
+ <h2>{{_i}}Lightweight defaults{{/i}}</h2>
1599
+ <div class="row">
1600
+ <div class="span4">
1601
+ <h3>{{_i}}Rewritten base class{{/i}}</h3>
1602
+ <p>{{_i}}With Bootstrap 2, we've simplified the base class: <code>.alert</code> instead of <code>.alert-message</code>. We've also reduced the minimum required markup—no <code><p></code> is required by default, just the outer <code><div></code>.{{/i}}</p>
1603
+ <h3>{{_i}}Single alert message{{/i}}</h3>
1604
+ <p>{{_i}}For a more durable component with less code, we've removed the differentiating look for block alerts, messages that come with more padding and typically more text. The class also has changed to <code>.alert-block</code>.{{/i}}</p>
1605
+ <hr>
1606
+ <h3>{{_i}}Goes great with javascript{{/i}}</h3>
1607
+ <p>{{_i}}Bootstrap comes with a great jQuery plugin that supports alert messages, making dismissing them quick and easy.{{/i}}</p>
1608
+ <p><a class="btn js-btn" href="./javascript.html#alerts">{{_i}}Get the plugin »</a>{{/i}}</p>
1609
+ </div>
1610
+ <div class="span8">
1611
+ <h3>{{_i}}Example alerts{{/i}}</h3>
1612
+ <p>{{_i}}Wrap your message and an optional close icon in a div with simple class.{{/i}}</p>
1613
+ <div class="alert">
1614
+ <button type="button" class="close" data-dismiss="alert">×</button>
1615
+ <strong>{{_i}}Warning!{{/i}}</strong> {{_i}}Best check yo self, you're not looking too good.{{/i}}
1616
+ </div>
1617
+<pre class="prettyprint linenums">
1618
+<div class="alert">
1619
+ <button class="close" data-dismiss="alert">×</button>
1620
+ <strong>{{_i}}Warning!{{/i}}</strong> {{_i}}Best check yo self, you're not looking too good.{{/i}}
1621
+</div>
1622
+</pre>
1623
+ <p><span class="label label-info">{{_i}}Heads up!{{/i}}</span> {{_i}}iOS devices require an <code>href="#"</code> for the dismissal of alerts. Be sure to include it and the data attribute for anchor close icons. Alternatively, you may use a <code><button></code> element with the data attribute, which we have opted to do for our docs. When using <code><button></code>, you must include <code>type="button"</code> or your forms may not submit.{{/i}}</p>
1624
+ <p>{{_i}}Easily extend the standard alert message with two optional classes: <code>.alert-block</code> for more padding and text controls and <code>.alert-heading</code> for a matching heading.{{/i}}</p>
1625
+ <div class="alert alert-block">
1626
+ <button type="button" class="close" data-dismiss="alert">×</button>
1627
+ <h4 class="alert-heading">{{_i}}Warning!{{/i}}</h4>
1628
+ <p>{{_i}}Best check yo self, you're not looking too good.{{/i}} Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.</p>
1629
+ </div>
1630
+<pre class="prettyprint linenums">
1631
+<div class="alert alert-block">
1632
+ <a class="close" data-dismiss="alert" href="#">×</a>
1633
+ <h4 class="alert-heading">{{_i}}Warning!{{/i}}</h4>
1634
+ {{_i}}Best check yo self, you're not...{{/i}}
1635
+</div>
1636
+</pre>
1637
+ </div>
1638
+ </div>
1639
+
1640
+ <h2>{{_i}}Contextual alternatives{{/i}} <small>{{_i}}Add optional classes to change an alert's connotation{{/i}}</small></h2>
1641
+ <div class="row">
1642
+ <div class="span4">
1643
+ <h3>{{_i}}Error or danger{{/i}}</h3>
1644
+ <div class="alert alert-error">
1645
+ <button type="button" class="close" data-dismiss="alert">×</button>
1646
+ <strong>{{_i}}Oh snap!{{/i}}</strong> {{_i}}Change a few things up and try submitting again.{{/i}}
1647
+ </div>
1648
+<pre class="prettyprint linenums">
1649
+<div class="alert alert-error">
1650
+ ...
1651
+</div>
1652
+</pre>
1653
+ </div>
1654
+ <div class="span4">
1655
+ <h3>{{_i}}Success{{/i}}</h3>
1656
+ <div class="alert alert-success">
1657
+ <button type="button" class="close" data-dismiss="alert">×</button>
1658
+ <strong>{{_i}}Well done!{{/i}}</strong> {{_i}}You successfully read this important alert message.{{/i}}
1659
+ </div>
1660
+<pre class="prettyprint linenums">
1661
+<div class="alert alert-success">
1662
+ ...
1663
+</div>
1664
+</pre>
1665
+ </div>
1666
+ <div class="span4">
1667
+ <h3>{{_i}}Information{{/i}}</h3>
1668
+ <div class="alert alert-info">
1669
+ <button type="button" class="close" data-dismiss="alert">×</button>
1670
+ <strong>{{_i}}Heads up!{{/i}}</strong> {{_i}}This alert needs your attention, but it's not super important.{{/i}}
1671
+ </div>
1672
+<pre class="prettyprint linenums">
1673
+<div class="alert alert-info">
1674
+ ...
1675
+</div>
1676
+</pre>
1677
+ </div>
1678
+ </div>
1679
+
1680
+</section>
1681
+
1682
+
1683
+
1684
+<!-- Progress bars
1685
+================================================== -->
1686
+<section id="progress">
1687
+ <div class="page-header">
1688
+ <h1>{{_i}}Progress bars{{/i}} <small>{{_i}}For loading, redirecting, or action status{{/i}}</small></h1>
1689
+ </div>
1690
+
1691
+ <h2>{{_i}}Examples and markup{{/i}}</h2>
1692
+ <div class="row">
1693
+ <div class="span4">
1694
+ <h3>{{_i}}Basic{{/i}}</h3>
1695
+ <p>{{_i}}Default progress bar with a vertical gradient.{{/i}}</p>
1696
+ <div class="progress">
1697
+ <div class="bar" style="width: 60%;"></div>
1698
+ </div>
1699
+<pre class="prettyprint linenums">
1700
+<div class="progress">
1701
+ <div class="bar"
1702
+ style="width: 60%;"></div>
1703
+</div>
1704
+</pre>
1705
+ </div>
1706
+ <div class="span4">
1707
+ <h3>{{_i}}Striped{{/i}}</h3>
1708
+ <p>{{_i}}Uses a gradient to create a striped effect (no IE).{{/i}}</p>
1709
+ <div class="progress progress-striped">
1710
+ <div class="bar" style="width: 20%;"></div>
1711
+ </div>
1712
+<pre class="prettyprint linenums">
1713
+<div class="progress progress-striped">
1714
+ <div class="bar"
1715
+ style="width: 20%;"></div>
1716
+</div>
1717
+</pre>
1718
+ </div>
1719
+ <div class="span4">
1720
+ <h3>{{_i}}Animated{{/i}}</h3>
1721
+ <p>{{_i}}Takes the striped example and animates it (no IE).{{/i}}</p>
1722
+ <div class="progress progress-striped active">
1723
+ <div class="bar" style="width: 45%"></div>
1724
+ </div>
1725
+<pre class="prettyprint linenums">
1726
+<div class="progress progress-striped
1727
+ active">
1728
+ <div class="bar"
1729
+ style="width: 40%;"></div>
1730
+</div>
1731
+</pre>
1732
+ </div>
1733
+ </div>
1734
+
1735
+ <h2>{{_i}}Options and browser support{{/i}}</h2>
1736
+ <div class="row">
1737
+ <div class="span3">
1738
+ <h3>{{_i}}Additional colors{{/i}}</h3>
1739
+ <p>{{_i}}Progress bars use some of the same button and alert classes for consistent styles.{{/i}}</p>
1740
+ <div class="progress progress-info" style="margin-bottom: 9px;">
1741
+ <div class="bar" style="width: 20%"></div>
1742
+ </div>
1743
+ <div class="progress progress-success" style="margin-bottom: 9px;">
1744
+ <div class="bar" style="width: 40%"></div>
1745
+ </div>
1746
+ <div class="progress progress-warning" style="margin-bottom: 9px;">
1747
+ <div class="bar" style="width: 60%"></div>
1748
+ </div>
1749
+ <div class="progress progress-danger" style="margin-bottom: 9px;">
1750
+ <div class="bar" style="width: 80%"></div>
1751
+ </div>
1752
+ </div>
1753
+ <div class="span3">
1754
+ <h3>{{_i}}Striped bars{{/i}}</h3>
1755
+ <p>{{_i}}Similar to the solid colors, we have varied striped progress bars.{{/i}}</p>
1756
+ <div class="progress progress-info progress-striped" style="margin-bottom: 9px;">
1757
+ <div class="bar" style="width: 20%"></div>
1758
+ </div>
1759
+ <div class="progress progress-success progress-striped" style="margin-bottom: 9px;">
1760
+ <div class="bar" style="width: 40%"></div>
1761
+ </div>
1762
+ <div class="progress progress-warning progress-striped" style="margin-bottom: 9px;">
1763
+ <div class="bar" style="width: 60%"></div>
1764
+ </div>
1765
+ <div class="progress progress-danger progress-striped" style="margin-bottom: 9px;">
1766
+ <div class="bar" style="width: 80%"></div>
1767
+ </div>
1768
+ </div>
1769
+ <div class="span3">
1770
+ <h3>{{_i}}Behavior{{/i}}</h3>
1771
+ <p>{{_i}}Progress bars use CSS3 transitions, so if you dynamically adjust the width via javascript, it will smoothly resize.{{/i}}</p>
1772
+ <p>{{_i}}If you use the <code>.active</code> class, your <code>.progress-striped</code> progress bars will animate the stripes left to right.{{/i}}</p>
1773
+ </div>
1774
+ <div class="span3">
1775
+ <h3>{{_i}}Browser support{{/i}}</h3>
1776
+ <p>{{_i}}Progress bars use CSS3 gradients, transitions, and animations to achieve all their effects. These features are not supported in IE7-9 or older versions of Firefox.{{/i}}</p>
1777
+ <p>{{_i}}Opera and IE do not support animations at this time.{{/i}}</p>
1778
+ </div>
1779
+ </div>
1780
+
1781
+</section>
1782
+
1783
+
1784
+
1785
+
1786
+
1787
+<!-- Miscellaneous
1788
+================================================== -->
1789
+<section id="misc">
1790
+ <div class="page-header">
1791
+ <h1>{{_i}}Miscellaneous{{/i}} <small>{{_i}}Lightweight utility components{{/i}}</small></h1>
1792
+ </div>
1793
+ <div class="row">
1794
+ <div class="span4">
1795
+ <h2>{{_i}}Wells{{/i}}</h2>
1796
+ <p>{{_i}}Use the well as a simple effect on an element to give it an inset effect.{{/i}}</p>
1797
+ <div class="well">
1798
+ {{_i}}Look, I'm in a well!{{/i}}
1799
+ </div>
1800
+<pre class="prettyprint linenums">
1801
+<div class="well">
1802
+ ...
1803
+</div>
1804
+</pre>
1805
+ </div><!--/span-->
1806
+ <div class="span4">
1807
+ <h2>{{_i}}Close icon{{/i}}</h2>
1808
+ <p>{{_i}}Use the generic close icon for dismissing content like modals and alerts.{{/i}}</p>
1809
+ <p><button class="close" style="float: none;">×</button></p>
1810
+<pre class="prettyprint linenums"><button class="close">&times;</button></pre>
1811
+ <p>{{_i}}iOS devices require an href="#" for click events if you rather use an anchor.{{/i}}</p>
1812
+<pre class="prettyprint linenums"><a class="close" href="#">&times;</a></pre>
1813
+ </div><!--/span-->
1814
+ </div><!--/row-->
1815
+</section>
docs/docs/likebutton/docs/templates/pages/download.mustache
new
+338
@@ -0,0 +1,338 @@
1
+<!-- Masthead
2
+================================================== -->
3
+<header class="jumbotron subhead" id="overview">
4
+ <h1>{{_i}}Customize and download{{/i}}</h1>
5
+ <p class="lead">{{_i}}<a href="https://github.com/twitter/bootstrap/zipball/master">Download the full repository</a> or customize your entire Bootstrap build by selecting only the components, javascript plugins, and assets you need.{{/i}}</p>
6
+ <div class="subnav">
7
+ <ul class="nav nav-pills">
8
+ <li><a href="#components">{{_i}}1. Choose components{{/i}}</a></li>
9
+ <li><a href="#plugins">{{_i}}2. Select jQuery plugins{{/i}}</a></li>
10
+ <li><a href="#variables">{{_i}}3. Customize variables{{/i}}</a></li>
11
+ <li><a href="#download">{{_i}}4. Download{{/i}}</a></li>
12
+ </ul>
13
+ </div>
14
+</header>
15
+
16
+<section class="download" id="components">
17
+ <div class="page-header">
18
+ <a class="btn btn-small pull-right toggle-all" href="#">{{_i}}Toggle all{{/i}}</a>
19
+ <h1>
20
+ {{_i}}1. Choose components{{/i}}
21
+ <small>{{_i}}Get just the CSS you need{{/i}}</small>
22
+ </h1>
23
+ </div>
24
+ <div class="row download-builder">
25
+ <div class="span3">
26
+ <h3>{{_i}}Scaffolding{{/i}}</h3>
27
+ <label class="checkbox"><input checked="checked" type="checkbox" value="reset.less"> {{_i}}Normalize and reset{{/i}}</label>
28
+ <label class="checkbox"><input checked="checked" type="checkbox" value="scaffolding.less"> {{_i}}Body type and links{{/i}}</label>
29
+ <label class="checkbox"><input checked="checked" type="checkbox" value="grid.less"> {{_i}}Grid system{{/i}}</label>
30
+ <label class="checkbox"><input checked="checked" type="checkbox" value="layouts.less"> {{_i}}Layouts{{/i}}</label>
31
+ <h3>{{_i}}Base CSS{{/i}}</h3>
32
+ <label class="checkbox"><input checked="checked" type="checkbox" value="type.less"> {{_i}}Headings, body, etc{{/i}}</label>
33
+ <label class="checkbox"><input checked="checked" type="checkbox" value="code.less"> {{_i}}Code and pre{{/i}}</label>
34
+ <label class="checkbox"><input checked="checked" type="checkbox" value="labels-badges.less"> {{_i}}Labels and badges{{/i}}</label>
35
+ <label class="checkbox"><input checked="checked" type="checkbox" value="tables.less"> {{_i}}Tables{{/i}}</label>
36
+ <label class="checkbox"><input checked="checked" type="checkbox" value="forms.less"> {{_i}}Forms{{/i}}</label>
37
+ <label class="checkbox"><input checked="checked" type="checkbox" value="buttons.less"> {{_i}}Buttons{{/i}}</label>
38
+ <label class="checkbox"><input checked="checked" type="checkbox" value="sprites.less"> {{_i}}Icons{{/i}}</label>
39
+ </div><!-- /span -->
40
+ <div class="span3">
41
+ <h3>{{_i}}Components{{/i}}</h3>
42
+ <label class="checkbox"><input checked="checked" type="checkbox" value="button-groups.less"> {{_i}}Button groups and dropdowns{{/i}}</label>
43
+ <label class="checkbox"><input checked="checked" type="checkbox" value="navs.less"> {{_i}}Navs, tabs, and pills{{/i}}</label>
44
+ <label class="checkbox"><input checked="checked" type="checkbox" value="navbar.less"> {{_i}}Navbar{{/i}}</label>
45
+ <label class="checkbox"><input checked="checked" type="checkbox" value="breadcrumbs.less"> {{_i}}Breadcrumbs{{/i}}</label>
46
+ <label class="checkbox"><input checked="checked" type="checkbox" value="pagination.less"> {{_i}}Pagination{{/i}}</label>
47
+ <label class="checkbox"><input checked="checked" type="checkbox" value="pager.less"> {{_i}}Pager{{/i}}</label>
48
+ <label class="checkbox"><input checked="checked" type="checkbox" value="thumbnails.less"> {{_i}}Thumbnails{{/i}}</label>
49
+ <label class="checkbox"><input checked="checked" type="checkbox" value="alerts.less"> {{_i}}Alerts{{/i}}</label>
50
+ <label class="checkbox"><input checked="checked" type="checkbox" value="progress-bars.less"> {{_i}}Progress bars{{/i}}</label>
51
+ <label class="checkbox"><input checked="checked" type="checkbox" value="hero-unit.less"> {{_i}}Hero unit{{/i}}</label>
52
+ </div><!-- /span -->
53
+ <div class="span3">
54
+ <h3>{{_i}}JS Components{{/i}}</h3>
55
+ <label class="checkbox"><input checked="checked" type="checkbox" value="tooltip.less"> {{_i}}Tooltips{{/i}}</label>
56
+ <label class="checkbox"><input checked="checked" type="checkbox" value="popovers.less"> {{_i}}Popovers{{/i}}</label>
57
+ <label class="checkbox"><input checked="checked" type="checkbox" value="modals.less"> {{_i}}Modals{{/i}}</label>
58
+ <label class="checkbox"><input checked="checked" type="checkbox" value="dropdowns.less"> {{_i}}Dropdowns{{/i}}</label>
59
+ <label class="checkbox"><input checked="checked" type="checkbox" value="accordion.less"> {{_i}}Collapse{{/i}}</label>
60
+ <label class="checkbox"><input checked="checked" type="checkbox" value="carousel.less"> {{_i}}Carousel{{/i}}</label>
61
+ </div><!-- /span -->
62
+ <div class="span3">
63
+ <h3>{{_i}}Miscellaneous{{/i}}</h3>
64
+ <label class="checkbox"><input checked="checked" type="checkbox" value="wells.less"> {{_i}}Wells{{/i}}</label>
65
+ <label class="checkbox"><input checked="checked" type="checkbox" value="close.less"> {{_i}}Close icon{{/i}}</label>
66
+ <label class="checkbox"><input checked="checked" type="checkbox" value="utilities.less"> {{_i}}Utilities{{/i}}</label>
67
+ <label class="checkbox"><input checked="checked" type="checkbox" value="component-animations.less"> {{_i}}Component animations{{/i}}</label>
68
+ <h3>{{_i}}Responsive{{/i}}</h3>
69
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-utilities.less"> {{_i}}Visible/hidden classes{{/i}}</label>
70
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-767px-max.less"> {{_i}}Narrow tablets and below (<767px){{/i}}</label>
71
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-768px-979px.less"> {{_i}}Tablets to desktops (767-979px){{/i}}</label>
72
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-1200px-min.less"> {{_i}}Large desktops (>1200px){{/i}}</label>
73
+ <label class="checkbox"><input checked="checked" type="checkbox" value="responsive-navbar.less"> {{_i}}Responsive navbar{{/i}}</label>
74
+ </div><!-- /span -->
75
+ </div><!-- /row -->
76
+</section>
77
+
78
+<section class="download" id="plugins">
79
+ <div class="page-header">
80
+ <a class="btn btn-small pull-right toggle-all" href="#">{{_i}}Toggle all{{/i}}</a>
81
+ <h1>
82
+ {{_i}}2. Select jQuery plugins{{/i}}
83
+ <small>{{_i}}Quickly add only the necessary javascript{{/i}}</small>
84
+ </h1>
85
+ </div>
86
+ <div class="row download-builder">
87
+ <div class="span4">
88
+ <label class="checkbox">
89
+ <input type="checkbox" checked="true" value="bootstrap-transition.js">
90
+ {{_i}}Transitions <small>(required for any animation)</small>{{/i}}
91
+ </label>
92
+ <label class="checkbox">
93
+ <input type="checkbox" checked="true" value="bootstrap-modal.js">
94
+ {{_i}}Modals{{/i}}
95
+ </label>
96
+ <label class="checkbox">
97
+ <input type="checkbox" checked="true" value="bootstrap-dropdown.js">
98
+ {{_i}}Dropdowns{{/i}}
99
+ </label>
100
+ <label class="checkbox">
101
+ <input type="checkbox" checked="true" value="bootstrap-scrollspy.js">
102
+ {{_i}}Scrollspy{{/i}}
103
+ </label>
104
+ <label class="checkbox">
105
+ <input type="checkbox" checked="true" value="bootstrap-tab.js">
106
+ {{_i}}Togglable tabs{{/i}}
107
+ </label>
108
+ <label class="checkbox">
109
+ <input type="checkbox" checked="true" value="bootstrap-tooltip.js">
110
+ {{_i}}Tooltips{{/i}}
111
+ </label>
112
+ </div><!-- /span -->
113
+ <div class="span4">
114
+ <label class="checkbox">
115
+ <input type="checkbox" checked="true" value="bootstrap-popover.js">
116
+ {{_i}}Popovers <small>(requires Tooltips)</small>{{/i}}
117
+ </label>
118
+ <label class="checkbox">
119
+ <input type="checkbox" checked="true" value="bootstrap-alert.js">
120
+ {{_i}}Alert messages{{/i}}
121
+ </label>
122
+ <label class="checkbox">
123
+ <input type="checkbox" checked="true" value="bootstrap-button.js">
124
+ {{_i}}Buttons{{/i}}
125
+ </label>
126
+ <label class="checkbox">
127
+ <input type="checkbox" checked="true" value="bootstrap-collapse.js">
128
+ {{_i}}Collapse{{/i}}
129
+ </label>
130
+ <label class="checkbox">
131
+ <input type="checkbox" checked="true" value="bootstrap-carousel.js">
132
+ {{_i}}Carousel{{/i}}
133
+ </label>
134
+ <label class="checkbox">
135
+ <input type="checkbox" checked="true" value="bootstrap-typeahead.js">
136
+ {{_i}}Typeahead{{/i}}
137
+ </label>
138
+ </div><!-- /span -->
139
+ <div class="span4">
140
+ <h4 class="muted">{{_i}}Heads up!{{/i}}</h4>
141
+ <p class="muted">{{_i}}All checked plugins will be compiled into a single file, bootstrap.js. All plugins require the latest version of <a href="http://jquery.com/" target="_blank">jQuery</a> to be included.{{/i}}</p>
142
+ </div><!-- /span -->
143
+ </div><!-- /row -->
144
+</section>
145
+
146
+
147
+<section class="download" id="variables">
148
+ <div class="page-header">
149
+ <a class="btn btn-small pull-right toggle-all" href="#">{{_i}}Reset to defaults{{/i}}</a>
150
+ <h1>
151
+ {{_i}}3. Customize variables{{/i}}
152
+ <small>{{_i}}Optionally modify Bootstrap without a compiler{{/i}}</small>
153
+ </h1>
154
+ </div>
155
+ <div class="row download-builder">
156
+ <div class="span3">
157
+ <h3>{{_i}}Scaffolding{{/i}}</h3>
158
+ <label>@bodyBackground</label>
159
+ <input type="text" class="span3" placeholder="@white">
160
+ <label>@textColor</label>
161
+ <input type="text" class="span3" placeholder="@grayDark">
162
+
163
+ <h3>{{_i}}Links{{/i}}</h3>
164
+ <label>@linkColor</label>
165
+ <input type="text" class="span3" placeholder="#08c">
166
+ <label>@linkColorHover</label>
167
+ <input type="text" class="span3" placeholder="darken(@linkColor, 15%)">
168
+ <h3>{{_i}}Colors{{/i}}</h3>
169
+ <label>@blue</label>
170
+ <input type="text" class="span3" placeholder="#049cdb">
171
+ <label>@green</label>
172
+ <input type="text" class="span3" placeholder="#46a546">
173
+ <label>@red</label>
174
+ <input type="text" class="span3" placeholder="#9d261d">
175
+ <label>@yellow</label>
176
+ <input type="text" class="span3" placeholder="#ffc40d">
177
+ <label>@orange</label>
178
+ <input type="text" class="span3" placeholder="#f89406">
179
+ <label>@pink</label>
180
+ <input type="text" class="span3" placeholder="#c3325f">
181
+ <label>@purple</label>
182
+ <input type="text" class="span3" placeholder="#7a43b6">
183
+
184
+ <h3>{{_i}}Sprites{{/i}}</h3>
185
+ <label>@iconSpritePath</label>
186
+ <input type="text" class="span3" placeholder="'../img/glyphicons-halflings.png'">
187
+ <label>@iconWhiteSpritePath</label>
188
+ <input type="text" class="span3" placeholder="'../img/glyphicons-halflings-white.png'">
189
+
190
+ </div><!-- /span -->
191
+ <div class="span3">
192
+ <h3>{{_i}}Grid system{{/i}}</h3>
193
+ <label>@gridColumns</label>
194
+ <input type="text" class="span3" placeholder="12">
195
+ <label>@gridColumnWidth</label>
196
+ <input type="text" class="span3" placeholder="60px">
197
+ <label>@gridGutterWidth</label>
198
+ <input type="text" class="span3" placeholder="20px">
199
+ <h3>{{_i}}Fluid grid system{{/i}}</h3>
200
+ <label>@fluidGridColumnWidth</label>
201
+ <input type="text" class="span3" placeholder="6.382978723%">
202
+ <label>@fluidGridGutterWidth</label>
203
+ <input type="text" class="span3" placeholder="2.127659574%">
204
+
205
+ <h3>{{_i}}Typography{{/i}}</h3>
206
+ <label>@sansFontFamily</label>
207
+ <input type="text" class="span3" placeholder="'Helvetica Neue', Helvetica, Arial, sans-serif">
208
+ <label>@serifFontFamily</label>
209
+ <input type="text" class="span3" placeholder="Georgia, 'Times New Roman', Times, serif">
210
+ <label>@monoFontFamily</label>
211
+ <input type="text" class="span3" placeholder="Menlo, Monaco, 'Courier New', monospace">
212
+ <label>@baseFontSize</label>
213
+ <input type="text" class="span3" placeholder="13px">
214
+ <label>@baseFontFamily</label>
215
+ <input type="text" class="span3" placeholder="@sansFontFamily">
216
+ <label>@baseLineHeight</label>
217
+ <input type="text" class="span3" placeholder="18px">
218
+ <label>@altFontFamily</label>
219
+ <input type="text" class="span3" placeholder="@serifFontFamily">
220
+ <label>@headingsFontFamily</label>
221
+ <input type="text" class="span3" placeholder="inherit">
222
+ <label>@headingsFontWeight</label>
223
+ <input type="text" class="span3" placeholder="bold">
224
+ <label>@headingsColor</label>
225
+ <input type="text" class="span3" placeholder="inherit">
226
+ <label>@heroUnitBackground</label>
227
+ <input type="text" class="span3" placeholder="@grayLighter">
228
+ <label>@heroUnitHeadingColor</label>
229
+ <input type="text" class="span3" placeholder="inherit">
230
+ <label>@heroUnitLeadColor</label>
231
+ <input type="text" class="span3" placeholder="inherit">
232
+ </div><!-- /span -->
233
+ <div class="span3">
234
+ <h3>{{_i}}Tables{{/i}}</h3>
235
+ <label>@tableBackground</label>
236
+ <input type="text" class="span3" placeholder="transparent">
237
+ <label>@tableBackgroundAccent</label>
238
+ <input type="text" class="span3" placeholder="#f9f9f9">
239
+ <label>@tableBackgroundHover</label>
240
+ <input type="text" class="span3" placeholder="#f5f5f5">
241
+ <label>@tableBorder</label>
242
+ <input type="text" class="span3" placeholder="#ddd">
243
+
244
+ <h3>{{_i}}Navbar{{/i}}</h3>
245
+ <label>@navbarHeight</label>
246
+ <input type="text" class="span3" placeholder="40px">
247
+ <label>@navbarBackground</label>
248
+ <input type="text" class="span3" placeholder="@grayDarker">
249
+ <label>@navbarBackgroundHighlight</label>
250
+ <input type="text" class="span3" placeholder="@grayDark">
251
+ <label>@navbarText</label>
252
+ <input type="text" class="span3" placeholder="@grayLight">
253
+ <label>@navbarBrandColor</label>
254
+ <input type="text" class="span3" placeholder="@navbarLinkColor">
255
+ <label>@navbarLinkColor</label>
256
+ <input type="text" class="span3" placeholder="@grayLight">
257
+ <label>@navbarLinkColorHover</label>
258
+ <input type="text" class="span3" placeholder="@white">
259
+ <label>@navbarLinkColorActive</label>
260
+ <input type="text" class="span3" placeholder="@navbarLinkColorHover">
261
+ <label>@navbarLinkBackgroundHover</label>
262
+ <input type="text" class="span3" placeholder="transparent">
263
+ <label>@navbarLinkBackgroundActive</label>
264
+ <input type="text" class="span3" placeholder="@navbarBackground">
265
+ <label>@navbarSearchBackground</label>
266
+ <input type="text" class="span3" placeholder="lighten(@navbarBackground, 25%)">
267
+ <label>@navbarSearchBackgroundFocus</label>
268
+ <input type="text" class="span3" placeholder="@white">
269
+ <label>@navbarSearchBorder</label>
270
+ <input type="text" class="span3" placeholder="darken(@navbarSearchBackground, 30%)">
271
+ <label>@navbarSearchPlaceholderColor</label>
272
+ <input type="text" class="span3" placeholder="#ccc">
273
+
274
+ <h3>{{_i}}Dropdowns{{/i}}</h3>
275
+ <label>@dropdownBackground</label>
276
+ <input type="text" class="span3" placeholder="@white">
277
+ <label>@dropdownBorder</label>
278
+ <input type="text" class="span3" placeholder="rgba(0,0,0,.2)">
279
+ <label>@dropdownLinkColor</label>
280
+ <input type="text" class="span3" placeholder="@grayDark">
281
+ <label>@dropdownLinkColorHover</label>
282
+ <input type="text" class="span3" placeholder="@white">
283
+ <label>@dropdownLinkBackgroundHover</label>
284
+ <input type="text" class="span3" placeholder="@linkColor">
285
+ </div><!-- /span -->
286
+ <div class="span3">
287
+ <h3>{{_i}}Forms{{/i}}</h3>
288
+ <label>@placeholderText</label>
289
+ <input type="text" class="span3" placeholder="@grayLight">
290
+ <label>@inputBackground</label>
291
+ <input type="text" class="span3" placeholder="@white">
292
+ <label>@inputBorder</label>
293
+ <input type="text" class="span3" placeholder="#ccc">
294
+ <label>@inputBorderRadius</label>
295
+ <input type="text" class="span3" placeholder="3px">
296
+ <label>@inputDisabledBackground</label>
297
+ <input type="text" class="span3" placeholder="@grayLighter">
298
+ <label>@formActionsBackground</label>
299
+ <input type="text" class="span3" placeholder="#f5f5f5">
300
+
301
+ <label>@btnPrimaryBackground</label>
302
+ <input type="text" class="span3" placeholder="@linkColor">
303
+ <label>@btnPrimaryBackgroundHighlight</label>
304
+ <input type="text" class="span3" placeholder="darken(@white, 10%);">
305
+
306
+ <h3>{{_i}}Form states & alerts{{/i}}</h3>
307
+ <label>@warningText</label>
308
+ <input type="text" class="span3" placeholder="#c09853">
309
+ <label>@warningBackground</label>
310
+ <input type="text" class="span3" placeholder="#fcf8e3">
311
+ <label>@errorText</label>
312
+ <input type="text" class="span3" placeholder="#b94a48">
313
+ <label>@errorBackground</label>
314
+ <input type="text" class="span3" placeholder="#f2dede">
315
+ <label>@successText</label>
316
+ <input type="text" class="span3" placeholder="#468847">
317
+ <label>@successBackground</label>
318
+ <input type="text" class="span3" placeholder="#dff0d8">
319
+ <label>@infoText</label>
320
+ <input type="text" class="span3" placeholder="#3a87ad">
321
+ <label>@infoBackground</label>
322
+ <input type="text" class="span3" placeholder="#d9edf7">
323
+ </div><!-- /span -->
324
+ </div><!-- /row -->
325
+</section>
326
+
327
+<section class="download" id="download">
328
+ <div class="page-header">
329
+ <h1>
330
+ {{_i}}4. Download{{/i}}
331
+ </h1>
332
+ </div>
333
+ <div class="download-btn">
334
+ <a class="btn btn-primary" href="#" {{#production}}onclick="_gaq.push(['_trackEvent', 'Customize', 'Download', 'Customize and Download']);"{{/production}}>Customize and Download</a>
335
+ <h4>{{_i}}What's included?{{/i}}</h4>
336
+ <p>{{_i}}Downloads include compiled CSS, compiled and minified CSS, and compiled jQuery plugins, all nicely packed up into a zipball for your convenience.{{/i}}</p>
337
+ </div>
338
+</section><!-- /download -->
docs/docs/likebutton/docs/templates/pages/examples.mustache
new
+31
@@ -0,0 +1,31 @@
1
+<!-- Masthead
2
+================================================== -->
3
+<header class="jumbotron subhead" id="overview">
4
+ <h1>{{_i}}Bootstrap examples{{/i}}</h1>
5
+ <p class="lead">{{_i}}We've included a few basic examples as starting points for your work with Bootstrap. We encourage folks to iterate on these examples and not simply use them as an end result.{{/i}}</p>
6
+</header>
7
+
8
+
9
+<ul class="thumbnails bootstrap-examples">
10
+ <li class="span4">
11
+ <a class="thumbnail" href="examples/hero.html">
12
+ <img src="assets/img/examples/bootstrap-example-hero.jpg" alt="">
13
+ </a>
14
+ <h3>{{_i}}Basic marketing site{{/i}}</h3>
15
+ <p>{{_i}}Featuring a hero unit for a primary message and three supporting elements.{{/i}}</p>
16
+ </li>
17
+ <li class="span4">
18
+ <a class="thumbnail" href="examples/fluid.html">
19
+ <img src="assets/img/examples/bootstrap-example-fluid.jpg" alt="">
20
+ </a>
21
+ <h3>{{_i}}Fluid layout{{/i}}</h3>
22
+ <p>{{_i}}Uses our new responsive, fluid grid system to create a seamless liquid layout.{{/i}}</p>
23
+ </li>
24
+ <li class="span4">
25
+ <a class="thumbnail" href="examples/starter-template.html">
26
+ <img src="assets/img/examples/bootstrap-example-starter.jpg" alt="">
27
+ </a>
28
+ <h3>{{_i}}Starter template{{/i}}</h3>
29
+ <p>{{_i}}A barebones HTML document with all the Bootstrap CSS and javascript included.{{/i}}</p>
30
+ </li>
31
+</ul>
docs/docs/likebutton/docs/templates/pages/index.mustache
new
+144
@@ -0,0 +1,144 @@
1
+<!-- Masthead
2
+================================================== -->
3
+<header class="jumbotron masthead">
4
+ <div class="inner">
5
+ <h1>{{_i}}Bootstrap, from Twitter{{/i}}</h1>
6
+ <p>{{_i}}Simple and flexible HTML, CSS, and Javascript for popular user interface components and interactions.{{/i}}</p>
7
+ <p class="download-info">
8
+ <a href="https://github.com/twitter/bootstrap/" class="btn btn-primary btn-large" {{#production}}onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'GitHub Project', 'View project on GitHub']);"{{/production}}>{{_i}}View project on GitHub{{/i}}</a>
9
+ <a href="assets/bootstrap.zip" class="btn btn-large" {{#production}}onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Download', 'Download 2.0.4']);"{{/production}}>{{_i}}Download Bootstrap <small>(v2.0.4)</small>{{/i}}</a>
10
+ </p>
11
+ </div>
12
+
13
+ <div class="bs-links">
14
+ <ul class="quick-links">
15
+ <li><a href="./upgrading.html">{{_i}}Upgrading from 1.4{{/i}}</a></li>
16
+ <li><a href="https://github.com/twitter/bootstrap/zipball/master">{{_i}}Download with docs{{/i}}</a></li>
17
+ <li><a href="http://blog.getbootstrap.com">{{_i}}Read the blog{{/i}}</a></li>
18
+ <li><a href="https://github.com/twitter/bootstrap/issues?state=open">{{_i}}Submit issues{{/i}}</a></li>
19
+ <li><a href="https://github.com/twitter/bootstrap/wiki">{{_i}}Roadmap and changelog{{/i}}</a></li>
20
+ </ul>
21
+ <ul class="quick-links">
22
+ <li>
23
+ <iframe class="github-btn" src="http://markdotto.github.com/github-buttons/github-btn.html?user=twitter&repo=bootstrap&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="112px" height="20px"></iframe>
24
+ </li>
25
+ <li>
26
+ <iframe class="github-btn" src="http://markdotto.github.com/github-buttons/github-btn.html?user=twitter&repo=bootstrap&type=fork&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="98px" height="20px"></iframe>
27
+ </li>
28
+ <li class="follow-btn">
29
+ <a href="https://twitter.com/twbootstrap" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="true">{{_i}}Follow @twbootstrap{{/i}}</a>
30
+ </li>
31
+ <li class="tweet-btn">
32
+ <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://twitter.github.com/bootstrap/" data-count="horizontal" data-via="twbootstrap" data-related="mdo:Creator of Twitter Bootstrap">Tweet</a>
33
+ </li>
34
+ </ul>
35
+ </div>
36
+</header>
37
+
38
+<hr class="soften">
39
+
40
+<div class="marketing">
41
+ <h1>{{_i}}Designed for everyone, everywhere.{{/i}}</h1>
42
+ <p class="marketing-byline">{{_i}}Need reasons to love Bootstrap? Look no further.{{/i}}</p>
43
+ <div class="row">
44
+ <div class="span4">
45
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_042_group.png">
46
+ <h2>{{_i}}Built for and by nerds{{/i}}</h2>
47
+ <p>{{_i}}Like you, we love building awesome products on the web. We love it so much, we decided to help people just like us do it easier, better, and faster. Bootstrap is built for you.{{/i}}</p>
48
+ </div>
49
+ <div class="span4">
50
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_079_podium.png">
51
+ <h2>{{_i}}For all skill levels{{/i}}</h2>
52
+ <p>{{_i}}Bootstrap is designed to help people of all skill levels—designer or developer, huge nerd or early beginner. Use it as a complete kit or use to start something more complex.{{/i}}</p>
53
+ </div>
54
+ <div class="span4">
55
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_163_iphone.png">
56
+ <h2>{{_i}}Cross-everything{{/i}}</h2>
57
+ <p>{{_i}}Originally built with only modern browsers in mind, Bootstrap has evolved to include support for all major browsers (even IE7!) and, with Bootstrap 2, tablets and smartphones, too.{{/i}}</p>
58
+ </div>
59
+ </div><!--/row-->
60
+ <div class="row">
61
+ <div class="span4">
62
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_155_show_thumbnails.png">
63
+ <h2>{{_i}}12-column grid{{/i}}</h2>
64
+ <p>{{_i}}Grid systems aren't everything, but having a durable and flexible one at the core of your work can make development much simpler. Use our built-in grid classes or roll your own.{{/i}}</p>
65
+ </div>
66
+ <div class="span4">
67
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_214_resize_small.png">
68
+ <h2>{{_i}}Responsive design{{/i}}</h2>
69
+ <p>{{_i}}With Bootstrap 2, we've gone fully responsive. Our components are scaled according to a range of resolutions and devices to provide a consistent experience, no matter what.{{/i}}</p>
70
+ </div>
71
+ <div class="span4">
72
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_266_book_open.png">
73
+ <h2>{{_i}}Styleguide docs{{/i}}</h2>
74
+ <p>{{_i}}Unlike other front-end toolkits, Bootstrap was designed first and foremost as a styleguide to document not only our features, but best practices and living, coded examples.{{/i}}</p>
75
+ </div>
76
+ </div><!--/row-->
77
+ <div class="row">
78
+ <div class="span4">
79
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_082_roundabout.png">
80
+ <h2>{{_i}}Growing library{{/i}}</h2>
81
+ <p>{{_i}}Despite being only 10kb (gzipped), Bootstrap is one of the most complete front-end toolkits out there with dozens of fully functional components ready to be put to use.{{/i}}</p>
82
+ </div>
83
+ <div class="span4">
84
+ <img class="bs-icon" src="assets/img/glyphicons/glyphicons_009_magic.png">
85
+ <h2>{{_i}}Custom jQuery plugins{{/i}}</h2>
86
+ <p>{{_i}}What good is an awesome design component without easy-to-use, proper, and extensible interactions? With Bootstrap, you get custom-built jQuery plugins to bring your projects to life.{{/i}}</p>
87
+ </div>
88
+ <div class="span4">
89
+ <img class="bs-icon" src="assets/img/less-small.png">
90
+ <h2>{{_i}}Built on LESS{{/i}}</h2>
91
+ <p>{{_i}}Where vanilla CSS falters, LESS excels. Variables, nesting, operations, and mixins in LESS makes coding CSS faster and more efficient with minimal overhead.{{/i}}</p>
92
+ </div>
93
+ </div><!--/row-->
94
+ <div class="row">
95
+ <div class="span3">
96
+ <img class="small-bs-icon" src="assets/img/icon-html5.png">
97
+ <h3>HTML5</h3>
98
+ <p>{{_i}}Built to support new HTML5 elements and syntax.{{/i}}</p>
99
+ </div>
100
+ <div class="span3">
101
+ <img class="small-bs-icon" src="assets/img/icon-css3.png">
102
+ <h3>CSS3</h3>
103
+ <p>{{_i}}Progressively enhanced components for ultimate style.{{/i}}</p>
104
+ </div>
105
+ <div class="span3">
106
+ <img class="small-bs-icon" src="assets/img/icon-github.png">
107
+ <h3>{{_i}}Open-source{{/i}}</h3>
108
+ <p>{{_i}}Built for and maintained by the community via <a href="https://github.com">GitHub</a>.{{/i}}</p>
109
+ </div>
110
+ <div class="span3">
111
+ <img class="small-bs-icon" src="assets/img/icon-twitter.png">
112
+ <h3>{{_i}}Made at Twitter{{/i}}</h3>
113
+ <p>{{_i}}Brought to you by an experienced <a href="http://twitter.com/fat">engineer</a> and <a href="http://twitter.com/mdo">designer</a>.{{/i}}</p>
114
+ </div>
115
+ </div><!--/row-->
116
+
117
+ <hr class="soften">
118
+
119
+ <h1>{{_i}}Built with Bootstrap.{{/i}}</h1>
120
+ <p class="marketing-byline">{{_i}}For even more sites built with Bootstrap, <a href="http://builtwithbootstrap.tumblr.com/" target="_blank">visit the unofficial Tumblr</a> or <a href="./examples.html">browse the examples</a>.{{/i}}</p>
121
+ <ul class="thumbnails example-sites">
122
+ <li class="span3">
123
+ <a class="thumbnail" href="http://soundready.fm/" target="_blank">
124
+ <img src="assets/img/example-sites/soundready.png" alt="SoundReady.fm">
125
+ </a>
126
+ </li>
127
+ <li class="span3">
128
+ <a class="thumbnail" href="http://kippt.com/" target="_blank">
129
+ <img src="assets/img/example-sites/kippt.png" alt="Kippt">
130
+ </a>
131
+ </li>
132
+ <li class="span3">
133
+ <a class="thumbnail" href="http://www.fleetio.com/" target="_blank">
134
+ <img src="assets/img/example-sites/fleetio.png" alt="Fleetio">
135
+ </a>
136
+ </li>
137
+ <li class="span3">
138
+ <a class="thumbnail" href="http://www.jshint.com/" target="_blank">
139
+ <img src="assets/img/example-sites/jshint.png" alt="JS Hint">
140
+ </a>
141
+ </li>
142
+ </ul>
143
+
144
+</div><!-- /.marketing -->
\ No newline at end of file
docs/docs/likebutton/docs/templates/pages/javascript.mustache
new
+1405
@@ -0,0 +1,1405 @@
1
+ <!-- Masthead
2
+ ================================================== -->
3
+ <header class="jumbotron subhead" id="overview">
4
+ <h1>{{_i}}Javascript for Bootstrap{{/i}}</h1>
5
+ <p class="lead">{{_i}}Bring Bootstrap's components to life—now with 12 custom <a href="http://jquery.com/" target="_blank">jQuery</a> plugins.{{/i}}
6
+ <div class="subnav">
7
+ <ul class="nav nav-pills">
8
+ <li><a href="#javascript">{{_i}}All plugins{{/i}}</a></li>
9
+ <li><a href="#modals">{{_i}}Modal{{/i}}</a></li>
10
+ <li><a href="#dropdowns">{{_i}}Dropdown{{/i}}</a></li>
11
+ <li><a href="#scrollspy">{{_i}}Scrollspy{{/i}}</a></li>
12
+ <li><a href="#tabs">{{_i}}Tab{{/i}}</a></li>
13
+ <li><a href="#tooltips">{{_i}}Tooltip{{/i}}</a></li>
14
+ <li><a href="#popovers">{{_i}}Popover{{/i}}</a></li>
15
+ <li><a href="#alerts">{{_i}}Alert{{/i}}</a></li>
16
+ <li><a href="#buttons">{{_i}}Button{{/i}}</a></li>
17
+ <li><a href="#collapse">{{_i}}Collapse{{/i}}</a></li>
18
+ <li><a href="#carousel">{{_i}}Carousel{{/i}}</a></li>
19
+ <li><a href="#typeahead">{{_i}}Typeahead{{/i}}</a></li>
20
+ </ul>
21
+ </div>
22
+ </header>
23
+
24
+
25
+ <!-- Using Javascript w/ Bootstrap
26
+ ================================================== -->
27
+ <section id="javascript">
28
+ <div class="page-header">
29
+ <h1>{{_i}}jQuery plugins{{/i}} <small>{{_i}}A dozen Bootstrap plugins to get you started{{/i}}</small></h1>
30
+ </div>
31
+ <div class="row">
32
+ <div class="span3">
33
+ <h3><a href="./javascript.html#modals">{{_i}}Modals{{/i}}</a></h3>
34
+ <p>{{_i}}A streamlined, but flexible, take on the traditional javascript modal plugin with only the minimum required functionality and smart defaults.{{/i}}</p>
35
+ </div>
36
+ <div class="span3">
37
+ <h3><a href="./javascript.html#dropdowns">{{_i}}Dropdowns{{/i}}</a></h3>
38
+ <p>{{_i}}Add dropdown menus to nearly anything in Bootstrap with this simple plugin. Bootstrap features full dropdown menu support on in the navbar, tabs, and pills.{{/i}}</p>
39
+ </div>
40
+ <div class="span3">
41
+ <h3><a href="./javascript.html#scrollspy">{{_i}}Scrollspy{{/i}}</a></h3>
42
+ <p>{{_i}}Use scrollspy to automatically update the links in your navbar to show the current active link based on scroll position.{{/i}}</p>
43
+ </div>
44
+ <div class="span3">
45
+ <h3><a href="./javascript.html#tabs">{{_i}}Togglable tabs{{/i}}</a></h3>
46
+ <p>{{_i}}Use this plugin to make tabs and pills more useful by allowing them to toggle through tabbable panes of local content.{{/i}}</p>
47
+ </div>
48
+ </div> <!-- /row -->
49
+ <div class="row">
50
+ <div class="span3">
51
+ <h3><a href="./javascript.html#tooltips">{{_i}}Tooltips{{/i}}</a></h3>
52
+ <p>{{_i}}A new take on the jQuery Tipsy plugin, Tooltips don't rely on images—they use CSS3 for animations and data-attributes for local title storage.{{/i}}</p>
53
+ </div>
54
+ <div class="span3">
55
+ <h3><a href="./javascript.html#popovers">{{_i}}Popovers{{/i}}</a> <small class="muted">*</small></h3>
56
+ <p>{{_i}}Add small overlays of content, like those on the iPad, to any element for housing secondary information.{{/i}}</p>
57
+ <p class="muted"><strong>*</strong> {{_i}}Requires <a href="#tooltips">Tooltips</a> to be included{{/i}}</p>
58
+ </div>
59
+ <div class="span3">
60
+ <h3><a href="./javascript.html#alerts">{{_i}}Alert messages{{/i}}</a></h3>
61
+ <p>{{_i}}The alert plugin is a tiny class for adding close functionality to alerts.{{/i}}</p>
62
+ </div>
63
+ <div class="span3">
64
+ <h3><a href="./javascript.html#buttons">{{_i}}Buttons{{/i}}</a></h3>
65
+ <p>{{_i}}Do more with buttons. Control button states or create groups of buttons for more components like toolbars.{{/i}}</p>
66
+ </div>
67
+ </div> <!-- /row -->
68
+ <div class="row" style="margin-bottom: 9px;">
69
+ <div class="span3">
70
+ <h3><a href="./javascript.html#collapse">{{_i}}Collapse{{/i}}</a></h3>
71
+ <p>{{_i}}Get base styles and flexible support for collapsible components like accordions and navigation.{{/i}}</p>
72
+ </div>
73
+ <div class="span3">
74
+ <h3><a href="./javascript.html#carousel">{{_i}}Carousel{{/i}}</a></h3>
75
+ <p>{{_i}}Create a merry-go-round of any content you wish to provide an interactive slideshow of content.{{/i}}</p>
76
+ </div>
77
+ <div class="span3">
78
+ <h3><a href="./javascript.html#typeahead">Typeahead</a></h3>
79
+ <p>{{_i}}A basic, easily extended plugin for quickly creating elegant typeaheads with any form text input.{{/i}}</p>
80
+ </div>
81
+ <div class="span3">
82
+ <h3>{{_i}}Transitions{{/i}} <small class="muted">*</small></h3>
83
+ <p>{{_i}}For simple transition effects, include bootstrap-transition.js once to slide in modals or fade out alerts.{{/i}}</p>
84
+ <p class="muted"><strong>*</strong> {{_i}}Required for animation in plugins{{/i}}</p>
85
+ </div>
86
+ </div> <!-- /row -->
87
+ <div class="alert alert-info"><strong>{{_i}}Heads up!{{/i}}</strong> {{_i}}All javascript plugins require the latest version of jQuery.{{/i}}</div>
88
+ </section>
89
+
90
+
91
+
92
+ <!-- Modal
93
+ ================================================== -->
94
+ <section id="modals">
95
+ <div class="page-header">
96
+ <h1>{{_i}}Modals{{/i}} <small>bootstrap-modal.js</small></h1>
97
+ </div>
98
+ <div class="row">
99
+ <div class="span3 columns">
100
+ <h3>{{_i}}About modals{{/i}}</h3>
101
+ <p>{{_i}}A streamlined, but flexible, take on the traditional javascript modal plugin with only the minimum required functionality and smart defaults.{{/i}}</p>
102
+ <a href="assets/js/bootstrap-modal.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
103
+ </div>
104
+ <div class="span9 columns">
105
+ <h2>{{_i}}Static example{{/i}}</h2>
106
+ <p>{{_i}}Below is a statically rendered modal.{{/i}}</p>
107
+ <div class="well modal-example" style="background-color: #888; border: none;">
108
+ <div class="modal" style="position: relative; top: auto; left: auto; margin: 0 auto; z-index: 1; max-width: 100%;">
109
+ <div class="modal-header">
110
+ <button type="button" class="close" data-dismiss="modal">×</button>
111
+ <h3>{{_i}}Modal header{{/i}}</h3>
112
+ </div>
113
+ <div class="modal-body">
114
+ <p>{{_i}}One fine body…{{/i}}</p>
115
+ </div>
116
+ <div class="modal-footer">
117
+ <a href="#" class="btn">{{_i}}Close{{/i}}</a>
118
+ <a href="#" class="btn btn-primary">{{_i}}Save changes{{/i}}</a>
119
+ </div>
120
+ </div>
121
+ </div> <!-- /well -->
122
+
123
+ <h2>{{_i}}Live demo{{/i}}</h2>
124
+ <p>{{_i}}Toggle a modal via javascript by clicking the button below. It will slide down and fade in from the top of the page.{{/i}}</p>
125
+ <!-- sample modal content -->
126
+ <div id="myModal" class="modal hide fade">
127
+ <div class="modal-header">
128
+ <button type="button" class="close" data-dismiss="modal">×</button>
129
+ <h3>{{_i}}Modal Heading{{/i}}</h3>
130
+ </div>
131
+ <div class="modal-body">
132
+ <h4>{{_i}}Text in a modal{{/i}}</h4>
133
+ <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem.</p>
134
+
135
+ <h4>{{_i}}Popover in a modal{{/i}}</h4>
136
+ <p>{{_i}}This <a href="#" class="btn popover-test" title="A Title" data-content="And here's some amazing content. It's very engaging. right?">button</a> should trigger a popover on hover.{{/i}}</p>
137
+
138
+ <h4>{{_i}}Tooltips in a modal{{/i}}</h4>
139
+ <p>{{_i}}<a href="#" class="tooltip-test" title="Tooltip">This link</a> and <a href="#" class="tooltip-test" title="Tooltip">that link</a> should have tooltips on hover.{{/i}}</p>
140
+
141
+ <hr>
142
+
143
+ <h4>{{_i}}Overflowing text to show optional scrollbar{{/i}}</h4>
144
+ <p>{{_i}}We set a fixed <code>max-height</code> on the <code>.modal-body</code>. Watch it overflow with all this extra lorem ipsum text we've included.{{/i}}</p>
145
+ <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
146
+ <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
147
+ <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
148
+ <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
149
+ <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
150
+ <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
151
+ </div>
152
+ <div class="modal-footer">
153
+ <a href="#" class="btn" data-dismiss="modal" >{{_i}}Close{{/i}}</a>
154
+ <a href="#" class="btn btn-primary">{{_i}}Save changes{{/i}}</a>
155
+ </div>
156
+ </div>
157
+ <a data-toggle="modal" href="#myModal" class="btn btn-primary btn-large">{{_i}}Launch demo modal{{/i}}</a>
158
+
159
+ <hr>
160
+
161
+ <h2>{{_i}}Using bootstrap-modal{{/i}}</h2>
162
+ <p>{{_i}}Call the modal via javascript:{{/i}}</p>
163
+ <pre class="prettyprint linenums">$('#myModal').modal(options)</pre>
164
+ <h3>{{_i}}Options{{/i}}</h3>
165
+ <table class="table table-bordered table-striped">
166
+ <thead>
167
+ <tr>
168
+ <th style="width: 100px;">{{_i}}Name{{/i}}</th>
169
+ <th style="width: 50px;">{{_i}}type{{/i}}</th>
170
+ <th style="width: 50px;">{{_i}}default{{/i}}</th>
171
+ <th>{{_i}}description{{/i}}</th>
172
+ </tr>
173
+ </thead>
174
+ <tbody>
175
+ <tr>
176
+ <td>{{_i}}backdrop{{/i}}</td>
177
+ <td>{{_i}}boolean{{/i}}</td>
178
+ <td>{{_i}}true{{/i}}</td>
179
+ <td>{{_i}}Includes a modal-backdrop element. Alternatively, specify <code>static</code> for a backdrop which doesn't close the modal on click.{{/i}}</td>
180
+ </tr>
181
+ <tr>
182
+ <td>{{_i}}keyboard{{/i}}</td>
183
+ <td>{{_i}}boolean{{/i}}</td>
184
+ <td>{{_i}}true{{/i}}</td>
185
+ <td>{{_i}}Closes the modal when escape key is pressed{{/i}}</td>
186
+ </tr>
187
+ <tr>
188
+ <td>{{_i}}show{{/i}}</td>
189
+ <td>{{_i}}boolean{{/i}}</td>
190
+ <td>{{_i}}true{{/i}}</td>
191
+ <td>{{_i}}Shows the modal when initialized.{{/i}}</td>
192
+ </tr>
193
+ </tbody>
194
+ </table>
195
+ <h3>{{_i}}Markup{{/i}}</h3>
196
+ <p>{{_i}}You can activate modals on your page easily without having to write a single line of javascript. Just set <code>data-toggle="modal"</code> on a controller element with a <code>data-target="#foo"</code> or <code>href="#foo"</code> which corresponds to a modal element id, and when clicked, it will launch your modal.</p>
197
+ <p>Also, to add options to your modal instance, just include them as additional data attributes on either the control element or the modal markup itself.{{/i}}</p>
198
+<pre class="prettyprint linenums">
199
+<a class="btn" data-toggle="modal" href="#myModal" >{{_i}}Launch Modal{{/i}}</a>
200
+</pre>
201
+
202
+<pre class="prettyprint linenums">
203
+<div class="modal hide" id="myModal">
204
+ <div class="modal-header">
205
+ <button type="button" class="close" data-dismiss="modal">×</button>
206
+ <h3>Modal header</h3>
207
+ </div>
208
+ <div class="modal-body">
209
+ <p>{{_i}}One fine body…{{/i}}</p>
210
+ </div>
211
+ <div class="modal-footer">
212
+ <a href="#" class="btn" data-dismiss="modal">{{_i}}Close{{/i}}</a>
213
+ <a href="#" class="btn btn-primary">{{_i}}Save changes{{/i}}</a>
214
+ </div>
215
+</div>
216
+</pre>
217
+ <div class="alert alert-info">
218
+ <strong>{{_i}}Heads up!{{/i}}</strong> {{_i}}If you want your modal to animate in and out, just add a <code>.fade</code> class to the <code>.modal</code> element (refer to the demo to see this in action) and include bootstrap-transition.js.{{/i}}
219
+ </div>
220
+ <h3{{_i}}>Methods{{/i}}</h3>
221
+ <h4>.modal({{_i}}options{{/i}})</h4>
222
+ <p>{{_i}}Activates your content as a modal. Accepts an optional options <code>object</code>.{{/i}}</p>
223
+<pre class="prettyprint linenums">
224
+$('#myModal').modal({
225
+ keyboard: false
226
+})</pre>
227
+ <h4>.modal('toggle')</h4>
228
+ <p>{{_i}}Manually toggles a modal.{{/i}}</p>
229
+ <pre class="prettyprint linenums">$('#myModal').modal('toggle')</pre>
230
+ <h4>.modal('show')</h4>
231
+ <p>{{_i}}Manually opens a modal.{{/i}}</p>
232
+ <pre class="prettyprint linenums">$('#myModal').modal('show')</pre>
233
+ <h4>.modal('hide')</h4>
234
+ <p>{{_i}}Manually hides a modal.{{/i}}</p>
235
+ <pre class="prettyprint linenums">$('#myModal').modal('hide')</pre>
236
+ <h3>{{_i}}Events{{/i}}</h3>
237
+ <p>{{_i}}Bootstrap's modal class exposes a few events for hooking into modal functionality.{{/i}}</p>
238
+ <table class="table table-bordered table-striped">
239
+ <thead>
240
+ <tr>
241
+ <th style="width: 150px;">{{_i}}Event{{/i}}</th>
242
+ <th>{{_i}}Description{{/i}}</th>
243
+ </tr>
244
+ </thead>
245
+ <tbody>
246
+ <tr>
247
+ <td>{{_i}}show{{/i}}</td>
248
+ <td>{{_i}}This event fires immediately when the <code>show</code> instance method is called.{{/i}}</td>
249
+ </tr>
250
+ <tr>
251
+ <td>{{_i}}shown{{/i}}</td>
252
+ <td>{{_i}}This event is fired when the modal has been made visible to the user (will wait for css transitions to complete).{{/i}}</td>
253
+ </tr>
254
+ <tr>
255
+ <td>{{_i}}hide{{/i}}</td>
256
+ <td>{{_i}}This event is fired immediately when the <code>hide</code> instance method has been called.{{/i}}</td>
257
+ </tr>
258
+ <tr>
259
+ <td>{{_i}}hidden{{/i}}</td>
260
+ <td>{{_i}}This event is fired when the modal has finished being hidden from the user (will wait for css transitions to complete).{{/i}}</td>
261
+ </tr>
262
+ </tbody>
263
+ </table>
264
+
265
+<pre class="prettyprint linenums">
266
+$('#myModal').on('hidden', function () {
267
+ // {{_i}}do something…{{/i}}
268
+})</pre>
269
+ </div>
270
+ </div>
271
+ </section>
272
+
273
+
274
+
275
+ <!-- Dropdown
276
+ ================================================== -->
277
+ <section id="dropdowns">
278
+ <div class="page-header">
279
+ <h1>{{_i}}Dropdowns{{/i}} <small>bootstrap-dropdown.js</small></h1>
280
+ </div>
281
+ <div class="row">
282
+ <div class="span3 columns">
283
+ <h3>{{_i}}About dropdowns{{/i}}</h3>
284
+ <p>{{_i}}Add dropdown menus to nearly anything in Bootstrap with this simple plugin. Bootstrap features full dropdown menu support on in the navbar, tabs, and pills.{{/i}}</p>
285
+ <a href="assets/js/bootstrap-dropdown.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
286
+ </div>
287
+ <div class="span9 columns">
288
+ <h2>{{_i}}Examples{{/i}}</h2>
289
+ <p>{{_i}}Click on the dropdown nav links in the navbar and pills below to test dropdowns.{{/i}}</p>
290
+ <div id="navbar-example" class="navbar navbar-static">
291
+ <div class="navbar-inner">
292
+ <div class="container" style="width: auto;">
293
+ <a class="brand" href="#">{{_i}}Project Name{{/i}}</a>
294
+ <ul class="nav">
295
+ <li class="dropdown">
296
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{_i}}Dropdown{{/i}} <b class="caret"></b></a>
297
+ <ul class="dropdown-menu">
298
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
299
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
300
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
301
+ <li class="divider"></li>
302
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
303
+ </ul>
304
+ </li>
305
+ <li class="dropdown">
306
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{_i}}Dropdown 2 {{/i}}<b class="caret"></b></a>
307
+ <ul class="dropdown-menu">
308
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
309
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
310
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
311
+ <li class="divider"></li>
312
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
313
+ </ul>
314
+ </li>
315
+ </ul>
316
+ <ul class="nav pull-right">
317
+ <li id="fat-menu" class="dropdown">
318
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{_i}}Dropdown 3{{/i}} <b class="caret"></b></a>
319
+ <ul class="dropdown-menu">
320
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
321
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
322
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
323
+ <li class="divider"></li>
324
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
325
+ </ul>
326
+ </li>
327
+ </ul>
328
+ </div>
329
+ </div>
330
+ </div> <!-- /navbar-example -->
331
+
332
+ <ul class="nav nav-pills">
333
+ <li class="active"><a href="#">{{_i}}Regular link{{/i}}</a></li>
334
+ <li class="dropdown">
335
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">{{_i}}Dropdown{{/i}} <b class="caret"></b></a>
336
+ <ul id="menu1" class="dropdown-menu">
337
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
338
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
339
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
340
+ <li class="divider"></li>
341
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
342
+ </ul>
343
+ </li>
344
+ <li class="dropdown">
345
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">{{_i}}Dropdown 2{{/i}} <b class="caret"></b></a>
346
+ <ul id="menu2" class="dropdown-menu">
347
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
348
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
349
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
350
+ <li class="divider"></li>
351
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
352
+ </ul>
353
+ </li>
354
+ <li class="dropdown">
355
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">{{_i}}Dropdown 3{{/i}} <b class="caret"></b></a>
356
+ <ul id="menu3" class="dropdown-menu">
357
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
358
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
359
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
360
+ <li class="divider"></li>
361
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
362
+ </ul>
363
+ </li>
364
+ </ul> <!-- /tabs -->
365
+
366
+ <hr>
367
+
368
+ <h2>{{_i}}Using{{/i}} bootstrap-dropdown.js</h2>
369
+ <p>{{_i}}Call the dropdowns via javascript:{{/i}}</p>
370
+ <pre class="prettyprint linenums">$('.dropdown-toggle').dropdown()</pre>
371
+ <h3>{{_i}}Markup{{/i}}</h3>
372
+ <p>{{_i}}To quickly add dropdown functionality to any element just add <code>data-toggle="dropdown"</code> and any valid bootstrap dropdown will automatically be activated.{{/i}}</p>
373
+ <div class="alert alert-info">
374
+ <strong>{{_i}}Heads up!{{/i}}</strong>{{_i}} You may optionally target a specific dropdown by using <code>data-target="#fat"</code> or <code>href="#fat"</code>.{{/i}}
375
+ </div>
376
+
377
+<pre class="prettyprint linenums">
378
+<ul class="nav nav-pills">
379
+ <li class="active"><a href="#">Regular link</a></li>
380
+ <li class="dropdown" id="menu1">
381
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#menu1">
382
+ {{_i}}Dropdown{{/i}}
383
+ <b class="caret"></b>
384
+ </a>
385
+ <ul class="dropdown-menu">
386
+ <li><a href="#">{{_i}}Action{{/i}}</a></li>
387
+ <li><a href="#">{{_i}}Another action{{/i}}</a></li>
388
+ <li><a href="#">{{_i}}Something else here{{/i}}</a></li>
389
+ <li class="divider"></li>
390
+ <li><a href="#">{{_i}}Separated link{{/i}}</a></li>
391
+ </ul>
392
+ </li>
393
+ ...
394
+</ul></pre>
395
+ <p>{{_i}}To keep URLs intact, use the <code>data-target</code> attribute instead of <code>href="#"</code>.{{/i}}</p>
396
+<pre class="prettyprint linenums">
397
+<ul class="nav nav-pills">
398
+ <li class="dropdown">
399
+ <a class="dropdown-toggle" data-toggle="dropdown" data-target="#" href="path/to/page.html">
400
+ {{_i}}Dropdown{{/i}}
401
+ <b class="caret"></b>
402
+ </a>
403
+ <ul class="dropdown-menu">
404
+ ...
405
+ </ul>
406
+ </li>
407
+</ul>
408
+</pre>
409
+ <h3>{{_i}}Methods{{/i}}</h3>
410
+ <h4>$().dropdown()</h4>
411
+ <p>{{_i}}A programatic api for activating menus for a given navbar or tabbed navigation.{{/i}}</p>
412
+ </div>
413
+ </div>
414
+ </section>
415
+
416
+
417
+
418
+ <!-- ScrollSpy
419
+ ================================================== -->
420
+ <section id="scrollspy">
421
+ <div class="page-header">
422
+ <h1>{{_i}}ScrollSpy{{/i}} <small>bootstrap-scrollspy.js</small></h1>
423
+ </div>
424
+ <div class="row">
425
+ <div class="span3 columns">
426
+ <p>{{_i}}The ScrollSpy plugin is for automatically updating nav targets based on scroll position.{{/i}}</p>
427
+ <a href="assets/js/bootstrap-scrollspy.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
428
+ </div>
429
+ <div class="span9 columns">
430
+ <h2>{{_i}}Example navbar with scrollspy{{/i}}</h2>
431
+ <p>{{_i}}Scroll the area below and watch the navigation update. The dropdown sub items will be highlighted as well. Try it!{{/i}}</p>
432
+ <div id="navbarExample" class="navbar navbar-static">
433
+ <div class="navbar-inner">
434
+ <div class="container" style="width: auto;">
435
+ <a class="brand" href="#">{{_i}}Project Name{{/i}}</a>
436
+ <ul class="nav">
437
+ <li><a href="#fat">@fat</a></li>
438
+ <li><a href="#mdo">@mdo</a></li>
439
+ <li class="dropdown">
440
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{_i}}Dropdown{{/i}} <b class="caret"></b></a>
441
+ <ul class="dropdown-menu">
442
+ <li><a href="#one">{{_i}}one{{/i}}</a></li>
443
+ <li><a href="#two">{{_i}}two{{/i}}</a></li>
444
+ <li class="divider"></li>
445
+ <li><a href="#three">{{_i}}three{{/i}}</a></li>
446
+ </ul>
447
+ </li>
448
+ </ul>
449
+ </div>
450
+ </div>
451
+ </div>
452
+ <div data-spy="scroll" data-target="#navbarExample" data-offset="0" class="scrollspy-example">
453
+ <h4 id="fat">@fat</h4>
454
+ <p>
455
+ Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.
456
+ </p>
457
+ <h4 id="mdo">@mdo</h4>
458
+ <p>
459
+ Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.
460
+ </p>
461
+ <h4 id="one">one</h4>
462
+ <p>
463
+ Occaecat commodo aliqua delectus. Fap craft beer deserunt skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea sunt next level locavore single-origin coffee in magna veniam. High life id vinyl, echo park consequat quis aliquip banh mi pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim messenger bag. Cred ex in, sustainable delectus consectetur fanny pack iphone.
464
+ </p>
465
+ <h4 id="two">two</h4>
466
+ <p>
467
+ In incididunt echo park, officia deserunt mcsweeney's proident master cleanse thundercats sapiente veniam. Excepteur VHS elit, proident shoreditch +1 biodiesel laborum craft beer. Single-origin coffee wayfarers irure four loko, cupidatat terry richardson master cleanse. Assumenda you probably haven't heard of them art party fanny pack, tattooed nulla cardigan tempor ad. Proident wolf nesciunt sartorial keffiyeh eu banh mi sustainable. Elit wolf voluptate, lo-fi ea portland before they sold out four loko. Locavore enim nostrud mlkshk brooklyn nesciunt.
468
+ </p>
469
+ <h4 id="three">three</h4>
470
+ <p>
471
+ Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.
472
+ </p>
473
+ <p>Keytar twee blog, culpa messenger bag marfa whatever delectus food truck. Sapiente synth id assumenda. Locavore sed helvetica cliche irony, thundercats you probably haven't heard of them consequat hoodie gluten-free lo-fi fap aliquip. Labore elit placeat before they sold out, terry richardson proident brunch nesciunt quis cosby sweater pariatur keffiyeh ut helvetica artisan. Cardigan craft beer seitan readymade velit. VHS chambray laboris tempor veniam. Anim mollit minim commodo ullamco thundercats.
474
+ </p>
475
+ </div>
476
+ <hr>
477
+ <h2>{{_i}}Using bootstrap-scrollspy.js{{/i}}</h2>
478
+ <p>{{_i}}Call the scrollspy via javascript:{{/i}}</p>
479
+ <pre class="prettyprint linenums">$('#navbar').scrollspy()</pre>
480
+ <h3>{{_i}}Markup{{/i}}</h3>
481
+ <p>{{_i}}To easily add scrollspy behavior to your topbar navigation, just add <code>data-spy="scroll"</code> to the element you want to spy on (most typically this would be the body).{{/i}}</p>
482
+ <pre class="prettyprint linenums"><body data-spy="scroll" >...</body></pre>
483
+ <div class="alert alert-info">
484
+ <strong>{{_i}}Heads up!{{/i}}</strong>
485
+ {{_i}}Navbar links must have resolvable id targets. For example, a <code><a href="#home">home</a></code> must correspond to something in the dom like <code><div id="home"></div></code>.{{/i}}
486
+ </div>
487
+ <h3>{{_i}}Methods{{/i}}</h3>
488
+ <h4>.scrollspy('refresh')</h4>
489
+ <p>{{_i}}When using scrollspy in conjunction with adding or removing of elements from the DOM, you'll need to call the refresh method like so:{{/i}}</p>
490
+<pre class="prettyprint linenums">
491
+$('[data-spy="scroll"]').each(function () {
492
+ var $spy = $(this).scrollspy('refresh')
493
+});
494
+</pre>
495
+ <h3>{{_i}}Options{{/i}}</h3>
496
+ <table class="table table-bordered table-striped">
497
+ <thead>
498
+ <tr>
499
+ <th style="width: 100px;">{{_i}}Name{{/i}}</th>
500
+ <th style="width: 100px;">{{_i}}type{{/i}}</th>
501
+ <th style="width: 50px;">{{_i}}default{{/i}}</th>
502
+ <th>{{_i}}description{{/i}}</th>
503
+ </tr>
504
+ </thead>
505
+ <tbody>
506
+ <tr>
507
+ <td>{{_i}}offset{{/i}}</td>
508
+ <td>{{_i}}number{{/i}}</td>
509
+ <td>{{_i}}10{{/i}}</td>
510
+ <td>{{_i}}Pixels to offset from top when calculating position of scroll.{{/i}}</td>
511
+ </tr>
512
+ </tbody>
513
+ </table>
514
+ <h3>{{_i}}Events{{/i}}</h3>
515
+ <table class="table table-bordered table-striped">
516
+ <thead>
517
+ <tr>
518
+ <th style="width: 150px;">{{_i}}Event{{/i}}</th>
519
+ <th>{{_i}}Description{{/i}}</th>
520
+ </tr>
521
+ </thead>
522
+ <tbody>
523
+ <tr>
524
+ <td>{{_i}}activate{{/i}}</td>
525
+ <td>{{_i}}This event fires whenever a new item becomes activated by the scrollspy.{{/i}}</td>
526
+ </tr>
527
+ </tbody>
528
+ </table>
529
+ </div>
530
+ </div>
531
+ </section>
532
+
533
+
534
+
535
+ <!-- Tabs
536
+ ================================================== -->
537
+ <section id="tabs">
538
+ <div class="page-header">
539
+ <h1>{{_i}}Togglable tabs{{/i}} <small>bootstrap-tab.js</small></h1>
540
+ </div>
541
+ <div class="row">
542
+ <div class="span3 columns">
543
+ <p>{{_i}}This plugin adds quick, dynamic tab and pill functionality for transitioning through local content.{{/i}}</p>
544
+ <a href="assets/js/bootstrap-tab.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
545
+ </div>
546
+ <div class="span9 columns">
547
+ <h2>{{_i}}Example tabs{{/i}}</h2>
548
+ <p>{{_i}}Click the tabs below to toggle between hidden panes, even via dropdown menus.{{/i}}</p>
549
+ <ul id="myTab" class="nav nav-tabs">
550
+ <li class="active"><a href="#home" data-toggle="tab">{{_i}}Home{{/i}}</a></li>
551
+ <li><a href="#profile" data-toggle="tab">{{_i}}Profile{{/i}}</a></li>
552
+ <li class="dropdown">
553
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{_i}}Dropdown{{/i}} <b class="caret"></b></a>
554
+ <ul class="dropdown-menu">
555
+ <li><a href="#dropdown1" data-toggle="tab">@fat</a></li>
556
+ <li><a href="#dropdown2" data-toggle="tab">@mdo</a></li>
557
+ </ul>
558
+ </li>
559
+ </ul>
560
+ <div id="myTabContent" class="tab-content">
561
+ <div class="tab-pane fade in active" id="home">
562
+ <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
563
+ </div>
564
+ <div class="tab-pane fade" id="profile">
565
+ <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>
566
+ </div>
567
+ <div class="tab-pane fade" id="dropdown1">
568
+ <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>
569
+ </div>
570
+ <div class="tab-pane fade" id="dropdown2">
571
+ <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>
572
+ </div>
573
+ </div>
574
+ <hr>
575
+ <h2>{{_i}}Using bootstrap-tab.js{{/i}}</h2>
576
+ <p>{{_i}}Enable tabbable tabs via javascript (each tab needs to be activated individually):{{/i}}</p>
577
+ <pre class="prettyprint linenums">
578
+$('#myTab a').click(function (e) {
579
+ e.preventDefault();
580
+ $(this).tab('show');
581
+})</pre>
582
+ <p>{{_i}}You can activate individual tabs in several ways:{{/i}}</p>
583
+<pre class="prettyprint linenums">
584
+$('#myTab a[href="#profile"]').tab('show'); // Select tab by name
585
+$('#myTab a:first').tab('show'); // Select first tab
586
+$('#myTab a:last').tab('show'); // Select last tab
587
+$('#myTab li:eq(2) a').tab('show'); // Select third tab (0-indexed)
588
+</pre>
589
+ <h3>{{_i}}Markup{{/i}}</h3>
590
+ <p>{{_i}}You can activate a tab or pill navigation without writing any javascript by simply specifying <code>data-toggle="tab"</code> or <code>data-toggle="pill"</code> on an element. Adding the <code>nav</code> and <code>nav-tabs</code> classes to the tab <code>ul</code> will apply the bootstrap tab styling.{{/i}}</p>
591
+<pre class="prettyprint linenums">
592
+<ul class="nav nav-tabs">
593
+ <li><a href="#home" data-toggle="tab">{{_i}}Home{{/i}}</a></li>
594
+ <li><a href="#profile" data-toggle="tab">{{_i}}Profile{{/i}}</a></li>
595
+ <li><a href="#messages" data-toggle="tab">{{_i}}Messages{{/i}}</a></li>
596
+ <li><a href="#settings" data-toggle="tab">{{_i}}Settings{{/i}}</a></li>
597
+</ul></pre>
598
+ <h3>{{_i}}Methods{{/i}}</h3>
599
+ <h4>$().tab</h4>
600
+ <p>
601
+ {{_i}}Activates a tab element and content container. Tab should have either a <code>data-target</code> or an <code>href</code> targeting a container node in the DOM.{{/i}}
602
+ </p>
603
+<pre class="prettyprint linenums">
604
+<ul class="nav nav-tabs" id="myTab">
605
+ <li class="active"><a href="#home">{{_i}}Home{{/i}}</a></li>
606
+ <li><a href="#profile">{{_i}}Profile{{/i}}</a></li>
607
+ <li><a href="#messages">{{_i}}Messages{{/i}}</a></li>
608
+ <li><a href="#settings">{{_i}}Settings{{/i}}</a></li>
609
+</ul>
610
+
611
+<div class="tab-content">
612
+ <div class="tab-pane active" id="home">...</div>
613
+ <div class="tab-pane" id="profile">...</div>
614
+ <div class="tab-pane" id="messages">...</div>
615
+ <div class="tab-pane" id="settings">...</div>
616
+</div>
617
+
618
+<script>
619
+ $(function () {
620
+ $('#myTab a:last').tab('show');
621
+ })
622
+</script></pre>
623
+ <h3>{{_i}}Events{{/i}}</h3>
624
+ <table class="table table-bordered table-striped">
625
+ <thead>
626
+ <tr>
627
+ <th style="width: 150px;">{{_i}}Event{{/i}}</th>
628
+ <th>{{_i}}Description{{/i}}</th>
629
+ </tr>
630
+ </thead>
631
+ <tbody>
632
+ <tr>
633
+ <td>{{_i}}show{{/i}}</td>
634
+ <td>{{_i}}This event fires on tab show, but before the new tab has been shown. Use <code>event.target</code> and <code>event.relatedTarget</code> to target the active tab and the previous active tab (if available) respectively.{{/i}}</td>
635
+ </tr>
636
+ <tr>
637
+ <td>{{_i}}shown{{/i}}</td>
638
+ <td>{{_i}}This event fires on tab show after a tab has been shown. Use <code>event.target</code> and <code>event.relatedTarget</code> to target the active tab and the previous active tab (if available) respectively.{{/i}}</td>
639
+ </tr>
640
+ </tbody>
641
+ </table>
642
+
643
+ <pre class="prettyprint linenums">
644
+$('a[data-toggle="tab"]').on('shown', function (e) {
645
+ e.target // activated tab
646
+ e.relatedTarget // previous tab
647
+})</pre>
648
+ </div>
649
+ </div>
650
+ </section>
651
+
652
+
653
+ <!-- Tooltips
654
+ ================================================== -->
655
+ <section id="tooltips">
656
+ <div class="page-header">
657
+ <h1>{{_i}}Tooltips{{/i}} <small>bootstrap-tooltip.js</small></h1>
658
+ </div>
659
+ <div class="row">
660
+ <div class="span3 columns">
661
+ <h3>{{_i}}About Tooltips{{/i}}</h3>
662
+ <p>{{_i}}Inspired by the excellent jQuery.tipsy plugin written by Jason Frame; Tooltips are an updated version, which don't rely on images, use css3 for animations, and data-attributes for local title storage.{{/i}}</p>
663
+ <a href="assets/js/bootstrap-tooltip.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
664
+ </div>
665
+ <div class="span9 columns">
666
+ <h2>{{_i}}Example use of Tooltips{{/i}}</h2>
667
+ <p>{{_i}}Hover over the links below to see tooltips:{{/i}}</p>
668
+ <div class="tooltip-demo well">
669
+ <p class="muted" style="margin-bottom: 0;">{{_i}}Tight pants next level keffiyeh <a href="#" rel="tooltip" title="first tooltip">you probably</a> haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel <a href="#" rel="tooltip" title="Another tooltip">have a</a> terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan <a href="#" rel="tooltip" title="Another one here too">whatever keytar</a>, scenester farm-to-table banksy Austin <a href="#" rel="tooltip" title="The last tip!">twitter handle</a> freegan cred raw denim single-origin coffee viral.{{/i}}
670
+ </p>
671
+ </div>
672
+ <hr>
673
+ <h2>{{_i}}Using{{/i}} bootstrap-tooltip.js</h2>
674
+ <p>{{_i}}Trigger the tooltip via javascript:{{/i}}</p>
675
+ <pre class="prettyprint linenums">$('#example').tooltip({{_i}}options{{/i}})</pre>
676
+ <h3>{{_i}}Options{{/i}}</h3>
677
+ <table class="table table-bordered table-striped">
678
+ <thead>
679
+ <tr>
680
+ <th style="width: 100px;">{{_i}}Name{{/i}}</th>
681
+ <th style="width: 100px;">{{_i}}type{{/i}}</th>
682
+ <th style="width: 50px;">{{_i}}default{{/i}}</th>
683
+ <th>{{_i}}description{{/i}}</th>
684
+ </tr>
685
+ </thead>
686
+ <tbody>
687
+ <tr>
688
+ <td>{{_i}}animation{{/i}}</td>
689
+ <td>{{_i}}boolean{{/i}}</td>
690
+ <td>true</td>
691
+ <td>{{_i}}apply a css fade transition to the tooltip{{/i}}</td>
692
+ </tr>
693
+ <tr>
694
+ <td>{{_i}}placement{{/i}}</td>
695
+ <td>{{_i}}string|function{{/i}}</td>
696
+ <td>'top'</td>
697
+ <td>{{_i}}how to position the tooltip{{/i}} - top | bottom | left | right</td>
698
+ </tr>
699
+ <tr>
700
+ <td>{{_i}}selector{{/i}}</td>
701
+ <td>{{_i}}string{{/i}}</td>
702
+ <td>false</td>
703
+ <td>{{_i}}If a selector is provided, tooltip objects will be delegated to the specified targets.{{/i}}</td>
704
+ </tr>
705
+ <tr>
706
+ <td>{{_i}}title{{/i}}</td>
707
+ <td>{{_i}}string | function{{/i}}</td>
708
+ <td>''</td>
709
+ <td>{{_i}}default title value if `title` tag isn't present{{/i}}</td>
710
+ </tr>
711
+ <tr>
712
+ <td>{{_i}}trigger{{/i}}</td>
713
+ <td>{{_i}}string{{/i}}</td>
714
+ <td>'hover'</td>
715
+ <td>{{_i}}how tooltip is triggered{{/i}} - hover | focus | manual</td>
716
+ </tr>
717
+ <tr>
718
+ <td>{{_i}}delay{{/i}}</td>
719
+ <td>{{_i}}number | object{{/i}}</td>
720
+ <td>0</td>
721
+ <td>
722
+ <p>{{_i}}delay showing and hiding the tooltip (ms) - does not apply to manual trigger type{{/i}}</p>
723
+ <p>{{_i}}If a number is supplied, delay is applied to both hide/show{{/i}}</p>
724
+ <p>{{_i}}Object structure is: <code>delay: { show: 500, hide: 100 }</code>{{/i}}</p>
725
+ </td>
726
+ </tr>
727
+ </tbody>
728
+ </table>
729
+ <div class="alert alert-info">
730
+ <strong>{{_i}}Heads up!{{/i}}</strong>
731
+ {{_i}}Options for individual tooltips can alternatively be specified through the use of data attributes.{{/i}}
732
+ </div>
733
+ <h3>{{_i}}Markup{{/i}}</h3>
734
+ <p>{{_i}}For performance reasons, the Tooltip and Popover data-apis are opt in. If you would like to use them just specify a selector option.{{/i}}</p>
735
+<pre class="prettyprint linenums">
736
+<a href="#" rel="tooltip" title="{{_i}}first tooltip{{/i}}">{{_i}}hover over me{{/i}}</a>
737
+</pre>
738
+ <h3>{{_i}}Methods{{/i}}</h3>
739
+ <h4>$().tooltip({{_i}}options{{/i}})</h4>
740
+ <p>{{_i}}Attaches a tooltip handler to an element collection.{{/i}}</p>
741
+ <h4>.tooltip('show')</h4>
742
+ <p>{{_i}}Reveals an element's tooltip.{{/i}}</p>
743
+ <pre class="prettyprint linenums">$('#element').tooltip('show')</pre>
744
+ <h4>.tooltip('hide')</h4>
745
+ <p>{{_i}}Hides an element's tooltip.{{/i}}</p>
746
+ <pre class="prettyprint linenums">$('#element').tooltip('hide')</pre>
747
+ <h4>.tooltip('toggle')</h4>
748
+ <p>{{_i}}Toggles an element's tooltip.{{/i}}</p>
749
+ <pre class="prettyprint linenums">$('#element').tooltip('toggle')</pre>
750
+ </div>
751
+ </div>
752
+ </section>
753
+
754
+
755
+
756
+ <!-- Popovers
757
+ ================================================== -->
758
+ <section id="popovers">
759
+ <div class="page-header">
760
+ <h1>{{_i}}Popovers{{/i}} <small>bootstrap-popover.js</small></h1>
761
+ </div>
762
+ <div class="row">
763
+ <div class="span3 columns">
764
+ <h3>{{_i}}About popovers{{/i}}</h3>
765
+ <p>{{_i}}Add small overlays of content, like those on the iPad, to any element for housing secondary information.{{/i}}</p>
766
+ <p class="muted"><strong>*</strong> {{_i}}Requires <a href="#tooltips">Tooltip</a> to be included{{/i}}</p>
767
+ <a href="assets/js/bootstrap-popover.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
768
+ </div>
769
+ <div class="span9 columns">
770
+ <h2>{{_i}}Example hover popover{{/i}}</h2>
771
+ <p>{{_i}}Hover over the button to trigger the popover.{{/i}}</p>
772
+ <div class="well">
773
+ <a href="#" class="btn btn-danger" rel="popover" title="A Title" data-content="And here's some amazing content. It's very engaging. right?">{{_i}}hover for popover{{/i}}</a>
774
+ </div>
775
+ <hr>
776
+ <h2>{{_i}}Using bootstrap-popover.js{{/i}}</h2>
777
+ <p>{{_i}}Enable popovers via javascript:{{/i}}</p>
778
+ <pre class="prettyprint linenums">$('#example').popover({{_i}}options{{/i}})</pre>
779
+ <h3>{{_i}}Options{{/i}}</h3>
780
+ <table class="table table-bordered table-striped">
781
+ <thead>
782
+ <tr>
783
+ <th style="width: 100px;">{{_i}}Name{{/i}}</th>
784
+ <th style="width: 100px;">{{_i}}type{{/i}}</th>
785
+ <th style="width: 50px;">{{_i}}default{{/i}}</th>
786
+ <th>{{_i}}description{{/i}}</th>
787
+ </tr>
788
+ </thead>
789
+ <tbody>
790
+ <tr>
791
+ <td>{{_i}}animation{{/i}}</td>
792
+ <td>{{_i}}boolean{{/i}}</td>
793
+ <td>true</td>
794
+ <td>{{_i}}apply a css fade transition to the tooltip{{/i}}</td>
795
+ </tr>
796
+ <tr>
797
+ <td>{{_i}}placement{{/i}}</td>
798
+ <td>{{_i}}string|function{{/i}}</td>
799
+ <td>'right'</td>
800
+ <td>{{_i}}how to position the popover{{/i}} - top | bottom | left | right</td>
801
+ </tr>
802
+ <tr>
803
+ <td>{{_i}}selector{{/i}}</td>
804
+ <td>{{_i}}string{{/i}}</td>
805
+ <td>false</td>
806
+ <td>{{_i}}if a selector is provided, tooltip objects will be delegated to the specified targets{{/i}}</td>
807
+ </tr>
808
+ <tr>
809
+ <td>{{_i}}trigger{{/i}}</td>
810
+ <td>{{_i}}string{{/i}}</td>
811
+ <td>'hover'</td>
812
+ <td>{{_i}}how tooltip is triggered{{/i}} - hover | focus | manual</td>
813
+ </tr>
814
+ <tr>
815
+ <td>{{_i}}title{{/i}}</td>
816
+ <td>{{_i}}string | function{{/i}}</td>
817
+ <td>''</td>
818
+ <td>{{_i}}default title value if `title` attribute isn't present{{/i}}</td>
819
+ </tr>
820
+ <tr>
821
+ <td>{{_i}}content{{/i}}</td>
822
+ <td>{{_i}}string | function{{/i}}</td>
823
+ <td>''</td>
824
+ <td>{{_i}}default content value if `data-content` attribute isn't present{{/i}}</td>
825
+ </tr>
826
+ <tr>
827
+ <td>{{_i}}delay{{/i}}</td>
828
+ <td>{{_i}}number | object{{/i}}</td>
829
+ <td>0</td>
830
+ <td>
831
+ <p>{{_i}}delay showing and hiding the popover (ms) - does not apply to manual trigger type{{/i}}</p>
832
+ <p>{{_i}}If a number is supplied, delay is applied to both hide/show{{/i}}</p>
833
+ <p>{{_i}}Object structure is: <code>delay: { show: 500, hide: 100 }</code>{{/i}}</p>
834
+ </td>
835
+ </tr>
836
+ </tbody>
837
+ </table>
838
+ <div class="alert alert-info">
839
+ <strong>{{_i}}Heads up!{{/i}}</strong>
840
+ {{_i}}Options for individual popovers can alternatively be specified through the use of data attributes.{{/i}}
841
+ </div>
842
+ <h3>{{_i}}Markup{{/i}}</h3>
843
+ <p>
844
+ {{_i}}For performance reasons, the Tooltip and Popover data-apis are opt in. If you would like to use them just specify a selector option.{{/i}}
845
+ </p>
846
+ <h3>{{_i}}Methods{{/i}}</h3>
847
+ <h4>$().popover({{_i}}options{{/i}})</h4>
848
+ <p>{{_i}}Initializes popovers for an element collection.{{/i}}</p>
849
+ <h4>.popover('show')</h4>
850
+ <p>{{_i}}Reveals an elements popover.{{/i}}</p>
851
+ <pre class="prettyprint linenums">$('#element').popover('show')</pre>
852
+ <h4>.popover('hide')</h4>
853
+ <p>{{_i}}Hides an elements popover.{{/i}}</p>
854
+ <pre class="prettyprint linenums">$('#element').popover('hide')</pre>
855
+ <h4>.popover('toggle')</h4>
856
+ <p>{{_i}}Toggles an elements popover.{{/i}}</p>
857
+ <pre class="prettyprint linenums">$('#element').popover('toggle')</pre>
858
+ </div>
859
+ </div>
860
+ </section>
861
+
862
+
863
+
864
+ <!-- Alert
865
+ ================================================== -->
866
+ <section id="alerts">
867
+ <div class="page-header">
868
+ <h1>{{_i}}Alert messages{{/i}} <small>bootstrap-alert.js</small></h1>
869
+ </div>
870
+ <div class="row">
871
+ <div class="span3 columns">
872
+ <h3>{{_i}}About alerts{{/i}}</h3>
873
+ <p>{{_i}}The alert plugin is a tiny class for adding close functionality to alerts.{{/i}}</p>
874
+ <a href="assets/js/bootstrap-alert.js" target="_blank" class="btn">{{_i}}Download{{/i}}</a>
875
+ </div>
876
+ <div class="span9 columns">
877
+ <h2>{{_i}}Example alerts{{/i}}</h2>
878
+ <p>{{_i}}The alerts plugin works on regular alert messages, and block messages.{{/i}}</p>
879
+ <div class="alert fade in">
880
+ <button type="button" class="close" data-dismiss="alert">×</button>
881
+ <strong>{{_i}}Holy guacamole!{{/i}}</strong> {{_i}}Best check yo self, you're not looking too good.{{/i}}
882
+ </div>
883
+ <div class="alert alert-block alert-error fade in">
884
+ <button type="button" class="close" data-dismiss="alert">×</button>
885
+ <h4 class="alert-heading">{{_i}}Oh snap! You got an error!{{/i}}</h4>
886
+ <p>{{_i}}Change this and that and try again. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum.{{/i}}</p>
887
+ <p>
888
+ <a class="btn btn-danger" href="#">{{_i}}Take this action{{/i}}</a> <a class="btn" href="#">{{_i}}Or do this{{/i}}</a>
889
+ </p>
890
+ </div>
891
+ <hr>
892
+ <h2>{{_i}}Using bootstrap-alert.js{{/i}}</h2>
893
+ <p>{{_i}}Enable dismissal of an alert via javascript:{{/i}}</p>
894
+ <pre class="prettyprint linenums">$(".alert").alert()</pre>
895
+ <h3>{{_i}}Markup{{/i}}</h3>
896
+ <p>{{_i}}Just add <code>data-dismiss="alert"</code> to your close button to automatically give an alert close functionality.{{/i}}</p>
897
+ <pre class="prettyprint linenums"><a class="close" data-dismiss="alert" href="#">&times;</a></pre>
898
+ <h3>{{_i}}Methods{{/i}}</h3>
899
+ <h4>$().alert()</h4>
900
+ <p>{{_i}}Wraps all alerts with close functionality. To have your alerts animate out when closed, make sure they have the <code>.fade</code> and <code>.in</code> class already applied to them.{{/i}}</p>
901
+ <h4>.alert('close')</h4>
902
+ <p>{{_i}}Closes an alert.{{/i}}</p>
903
+ <pre class="prettyprint linenums">$(".alert").alert('close')</pre>
904
+ <h3>{{_i}}Events{{/i}}</h3>
905
+ <p>{{_i}}Bootstrap's alert class exposes a few events for hooking into alert functionality.{{/i}}</p>
906
+ <table class="table table-bordered table-striped">
907
+ <thead>
908
+ <tr>
909
+ <th style="width: 150px;">{{_i}}Event{{/i}}</th>
910
+ <th>{{_i}}Description{{/i}}</th>
911
+ </tr>
912
+ </thead>
913
+ <tbody>
914
+ <tr>
915
+ <td>{{_i}}close{{/i}}</td>
916
+ <td>{{_i}}This event fires immediately when the <code>close</code> instance method is called.{{/i}}</td>
917
+ </tr>
918
+ <tr>
919
+ <td>{{_i}}closed{{/i}}</td>
920
+ <td>{{_i}}This event is fired when the alert has been closed (will wait for css transitions to complete).{{/i}}</td>
921
+ </tr>
922
+ </tbody>
923
+ </table>
924
+<pre class="prettyprint linenums">
925
+$('#my-alert').bind('closed', function () {
926
+ // {{_i}}do something…{{/i}}
927
+})</pre>
928
+ </div>
929
+ </div>
930
+ </section>
931
+
932
+
933
+
934
+ <!-- Buttons
935
+ ================================================== -->
936
+ <section id="buttons">
937
+ <div class="page-header">
938
+ <h1>{{_i}}Buttons{{/i}} <small>bootstrap-button.js</small></h1>
939
+ </div>
940
+ <div class="row">
941
+ <div class="span3 columns">
942
+ <h3>{{_i}}About{{/i}}</h3>
943
+ <p>{{_i}}Do more with buttons. Control button states or create groups of buttons for more components like toolbars.{{/i}}</p>
944
+ <a href="assets/js/bootstrap-button.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
945
+ </div>
946
+ <div class="span9 columns">
947
+ <h2>{{_i}}Example uses{{/i}}</h2>
948
+ <p>{{_i}}Use the buttons plugin for states and toggles.{{/i}}</p>
949
+ <table class="table table-bordered table-striped">
950
+ <tbody>
951
+ <tr>
952
+ <td>{{_i}}Stateful{{/i}}</td>
953
+ <td>
954
+ <button id="fat-btn" data-loading-text="loading..." class="btn btn-primary">
955
+ {{_i}}Loading State{{/i}}
956
+ </button>
957
+ </td>
958
+ </tr>
959
+ <tr>
960
+ <td>{{_i}}Single toggle{{/i}}</td>
961
+ <td>
962
+ <button class="btn btn-primary" data-toggle="button">{{_i}}Single Toggle{{/i}}</button>
963
+ </td>
964
+ </tr>
965
+ <tr>
966
+ <td>{{_i}}Checkbox{{/i}}</td>
967
+ <td>
968
+ <div class="btn-group" data-toggle="buttons-checkbox">
969
+ <button class="btn btn-primary">{{_i}}Left{{/i}}</button>
970
+ <button class="btn btn-primary">{{_i}}Middle{{/i}}</button>
971
+ <button class="btn btn-primary">{{_i}}Right{{/i}}</button>
972
+ </div>
973
+ </td>
974
+ </tr>
975
+ <tr>
976
+ <td>{{_i}}Radio{{/i}}</td>
977
+ <td>
978
+ <div class="btn-group" data-toggle="buttons-radio">
979
+ <button class="btn btn-primary">{{_i}}Left{{/i}}</button>
980
+ <button class="btn btn-primary">{{_i}}Middle{{/i}}</button>
981
+ <button class="btn btn-primary">{{_i}}Right{{/i}}</button>
982
+ </div>
983
+ </td>
984
+ </tr>
985
+ </tbody>
986
+ </table>
987
+ <hr>
988
+ <h2>{{_i}}Using bootstrap-button.js{{/i}}</h2>
989
+ <p>{{_i}}Enable buttons via javascript:{{/i}}</p>
990
+ <pre class="prettyprint linenums">$('.nav-tabs').button()</pre>
991
+ <h3>{{_i}}Markup{{/i}}</h3>
992
+ <p>{{_i}}Data attributes are integral to the button plugin. Check out the example code below for the various markup types.{{/i}}</p>
993
+<pre class="prettyprint linenums">
994
+<!-- {{_i}}Add data-toggle="button" to activate toggling on a single button{{/i}} -->
995
+<button class="btn" data-toggle="button">Single Toggle</button>
996
+
997
+<!-- {{_i}}Add data-toggle="buttons-checkbox" for checkbox style toggling on btn-group{{/i}} -->
998
+<div class="btn-group" data-toggle="buttons-checkbox">
999
+ <button class="btn">Left</button>
1000
+ <button class="btn">Middle</button>
1001
+ <button class="btn">Right</button>
1002
+</div>
1003
+
1004
+<!-- {{_i}}Add data-toggle="buttons-radio" for radio style toggling on btn-group{{/i}} -->
1005
+<div class="btn-group" data-toggle="buttons-radio">
1006
+ <button class="btn">Left</button>
1007
+ <button class="btn">Middle</button>
1008
+ <button class="btn">Right</button>
1009
+</div>
1010
+</pre>
1011
+ <h3>{{_i}}Methods{{/i}}</h3>
1012
+ <h4>$().button('toggle')</h4>
1013
+ <p>{{_i}}Toggles push state. Gives the button the appearance that it has been activated.{{/i}}</p>
1014
+ <div class="alert alert-info">
1015
+ <strong>{{_i}}Heads up!{{/i}}</strong>
1016
+ {{_i}}You can enable auto toggling of a button by using the <code>data-toggle</code> attribute.{{/i}}
1017
+ </div>
1018
+ <pre class="prettyprint linenums"><button class="btn" data-toggle="button" >…</button></pre>
1019
+ <h4>$().button('loading')</h4>
1020
+ <p>{{_i}}Sets button state to loading - disables button and swaps text to loading text. Loading text should be defined on the button element using the data attribute <code>data-loading-text</code>.{{/i}}
1021
+ </p>
1022
+ <pre class="prettyprint linenums"><button class="btn" data-loading-text="loading stuff..." >...</button></pre>
1023
+ <div class="alert alert-info">
1024
+ <strong>{{_i}}Heads up!{{/i}}</strong>
1025
+ {{_i}}<a href="https://github.com/twitter/bootstrap/issues/793">Firefox persists the disabled state across page loads</a>. A workaround for this is to use <code>autocomplete="off"</code>.{{/i}}
1026
+ </div>
1027
+ <h4>$().button('reset')</h4>
1028
+ <p>{{_i}}Resets button state - swaps text to original text.{{/i}}</p>
1029
+ <h4>$().button(string)</h4>
1030
+ <p>{{_i}}Resets button state - swaps text to any data defined text state.{{/i}}</p>
1031
+<pre class="prettyprint linenums"><button class="btn" data-complete-text="finished!" >...</button>
1032
+<script>
1033
+ $('.btn').button('complete')
1034
+</script></pre>
1035
+ </div>
1036
+ </div>
1037
+ </section>
1038
+
1039
+
1040
+
1041
+ <!-- Collapse
1042
+ ================================================== -->
1043
+ <section id="collapse">
1044
+ <div class="page-header">
1045
+ <h1>{{_i}}Collapse{{/i}} <small>bootstrap-collapse.js</small></h1>
1046
+ </div>
1047
+ <div class="row">
1048
+ <div class="span3 columns">
1049
+ <h3>{{_i}}About{{/i}}</h3>
1050
+ <p>{{_i}}Get base styles and flexible support for collapsible components like accordions and navigation.{{/i}}</p>
1051
+ <a href="assets/js/bootstrap-collapse.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
1052
+ <p class="muted"><strong>*</strong> {{_i}}Requires the Transitions plugin to be included.{{/i}}</p>
1053
+ </div>
1054
+ <div class="span9 columns">
1055
+ <h2>{{_i}}Example accordion{{/i}}</h2>
1056
+ <p>{{_i}}Using the collapse plugin, we built a simple accordion style widget:{{/i}}</p>
1057
+
1058
+ <div class="accordion" id="accordion2">
1059
+ <div class="accordion-group">
1060
+ <div class="accordion-heading">
1061
+ <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseOne">
1062
+ {{_i}}Collapsible Group Item #1{{/i}}
1063
+ </a>
1064
+ </div>
1065
+ <div id="collapseOne" class="accordion-body collapse in">
1066
+ <div class="accordion-inner">
1067
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
1068
+ </div>
1069
+ </div>
1070
+ </div>
1071
+ <div class="accordion-group">
1072
+ <div class="accordion-heading">
1073
+ <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseTwo">
1074
+ {{_i}}Collapsible Group Item #2{{/i}}
1075
+ </a>
1076
+ </div>
1077
+ <div id="collapseTwo" class="accordion-body collapse">
1078
+ <div class="accordion-inner">
1079
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
1080
+ </div>
1081
+ </div>
1082
+ </div>
1083
+ <div class="accordion-group">
1084
+ <div class="accordion-heading">
1085
+ <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseThree">
1086
+ {{_i}}Collapsible Group Item #3{{/i}}
1087
+ </a>
1088
+ </div>
1089
+ <div id="collapseThree" class="accordion-body collapse">
1090
+ <div class="accordion-inner">
1091
+ Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
1092
+ </div>
1093
+ </div>
1094
+ </div>
1095
+ </div>
1096
+
1097
+
1098
+ <hr>
1099
+ <h2>{{_i}}Using bootstrap-collapse.js{{/i}}</h2>
1100
+ <p>{{_i}}Enable via javascript:{{/i}}</p>
1101
+ <pre class="prettyprint linenums">$(".collapse").collapse()</pre>
1102
+ <h3>{{_i}}Options{{/i}}</h3>
1103
+ <table class="table table-bordered table-striped">
1104
+ <thead>
1105
+ <tr>
1106
+ <th style="width: 100px;">{{_i}}Name{{/i}}</th>
1107
+ <th style="width: 50px;">{{_i}}type{{/i}}</th>
1108
+ <th style="width: 50px;">{{_i}}default{{/i}}</th>
1109
+ <th>{{_i}}description{{/i}}</th>
1110
+ </tr>
1111
+ </thead>
1112
+ <tbody>
1113
+ <tr>
1114
+ <td>{{_i}}parent{{/i}}</td>
1115
+ <td>{{_i}}selector{{/i}}</td>
1116
+ <td>false</td>
1117
+ <td>{{_i}}If selector then all collapsible elements under the specified parent will be closed when this collapsible item is shown. (similar to traditional accordion behavior){{/i}}</td>
1118
+ </tr>
1119
+ <tr>
1120
+ <td>{{_i}}toggle{{/i}}</td>
1121
+ <td>{{_i}}boolean{{/i}}</td>
1122
+ <td>true</td>
1123
+ <td>{{_i}}Toggles the collapsible element on invocation{{/i}}</td>
1124
+ </tr>
1125
+ </tbody>
1126
+ </table>
1127
+ <h3>{{_i}}Markup{{/i}}</h3>
1128
+ <p>{{_i}}Just add <code>data-toggle="collapse"</code> and a <code>data-target</code> to element to automatically assign control of a collapsible element. The <code>data-target</code> attribute accepts a css selector to apply the collapse to. Be sure to add the class <code>collapse</code> to the collapsible element. If you'd like it to default open, add the additional class <code>in</code>.{{/i}}</p>
1129
+ <pre class="prettyprint linenums">
1130
+<button class="btn btn-danger" data-toggle="collapse" data-target="#demo">
1131
+ {{_i}}simple collapsible{{/i}}
1132
+</button>
1133
+
1134
+<div id="demo" class="collapse in"> … </div></pre>
1135
+ <div class="alert alert-info">
1136
+ <strong>{{_i}}Heads up!{{/i}}</strong>
1137
+ {{_i}}To add accordion-like group management to a collapsible control, add the data attribute <code>data-parent="#selector"</code>. Refer to the demo to see this in action.{{/i}}
1138
+ </div>
1139
+ <h3>{{_i}}Methods{{/i}}</h3>
1140
+ <h4>.collapse({{_i}}options{{/i}})</h4>
1141
+ <p>{{_i}}Activates your content as a collapsible element. Accepts an optional options <code>object</code>.{{/i}}
1142
+<pre class="prettyprint linenums">
1143
+$('#myCollapsible').collapse({
1144
+ toggle: false
1145
+})</pre>
1146
+ <h4>.collapse('toggle')</h4>
1147
+ <p>{{_i}}Toggles a collapsible element to shown or hidden.{{/i}}</p>
1148
+ <h4>.collapse('show')</h4>
1149
+ <p>{{_i}}Shows a collapsible element.{{/i}}</p>
1150
+ <h4>.collapse('hide')</h4>
1151
+ <p>{{_i}}Hides a collapsible element.{{/i}}</p>
1152
+ <h3>{{_i}}Events{{/i}}</h3>
1153
+ <p>
1154
+ {{_i}}Bootstrap's collapse class exposes a few events for hooking into collapse functionality.{{/i}}
1155
+ </p>
1156
+ <table class="table table-bordered table-striped">
1157
+ <thead>
1158
+ <tr>
1159
+ <th style="width: 150px;">{{_i}}Event{{/i}}</th>
1160
+ <th>{{_i}}Description{{/i}}</th>
1161
+ </tr>
1162
+ </thead>
1163
+ <tbody>
1164
+ <tr>
1165
+ <td>{{_i}}show{{/i}}</td>
1166
+ <td>{{_i}}This event fires immediately when the <code>show</code> instance method is called.{{/i}}</td>
1167
+ </tr>
1168
+ <tr>
1169
+ <td>{{_i}}shown{{/i}}</td>
1170
+ <td>{{_i}}This event is fired when a collapse element has been made visible to the user (will wait for css transitions to complete).{{/i}}</td>
1171
+ </tr>
1172
+ <tr>
1173
+ <td>{{_i}}hide{{/i}}</td>
1174
+ <td>
1175
+ {{_i}}This event is fired immediately when the <code>hide</code> method has been called.{{/i}}
1176
+ </td>
1177
+ </tr>
1178
+ <tr>
1179
+ <td>{{_i}}hidden{{/i}}</td>
1180
+ <td>{{_i}}This event is fired when a collapse element has been hidden from the user (will wait for css transitions to complete).{{/i}}</td>
1181
+ </tr>
1182
+ </tbody>
1183
+ </table>
1184
+
1185
+<pre class="prettyprint linenums">
1186
+$('#myCollapsible').on('hidden', function () {
1187
+ // {{_i}}do something…{{/i}}
1188
+})</pre>
1189
+ </div>
1190
+ </div>
1191
+ </section>
1192
+
1193
+
1194
+
1195
+ <!-- Carousel
1196
+ ================================================== -->
1197
+ <section id="carousel">
1198
+ <div class="page-header">
1199
+ <h1>{{_i}}Carousel{{/i}} <small>bootstrap-carousel.js</small></h1>
1200
+ </div>
1201
+ <div class="row">
1202
+ <div class="span3 columns">
1203
+ <h3>{{_i}}About{{/i}}</h3>
1204
+ <p>{{_i}}A generic plugin for cycling through elements. A merry-go-round.{{/i}}</p>
1205
+ <a href="assets/js/bootstrap-carousel.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
1206
+ </div>
1207
+ <div class="span9 columns">
1208
+ <h2>{{_i}}Example carousel{{/i}}</h2>
1209
+ <p>{{_i}}Watch the slideshow below.{{/i}}</p>
1210
+ <div id="myCarousel" class="carousel slide">
1211
+ <div class="carousel-inner">
1212
+ <div class="item active">
1213
+ <img src="assets/img/bootstrap-mdo-sfmoma-01.jpg" alt="">
1214
+ <div class="carousel-caption">
1215
+ <h4>{{_i}}First Thumbnail label{{/i}}</h4>
1216
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1217
+ </div>
1218
+ </div>
1219
+ <div class="item">
1220
+ <img src="assets/img/bootstrap-mdo-sfmoma-02.jpg" alt="">
1221
+ <div class="carousel-caption">
1222
+ <h4>{{_i}}Second Thumbnail label{{/i}}</h4>
1223
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1224
+ </div>
1225
+ </div>
1226
+ <div class="item">
1227
+ <img src="assets/img/bootstrap-mdo-sfmoma-03.jpg" alt="">
1228
+ <div class="carousel-caption">
1229
+ <h4>{{_i}}Third Thumbnail label{{/i}}</h4>
1230
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
1231
+ </div>
1232
+ </div>
1233
+ </div>
1234
+ <a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>
1235
+ <a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>
1236
+ </div>
1237
+ <div class="alert alert-info">
1238
+ <strong>{{_i}}Heads up!{{/i}}</strong>
1239
+ {{_i}}When implementing this carousel, remove the images we have provided and replace them with your own.{{/i}}
1240
+ </div>
1241
+ <hr>
1242
+ <h2>{{_i}}Using bootstrap-carousel.js{{/i}}</h2>
1243
+ <p>{{_i}}Call via javascript:{{/i}}</p>
1244
+ <pre class="prettyprint linenums">$('.carousel').carousel()</pre>
1245
+ <h3>{{_i}}Options{{/i}}</h3>
1246
+ <table class="table table-bordered table-striped">
1247
+ <thead>
1248
+ <tr>
1249
+ <th style="width: 100px;">{{_i}}Name{{/i}}</th>
1250
+ <th style="width: 50px;">{{_i}}type{{/i}}</th>
1251
+ <th style="width: 50px;">{{_i}}default{{/i}}</th>
1252
+ <th>{{_i}}description{{/i}}</th>
1253
+ </tr>
1254
+ </thead>
1255
+ <tbody>
1256
+ <tr>
1257
+ <td>{{_i}}interval{{/i}}</td>
1258
+ <td>{{_i}}number{{/i}}</td>
1259
+ <td>5000</td>
1260
+ <td>{{_i}}The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle.{{/i}}</td>
1261
+ </tr>
1262
+ <tr>
1263
+ <td>{{_i}}pause{{/i}}</td>
1264
+ <td>{{_i}}string{{/i}}</td>
1265
+ <td>"hover"</td>
1266
+ <td>{{_i}}Pauses the cycling of the carousel on mouseenter and resumes the cycling of the carousel on mouseleave.{{/i}}</td>
1267
+ </tr>
1268
+ </tbody>
1269
+ </table>
1270
+ <h3>{{_i}}Markup{{/i}}</h3>
1271
+ <p>{{_i}}Data attributes are used for the previous and next conrols. Check out the example markup below.{{/i}}</p>
1272
+<pre class="prettyprint linenums">
1273
+<div id="myCarousel" class="carousel slide">
1274
+ <!-- {{_i}}Carousel items{{/i}} -->
1275
+ <div class="carousel-inner">
1276
+ <div class="active item">…</div>
1277
+ <div class="item">…</div>
1278
+ <div class="item">…</div>
1279
+ </div>
1280
+ <!-- {{_i}}Carousel nav{{/i}} -->
1281
+ <a class="carousel-control left" href="#myCarousel" data-slide="prev">&lsaquo;</a>
1282
+ <a class="carousel-control right" href="#myCarousel" data-slide="next">&rsaquo;</a>
1283
+</div>
1284
+</pre>
1285
+ <h3>{{_i}}Methods{{/i}}</h3>
1286
+ <h4>.carousel({{_i}}options{{/i}})</h4>
1287
+ <p>{{_i}}Initializes the carousel with an optional options <code>object</code> and starts cycling through items.{{/i}}</p>
1288
+<pre class="prettyprint linenums">
1289
+$('.carousel').carousel({
1290
+ interval: 2000
1291
+})
1292
+</pre>
1293
+ <h4>.carousel('cycle')</h4>
1294
+ <p>{{_i}}Cycles through the carousel items from left to right.{{/i}}</p>
1295
+ <h4>.carousel('pause')</h4>
1296
+ <p>{{_i}}Stops the carousel from cycling through items.{{/i}}</p>
1297
+ <h4>.carousel(number)</h4>
1298
+ <p>{{_i}}Cycles the carousel to a particular frame (0 based, similar to an array).{{/i}}</p>
1299
+ <h4>.carousel('prev')</h4>
1300
+ <p>{{_i}}Cycles to the previous item.{{/i}}</p>
1301
+ <h4>.carousel('next')</h4>
1302
+ <p>{{_i}}Cycles to the next item.{{/i}}</p>
1303
+ <h3>{{_i}}Events{{/i}}</h3>
1304
+ <p>{{_i}}Bootstrap's carousel class exposes two events for hooking into carousel functionality.{{/i}}</p>
1305
+ <table class="table table-bordered table-striped">
1306
+ <thead>
1307
+ <tr>
1308
+ <th style="width: 150px;">{{_i}}Event{{/i}}</th>
1309
+ <th>{{_i}}Description{{/i}}</th>
1310
+ </tr>
1311
+ </thead>
1312
+ <tbody>
1313
+ <tr>
1314
+ <td>{{_i}}slide{{/i}}</td>
1315
+ <td>{{_i}}This event fires immediately when the <code>slide</code> instance method is invoked.{{/i}}</td>
1316
+ </tr>
1317
+ <tr>
1318
+ <td>{{_i}}slid{{/i}}</td>
1319
+ <td>{{_i}}This event is fired when the carousel has completed its slide transition.{{/i}}</td>
1320
+ </tr>
1321
+ </tbody>
1322
+ </table>
1323
+ </div>
1324
+ </div>
1325
+ </section>
1326
+
1327
+
1328
+
1329
+ <!-- Typeahead
1330
+ ================================================== -->
1331
+ <section id="typeahead">
1332
+ <div class="page-header">
1333
+ <h1>{{_i}}Typeahead{{/i}} <small>bootstrap-typeahead.js</small></h1>
1334
+ </div>
1335
+ <div class="row">
1336
+ <div class="span3 columns">
1337
+ <h3>{{_i}}About{{/i}}</h3>
1338
+ <p>{{_i}}A basic, easily extended plugin for quickly creating elegant typeaheads with any form text input.{{/i}}</p>
1339
+ <a href="assets/js/bootstrap-typeahead.js" target="_blank" class="btn">{{_i}}Download file{{/i}}</a>
1340
+ </div>
1341
+ <div class="span9 columns">
1342
+ <h2>{{_i}}Example{{/i}}</h2>
1343
+ <p>{{_i}}Start typing in the field below to show the typeahead results.{{/i}}</p>
1344
+ <div class="well">
1345
+ <input type="text" class="span3" style="margin: 0 auto;" data-provide="typeahead" data-items="4" data-source='["Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Hampshire","New Jersey","New Mexico","New York","North Dakota","North Carolina","Ohio","Oklahoma","Oregon","Pennsylvania","Rhode Island","South Carolina","South Dakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","West Virginia","Wisconsin","Wyoming"]'>
1346
+ </div>
1347
+ <hr>
1348
+ <h2>{{_i}}Using bootstrap-typeahead.js{{/i}}</h2>
1349
+ <p>{{_i}}Call the typeahead via javascript:{{/i}}</p>
1350
+ <pre class="prettyprint linenums">$('.typeahead').typeahead()</pre>
1351
+ <h3>{{_i}}Options{{/i}}</h3>
1352
+ <table class="table table-bordered table-striped">
1353
+ <thead>
1354
+ <tr>
1355
+ <th style="width: 100px;">{{_i}}Name{{/i}}</th>
1356
+ <th style="width: 50px;">{{_i}}type{{/i}}</th>
1357
+ <th style="width: 100px;">{{_i}}default{{/i}}</th>
1358
+ <th>{{_i}}description{{/i}}</th>
1359
+ </tr>
1360
+ </thead>
1361
+ <tbody>
1362
+ <tr>
1363
+ <td>{{_i}}source{{/i}}</td>
1364
+ <td>{{_i}}array{{/i}}</td>
1365
+ <td>[ ]</td>
1366
+ <td>{{_i}}The data source to query against.{{/i}}</td>
1367
+ </tr>
1368
+ <tr>
1369
+ <td>{{_i}}items{{/i}}</td>
1370
+ <td>{{_i}}number{{/i}}</td>
1371
+ <td>8</td>
1372
+ <td>{{_i}}The max number of items to display in the dropdown.{{/i}}</td>
1373
+ </tr>
1374
+ <tr>
1375
+ <td>{{_i}}matcher{{/i}}</td>
1376
+ <td>{{_i}}function{{/i}}</td>
1377
+ <td>{{_i}}case insensitive{{/i}}</td>
1378
+ <td>{{_i}}The method used to determine if a query matches an item. Accepts a single argument, the <code>item</code> against which to test the query. Access the current query with <code>this.query</code>. Return a boolean <code>true</code> if query is a match.{{/i}}</td>
1379
+ </tr>
1380
+ <tr>
1381
+ <td>{{_i}}sorter{{/i}}</td>
1382
+ <td>{{_i}}function{{/i}}</td>
1383
+ <td>{{_i}}exact match,<br> case sensitive,<br> case insensitive{{/i}}</td>
1384
+ <td>{{_i}}Method used to sort autocomplete results. Accepts a single argument <code>items</code> and has the scope of the typeahead instance. Reference the current query with <code>this.query</code>.{{/i}}</td>
1385
+ </tr>
1386
+ <tr>
1387
+ <td>{{_i}}highlighter{{/i}}</td>
1388
+ <td>{{_i}}function{{/i}}</td>
1389
+ <td>{{_i}}highlights all default matches{{/i}}</td>
1390
+ <td>{{_i}}Method used to highlight autocomplete results. Accepts a single argument <code>item</code> and has the scope of the typeahead instance. Should return html.{{/i}}</td>
1391
+ </tr>
1392
+ </tbody>
1393
+ </table>
1394
+
1395
+ <h3>{{_i}}Markup{{/i}}</h3>
1396
+ <p>{{_i}}Add data attributes to register an element with typeahead functionality.{{/i}}</p>
1397
+<pre class="prettyprint linenums">
1398
+<input type="text" data-provide="typeahead">
1399
+</pre>
1400
+ <h3>{{_i}}Methods{{/i}}</h3>
1401
+ <h4>.typeahead({{_i}}options{{/i}})</h4>
1402
+ <p>{{_i}}Initializes an input with a typeahead.{{/i}}</p>
1403
+ </div>
1404
+ </div>
1405
+ </section>
\ No newline at end of file
docs/docs/likebutton/docs/templates/pages/less.mustache
new
+944
@@ -0,0 +1,944 @@
1
+<!-- Masthead
2
+================================================== -->
3
+<header class="jumbotron subhead" id="overview">
4
+ <h1>{{_i}}Using LESS with Bootstrap{{/i}}</h1>
5
+ <p class="lead">{{_i}}Customize and extend Bootstrap with <a href="http://lesscss.org" target="_blank">LESS</a>, a CSS preprocessor, to take advantage of the variables, mixins, and more used to build Bootstrap's CSS.{{/i}}</p>
6
+ <div class="subnav">
7
+ <ul class="nav nav-pills">
8
+ <li><a href="#builtWith">{{_i}}Built with Less{{/i}}</a></li>
9
+ <li><a href="#variables">{{_i}}Variables{{/i}}</a></li>
10
+ <li><a href="#mixins">{{_i}}Mixins{{/i}}</a></li>
11
+ <li><a href="#compiling">{{_i}}Compiling Bootstrap{{/i}}</a></li>
12
+ </ul>
13
+ </div>
14
+</header>
15
+
16
+
17
+
18
+<!-- BUILT WITH LESS
19
+================================================== -->
20
+<section id="builtWith">
21
+ <div class="page-header">
22
+ <h1>{{_i}}Built with LESS{{/i}}</h1>
23
+ </div>
24
+ <div class="row">
25
+ <div class="span4">
26
+ <h3>{{_i}}Why LESS?{{/i}}</h3>
27
+ <p>{{_i}}Bootstrap is made with LESS at its core, a dynamic stylesheet language created by our good friend, <a href="http://cloudhead.io">Alexis Sellier</a>. It makes developing systems-based CSS faster, easier, and more fun.{{/i}}</p>
28
+ </div>
29
+ <div class="span4">
30
+ <h3>{{_i}}What's included?{{/i}}</h3>
31
+ <p>{{_i}}As an extension of CSS, LESS includes variables, mixins for reusable snippets of code, operations for simple math, nesting, and even color functions.{{/i}}</p>
32
+ </div>
33
+ <div class="span4">
34
+ <h3>{{_i}}Learn more{{/i}}</h3>
35
+ <img style="float: right; height: 36px;" src="assets/img/less-logo-large.png" alt="LESS CSS">
36
+ <p>{{_i}}Visit the official website at <a href="http://lesscss.org">http://lesscss.org</a> to learn more.{{/i}}</p>
37
+ </div>
38
+ </div>
39
+ <div class="row">
40
+ <div class="span4">
41
+ <h3><a href="#variables">{{_i}}Variables{{/i}}</a></h3>
42
+ <p>{{_i}}Managing colors and pixel values in CSS can be a bit of a pain, usually full of copy and paste. Not with LESS though—assign colors or pixel values as variables and change them once.{{/i}}</p>
43
+ </div>
44
+ <div class="span4">
45
+ <h3><a href="#mixins">{{_i}}Mixins{{/i}}</a></h3>
46
+ <p>{{_i}}Those three border-radius declarations you need to make in regular ol' CSS? Now they're down to one line with the help of mixins, snippets of code you can reuse anywhere.{{/i}}</p>
47
+ </div>
48
+ <div class="span4">
49
+ <h3>{{_i}}Operations{{/i}}</h3>
50
+ <p>{{_i}}Make your grid, leading, and more super flexible by doing the math on the fly with operations. Multiply, divide, add, and subtract your way to CSS sanity.{{/i}}</p>
51
+ </div>
52
+ </div>
53
+</section>
54
+
55
+
56
+
57
+<!-- VARIABLES
58
+================================================== -->
59
+<section id="variables">
60
+ <div class="page-header">
61
+ <h1>{{_i}}Bootstrap variables <small>LESS variables, their values, and usage guidelines</small>{{/i}}</h1>
62
+ </div>
63
+
64
+ <h3>{{_i}}Scaffolding and links{{/i}}</h3>
65
+ <table class="table table-bordered table-striped">
66
+ <tbody>
67
+ <tr>
68
+ <td class="span4"><code>@bodyBackground</code></td>
69
+ <td><code>@white</code></td>
70
+ <td>{{_i}}Page background color{{/i}}</td>
71
+ <td class="swatch-col"><span class="swatch" style="background-color: #fff;"></span></td>
72
+ </tr>
73
+ <tr>
74
+ <td><code>@textColor</code></td>
75
+ <td><code>@grayDark</code></td>
76
+ <td>{{_i}}Default text color for entire body, headings, and more{{/i}}</td>
77
+ <td class="swatch-col"><span class="swatch" style="background-color: #333;"></span></td>
78
+ </tr>
79
+ <tr>
80
+ <td><code>@linkColor</code></td>
81
+ <td><code>#08c</code></td>
82
+ <td>{{_i}}Default link text color{{/i}}</td>
83
+ <td class="swatch-col"><span class="swatch" style="background-color: #08c;"></span></td>
84
+ </tr>
85
+ <tr>
86
+ <td><code>@linkColorHover</code></td>
87
+ <td><code>darken(@linkColor, 15%)</code></td>
88
+ <td>{{_i}}Default link text hover color{{/i}}</td>
89
+ <td><span class="swatch" style="background-color: #005580;"></span></td>
90
+ </tr>
91
+ </tbody>
92
+ </table>
93
+ <h3>{{_i}}Grid system{{/i}}</h3>
94
+ <table class="table table-bordered table-striped">
95
+ <tbody>
96
+ <tr>
97
+ <td class="span4"><code>@gridColumns</code></td>
98
+ <td>12</td>
99
+ </tr>
100
+ <tr>
101
+ <td><code>@gridColumnWidth</code></td>
102
+ <td>60px</td>
103
+ </tr>
104
+ <tr>
105
+ <td><code>@gridGutterWidth</code></td>
106
+ <td>20px</td>
107
+ </tr>
108
+ <tr>
109
+ <td><code>@fluidGridColumnWidth</code></td>
110
+ <td>6.382978723%</td>
111
+ </tr>
112
+ <tr>
113
+ <td><code>@fluidGridGutterWidth</code></td>
114
+ <td>2.127659574%</td>
115
+ </tr>
116
+ </tbody>
117
+ </table>
118
+ <h3>{{_i}}Typography{{/i}}</h3>
119
+ <table class="table table-bordered table-striped">
120
+ <tbody>
121
+ <tr>
122
+ <td class="span4"><code>@sansFontFamily</code></td>
123
+ <td colspan="2">"Helvetica Neue", Helvetica, Arial, sans-serif</td>
124
+ </tr>
125
+ <tr>
126
+ <td><code>@serifFontFamily</code></td>
127
+ <td colspan="2"><code>Georgia, "Times New Roman", Times, serif</code></td>
128
+ </tr>
129
+ <tr>
130
+ <td><code>@monoFontFamily</code></td>
131
+ <td colspan="2">Menlo, Monaco, "Courier New", monospace</td>
132
+ </tr>
133
+
134
+ <tr>
135
+ <td><code>@baseFontSize</code></td>
136
+ <td>13px</td>
137
+ <td><em class="muted">Must be pixels</em></td>
138
+ </tr>
139
+ <tr>
140
+ <td><code>@baseFontFamily</code></td>
141
+ <td colspan="2"><code>@sansFontFamily</code></td>
142
+ </tr>
143
+ <tr>
144
+ <td><code>@baseLineHeight</code></td>
145
+ <td>18px</td>
146
+ <td><em class="muted">Must be pixels</em></td>
147
+ </tr>
148
+ <tr>
149
+ <td><code>@altFontFamily</code></td>
150
+ <td colspan="2"><code>@serifFontFamily</code></td>
151
+ </tr>
152
+
153
+ <tr>
154
+ <td><code>@headingsFontFamily</code></td>
155
+ <td colspan="2"><code>inherit</code></td>
156
+ </tr>
157
+ <tr>
158
+ <td><code>@headingsFontWeight</code></td>
159
+ <td colspan="2"><code>bold</code></td>
160
+ </tr>
161
+ <tr>
162
+ <td><code>@headingsColor</code></td>
163
+ <td colspan="2"><code>inherit</code></td>
164
+ </tr>
165
+ </tbody>
166
+ </table>
167
+ <h3>{{_i}}Tables{{/i}}</h3>
168
+ <table class="table table-bordered table-striped">
169
+ <tbody>
170
+ <tr>
171
+ <td class="span4"><code>@tableBackground</code></td>
172
+ <td><code>transparent</code></td>
173
+ </tr>
174
+ <tr>
175
+ <td><code>@tableBackgroundAccent</code></td>
176
+ <td><code>#f9f9f9</code></td>
177
+ </tr>
178
+ <tr>
179
+ <td><code>@tableBackgroundHover</code></td>
180
+ <td><code>#f5f5f5</code></td>
181
+ </tr>
182
+ <tr>
183
+ <td><code>@tableBorder</code></td>
184
+ <td><code>ddd</code></td>
185
+ </tr>
186
+ </tbody>
187
+ </table>
188
+
189
+ <h3>{{_i}}Grayscale colors{{/i}}</h3>
190
+ <table class="table table-bordered table-striped">
191
+ <tbody>
192
+ <tr>
193
+ <td class="span4"><code>@black</code></td>
194
+ <td>#000</td>
195
+ <td class="swatch-col"><span class="swatch" style="background-color: #000;"></span></td>
196
+ </tr>
197
+ <tr>
198
+ <td><code>@grayDarker</code></td>
199
+ <td>#222</td>
200
+ <td><span class="swatch" style="background-color: #222;"></span></td>
201
+ </tr>
202
+ <tr>
203
+ <td><code>@grayDark</code></td>
204
+ <td>#333</td>
205
+ <td><span class="swatch" style="background-color: #333;"></span></td>
206
+ </tr>
207
+ <tr>
208
+ <td><code>@gray</code></td>
209
+ <td>#555</td>
210
+ <td><span class="swatch" style="background-color: #555;"></span></td>
211
+ </tr>
212
+ <tr>
213
+ <td><code>@grayLight</code></td>
214
+ <td>#999</td>
215
+ <td><span class="swatch" style="background-color: #999;"></span></td>
216
+ </tr>
217
+ <tr>
218
+ <td><code>@grayLighter</code></td>
219
+ <td>#eee</td>
220
+ <td><span class="swatch" style="background-color: #eee;"></span></td>
221
+ </tr>
222
+ <tr>
223
+ <td><code>@white</code></td>
224
+ <td>#fff</td>
225
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
226
+ </tr>
227
+ </tbody>
228
+ </table>
229
+ <h3>{{_i}}Accent colors{{/i}}</h3>
230
+ <table class="table table-bordered table-striped">
231
+ <tbody>
232
+ <tr>
233
+ <td class="span4"><code>@blue</code></td>
234
+ <td>#049cdb</td>
235
+ <td class="swatch-col"><span class="swatch" style="background-color: #049cdb;"></span></td>
236
+ </tr>
237
+ <tr>
238
+ <td><code>@green</code></td>
239
+ <td>#46a546</td>
240
+ <td><span class="swatch" style="background-color: #46a546;"></span></td>
241
+ </tr>
242
+ <tr>
243
+ <td><code>@red</code></td>
244
+ <td>#9d261d</td>
245
+ <td><span class="swatch" style="background-color: #9d261d;"></span></td>
246
+ </tr>
247
+ <tr>
248
+ <td><code>@yellow</code></td>
249
+ <td>#ffc40d</td>
250
+ <td><span class="swatch" style="background-color: #ffc40d;"></span></td>
251
+ </tr>
252
+ <tr>
253
+ <td><code>@orange</code></td>
254
+ <td>#f89406</td>
255
+ <td><span class="swatch" style="background-color: #f89406;"></span></td>
256
+ </tr>
257
+ <tr>
258
+ <td><code>@pink</code></td>
259
+ <td>#c3325f</td>
260
+ <td><span class="swatch" style="background-color: #c3325f;"></span></td>
261
+ </tr>
262
+ <tr>
263
+ <td><code>@purple</code></td>
264
+ <td>#7a43b6</td>
265
+ <td><span class="swatch" style="background-color: #7a43b6;"></span></td>
266
+ </tr>
267
+ </tbody>
268
+ </table>
269
+
270
+
271
+ <h3>{{_i}}Components{{/i}}</h3>
272
+
273
+ <h4>{{_i}}Buttons{{/i}}</h4>
274
+ <table class="table table-bordered table-striped">
275
+ <tbody>
276
+ <tr>
277
+ <td class="span4"><code>@btnBackground</code></td>
278
+ <td><code>@white</code></td>
279
+ <td class="swatch-col"><span class="swatch" style="background-color: #fff;"></span></td>
280
+ </tr>
281
+ <tr>
282
+ <td><code>@btnBackgroundHighlight</code></td>
283
+ <td><code>darken(@white, 10%)</code></td>
284
+ <td class="swatch-col"><span class="swatch" style="background-color: #e6e6e6;"></span></td>
285
+ </tr>
286
+ <tr>
287
+ <td><code>@btnBorder</code></td>
288
+ <td><code>darken(@white, 20%)</code></td>
289
+ <td class="swatch-col"><span class="swatch" style="background-color: #ccc;"></span></td>
290
+ </tr>
291
+
292
+ <tr>
293
+ <td><code>@btnPrimaryBackground</code></td>
294
+ <td><code>@linkColor</code></td>
295
+ <td class="swatch-col"><span class="swatch" style="background-color: #08c;"></span></td>
296
+ </tr>
297
+ <tr>
298
+ <td><code>@btnPrimaryBackgroundHighlight</code></td>
299
+ <td><code>spin(@btnPrimaryBackground, 15%)</code></td>
300
+ <td class="swatch-col"><span class="swatch" style="background-color: #05c;"></span></td>
301
+ </tr>
302
+
303
+ <tr>
304
+ <td><code>@btnInfoBackground</code></td>
305
+ <td><code>#5bc0de</code></td>
306
+ <td class="swatch-col"><span class="swatch" style="background-color: #5bc0de;"></span></td>
307
+ </tr>
308
+ <tr>
309
+ <td><code>@btnInfoBackgroundHighlight</code></td>
310
+ <td><code>#2f96b4</code></td>
311
+ <td class="swatch-col"><span class="swatch" style="background-color: #2f96b4;"></span></td>
312
+ </tr>
313
+
314
+ <tr>
315
+ <td><code>@btnSuccessBackground</code></td>
316
+ <td><code>#62c462</code></td>
317
+ <td class="swatch-col"><span class="swatch" style="background-color: #62c462;"></span></td>
318
+ </tr>
319
+ <tr>
320
+ <td><code>@btnSuccessBackgroundHighlight</code></td>
321
+ <td><code>51a351</code></td>
322
+ <td class="swatch-col"><span class="swatch" style="background-color: #51a351;"></span></td>
323
+ </tr>
324
+
325
+ <tr>
326
+ <td><code>@btnWarningBackground</code></td>
327
+ <td><code>lighten(@orange, 15%)</code></td>
328
+ <td class="swatch-col"><span class="swatch" style="background-color: #fbb450;"></span></td>
329
+ </tr>
330
+ <tr>
331
+ <td><code>@btnWarningBackgroundHighlight</code></td>
332
+ <td><code>@orange</code></td>
333
+ <td class="swatch-col"><span class="swatch" style="background-color: #f89406;"></span></td>
334
+ </tr>
335
+
336
+ <tr>
337
+ <td><code>@btnDangerBackground</code></td>
338
+ <td><code>#ee5f5b</code></td>
339
+ <td class="swatch-col"><span class="swatch" style="background-color: #ee5f5b;"></span></td>
340
+ </tr>
341
+ <tr>
342
+ <td><code>@btnDangerBackgroundHighlight</code></td>
343
+ <td><code>#bd362f</code></td>
344
+ <td class="swatch-col"><span class="swatch" style="background-color: #bd362f;"></span></td>
345
+ </tr>
346
+
347
+ <tr>
348
+ <td><code>@btnInverseBackground</code></td>
349
+ <td><code>@gray</code></td>
350
+ <td class="swatch-col"><span class="swatch" style="background-color: #555;"></span></td>
351
+ </tr>
352
+ <tr>
353
+ <td><code>@btnInverseBackgroundHighlight</code></td>
354
+ <td><code>@grayDarker</code></td>
355
+ <td class="swatch-col"><span class="swatch" style="background-color: #222;"></span></td>
356
+ </tr>
357
+ </tbody>
358
+ </table>
359
+ <h4>{{_i}}Forms{{/i}}</h4>
360
+ <table class="table table-bordered table-striped">
361
+ <tbody>
362
+ <tr>
363
+ <td class="span4"><code>@placeholderText</code></td>
364
+ <td><code>@grayLight</code></td>
365
+ </tr>
366
+ <tr>
367
+ <td><code>@inputBackground</code></td>
368
+ <td><code>@white</code></td>
369
+ </tr>
370
+ <tr>
371
+ <td><code>@inputBorder</code></td>
372
+ <td><code>#ccc</code></td>
373
+ </tr>
374
+ <tr>
375
+ <td><code>@inputBorderRadius</code></td>
376
+ <td><code>3px</code></td>
377
+ </tr>
378
+ <tr>
379
+ <td><code>@inputDisabledBackground</code></td>
380
+ <td><code>@grayLighter</code></td>
381
+ </tr>
382
+ <tr>
383
+ <td><code>@formActionsBackground</code></td>
384
+ <td><code>#f5f5f5</code></td>
385
+ </tr>
386
+ </tbody>
387
+ </table>
388
+ <h4>{{_i}}Form states and alerts{{/i}}</h4>
389
+ <table class="table table-bordered table-striped">
390
+ <tbody>
391
+ <tr>
392
+ <td class="span4"><code>@warningText</code></td>
393
+ <td>#c09853</td>
394
+ <td><span class="swatch" style="background-color: #c09853;"></span></td>
395
+ </tr>
396
+ <tr>
397
+ <td><code>@warningBackground</code></td>
398
+ <td>#f3edd2</td>
399
+ <td class="swatch-col"><span class="swatch" style="background-color: #f3edd2;"></span></td>
400
+ </tr>
401
+ <tr>
402
+ <td><code>@errorText</code></td>
403
+ <td>#b94a48</td>
404
+ <td><span class="swatch" style="background-color: #b94a48;"></span></td>
405
+ </tr>
406
+ <tr>
407
+ <td><code>@errorBackground</code></td>
408
+ <td>#f2dede</td>
409
+ <td><span class="swatch" style="background-color: #f2dede;"></span></td>
410
+ </tr>
411
+ <tr>
412
+ <td><code>@successText</code></td>
413
+ <td>#468847</td>
414
+ <td><span class="swatch" style="background-color: #468847;"></span></td>
415
+ </tr>
416
+ <tr>
417
+ <td><code>@successBackground</code></td>
418
+ <td>#dff0d8</td>
419
+ <td><span class="swatch" style="background-color: #dff0d8;"></span></td>
420
+ </tr>
421
+ <tr>
422
+ <td><code>@infoText</code></td>
423
+ <td>#3a87ad</td>
424
+ <td><span class="swatch" style="background-color: #3a87ad;"></span></td>
425
+ </tr>
426
+ <tr>
427
+ <td><code>@infoBackground</code></td>
428
+ <td>#d9edf7</td>
429
+ <td><span class="swatch" style="background-color: #d9edf7;"></span></td>
430
+ </tr>
431
+ </tbody>
432
+ </table>
433
+
434
+ <h4>{{_i}}Navbar{{/i}}</h4>
435
+ <table class="table table-bordered table-striped">
436
+ <tbody>
437
+ <tr>
438
+ <td class="span4"><code>@navbarHeight</code></td>
439
+ <td>40px</td>
440
+ <td class="swatch-col"></td>
441
+ </tr>
442
+ <tr>
443
+ <td><code>@navbarBackground</code></td>
444
+ <td><code>@grayDarker</code></td>
445
+ <td><span class="swatch" style="background-color: #222;"></span></td>
446
+ </tr>
447
+ <tr>
448
+ <td><code>@navbarBackgroundHighlight</code></td>
449
+ <td><code>@grayDark</code></td>
450
+ <td><span class="swatch" style="background-color: #333;"></span></td>
451
+ </tr>
452
+
453
+ <tr>
454
+ <td><code>@navbarText</code></td>
455
+ <td><code>@grayLight</code></td>
456
+ <td><span class="swatch" style="background-color: #999;"></span></td>
457
+ </tr>
458
+ <tr>
459
+ <td><code>@navbarLinkColor</code></td>
460
+ <td><code>@grayLight</code></td>
461
+ <td><span class="swatch" style="background-color: #999;"></span></td>
462
+ </tr>
463
+ <tr>
464
+ <td><code>@navbarLinkColorHover</code></td>
465
+ <td><code>@white</code></td>
466
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
467
+ </tr>
468
+ <tr>
469
+ <td><code>@navbarLinkColorActive</code></td>
470
+ <td><code>@navbarLinkColorHover</code></td>
471
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
472
+ </tr>
473
+ <tr>
474
+ <td><code>@navbarLinkBackgroundHover</code></td>
475
+ <td><code>transparent</code></td>
476
+ <td><span class="swatch swatch-bordered" style="background-color: transparent;"></span></td>
477
+ </tr>
478
+ <tr>
479
+ <td><code>@navbarLinkBackgroundActive</code></td>
480
+ <td><code>@navbarBackground</code></td>
481
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
482
+ </tr>
483
+
484
+ <tr>
485
+ <td><code>@navbarSearchBackground</code></td>
486
+ <td><code>lighten(@navbarBackground, 25%)</code></td>
487
+ <td><span class="swatch" style="background-color: #666;"></span></td>
488
+ </tr>
489
+ <tr>
490
+ <td><code>@navbarSearchBackgroundFocus</code></td>
491
+ <td><code>@white</code></td>
492
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
493
+ </tr>
494
+ <tr>
495
+ <td><code>@navbarSearchBorder</code></td>
496
+ <td><code>darken(@navbarSearchBackground, 30%)</code></td>
497
+ <td><span class="swatch" style="background-color: #111;"></span></td>
498
+ </tr>
499
+ <tr>
500
+ <td><code>@navbarSearchPlaceholderColor</code></td>
501
+ <td><code>#ccc</code></td>
502
+ <td><span class="swatch" style="background-color: #ccc;"></span></td>
503
+ </tr>
504
+ <tr>
505
+ <td><code>@navbarBrandColor</code></td>
506
+ <td><code>@navbarLinkColor</code></td>
507
+ <td><span class="swatch swatch-bordered" style="background-color: #fff;"></span></td>
508
+ </tr>
509
+ </tbody>
510
+ </table>
511
+ <h4>{{_i}}Dropdowns{{/i}}</h4>
512
+ <table class="table table-bordered table-striped">
513
+ <tbody>
514
+ <tr>
515
+ <td class="span4"><code>@dropdownBackground</code></td>
516
+ <td><code>@white</code></td>
517
+ </tr>
518
+ <tr>
519
+ <td><code>@dropdownBorder</code></td>
520
+ <td><code>rgba(0,0,0,.2)</code></td>
521
+ </tr>
522
+ <tr>
523
+ <td><code>@dropdownLinkColor</code></td>
524
+ <td><code>@grayDark</code></td>
525
+ </tr>
526
+ <tr>
527
+ <td><code>@dropdownLinkColorHover</code></td>
528
+ <td><code>@white</code></td>
529
+ </tr>
530
+ <tr>
531
+ <td><code>@dropdownLinkBackgroundHover</code></td>
532
+ <td><code>@linkColor</code></td>
533
+ </tr>
534
+ <tr>
535
+ <td><code>@@dropdownDividerTop</code></td>
536
+ <td><code>#e5e5e5</code></td>
537
+ </tr>
538
+ <tr>
539
+ <td><code>@@dropdownDividerBottom</code></td>
540
+ <td><code>@white</code></td>
541
+ </tr>
542
+ </tbody>
543
+ </table>
544
+ <h4>{{_i}}Hero unit{{/i}}</h4>
545
+ <table class="table table-bordered table-striped">
546
+ <tbody>
547
+ <tr>
548
+ <td class="span4"><code>@heroUnitBackground</code></td>
549
+ <td><code>@grayLighter</code></td>
550
+ <td class="swatch-col"><span class="swatch" style="background-color: #eee;"></span></td>
551
+ </tr>
552
+ <tr>
553
+ <td class="span2"><code>@heroUnitHeadingColor</code></td>
554
+ <td><code>inherit</code></td>
555
+ <td></td>
556
+ </tr>
557
+ <tr>
558
+ <td><code>@heroUnitLeadColor</code></td>
559
+ <td><code>inhereit</code></td>
560
+ <td></td>
561
+ </tr>
562
+ </tbody>
563
+ </table>
564
+
565
+
566
+</section>
567
+
568
+
569
+
570
+<!-- MIXINS
571
+================================================== -->
572
+<section id="mixins">
573
+ <div class="page-header">
574
+ <h1>{{_i}}Bootstrap mixins <small></small>{{/i}}</h1>
575
+ </div>
576
+ <h2>{{_i}}About mixins{{/i}}</h2>
577
+ <div class="row">
578
+ <div class="span4">
579
+ <h3>{{_i}}Basic mixins{{/i}}</h3>
580
+ <p>{{_i}}A basic mixin is essentially an include or a partial for a snippet of CSS. They're written just like a CSS class and can be called anywhere.{{/i}}</p>
581
+<pre class="prettyprint linenums">
582
+.element {
583
+ .clearfix();
584
+}
585
+</pre>
586
+ </div><!-- /span4 -->
587
+ <div class="span4">
588
+ <h3>{{_i}}Parametric mixins{{/i}}</h3>
589
+ <p>{{_i}}A parametric mixin is just like a basic mixin, but it also accepts parameters (hence the name) with optional default values.{{/i}}</p>
590
+<pre class="prettyprint linenums">
591
+.element {
592
+ .border-radius(4px);
593
+}
594
+</pre>
595
+ </div><!-- /span4 -->
596
+ <div class="span4">
597
+ <h3>{{_i}}Easily add your own{{/i}}</h3>
598
+ <p>{{_i}}Nearly all of Bootstrap's mixins are stored in mixins.less, a wonderful utility .less file that enables you to use a mixin in any of the .less files in the toolkit.{{/i}}</p>
599
+ <p>{{_i}}So, go ahead and use the existing ones or feel free to add your own as you need.{{/i}}</p>
600
+ </div><!-- /span4 -->
601
+ </div><!-- /row -->
602
+ <h2>{{_i}}Included mixins{{/i}}</h2>
603
+ <h3>{{_i}}Utilities{{/i}}</h3>
604
+ <table class="table table-bordered table-striped">
605
+ <thead>
606
+ <tr>
607
+ <th class="span4">{{_i}}Mixin{{/i}}</th>
608
+ <th>{{_i}}Parameters{{/i}}</th>
609
+ <th>{{_i}}Usage{{/i}}</th>
610
+ </tr>
611
+ </thead>
612
+ <tbody>
613
+ <tr>
614
+ <td><code>.clearfix()</code></td>
615
+ <td><em class="muted">none</em></td>
616
+ <td>{{_i}}Add to any parent to clear floats within{{/i}}</td>
617
+ </tr>
618
+ <tr>
619
+ <td><code>.tab-focus()</code></td>
620
+ <td><em class="muted">none</em></td>
621
+ <td>{{_i}}Apply the Webkit focus style and round Firefox outline{{/i}}</td>
622
+ </tr>
623
+ <tr>
624
+ <td><code>.center-block()</code></td>
625
+ <td><em class="muted">none</em></td>
626
+ <td>{{_i}}Auto center a block-level element using <code>margin: auto</code>{{/i}}</td>
627
+ </tr>
628
+ <tr>
629
+ <td><code>.ie7-inline-block()</code></td>
630
+ <td><em class="muted">none</em></td>
631
+ <td>{{_i}}Use in addition to regular <code>display: inline-block</code> to get IE7 support{{/i}}</td>
632
+ </tr>
633
+ <tr>
634
+ <td><code>.size()</code></td>
635
+ <td><code>@height @width</code></td>
636
+ <td>{{_i}}Quickly set the height and width on one line{{/i}}</td>
637
+ </tr>
638
+ <tr>
639
+ <td><code>.square()</code></td>
640
+ <td><code>@size</code></td>
641
+ <td>{{_i}}Builds on <code>.size()</code> to set the width and height as same value{{/i}}</td>
642
+ </tr>
643
+ <tr>
644
+ <td><code>.opacity()</code></td>
645
+ <td><code>@opacity</code></td>
646
+ <td>{{_i}}Set, in whole numbers, the opacity percentage (e.g., "50" or "75"){{/i}}</td>
647
+ </tr>
648
+ </tbody>
649
+ </table>
650
+ <h3>Forms</h3>
651
+ <table class="table table-bordered table-striped">
652
+ <thead>
653
+ <tr>
654
+ <th class="span4">{{_i}}Mixin{{/i}}</th>
655
+ <th>{{_i}}Parameters{{/i}}</th>
656
+ <th>{{_i}}Usage{{/i}}</th>
657
+ </tr>
658
+ </thead>
659
+ <tbody>
660
+ <tr>
661
+ <td><code>.placeholder()</code></td>
662
+ <td><code>@color: @placeholderText</code></td>
663
+ <td>{{_i}}Set the <code>placeholder</code> text color for inputs{{/i}}</td>
664
+ </tr>
665
+ </tbody>
666
+ </table>
667
+ <h3>Typography</h3>
668
+ <table class="table table-bordered table-striped">
669
+ <thead>
670
+ <tr>
671
+ <th class="span4">{{_i}}Mixin{{/i}}</th>
672
+ <th>{{_i}}Parameters{{/i}}</th>
673
+ <th>{{_i}}Usage{{/i}}</th>
674
+ </tr>
675
+ </thead>
676
+ <tbody>
677
+ <tr>
678
+ <td><code>#font > #family > .serif()</code></td>
679
+ <td><em class="muted">none</em></td>
680
+ <td>{{_i}}Make an element use a serif font stack{{/i}}</td>
681
+ </tr>
682
+ <tr>
683
+ <td><code>#font > #family > .sans-serif()</code></td>
684
+ <td><em class="muted">none</em></td>
685
+ <td>{{_i}}Make an element use a sans-serif font stack{{/i}}</td>
686
+ </tr>
687
+ <tr>
688
+ <td><code>#font > #family > .monospace()</code></td>
689
+ <td><em class="muted">none</em></td>
690
+ <td>{{_i}}Make an element use a monospace font stack{{/i}}</td>
691
+ </tr>
692
+ <tr>
693
+ <td><code>#font > .shorthand()</code></td>
694
+ <td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
695
+ <td>{{_i}}Easily set font size, weight, and leading{{/i}}</td>
696
+ </tr>
697
+ <tr>
698
+ <td><code>#font > .serif()</code></td>
699
+ <td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
700
+ <td>{{_i}}Set font family to serif, and control size, weight, and leading{{/i}}</td>
701
+ </tr>
702
+ <tr>
703
+ <td><code>#font > .sans-serif()</code></td>
704
+ <td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
705
+ <td>{{_i}}Set font family to sans-serif, and control size, weight, and leading{{/i}}</td>
706
+ </tr>
707
+ <tr>
708
+ <td><code>#font > .monospace()</code></td>
709
+ <td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
710
+ <td>{{_i}}Set font family to monospace, and control size, weight, and leading{{/i}}</td>
711
+ </tr>
712
+ </tbody>
713
+ </table>
714
+ <h3>Grid system</h3>
715
+ <table class="table table-bordered table-striped">
716
+ <thead>
717
+ <tr>
718
+ <th class="span4">{{_i}}Mixin{{/i}}</th>
719
+ <th>{{_i}}Parameters{{/i}}</th>
720
+ <th>{{_i}}Usage{{/i}}</th>
721
+ </tr>
722
+ </thead>
723
+ <tbody>
724
+ <tr>
725
+ <td><code>.container-fixed()</code></td>
726
+ <td><em class="muted">none</em></td>
727
+ <td>{{_i}}Create a horizontally centered container for holding your content{{/i}}</td>
728
+ </tr>
729
+ <tr>
730
+ <td><code>#grid > .core()</code></td>
731
+ <td><code>@gridColumnWidth, @gridGutterWidth</code></td>
732
+ <td>{{_i}}Generate a pixel grid system (container, row, and columns) with <em>n</em> columns and <em>x</em> pixel wide gutter{{/i}}</td>
733
+ </tr>
734
+ <tr>
735
+ <td><code>#grid > .fluid()</code></td>
736
+ <td><code>@fluidGridColumnWidth, @fluidGridGutterWidth</code></td>
737
+ <td>{{_i}}Generate a percent grid system with <em>n</em> columns and <em>x</em> % wide gutter{{/i}}</td>
738
+ </tr>
739
+ <tr>
740
+ <td><code>#grid > .input()</code></td>
741
+ <td><code>@gridColumnWidth, @gridGutterWidth</code></td>
742
+ <td>{{_i}}Generate the pixel grid system for <code>input</code> elements, accounting for padding and borders{{/i}}</td>
743
+ </tr>
744
+ <tr>
745
+ <td><code>.makeColumn</code></td>
746
+ <td><code>@columns: 1, @offset: 0</code></td>
747
+ <td>{{_i}}Turn any <code>div</code> into a grid column without the <code>.span*</code> classes{{/i}}</td>
748
+ </tr>
749
+ </tbody>
750
+ </table>
751
+ <h3>{{_i}}CSS3 properties{{/i}}</h3>
752
+ <table class="table table-bordered table-striped">
753
+ <thead>
754
+ <tr>
755
+ <th class="span3">{{_i}}Mixin{{/i}}</th>
756
+ <th>{{_i}}Parameters{{/i}}</th>
757
+ <th>{{_i}}Usage{{/i}}</th>
758
+ </tr>
759
+ </thead>
760
+ <tbody>
761
+ <tr>
762
+ <td><code>.border-radius()</code></td>
763
+ <td><code>@radius</code></td>
764
+ <td>{{_i}}Round the corners of an element. Can be a single value or four space-separated values{{/i}}</td>
765
+ </tr>
766
+ <tr>
767
+ <td><code>.box-shadow()</code></td>
768
+ <td><code>@shadow</code></td>
769
+ <td>{{_i}}Add a drop shadow to an element{{/i}}</td>
770
+ </tr>
771
+ <tr>
772
+ <td><code>.transition()</code></td>
773
+ <td><code>@transition</code></td>
774
+ <td>{{_i}}Add CSS3 transition effect (e.g., <code>all .2s linear</code>){{/i}}</td>
775
+ </tr>
776
+ <tr>
777
+ <td><code>.rotate()</code></td>
778
+ <td><code>@degrees</code></td>
779
+ <td>{{_i}}Rotate an element <em>n</em> degrees{{/i}}</td>
780
+ </tr>
781
+ <tr>
782
+ <td><code>.scale()</code></td>
783
+ <td><code>@ratio</code></td>
784
+ <td>{{_i}}Scale an element to <em>n</em> times its original size{{/i}}</td>
785
+ </tr>
786
+ <tr>
787
+ <td><code>.translate()</code></td>
788
+ <td><code>@x, @y</code></td>
789
+ <td>{{_i}}Move an element on the x and y planes{{/i}}</td>
790
+ </tr>
791
+ <tr>
792
+ <td><code>.background-clip()</code></td>
793
+ <td><code>@clip</code></td>
794
+ <td>{{_i}}Crop the background of an element (useful for <code>border-radius</code>){{/i}}</td>
795
+ </tr>
796
+ <tr>
797
+ <td><code>.background-size()</code></td>
798
+ <td><code>@size</code></td>
799
+ <td>{{_i}}Control the size of background images via CSS3{{/i}}</td>
800
+ </tr>
801
+ <tr>
802
+ <td><code>.box-sizing()</code></td>
803
+ <td><code>@boxmodel</code></td>
804
+ <td>{{_i}}Change the box model for an element (e.g., <code>border-box</code> for a full-width <code>input</code>){{/i}}</td>
805
+ </tr>
806
+ <tr>
807
+ <td><code>.user-select()</code></td>
808
+ <td><code>@select</code></td>
809
+ <td>{{_i}}Control cursor selection of text on a page{{/i}}</td>
810
+ </tr>
811
+ <tr>
812
+ <td><code>.backface-visibility()</code></td>
813
+ <td><code>@visibility: visible</code></td>
814
+ <td>{{_i}}Prevent flickering of content when using CSS 3D transforms{{/i}}</td>
815
+ </tr>
816
+ <tr>
817
+ <td><code>.resizable()</code></td>
818
+ <td><code>@direction: both</code></td>
819
+ <td>{{_i}}Make any element resizable on the right and bottom{{/i}}</td>
820
+ </tr>
821
+ <tr>
822
+ <td><code>.content-columns()</code></td>
823
+ <td><code>@columnCount, @columnGap: @gridGutterWidth</code></td>
824
+ <td>{{_i}}Make the content of any element use CSS3 columns{{/i}}</td>
825
+ </tr>
826
+ <tr>
827
+ <td><code>.hyphens()</code></td>
828
+ <td><code>@mode: auto</code></td>
829
+ <td>{{_i}}CSS3 hyphenation when you want it (includes <code>word-wrap: break-word</code>){{/i}}</td>
830
+ </tr>
831
+ </tbody>
832
+ </table>
833
+ <h3>{{_i}}Backgrounds and gradients{{/i}}</h3>
834
+ <table class="table table-bordered table-striped">
835
+ <thead>
836
+ <tr>
837
+ <th class="span4">{{_i}}Mixin{{/i}}</th>
838
+ <th>{{_i}}Parameters{{/i}}</th>
839
+ <th>{{_i}}Usage{{/i}}</th>
840
+ </tr>
841
+ </thead>
842
+ <tbody>
843
+ <tr>
844
+ <td><code>#translucent > .background()</code></td>
845
+ <td><code>@color: @white, @alpha: 1</code></td>
846
+ <td>{{_i}}Give an element a translucent background color{{/i}}</td>
847
+ </tr>
848
+ <tr>
849
+ <td><code>#translucent > .border()</code></td>
850
+ <td><code>@color: @white, @alpha: 1</code></td>
851
+ <td>{{_i}}Give an element a translucent border color{{/i}}</td>
852
+ </tr>
853
+ <tr>
854
+ <td><code>#gradient > .vertical()</code></td>
855
+ <td><code>@startColor, @endColor</code></td>
856
+ <td>{{_i}}Create a cross-browser vertical background gradient{{/i}}</td>
857
+ </tr>
858
+ <tr>
859
+ <td><code>#gradient > .horizontal()</code></td>
860
+ <td><code>@startColor, @endColor</code></td>
861
+ <td>{{_i}}Create a cross-browser horizontal background gradient{{/i}}</td>
862
+ </tr>
863
+ <tr>
864
+ <td><code>#gradient > .directional()</code></td>
865
+ <td><code>@startColor, @endColor, @deg</code></td>
866
+ <td>{{_i}}Create a cross-browser directional background gradient{{/i}}</td>
867
+ </tr>
868
+ <tr>
869
+ <td><code>#gradient > .vertical-three-colors()</code></td>
870
+ <td><code>@startColor, @midColor, @colorStop, @endColor</code></td>
871
+ <td>{{_i}}Create a cross-browser three-color background gradient{{/i}}</td>
872
+ </tr>
873
+ <tr>
874
+ <td><code>#gradient > .radial()</code></td>
875
+ <td><code>@innerColor, @outerColor</code></td>
876
+ <td>{{_i}}Create a cross-browser radial background gradient{{/i}}</td>
877
+ </tr>
878
+ <tr>
879
+ <td><code>#gradient > .striped()</code></td>
880
+ <td><code>@color, @angle</code></td>
881
+ <td>{{_i}}Create a cross-browser striped background gradient{{/i}}</td>
882
+ </tr>
883
+ <tr>
884
+ <td><code>#gradientBar()</code></td>
885
+ <td><code>@primaryColor, @secondaryColor</code></td>
886
+ <td>{{_i}}Used for buttons to assign a gradient and slightly darker border{{/i}}</td>
887
+ </tr>
888
+ </tbody>
889
+ </table>
890
+</section>
891
+
892
+
893
+
894
+<!-- COMPILING LESS AND BOOTSTRAP
895
+================================================== -->
896
+<section id="compiling">
897
+ <div class="page-header">
898
+ <h1>{{_i}}Compiling Bootstrap with LESS{{/i}}</h1>
899
+ </div>
900
+ <div class="alert alert-info">
901
+ {{_i}}<strong>Note:</strong> If you're submitting a pull request to GitHub with modified CSS, you <strong>must</strong> recompile the CSS via any of these methods.{{/i}}
902
+ </div>
903
+ <h2>{{_i}}Tools for compiling{{/i}}</h2>
904
+ <div class="row">
905
+ <div class="span4">
906
+ <h3>{{_i}}Node with makefile{{/i}}</h3>
907
+ <p>{{_i}}Install the LESS command line compiler, JSHint, Recess, and uglify-js globally with npm by running the following command:{{/i}}</p>
908
+ <pre>$ npm install -g less jshint recess uglify-js</pre>
909
+ <p>{{_i}}Once installed just run <code>make</code> from the root of your bootstrap directory and you're all set.{{/i}}</p>
910
+ <p>{{_i}}Additionally, if you have <a href="https://github.com/mynyml/watchr">watchr</a> installed, you may run <code>make watch</code> to have bootstrap automatically rebuilt every time you edit a file in the bootstrap lib (this isn't required, just a convenience method).{{/i}}</p>
911
+ </div><!-- /span4 -->
912
+ <div class="span4">
913
+ <h3>{{_i}}Command line{{/i}}</h3>
914
+ <p>{{_i}}Install the LESS command line tool via Node and run the following command:{{/i}}</p>
915
+ <pre>$ lessc ./less/bootstrap.less > bootstrap.css</pre>
916
+ <p>{{_i}}Be sure to include <code>--compress</code> in that command if you're trying to save some bytes!{{/i}}</p>
917
+ </div><!-- /span4 -->
918
+ <div class="span4">
919
+ <h3>{{_i}}Javascript{{/i}}</h3>
920
+ <p>{{_i}}<a href="http://lesscss.org/">Download the latest Less.js</a> and include the path to it (and Bootstrap) in the <code><head></code>.{{/i}}</p>
921
+<pre class="prettyprint">
922
+<link rel="stylesheet/less" href="/path/to/bootstrap.less">
923
+<script src="/path/to/less.js"></script>
924
+</pre>
925
+ <p>{{_i}}To recompile the .less files, just save them and reload your page. Less.js compiles them and stores them in local storage.{{/i}}</p>
926
+ </div><!-- /span4 -->
927
+ </div><!-- /row -->
928
+ <div class="row">
929
+ <div class="span4">
930
+ <h3>{{_i}}Unofficial Mac app{{/i}}</h3>
931
+ <p>{{_i}}<a href="http://incident57.com/less/">The unofficial Mac app</a> watches directories of .less files and compiles the code to local files after every save of a watched .less file.{{/i}}</p>
932
+ <p>{{_i}}If you like, you can toggle preferences in the app for automatic minifying and which directory the compiled files end up in.{{/i}}</p>
933
+ </div><!-- /span4 -->
934
+ <div class="span4">
935
+ <h3>{{_i}}More Mac apps{{/i}}</h3>
936
+ <h4><a href="http://crunchapp.net/" target="_blank">Crunch</a></h4>
937
+ <p>{{_i}}Crunch is a great looking LESS editor and compiler built on Adobe Air.{{/i}}</p>
938
+ <h4><a href="http://incident57.com/codekit/" target="_blank">CodeKit</a></h4>
939
+ <p>{{_i}}Created by the same guy as the unofficial Mac app, CodeKit is a Mac app that compiles LESS, SASS, Stylus, and CoffeeScript.{{/i}}</p>
940
+ <h4><a href="http://wearekiss.com/simpless" target="_blank">Simpless</a></h4>
941
+ <p>{{_i}}Mac, Linux, and PC app for drag and drop compiling of LESS files. Plus, the <a href="https://github.com/Paratron/SimpLESS" target="_blank">source code is on GitHub</a>.{{/i}}</p>
942
+ </div><!-- /span4 -->
943
+ </div><!-- /row -->
944
+</section>
docs/docs/likebutton/docs/templates/pages/scaffolding.mustache
new
+555
@@ -0,0 +1,555 @@
1
+<!-- Masthead
2
+================================================== -->
3
+<header class="jumbotron subhead" id="overview">
4
+ <h1>{{_i}}Scaffolding{{/i}}</h1>
5
+ <p class="lead">{{_i}}Bootstrap is built on a responsive 12-column grid. We've also included fixed- and fluid-width layouts based on that system.{{/i}}</p>
6
+ <div class="subnav">
7
+ <ul class="nav nav-pills">
8
+ <li><a href="#global">{{_i}}Global styles{{/i}}</a></li>
9
+ <li><a href="#gridSystem">{{_i}}Grid system{{/i}}</a></li>
10
+ <li><a href="#fluidGridSystem">{{_i}}Fluid grid system{{/i}}</a></li>
11
+ <li><a href="#gridCustomization">{{_i}}Customizing{{/i}}</a></li>
12
+ <li><a href="#layouts">{{_i}}Layouts{{/i}}</a></li>
13
+ <li><a href="#responsive">{{_i}}Responsive design{{/i}}</a></li>
14
+ </ul>
15
+ </div>
16
+</header>
17
+
18
+
19
+
20
+
21
+<!-- Global Bootstrap settings
22
+================================================== -->
23
+<section id="global">
24
+ <div class="page-header">
25
+ <h1>{{_i}}Global styles <small>for CSS reset, typography, and links</small>{{/i}}</h1>
26
+ </div>
27
+ <div class="row">
28
+ <div class="span4">
29
+ <h2>{{_i}}Requires HTML5 doctype{{/i}}</h2>
30
+ <p>{{_i}}Bootstrap makes use of HTML elements and CSS properties that require the use of the HTML5 doctype. Be sure to include it at the beginning of every Bootstrapped page in your project.{{/i}}</p>
31
+<pre class="prettyprint linenums">
32
+<!DOCTYPE html>
33
+<html lang="en">
34
+ ...
35
+</html>
36
+</pre>
37
+ </div><!-- /.span -->
38
+ <div class="span4">
39
+ <h2>{{_i}}Typography and links{{/i}}</h2>
40
+ <p>{{_i}}Within the <strong>scaffolding.less</strong> file, we set basic global display, typography, and link styles. Specifically, we:{{/i}}</p>
41
+ <ul>
42
+ <li>{{_i}}Remove margin on the body{{/i}}</li>
43
+ <li>{{_i}}Set <code>background-color: white;</code> on the <code>body</code>{{/i}}</li>
44
+ <li>{{_i}}Use the <code>@baseFontFamily</code>, <code>@baseFontSize</code>, and <code>@baseLineHeight</code> attributes as our typographyic base{{/i}}</li>
45
+ <li>{{_i}}Set the global link color via <code>@linkColor</code> and apply link underlines only on <code>:hover</code>{{/i}}</li>
46
+ </ul>
47
+ </div><!-- /.span -->
48
+ <div class="span4">
49
+ <h2>{{_i}}Reset via Normalize{{/i}}</h2>
50
+ <p>{{_i}}As of Bootstrap 2, the traditional CSS reset has evolved to make use of elements from <a href="http://necolas.github.com/normalize.css/" target="_blank">Normalize.css</a>, a project by <a href="http://twitter.com/necolas" target="_blank">Nicolas Gallagher</a> that also powers the <a href="http://html5boilerplate.com" target="_blank">HTML5 Boilerplate</a>.{{/i}}</p>
51
+ <p>{{_i}}The new reset can still be found in <strong>reset.less</strong>, but with many elements removed for brevity and accuracy.{{/i}}</p>
52
+ </div><!-- /.span -->
53
+ </div><!-- /.row -->
54
+</section>
55
+
56
+
57
+
58
+
59
+<!-- Grid system
60
+================================================== -->
61
+<section id="gridSystem">
62
+ <div class="page-header">
63
+ <h1>{{_i}}Default grid system <small>12 columns with a responsive twist</small>{{/i}}</h1>
64
+ </div>
65
+
66
+ <div class="row show-grid">
67
+ <div class="span1">1</div>
68
+ <div class="span1">1</div>
69
+ <div class="span1">1</div>
70
+ <div class="span1">1</div>
71
+ <div class="span1">1</div>
72
+ <div class="span1">1</div>
73
+ <div class="span1">1</div>
74
+ <div class="span1">1</div>
75
+ <div class="span1">1</div>
76
+ <div class="span1">1</div>
77
+ <div class="span1">1</div>
78
+ <div class="span1">1</div>
79
+ </div>
80
+ <div class="row show-grid">
81
+ <div class="span4">4</div>
82
+ <div class="span4">4</div>
83
+ <div class="span4">4</div>
84
+ </div>
85
+ <div class="row show-grid">
86
+ <div class="span4">4</div>
87
+ <div class="span8">8</div>
88
+ </div>
89
+ <div class="row show-grid">
90
+ <div class="span6">6</div>
91
+ <div class="span6">6</div>
92
+ </div>
93
+ <div class="row show-grid">
94
+ <div class="span12">12</div>
95
+ </div>
96
+ <div class="row">
97
+ <div class="span4">
98
+ <p>{{_i}}The default grid system provided in Bootstrap utilizes <strong>12 columns</strong> that render out at widths of 724px, 940px (default without responsive CSS included), and 1170px. Below 767px viewports, the columns become fluid and stack vertically. {{/i}}</p>
99
+ </div><!-- /.span -->
100
+ <div class="span4">
101
+<pre class="prettyprint linenums">
102
+<div class="row">
103
+ <div class="span4">...</div>
104
+ <div class="span8">...</div>
105
+</div>
106
+</pre>
107
+ </div><!-- /.span -->
108
+ <div class="span4">
109
+ <p>{{_i}}As shown here, a basic layout can be created with two "columns", each spanning a number of the 12 foundational columns we defined as part of our grid system.{{/i}}</p>
110
+ </div><!-- /.span -->
111
+ </div><!-- /.row -->
112
+
113
+ <br>
114
+
115
+ <h2>{{_i}}Offsetting columns{{/i}}</h2>
116
+ <div class="row show-grid">
117
+ <div class="span4">4</div>
118
+ <div class="span4 offset4">4 offset 4</div>
119
+ </div><!-- /row -->
120
+ <div class="row show-grid">
121
+ <div class="span3 offset3">3 offset 3</div>
122
+ <div class="span3 offset3">3 offset 3</div>
123
+ </div><!-- /row -->
124
+ <div class="row show-grid">
125
+ <div class="span8 offset4">8 offset 4</div>
126
+ </div><!-- /row -->
127
+<pre class="prettyprint linenums">
128
+<div class="row">
129
+ <div class="span4">...</div>
130
+ <div class="span4 offset4">...</div>
131
+</div>
132
+</pre>
133
+
134
+ <br>
135
+
136
+ <h2>{{_i}}Nesting columns{{/i}}</h2>
137
+ <div class="row">
138
+ <div class="span6">
139
+ <p>{{_i}}With the static (non-fluid) grid system in Bootstrap, nesting is easy. To nest your content, just add a new <code>.row</code> and set of <code>.span*</code> columns within an existing <code>.span*</code> column.{{/i}}</p>
140
+ <h3>{{_i}}Example{{/i}}</h3>
141
+ <p>{{_i}}Nested rows should include a set of columns that add up to the number of columns of it's parent. For example, two nested <code>.span3</code> columns should be placed within a <code>.span6</code>.{{/i}}</p>
142
+ <div class="row show-grid">
143
+ <div class="span6">
144
+ {{_i}}Level 1 of column{{/i}}
145
+ <div class="row show-grid">
146
+ <div class="span3">
147
+ {{_i}}Level 2{{/i}}
148
+ </div>
149
+ <div class="span3">
150
+ {{_i}}Level 2{{/i}}
151
+ </div>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ </div><!-- /.span -->
156
+ <div class="span6">
157
+<pre class="prettyprint linenums">
158
+<div class="row">
159
+ <div class="span6">
160
+ {{_i}}Level 1 column{{/i}}
161
+ <div class="row">
162
+ <div class="span3">{{_i}}Level 2{{/i}}</div>
163
+ <div class="span3">{{_i}}Level 2{{/i}}</div>
164
+ </div>
165
+ </div>
166
+</div>
167
+</pre>
168
+ </div><!-- /.span -->
169
+ </div><!-- /.row -->
170
+</section>
171
+
172
+
173
+
174
+<!-- Fluid grid system
175
+================================================== -->
176
+<section id="fluidGridSystem">
177
+ <div class="page-header">
178
+ <h1>{{_i}}Fluid grid system <small>12 responsive, percent-based columns</small>{{/i}}</h1>
179
+ </div>
180
+
181
+ <h2>{{_i}}Fluid columns{{/i}}</h2>
182
+ <div class="row-fluid show-grid">
183
+ <div class="span1">1</div>
184
+ <div class="span1">1</div>
185
+ <div class="span1">1</div>
186
+ <div class="span1">1</div>
187
+ <div class="span1">1</div>
188
+ <div class="span1">1</div>
189
+ <div class="span1">1</div>
190
+ <div class="span1">1</div>
191
+ <div class="span1">1</div>
192
+ <div class="span1">1</div>
193
+ <div class="span1">1</div>
194
+ <div class="span1">1</div>
195
+ </div>
196
+ <div class="row-fluid show-grid">
197
+ <div class="span4">4</div>
198
+ <div class="span4">4</div>
199
+ <div class="span4">4</div>
200
+ </div>
201
+ <div class="row-fluid show-grid">
202
+ <div class="span4">4</div>
203
+ <div class="span8">8</div>
204
+ </div>
205
+ <div class="row-fluid show-grid">
206
+ <div class="span6">6</div>
207
+ <div class="span6">6</div>
208
+ </div>
209
+ <div class="row-fluid show-grid">
210
+ <div class="span12">12</div>
211
+ </div>
212
+
213
+ <div class="row">
214
+ <div class="span4">
215
+ <h3>{{_i}}Percents, not pixels{{/i}}</h3>
216
+ <p>{{_i}}The fluid grid system uses percents for column widths instead of fixed pixels. It also has the same responsive variations as our fixed grid system, ensuring proper proportions for key screen resolutions and devices.{{/i}}</p>
217
+ </div><!-- /.span -->
218
+ <div class="span4">
219
+ <h3>{{_i}}Fluid rows{{/i}}</h3>
220
+ <p>{{_i}}Make any row fluid simply by changing <code>.row</code> to <code>.row-fluid</code>. The columns stay the exact same, making it super straightforward to flip between fixed and fluid layouts.{{/i}}</p>
221
+ </div><!-- /.span -->
222
+ <div class="span4">
223
+ <h3>{{_i}}Markup{{/i}}</h3>
224
+<pre class="prettyprint linenums">
225
+<div class="row-fluid">
226
+ <div class="span4">...</div>
227
+ <div class="span8">...</div>
228
+</div>
229
+</pre>
230
+ </div><!-- /.span -->
231
+ </div><!-- /.row -->
232
+
233
+ <h2>{{_i}}Fluid nesting{{/i}}</h2>
234
+ <div class="row">
235
+ <div class="span6">
236
+ <p>{{_i}}Nesting with fluid grids is a bit different: the number of nested columns doesn't need to match the parent. Instead, your columns are reset at each level because each row takes up 100% of the parent column.{{/i}}</p>
237
+ <div class="row-fluid show-grid">
238
+ <div class="span12">
239
+ {{_i}}Fluid 12{{/i}}
240
+ <div class="row-fluid show-grid">
241
+ <div class="span6">
242
+ {{_i}}Fluid 6{{/i}}
243
+ </div>
244
+ <div class="span6">
245
+ {{_i}}Fluid 6{{/i}}
246
+ </div>
247
+ </div>
248
+ </div>
249
+ </div>
250
+ </div><!-- /.span -->
251
+ <div class="span6">
252
+<pre class="prettyprint linenums">
253
+<div class="row-fluid">
254
+ <div class="span12">
255
+ {{_i}}Level 1 of column{{/i}}
256
+ <div class="row-fluid">
257
+ <div class="span6">{{_i}}Level 2{{/i}}</div>
258
+ <div class="span6">{{_i}}Level 2{{/i}}</div>
259
+ </div>
260
+ </div>
261
+</div>
262
+</pre>
263
+ </div><!-- /.span -->
264
+ </div><!-- /.row -->
265
+
266
+</section>
267
+
268
+
269
+
270
+<!-- Customizaton
271
+================================================== -->
272
+<section id="gridCustomization">
273
+ <div class="page-header">
274
+ <h1>{{_i}}Grid customization{{/i}}</h1>
275
+ </div>
276
+ <table class="table table-bordered table-striped">
277
+ <thead>
278
+ <tr>
279
+ <th>{{_i}}Variable{{/i}}</th>
280
+ <th>{{_i}}Default value{{/i}}</th>
281
+ <th>{{_i}}Description{{/i}}</th>
282
+ </tr>
283
+ </thead>
284
+ <tbody>
285
+ <tr>
286
+ <td><code>@gridColumns</code></td>
287
+ <td>12</td>
288
+ <td>{{_i}}Number of columns{{/i}}</td>
289
+ </tr>
290
+ <tr>
291
+ <td><code>@gridColumnWidth</code></td>
292
+ <td>60px</td>
293
+ <td>{{_i}}Width of each column{{/i}}</td>
294
+ </tr>
295
+ <tr>
296
+ <td><code>@gridGutterWidth</code></td>
297
+ <td>20px</td>
298
+ <td>{{_i}}Negative space between columns{{/i}}</td>
299
+ </tr>
300
+ </tbody>
301
+ </table>
302
+ <div class="row">
303
+ <div class="span4">
304
+ <h3>{{_i}}Variables in LESS{{/i}}</h3>
305
+ <p>{{_i}}Built into Bootstrap are a handful of variables for customizing the default 940px grid system, documented above. All variables for the grid are stored in variables.less.{{/i}}</p>
306
+ </div><!-- /.span -->
307
+ <div class="span4">
308
+ <h3>{{_i}}How to customize{{/i}}</h3>
309
+ <p>{{_i}}Modifying the grid means changing the three <code>@grid*</code> variables and recompiling Bootstrap. Change the grid variables in variables.less and use one of the <a href="less.html#compiling">four ways documented to recompile</a>. If you're adding more columns, be sure to add the CSS for those in grid.less.{{/i}}</p>
310
+ </div><!-- /.span -->
311
+ <div class="span4">
312
+ <h3>{{_i}}Staying responsive{{/i}}</h3>
313
+ <p>{{_i}}Customization of the grid only works at the default level, the 940px grid. To maintain the responsive aspects of Bootstrap, you'll also have to customize the grids in responsive.less.{{/i}}</p>
314
+ </div><!-- /.span -->
315
+ </div><!-- /.row -->
316
+
317
+</section>
318
+
319
+
320
+
321
+<!-- Layouts (Default and fluid)
322
+================================================== -->
323
+<section id="layouts">
324
+ <div class="page-header">
325
+ <h1>{{_i}}Layouts <small>Basic templates to create webpages</small>{{/i}}</h1>
326
+ </div>
327
+
328
+ <div class="row">
329
+ <div class="span6">
330
+ <h2>{{_i}}Fixed layout{{/i}}</h2>
331
+ <p>{{_i}}The default and simple 940px-wide, centered layout for just about any website or page provided by a single <code><div class="container"></code>.{{/i}}</p>
332
+ <div class="mini-layout">
333
+ <div class="mini-layout-body"></div>
334
+ </div>
335
+<pre class="prettyprint linenums">
336
+<body>
337
+ <div class="container">
338
+ ...
339
+ </div>
340
+</body>
341
+</pre>
342
+ </div><!-- /.span -->
343
+ <div class="span6">
344
+ <h2>{{_i}}Fluid layout{{/i}}</h2>
345
+ <p>{{_i}}<code><div class="container-fluid"></code> gives flexible page structure, min- and max-widths, and a left-hand sidebar. It's great for apps and docs.{{/i}}</p>
346
+ <div class="mini-layout fluid">
347
+ <div class="mini-layout-sidebar"></div>
348
+ <div class="mini-layout-body"></div>
349
+ </div>
350
+<pre class="prettyprint linenums">
351
+<div class="container-fluid">
352
+ <div class="row-fluid">
353
+ <div class="span2">
354
+ <!--{{_i}}Sidebar content{{/i}}-->
355
+ </div>
356
+ <div class="span10">
357
+ <!--{{_i}}Body content{{/i}}-->
358
+ </div>
359
+ </div>
360
+</div>
361
+</pre>
362
+ </div><!-- /.span -->
363
+ </div><!-- /.row -->
364
+</section>
365
+
366
+
367
+
368
+
369
+<!-- Responsive design
370
+================================================== -->
371
+<section id="responsive">
372
+ <div class="page-header">
373
+ <h1>{{_i}}Responsive design <small>Media queries for various devices and resolutions</small>{{/i}}</h1>
374
+ </div>
375
+ <!-- Supported devices -->
376
+ <div class="row">
377
+ <div class="span4">
378
+ <p><img src="assets/img/responsive-illustrations.png" alt="Responsive devices"></p>
379
+ <h3>{{_i}}What they do{{/i}}</h3>
380
+ <p>{{_i}}Media queries allow for custom CSS based on a number of conditions—ratios, widths, display type, etc—but usually focuses around <code>min-width</code> and <code>max-width</code>.{{/i}}</p>
381
+ <ul>
382
+ <li>{{_i}}Modify the width of column in our grid{{/i}}</li>
383
+ <li>{{_i}}Stack elements instead of float wherever necessary{{/i}}</li>
384
+ <li>{{_i}}Resize headings and text to be more appropriate for devices{{/i}}</li>
385
+ </ul>
386
+ <p>{{_i}}Use media queries responsibly and only as a start to your mobile audiences. For larger projects, do consider dedicated code bases and not layers of media queries.{{/i}}</p>
387
+ </div><!-- /.span -->
388
+ <div class="span8">
389
+ <h2>{{_i}}Supported devices{{/i}}</h2>
390
+ <p>{{_i}}Bootstrap supports a handful of media queries in a single file to help make your projects more appropriate on different devices and screen resolutions. Here's what's included:{{/i}}</p>
391
+ <table class="table table-bordered table-striped">
392
+ <thead>
393
+ <tr>
394
+ <th>{{_i}}Label{{/i}}</th>
395
+ <th>{{_i}}Layout width{{/i}}</th>
396
+ <th>{{_i}}Column width{{/i}}</th>
397
+ <th>{{_i}}Gutter width{{/i}}</th>
398
+ </tr>
399
+ </thead>
400
+ <tbody>
401
+ <tr>
402
+ <td>{{_i}}Smartphones{{/i}}</td>
403
+ <td>480px and below</td>
404
+ <td class="muted" colspan="2">{{_i}}Fluid columns, no fixed widths{{/i}}</td>
405
+ </tr>
406
+ <tr>
407
+ <td>{{_i}}Smartphones to tablets{{/i}}</td>
408
+ <td>767px and below</td>
409
+ <td class="muted" colspan="2">{{_i}}Fluid columns, no fixed widths{{/i}}</td>
410
+ </tr>
411
+ <tr>
412
+ <td>{{_i}}Portrait tablets{{/i}}</td>
413
+ <td>768px and above</td>
414
+ <td>42px</td>
415
+ <td>20px</td>
416
+ </tr>
417
+ <tr>
418
+ <td>{{_i}}Default{{/i}}</td>
419
+ <td>980px and up</td>
420
+ <td>60px</td>
421
+ <td>20px</td>
422
+ </tr>
423
+ <tr>
424
+ <td>{{_i}}Large display{{/i}}</td>
425
+ <td>1200px and up</td>
426
+ <td>70px</td>
427
+ <td>30px</td>
428
+ </tr>
429
+ </tbody>
430
+ </table>
431
+
432
+ <h3>{{_i}}Requires meta tag{{/i}}</h3>
433
+ <p>{{_i}}To ensure devices display responsive pages properly, include the viewport meta tag.{{/i}}</p>
434
+ <pre class="prettyprint linenums"><meta name="viewport" content="width=device-width, initial-scale=1.0"></pre>
435
+ </div><!-- /.span -->
436
+ </div><!-- /.row -->
437
+
438
+ <br>
439
+
440
+ <!-- Media query code -->
441
+ <h2>{{_i}}Using the media queries{{/i}}</h2>
442
+ <div class="row">
443
+ <div class="span4">
444
+ <p>{{_i}}Bootstrap doesn't automatically include these media queries, but understanding and adding them is very easy and requires minimal setup. You have a few options for including the responsive features of Bootstrap:{{/i}}</p>
445
+ <ol>
446
+ <li>{{_i}}Use the compiled responsive version, bootstrap-responsive.css{{/i}}</li>
447
+ <li>{{_i}}Add @import "responsive.less" and recompile Bootstrap{{/i}}</li>
448
+ <li>{{_i}}Modify and recompile responsive.less as a separate file{{/i}}</li>
449
+ </ol>
450
+ <p>{{_i}}<strong>Why not just include it?</strong> Truth be told, not everything needs to be responsive. Instead of encouraging developers to remove this feature, we figure it best to enable it.{{/i}}</p>
451
+ </div><!-- /.span -->
452
+ <div class="span8">
453
+<pre class="prettyprint linenums">
454
+ /* {{_i}}Landscape phones and down{{/i}} */
455
+ @media (max-width: 480px) { ... }
456
+
457
+ /* {{_i}}Landscape phone to portrait tablet{{/i}} */
458
+ @media (max-width: 767px) { ... }
459
+
460
+ /* {{_i}}Portrait tablet to landscape and desktop{{/i}} */
461
+ @media (min-width: 768px) and (max-width: 979px) { ... }
462
+
463
+ /* {{_i}}Large desktop{{/i}} */
464
+ @media (min-width: 1200px) { ... }
465
+</pre>
466
+ </div><!-- /.span -->
467
+ </div><!-- /.row -->
468
+ <br>
469
+
470
+ <!-- Responsive utility classes -->
471
+ <h2>{{_i}}Responsive utility classes{{/i}}</h2>
472
+ <div class="row">
473
+ <div class="span4">
474
+ <h3>{{_i}}What are they{{/i}}</h2>
475
+ <p>{{_i}}For faster mobile-friendly development, use these basic utility classes for showing and hiding content by device.{{/i}}</p>
476
+ <h3>{{_i}}When to use{{/i}}</h2>
477
+ <p>{{_i}}Use on a limited basis and avoid creating entirely different versions of the same site. Instead, use them to complement each device's presentation.{{/i}}</p>
478
+ <p>{{_i}}For example, you might show a <code><select></code> element for nav on mobile layouts, but not on tablets or desktops.{{/i}}</p>
479
+ </div><!-- /.span -->
480
+ <div class="span8">
481
+ <h3>{{_i}}Support classes{{/i}}</h3>
482
+ <p>{{_i}}Shown here is a table of the classes we support and their effect on a given media query layout (labeled by device). They can be found in <code>responsive.less</code>.{{/i}}</p>
483
+ <table class="table table-bordered table-striped responsive-utilities">
484
+ <thead>
485
+ <tr>
486
+ <th>{{_i}}Class{{/i}}</th>
487
+ <th>{{_i}}Phones <small>480px and below</small>{{/i}}</th>
488
+ <th>{{_i}}Tablets <small>767px and below</small>{{/i}}</th>
489
+ <th>{{_i}}Desktops <small>768px and above</small>{{/i}}</th>
490
+ </tr>
491
+ </thead>
492
+ <tbody>
493
+ <tr>
494
+ <th><code>.visible-phone</code></th>
495
+ <td class="is-visible">{{_i}}Visible{{/i}}</td>
496
+ <td class="is-hidden">{{_i}}Hidden{{/i}}</td>
497
+ <td class="is-hidden">{{_i}}Hidden{{/i}}</td>
498
+ </tr>
499
+ <tr>
500
+ <th><code>.visible-tablet</code></th>
501
+ <td class="is-hidden">{{_i}}Hidden{{/i}}</td>
502
+ <td class="is-visible">{{_i}}Visible{{/i}}</td>
503
+ <td class="is-hidden">{{_i}}Hidden{{/i}}</td>
504
+ </tr>
505
+ <tr>
506
+ <th><code>.visible-desktop</code></th>
507
+ <td class="is-hidden">{{_i}}Hidden{{/i}}</td>
508
+ <td class="is-hidden">{{_i}}Hidden{{/i}}</td>
509
+ <td class="is-visible">{{_i}}Visible{{/i}}</td>
510
+ </tr>
511
+ <tr>
512
+ <th><code>.hidden-phone</code></th>
513
+ <td class="is-hidden">{{_i}}Hidden{{/i}}</td>
514
+ <td class="is-visible">{{_i}}Visible{{/i}}</td>
515
+ <td class="is-visible">{{_i}}Visible{{/i}}</td>
516
+ </tr>
517
+ <tr>
518
+ <th><code>.hidden-tablet</code></th>
519
+ <td class="is-visible">{{_i}}Visible{{/i}}</td>
520
+ <td class="is-hidden">{{_i}}Hidden{{/i}}</td>
521
+ <td class="is-visible">{{_i}}Visible{{/i}}</td>
522
+ </tr>
523
+ <tr>
524
+ <th><code>.hidden-desktop</code></th>
525
+ <td class="is-visible">{{_i}}Visible{{/i}}</td>
526
+ <td class="is-visible">{{_i}}Visible{{/i}}</td>
527
+ <td class="is-hidden">{{_i}}Hidden{{/i}}</td>
528
+ </tr>
529
+ </tbody>
530
+ </table>
531
+ <h3>{{_i}}Test case{{/i}}</h3>
532
+ <p>{{_i}}Resize your browser or load on different devices to test the above classes.{{/i}}</p>
533
+ <h4>{{_i}}Visible on...{{/i}}</h4>
534
+ <p>{{_i}}Green checkmarks indicate that class is visible in your current viewport.{{/i}}</p>
535
+ <ul class="responsive-utilities-test">
536
+ <li>{{_i}}Phone{{/i}}<span class="visible-phone">✔ {{_i}}Phone{{/i}}</span></li>
537
+ <li>{{_i}}Tablet{{/i}}<span class="visible-tablet">✔ {{_i}}Tablet{{/i}}</span></li>
538
+ <li>{{_i}}Desktop{{/i}}<span class="visible-desktop">✔ {{_i}}Desktop{{/i}}</span></li>
539
+ </ul>
540
+ <h4>{{_i}}Hidden on...{{/i}}</h4>
541
+ <p>{{_i}}Here, green checkmarks indicate that class is hidden in your current viewport.{{/i}}</p>
542
+ <ul class="responsive-utilities-test hidden-on">
543
+ <li>{{_i}}Phone{{/i}}<span class="hidden-phone">✔ {{_i}}Phone{{/i}}</span></li>
544
+ <li>{{_i}}Tablet{{/i}}<span class="hidden-tablet">✔ {{_i}}Tablet{{/i}}</span></li>
545
+ <li>{{_i}}Desktop{{/i}}<span class="hidden-desktop">✔ {{_i}}Desktop{{/i}}</span></li>
546
+ </ul>
547
+ </div><!-- /.span -->
548
+ </div><!-- /.row -->
549
+
550
+
551
+ <div class="row">
552
+ <div class="span4">
553
+ </div><!-- /.span -->
554
+ </div><!-- /.row -->
555
+</section>
docs/docs/likebutton/docs/templates/pages/upgrading.mustache
new
+194
@@ -0,0 +1,194 @@
1
+<!-- Masthead
2
+================================================== -->
3
+<header class="jumbotron subhead" id="overview">
4
+ <h1>{{_i}}Upgrading to Bootstrap 2{{/i}}</h1>
5
+ <p class="lead">{{_i}}Learn about significant changes and additions since v1.4 with this handy guide.{{/i}}</p>
6
+</header>
7
+
8
+
9
+
10
+<!-- Project
11
+================================================== -->
12
+<section id="docs">
13
+ <div class="page-header">
14
+ <h1>{{_i}}Project changes{{/i}}</h1>
15
+ </div>
16
+ <ul>
17
+ <li>{{_i}}Docs: major updates across the board to general structure, examples, and code snippets. Also made responsive with new media queries.{{/i}}</li>
18
+ <li>{{_i}}Docs: all docs pages are now powered by Mustache templates and strings are wrapped in i18n tags for translation by the Twitter Translation Center. All changes to documentation must be done here and then compiled (similar to our CSS and LESS).{{/i}}</li>
19
+ <li>{{_i}}Repo directory structure: removed the compiled CSS from the root in favor of a large direct download link on the docs homepage. Compiled CSS is in <code>/docs/assets/css/</code>.{{/i}}</li>
20
+ <li>{{_i}}Docs and repo: one makefile, just type <code>make</code> in the Terminal and get updated docs and CSS.{{/i}}</li>
21
+ </ul>
22
+</section>
23
+
24
+
25
+
26
+<!-- Scaffolding
27
+================================================== -->
28
+<section id="scaffolding">
29
+ <div class="page-header">
30
+ <h1>{{_i}}Scaffolding{{/i}}</h1>
31
+ </div>
32
+ <h3>{{_i}}Grid system{{/i}}</h3>
33
+ <ul>
34
+ <li>{{_i}}Updated grid system, now only 12 columns instead of 16{{/i}}
35
+ <li>{{_i}}Responsive approach means your projects virtually work out of the box on smartphones, tablets, and more{{/i}}</li>
36
+ <li>{{_i}}Removed unused (by default) grid columns support for 17-24 columns{{/i}}</li>
37
+ </ul>
38
+ <h3>{{_i}}Responsive (media queries){{/i}}</h3>
39
+ <ul>
40
+ <li>{{_i}}Media queries added for <strong>basic support</strong> across mobile and tablet devices{{/i}}
41
+ <li>{{_i}}Responsive CSS is compiled separately, as bootstrap-responsive.css{{/i}}</li>
42
+ </ul>
43
+</section>
44
+
45
+
46
+
47
+<!-- Base CSS
48
+================================================== -->
49
+<section id="baseCSS">
50
+ <div class="page-header">
51
+ <h1>{{_i}}Base CSS{{/i}}</h1>
52
+ </div>
53
+ <h3>{{_i}}Typography{{/i}}</h3>
54
+ <ul>
55
+ <li>{{_i}}<code>h4</code> elements were dropped from 16px to 14px with a default <code>line-height</code> of 18px{{/i}}</li>
56
+ <li>{{_i}}<code>h5</code> elements were dropped from 14px to 12px{{/i}}</li>
57
+ <li>{{_i}}<code>h6</code> elements were dropped from 13px to 11px{{/i}}</li>
58
+ <li>{{_i}}Right-aligned option for blockquotes if <code>float: right;</code>{{/i}}</li>
59
+ </ul>
60
+ <h3>{{_i}}Code{{/i}}</h3>
61
+ <ul>
62
+ <li>{{_i}}New graphical style for <code><code></code>{{/i}}</li>
63
+ <li>{{_i}}Google Code Prettify styles updated (based on GitHub's gists){{/i}}</li>
64
+ </ul>
65
+ <h3>{{_i}}Tables{{/i}}</h3>
66
+ <ul>
67
+ <li>{{_i}}Improved support for <code>colspan</code> and <code>rowspan</code>{{/i}}</li>
68
+ <li>{{_i}}Styles now restricted to new base class, <code>.table</code>{{/i}}</li>
69
+ <li>{{_i}}Table classes standardized with <code>.table-</code> required as a prefix{{/i}}</li>
70
+ <li>{{_i}}Removed unused table color options (too much code for such little impact){{/i}}</li>
71
+ <li>{{_i}}Dropped support for TableSorter{{/i}}</li>
72
+ </ul>
73
+ <h3>{{_i}}Buttons{{/i}}</h3>
74
+ <ul>
75
+ <li>{{_i}}New classes for colors and sizes, all prefixed with <code>.btn-</code>{{/i}}</li>
76
+ <li>{{_i}}IE9: removed gradients and added rounded corners{{/i}}</li>
77
+ <li>{{_i}}Updated active state to make styling clearer in button groups (new) and look better with custom transition{{/i}}</li>
78
+ <li>{{_i}}New mixin, <code>.buttonBackground</code>, to set button gradients{{/i}}</li>
79
+ <li>{{_i}}The <code>.secondary</code> class was removed from modal examples in our docs as it never had associated styles.{{/i}}</li>
80
+ </ul>
81
+ <h3>{{_i}}Forms{{/i}}</h3>
82
+ <ul>
83
+ <li>{{_i}}Default form style is now vertical (stacked) to use less CSS and add greater flexibility{{/i}}</li>
84
+ <li>{{_i}}Form classes standardized with <code>.form-</code> required as a prefix{{/i}}</li>
85
+ <li>{{_i}}New built-in form defaults for search, inline, and horizontal forms{{/i}}</li>
86
+ <li>{{_i}}For horizontal forms, previous classes <code>.clearfix</code> and <code>.input</code> are equivalent to the new <code>.control-group</code> and <code>.controls</code>.{{/i}}</li>
87
+ <li>{{_i}}More flexible horizontal form markup with classes for all styling, including new optional class for the <code>label</code>{{/i}}</li>
88
+ <li>{{_i}}Form states: colors updated and customizable via new LESS variables{{/i}}</li>
89
+ </ul>
90
+ <h3>{{_i}}Icons, by Glyphicons{{/i}}</h3>
91
+ <ul>
92
+ <li>{{_i}}New Glyphicons Halflings icon set added in sprite form, in black and white{{/i}}</li>
93
+ <li>{{_i}}Simple markup required for an icon in tons of contexts: <code><i class="icon-cog"></></code>{{/i}}</li>
94
+ <li>{{_i}}Add another class, <code>.icon-white</code>, for white variation of the same icon{{/i}}</li>
95
+ </ul>
96
+</section>
97
+
98
+
99
+
100
+<!-- Components
101
+================================================== -->
102
+<section id="components">
103
+ <div class="page-header">
104
+ <h1>{{_i}}Components{{/i}}</h1>
105
+ </div>
106
+ <h3>{{_i}}Button groups and dropdowns{{/i}}</h3>
107
+ <ul>
108
+ <li>{{_i}}Two brand new components in 2.0: button groups and button dropdowns{{/i}}</li>
109
+ <li>{{_i}}Dependency: button dropdowns are built on button groups, and therefore require all their styles{{/i}}</li>
110
+ <li>{{_i}}Button groups, <code>.btn-group</code>, can be grouped one level higher with a button toolbar, <code>.btn-toolbar</code>{{/i}}</li>
111
+ </ul>
112
+ <h3>{{_i}}Navigation{{/i}}</h3>
113
+ <ul>
114
+ <li>{{_i}}Tabs and pills now require the use of a new base class, <code>.nav</code>, on their <code><ul></code> and the class names are now <code>.nav-pills</code> and <code>.nav-tabs</code>.{{/i}}</li>
115
+ <li>{{_i}}New nav list variation added that uses the same base class, <code>.nav</code>{{/i}}</li>
116
+ <li>{{_i}}Vertical tabs and pills have been added—just add <code>.nav-stacked</code> to the <code><ul></code>{{/i}}</li>
117
+ <li>{{_i}}Pills were restyled to be less rounded by default{{/i}}</li>
118
+ <li>{{_i}}Pills now have dropdown menu support (they share the same markup and styles as tabs){{/i}}</li>
119
+ </ul>
120
+ <h3>{{_i}}Navbar (formerly topbar){{/i}}</h3>
121
+ <ul>
122
+ <li>{{_i}}Base class changed from <code>.topbar</code> to <code>.navbar</code>{{/i}}</li>
123
+ <li>{{_i}}Now supports static position (default behavior, not fixed) and fixed to the top of viewport via <code>.navbar-fixed-top</code> (previously only supported fixed){{/i}}</li>
124
+ <li>{{_i}}Added vertical dividers to top-level nav{{/i}}</li>
125
+ <li>{{_i}}Improved support for inline forms in the navbar, which now require <code>.navbar-form</code> to properly scope styles to only the intended forms.{{/i}}</li>
126
+ <li>{{_i}}Navbar search form now requires use of the <code>.navbar-search</code> class and its input the use of <code>.search-query</code>. To position the search form, you <strong>must</strong> use <code>.pull-left</code> or <code>.pull-right</code>.{{/i}}</li>
127
+ <li>{{_i}}Added optional responsive markup for collapsing navbar contents for smaller resolutions and devices. <a href="./components.html#navbar">See navbar docs</a> for how to utilize.{{/i}}</li>
128
+ </ul>
129
+ <h3>{{_i}}Dropdown menus{{/i}}</h3>
130
+ <ul>
131
+ <li>{{_i}}Updated the <code>.dropdown-menu</code> to tighten up spacing{{/i}}</li>
132
+ <li>{{_i}}Now requires you to add a <code><span class="caret"></span></code> to show the dropdown arrow{{/i}}</li>
133
+ <li>{{_i}}Now requires you to add a <code>data-toggle="dropdown"</code> attribute to obtain toggling behavior{{/i}}</li>
134
+ <li>{{_i}}The navbar (fixed topbar) has brand new dropdowns. Gone are the dark versions and in their place are the standard white ones with an additional caret at their tops for clarity of position.{{/i}}</li>
135
+ </ul>
136
+ <h3>{{_i}}Labels{{/i}}</h3>
137
+ <ul>
138
+ <li>{{_i}}Label colors updated to match form state colors{{/i}}</li>
139
+ <li>{{_i}}Not only do they match graphically, but they are powered by the same new variables{{/i}}</li>
140
+ </ul>
141
+ <h3>{{_i}}Thumbnails{{/i}}</h3>
142
+ <ul>
143
+ <li>{{_i}}Formerly <code>.media-grid</code>, now just <code>.thumbnails</code>, we've thoroughly extended this component for more uses while maintaining overall simplicity out of the box.{{/i}}</li>
144
+ <li>{{_i}}Individual thumbnails now require <code>.thumbnail</code> class{{/i}}</li>
145
+ </ul>
146
+ <h3>{{_i}}Alerts{{/i}}</h3>
147
+ <ul>
148
+ <li>{{_i}}New base class: <code>.alert</code> instead of <code>.alert-message</code>{{/i}}</li>
149
+ <li>{{_i}}Class names standardized for other options, now all starting with <code>.alert-</code>{{/i}}</li>
150
+ <li>{{_i}}Redesigned base alert styles to combine the default alerts and block-level alerts into one{{/i}}</li>
151
+ <li>{{_i}}Block level alert class changed: <code>.alert-block</code> instead of <code>.block-message</code>{{/i}}</li>
152
+ </ul>
153
+ <h3>{{_i}}Progress bars{{/i}}</h3>
154
+ <ul>
155
+ <li>{{_i}}New in 2.0{{/i}}</li>
156
+ <li>{{_i}}Features multiple styles via classes, including striped and animated variations via CSS3{{/i}}</li>
157
+ </ul>
158
+ <h3>{{_i}}Miscellaneous components{{/i}}</h3>
159
+ <ul>
160
+ <li>{{_i}}Added documentation for the well component and the close icon (used in modals and alerts){{/i}}</li>
161
+ </ul>
162
+</section>
163
+
164
+
165
+
166
+<!-- Javascript
167
+================================================== -->
168
+<section id="javascript">
169
+ <div class="page-header">
170
+ <h1>{{_i}}Javascript plugins{{/i}}</h1>
171
+ </div>
172
+ <div class="alert alert-info">
173
+ <strong>{{_i}}Heads up!{{/i}}</strong> {{_i}}We've rewritten just about everything for our plugins, so head on over to <a href="./javascript.html">the Javascript page</a> to learn more.{{/i}}
174
+ </div>
175
+ <h3>{{_i}}Tooltips{{/i}}</h3>
176
+ <ul>
177
+ <li>{{_i}}The plugin method has been renamed from <code>twipsy()</code> to <code>tooltip()</code>, and the class name changed from <code>twipsy</code> to <code>tooltip</code>.{{/i}}</li>
178
+ <li>{{_i}}The <code>placement</code> option value that was <code>below</code> is now <code>bottom</code>, and <code>above</code> is now <code>top</code>.{{/i}}</li>
179
+ <li>{{_i}}The <code>animate</code> option was renamed to <code>animation</code>.{{/i}}</li>
180
+ <li>{{_i}}The <code>html</code> option was removed, as the tooltips default to allowing HTML now.{{/i}}</li>
181
+ </ul>
182
+ <h3>{{_i}}Popovers{{/i}}</h3>
183
+ <ul>
184
+ <li>{{_i}}Child elements now properly namespaced: <code>.title</code> to <code>.popover-title</code>, <code>.inner</code> to <code>.popover-inner</code>, and <code>.content</code> to <code>.popover-content</code>.{{/i}}</li>
185
+ <li>{{_i}}The <code>placement</code> option value that was <code>below</code> is now <code>bottom</code>, and <code>above</code> is now <code>top</code>.{{/i}}</li>
186
+ </ul>
187
+ <h3>{{_i}}New plugins{{/i}}</h3>
188
+ <ul>
189
+ <li>{{_i}}<a href="./javascript.html#collapse">Collapse</a>{{/i}}</li>
190
+ <li>{{_i}}<a href="./javascript.html#carousel">Carousel</a>{{/i}}</li>
191
+ <li>{{_i}}<a href="./javascript.html#typeahead">Typeahead</a>{{/i}}</li>
192
+ </ul>
193
+</section>
194
+
docs/docs/likebutton/docs/upgrading.html
new
+310
@@ -0,0 +1,310 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Upgrading · Twitter Bootstrap</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="">
8
+ <meta name="author" content="">
9
+
10
+ <!-- Le styles -->
11
+ <link href="assets/css/bootstrap.css" rel="stylesheet">
12
+ <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
13
+ <link href="assets/css/docs.css" rel="stylesheet">
14
+ <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
15
+
16
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <!-- Le fav and touch icons -->
22
+ <link rel="shortcut icon" href="assets/ico/favicon.ico">
23
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
24
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
25
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
26
+ <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
27
+
28
+ </head>
29
+
30
+ <body data-spy="scroll" data-target=".subnav" data-offset="50">
31
+
32
+
33
+ <!-- Navbar
34
+ ================================================== -->
35
+ <div class="navbar navbar-fixed-top">
36
+ <div class="navbar-inner">
37
+ <div class="container">
38
+ <button type="button"class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="brand" href="./index.html">Bootstrap</a>
44
+ <div class="nav-collapse collapse">
45
+ <ul class="nav">
46
+ <li class="">
47
+ <a href="./index.html">Overview</a>
48
+ </li>
49
+ <li class="">
50
+ <a href="./scaffolding.html">Scaffolding</a>
51
+ </li>
52
+ <li class="">
53
+ <a href="./base-css.html">Base CSS</a>
54
+ </li>
55
+ <li class="">
56
+ <a href="./components.html">Components</a>
57
+ </li>
58
+ <li class="">
59
+ <a href="./javascript.html">Javascript plugins</a>
60
+ </li>
61
+ <li class="">
62
+ <a href="./less.html">Using LESS</a>
63
+ </li>
64
+ <li class="divider-vertical"></li>
65
+ <li class="">
66
+ <a href="./download.html">Customize</a>
67
+ </li>
68
+ <li class="">
69
+ <a href="./examples.html">Examples</a>
70
+ </li>
71
+ </ul>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="container">
78
+
79
+<!-- Masthead
80
+================================================== -->
81
+<header class="jumbotron subhead" id="overview">
82
+ <h1>Upgrading to Bootstrap 2</h1>
83
+ <p class="lead">Learn about significant changes and additions since v1.4 with this handy guide.</p>
84
+</header>
85
+
86
+
87
+
88
+<!-- Project
89
+================================================== -->
90
+<section id="docs">
91
+ <div class="page-header">
92
+ <h1>Project changes</h1>
93
+ </div>
94
+ <ul>
95
+ <li>Docs: major updates across the board to general structure, examples, and code snippets. Also made responsive with new media queries.</li>
96
+ <li>Docs: all docs pages are now powered by Mustache templates and strings are wrapped in i18n tags for translation by the Twitter Translation Center. All changes to documentation must be done here and then compiled (similar to our CSS and LESS).</li>
97
+ <li>Repo directory structure: removed the compiled CSS from the root in favor of a large direct download link on the docs homepage. Compiled CSS is in <code>/docs/assets/css/</code>.</li>
98
+ <li>Docs and repo: one makefile, just type <code>make</code> in the Terminal and get updated docs and CSS.</li>
99
+ </ul>
100
+</section>
101
+
102
+
103
+
104
+<!-- Scaffolding
105
+================================================== -->
106
+<section id="scaffolding">
107
+ <div class="page-header">
108
+ <h1>Scaffolding</h1>
109
+ </div>
110
+ <h3>Grid system</h3>
111
+ <ul>
112
+ <li>Updated grid system, now only 12 columns instead of 16
113
+ <li>Responsive approach means your projects virtually work out of the box on smartphones, tablets, and more</li>
114
+ <li>Removed unused (by default) grid columns support for 17-24 columns</li>
115
+ </ul>
116
+ <h3>Responsive (media queries)</h3>
117
+ <ul>
118
+ <li>Media queries added for <strong>basic support</strong> across mobile and tablet devices
119
+ <li>Responsive CSS is compiled separately, as bootstrap-responsive.css</li>
120
+ </ul>
121
+</section>
122
+
123
+
124
+
125
+<!-- Base CSS
126
+================================================== -->
127
+<section id="baseCSS">
128
+ <div class="page-header">
129
+ <h1>Base CSS</h1>
130
+ </div>
131
+ <h3>Typography</h3>
132
+ <ul>
133
+ <li><code>h4</code> elements were dropped from 16px to 14px with a default <code>line-height</code> of 18px</li>
134
+ <li><code>h5</code> elements were dropped from 14px to 12px</li>
135
+ <li><code>h6</code> elements were dropped from 13px to 11px</li>
136
+ <li>Right-aligned option for blockquotes if <code>float: right;</code></li>
137
+ </ul>
138
+ <h3>Code</h3>
139
+ <ul>
140
+ <li>New graphical style for <code><code></code></li>
141
+ <li>Google Code Prettify styles updated (based on GitHub's gists)</li>
142
+ </ul>
143
+ <h3>Tables</h3>
144
+ <ul>
145
+ <li>Improved support for <code>colspan</code> and <code>rowspan</code></li>
146
+ <li>Styles now restricted to new base class, <code>.table</code></li>
147
+ <li>Table classes standardized with <code>.table-</code> required as a prefix</li>
148
+ <li>Removed unused table color options (too much code for such little impact)</li>
149
+ <li>Dropped support for TableSorter</li>
150
+ </ul>
151
+ <h3>Buttons</h3>
152
+ <ul>
153
+ <li>New classes for colors and sizes, all prefixed with <code>.btn-</code></li>
154
+ <li>IE9: removed gradients and added rounded corners</li>
155
+ <li>Updated active state to make styling clearer in button groups (new) and look better with custom transition</li>
156
+ <li>New mixin, <code>.buttonBackground</code>, to set button gradients</li>
157
+ <li>The <code>.secondary</code> class was removed from modal examples in our docs as it never had associated styles.</li>
158
+ </ul>
159
+ <h3>Forms</h3>
160
+ <ul>
161
+ <li>Default form style is now vertical (stacked) to use less CSS and add greater flexibility</li>
162
+ <li>Form classes standardized with <code>.form-</code> required as a prefix</li>
163
+ <li>New built-in form defaults for search, inline, and horizontal forms</li>
164
+ <li>For horizontal forms, previous classes <code>.clearfix</code> and <code>.input</code> are equivalent to the new <code>.control-group</code> and <code>.controls</code>.</li>
165
+ <li>More flexible horizontal form markup with classes for all styling, including new optional class for the <code>label</code></li>
166
+ <li>Form states: colors updated and customizable via new LESS variables</li>
167
+ </ul>
168
+ <h3>Icons, by Glyphicons</h3>
169
+ <ul>
170
+ <li>New Glyphicons Halflings icon set added in sprite form, in black and white</li>
171
+ <li>Simple markup required for an icon in tons of contexts: <code><i class="icon-cog"></></code></li>
172
+ <li>Add another class, <code>.icon-white</code>, for white variation of the same icon</li>
173
+ </ul>
174
+</section>
175
+
176
+
177
+
178
+<!-- Components
179
+================================================== -->
180
+<section id="components">
181
+ <div class="page-header">
182
+ <h1>Components</h1>
183
+ </div>
184
+ <h3>Button groups and dropdowns</h3>
185
+ <ul>
186
+ <li>Two brand new components in 2.0: button groups and button dropdowns</li>
187
+ <li>Dependency: button dropdowns are built on button groups, and therefore require all their styles</li>
188
+ <li>Button groups, <code>.btn-group</code>, can be grouped one level higher with a button toolbar, <code>.btn-toolbar</code></li>
189
+ </ul>
190
+ <h3>Navigation</h3>
191
+ <ul>
192
+ <li>Tabs and pills now require the use of a new base class, <code>.nav</code>, on their <code><ul></code> and the class names are now <code>.nav-pills</code> and <code>.nav-tabs</code>.</li>
193
+ <li>New nav list variation added that uses the same base class, <code>.nav</code></li>
194
+ <li>Vertical tabs and pills have been added—just add <code>.nav-stacked</code> to the <code><ul></code></li>
195
+ <li>Pills were restyled to be less rounded by default</li>
196
+ <li>Pills now have dropdown menu support (they share the same markup and styles as tabs)</li>
197
+ </ul>
198
+ <h3>Navbar (formerly topbar)</h3>
199
+ <ul>
200
+ <li>Base class changed from <code>.topbar</code> to <code>.navbar</code></li>
201
+ <li>Now supports static position (default behavior, not fixed) and fixed to the top of viewport via <code>.navbar-fixed-top</code> (previously only supported fixed)</li>
202
+ <li>Added vertical dividers to top-level nav</li>
203
+ <li>Improved support for inline forms in the navbar, which now require <code>.navbar-form</code> to properly scope styles to only the intended forms.</li>
204
+ <li>Navbar search form now requires use of the <code>.navbar-search</code> class and its input the use of <code>.search-query</code>. To position the search form, you <strong>must</strong> use <code>.pull-left</code> or <code>.pull-right</code>.</li>
205
+ <li>Added optional responsive markup for collapsing navbar contents for smaller resolutions and devices. <a href="./components.html#navbar">See navbar docs</a> for how to utilize.</li>
206
+ </ul>
207
+ <h3>Dropdown menus</h3>
208
+ <ul>
209
+ <li>Updated the <code>.dropdown-menu</code> to tighten up spacing</li>
210
+ <li>Now requires you to add a <code><span class="caret"></span></code> to show the dropdown arrow</li>
211
+ <li>Now requires you to add a <code>data-toggle="dropdown"</code> attribute to obtain toggling behavior</li>
212
+ <li>The navbar (fixed topbar) has brand new dropdowns. Gone are the dark versions and in their place are the standard white ones with an additional caret at their tops for clarity of position.</li>
213
+ </ul>
214
+ <h3>Labels</h3>
215
+ <ul>
216
+ <li>Label colors updated to match form state colors</li>
217
+ <li>Not only do they match graphically, but they are powered by the same new variables</li>
218
+ </ul>
219
+ <h3>Thumbnails</h3>
220
+ <ul>
221
+ <li>Formerly <code>.media-grid</code>, now just <code>.thumbnails</code>, we've thoroughly extended this component for more uses while maintaining overall simplicity out of the box.</li>
222
+ <li>Individual thumbnails now require <code>.thumbnail</code> class</li>
223
+ </ul>
224
+ <h3>Alerts</h3>
225
+ <ul>
226
+ <li>New base class: <code>.alert</code> instead of <code>.alert-message</code></li>
227
+ <li>Class names standardized for other options, now all starting with <code>.alert-</code></li>
228
+ <li>Redesigned base alert styles to combine the default alerts and block-level alerts into one</li>
229
+ <li>Block level alert class changed: <code>.alert-block</code> instead of <code>.block-message</code></li>
230
+ </ul>
231
+ <h3>Progress bars</h3>
232
+ <ul>
233
+ <li>New in 2.0</li>
234
+ <li>Features multiple styles via classes, including striped and animated variations via CSS3</li>
235
+ </ul>
236
+ <h3>Miscellaneous components</h3>
237
+ <ul>
238
+ <li>Added documentation for the well component and the close icon (used in modals and alerts)</li>
239
+ </ul>
240
+</section>
241
+
242
+
243
+
244
+<!-- Javascript
245
+================================================== -->
246
+<section id="javascript">
247
+ <div class="page-header">
248
+ <h1>Javascript plugins</h1>
249
+ </div>
250
+ <div class="alert alert-info">
251
+ <strong>Heads up!</strong> We've rewritten just about everything for our plugins, so head on over to <a href="./javascript.html">the Javascript page</a> to learn more.
252
+ </div>
253
+ <h3>Tooltips</h3>
254
+ <ul>
255
+ <li>The plugin method has been renamed from <code>twipsy()</code> to <code>tooltip()</code>, and the class name changed from <code>twipsy</code> to <code>tooltip</code>.</li>
256
+ <li>The <code>placement</code> option value that was <code>below</code> is now <code>bottom</code>, and <code>above</code> is now <code>top</code>.</li>
257
+ <li>The <code>animate</code> option was renamed to <code>animation</code>.</li>
258
+ <li>The <code>html</code> option was removed, as the tooltips default to allowing HTML now.</li>
259
+ </ul>
260
+ <h3>Popovers</h3>
261
+ <ul>
262
+ <li>Child elements now properly namespaced: <code>.title</code> to <code>.popover-title</code>, <code>.inner</code> to <code>.popover-inner</code>, and <code>.content</code> to <code>.popover-content</code>.</li>
263
+ <li>The <code>placement</code> option value that was <code>below</code> is now <code>bottom</code>, and <code>above</code> is now <code>top</code>.</li>
264
+ </ul>
265
+ <h3>New plugins</h3>
266
+ <ul>
267
+ <li><a href="./javascript.html#collapse">Collapse</a></li>
268
+ <li><a href="./javascript.html#carousel">Carousel</a></li>
269
+ <li><a href="./javascript.html#typeahead">Typeahead</a></li>
270
+ </ul>
271
+</section>
272
+
273
+
274
+
275
+ <!-- Footer
276
+ ================================================== -->
277
+ <footer class="footer">
278
+ <p class="pull-right"><a href="#">Back to top</a></p>
279
+ <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
280
+ <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
281
+ <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
282
+ </footer>
283
+
284
+ </div><!-- /container -->
285
+
286
+
287
+
288
+ <!-- Le javascript
289
+ ================================================== -->
290
+ <!-- Placed at the end of the document so the pages load faster -->
291
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
292
+ <script src="assets/js/jquery.js"></script>
293
+ <script src="assets/js/google-code-prettify/prettify.js"></script>
294
+ <script src="assets/js/bootstrap-transition.js"></script>
295
+ <script src="assets/js/bootstrap-alert.js"></script>
296
+ <script src="assets/js/bootstrap-modal.js"></script>
297
+ <script src="assets/js/bootstrap-dropdown.js"></script>
298
+ <script src="assets/js/bootstrap-scrollspy.js"></script>
299
+ <script src="assets/js/bootstrap-tab.js"></script>
300
+ <script src="assets/js/bootstrap-tooltip.js"></script>
301
+ <script src="assets/js/bootstrap-popover.js"></script>
302
+ <script src="assets/js/bootstrap-button.js"></script>
303
+ <script src="assets/js/bootstrap-collapse.js"></script>
304
+ <script src="assets/js/bootstrap-carousel.js"></script>
305
+ <script src="assets/js/bootstrap-typeahead.js"></script>
306
+ <script src="assets/js/application.js"></script>
307
+
308
+
309
+ </body>
310
+</html>
docs/docs/likebutton/img/LikeToggler.png
Binary files /dev/null and b/docs/docs/likebutton/img/LikeToggler.png differ
docs/docs/likebutton/img/ReactDataDiagram.png
Binary files /dev/null and b/docs/docs/likebutton/img/ReactDataDiagram.png differ
docs/docs/likebutton/img/ReactLogo3.png
Binary files /dev/null and b/docs/docs/likebutton/img/ReactLogo3.png differ
docs/docs/likebutton/img/glyphicons-halflings-white.png
Binary files /dev/null and b/docs/docs/likebutton/img/glyphicons-halflings-white.png differ
docs/docs/likebutton/img/glyphicons-halflings.png
Binary files /dev/null and b/docs/docs/likebutton/img/glyphicons-halflings.png differ
docs/docs/likebutton/index.html
new
+931
@@ -0,0 +1,931 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <link href="./docs/assets/js/google-code-prettify/prettify.css" rel="stylesheet">
5
+ <meta charset="utf-8">
6
+ <title>React Javascript Framework</title>
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
+ <meta name="description" content="">
9
+ <meta name="author" content="">
10
+
11
+ <!-- Le styles -->
12
+ <link href="./docs/assets/css/bootstrap.css" rel="stylesheet">
13
+ <style type="text/css">
14
+ .hoverCardLink,
15
+ .hoverCardLink:hover,
16
+ .hoverCardLink:active {
17
+ cursor: default;
18
+ text-decoration: none;
19
+ border-bottom: 1px dotted #ba0000;
20
+ border-bottom: 1px dotted rgb(91, 116, 168);
21
+ }
22
+ body {
23
+ /*background-image: url("../../../whiteGrain.png");*/
24
+ padding-top: 60px;
25
+ padding-bottom: 40px;
26
+ }
27
+ .sidebar-nav {
28
+ padding: 9px 0;
29
+ }
30
+ </style>
31
+ <link href="./docs/assets/css/bootstrap-responsive.css" rel="stylesheet">
32
+
33
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
34
+ <!--[if lt IE 9]>
35
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
36
+ <![endif]-->
37
+
38
+ <!-- Le fav and touch icons -->
39
+ <link rel="shortcut icon" href="./docs/assets/ico/favicon.ico">
40
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="./docs/assets/ico/apple-touch-icon-144-precomposed.png">
41
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="./docs/assets/ico/apple-touch-icon-114-precomposed.png">
42
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="./docs/assets/ico/apple-touch-icon-72-precomposed.png">
43
+ <link rel="apple-touch-icon-precomposed" href="./docs/assets/ico/apple-touch-icon-57-precomposed.png">
44
+ </head>
45
+
46
+ <body data-spy="scroll" onload="prettyPrint()">
47
+
48
+ <div class="navbar-fixed-top navbar">
49
+ <div class="navbar-inner">
50
+ <div class="container-fluid">
51
+ <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
52
+ <span class="icon-bar"></span>
53
+ <span class="icon-bar"></span>
54
+ <span class="icon-bar"></span>
55
+ </button>
56
+ <a style="float:right;font-weight:bold;color:black; text-shadow: 0 1px 0 rgba(255, 255, 255, .1), 0 0 30px rgba(255, 255, 255, .125)" class="brand" href="./index.html">React</a>
57
+ <div class="nav-collapse">
58
+ <ul class="nav">
59
+ <li><a href="#reactTop">React</a></li>
60
+ <li><a href="#gettingStarted">Get Started</a></li>
61
+ <li><a href="#tutorial">Tutorial</a></li>
62
+ </ul>
63
+ </div><!--/.nav-collapse -->
64
+ </div>
65
+ </div>
66
+ </div>
67
+
68
+ <div id="reactTop" class="container">
69
+ <br>
70
+ <br>
71
+ <h1 id="gettingStarted">Start Hacking <small>with React</small></h1>
72
+ <hr>
73
+
74
+ <div class="row">
75
+ <div class="span6">
76
+ <h3 style="">A Simple Example</h3>
77
+ <ul>
78
+ <li><code>@jsx React.DOM</code> enables XML syntax known as <code>jsx</code>.</li>
79
+ <li>The <code>React</code> module allows for creation and rendering of React components.</li>
80
+ <li><code>msg</code> is a React component instance, constructed using XML syntax.</li>
81
+ <li><code>React.renderComponent</code> renders the react content into the document. </li>
82
+ </ul>
83
+ <br>
84
+ <br>
85
+ <a id="behindTheScenesBtn" class="btn"><i class="icon-film"></i> Behind the Scenes</a>
86
+ </div>
87
+ <div class="span6">
88
+ <h6><small>Fig 1: Simple Example of React Usage</small></h6>
89
+ <pre class="prettyprint linenums">
90
+ /**
91
+ * @jsx React.DOM
92
+ */
93
+ var React = require('React');
94
+ var msg =
95
+ <div class="outerDiv">
96
+ <span>hello</span>
97
+ </div>;
98
+ React.renderComponent(msg, document.getElementById('someId'));</pre>
99
+ </div>
100
+
101
+ </div>
102
+ <br>
103
+ <br>
104
+ <div id="behindTheScenes" class="row">
105
+ <div class="span6">
106
+ <h3>Behind the Scenes</h3>
107
+ <p>
108
+ The previous example was very straightforward except for the use of
109
+ XML syntax. The inclusion of <code>@jsx React.DOM</code> accomplishes
110
+ two things.
111
+ <ol>
112
+ <li>Tells the build system to compile XML syntax into standard
113
+ javascript function calls.
114
+ </li>
115
+ <li>
116
+ Ensures that <code>div</code> and <code>span</code> are
117
+ functions that are in scope. In fact, all standard DOM tags
118
+ (such as <code>img</code> and <code>ul</code> are also treated
119
+ this way).
120
+ </li>
121
+ </ol>
122
+ </p>
123
+ <p>
124
+ Obviously, javascript isn't the most attractive way to specify
125
+ declarative structures. The XML syntax will be used for the
126
+ remainder of this tutorial. Additionally, require calls and calls to
127
+ <code>React.renderComponent</code> will be ommited from
128
+ examples.
129
+ </p>
130
+ </div>
131
+ <div class="span6">
132
+ <h6><small>Fig 2: Example of compiler output</small></h6>
133
+ <pre class="prettyprint linenums">
134
+ /**
135
+ * @jsx React.DOM
136
+ */
137
+ var React = require('React');
138
+ var div = React.DOM.div;
139
+ var span = React.DOM.span;
140
+ var msg =
141
+ div({
142
+ className:"outerDiv",
143
+ children: [
144
+ span({
145
+ children: ['hello']
146
+ })
147
+ ]
148
+ });
149
+ React.renderComponent(msg, document.getElementById('someId'));
150
+ </pre>
151
+ </div>
152
+ </div>
153
+
154
+ <div class="row">
155
+ <div class="span6">
156
+ <h3 style="">Mobile Development</h3>
157
+ If developing for mobile, ensure that React is listening to touch
158
+ events <i>before</i> performing rendering. This only needs to be done
159
+ once. Everything else is exactly as it would be on desktop.
160
+ <br>
161
+ <br>
162
+ </div>
163
+ <div class="span6">
164
+ <h6><small>Fig 2.5: Supporting mobile</small></h6>
165
+ <pre class="prettyprint linenums">
166
+React.initializeTouchEvents(true);
167
+React.renderComponent(yourComponent, document.getElementById('someId')); </pre>
168
+ </div>
169
+ </div>
170
+
171
+
172
+
173
+ <div class="row">
174
+ <div class="span6">
175
+ <h3 style="">JSX Development Environment</h3>
176
+ <ul>
177
+ <li><b>Vim</b> already supports the <code>jsx</code> syntax out of the box.</li>
178
+ <li>If you prefer <b>Emacs</b>, <a href="http://code.google.com/p/js2-mode/">JS2 mode</a> works well. </li>
179
+ <li>For <a href="Sublime Text" href="http://www.sublimetext.com/">Sublime Text</a>, you can use the
180
+ excellent <a href="http://home.fburl.com/~yungsters/facelime/#configuration">Facelime</a>
181
+ tools which adds syntax highlighting and inline editor linting of <code>jsx</code>.
182
+ </li>
183
+ <li>Arc lint correctly supports <code>jsx</code> syntax.</li>
184
+ </ul>
185
+ <br>
186
+ <br>
187
+ </div>
188
+ </div>
189
+
190
+
191
+ <br>
192
+ <br>
193
+ <h1>Types of Components <small>application building blocks</small></h1>
194
+ <hr>
195
+
196
+ <!-- <div class="row"> -->
197
+ <!-- <div class="span6"> -->
198
+ <!-- <h2 style="font-weight:500">Types of Components</h2> -->
199
+ <!-- There are two subclasses of <code>ReactComponent</code> -->
200
+ <!-- <ul> -->
201
+ <!-- <li> <code>ReactDOMComponent</code>: Wrappers around DOM elements such as <code>div</code> and <code>span</code>.</li> -->
202
+ <!-- <li> <code>ReactCompositeComponent</code>: Higher level (custom) components. We haven't seen these yet. </li> -->
203
+ <!-- </ul> -->
204
+ <!-- Note that React seldom <a class="hoverCardLink"" href="#hoverCardLink" id="inheritancenote">uses inheritance.</a> -->
205
+ <!-- </div> -->
206
+ <!-- <div class="span6"> -->
207
+ <!-- <h6><small>Fig 3: Hierarchy of components</small></h6> -->
208
+ <!-- <b>insert diagram</b> -->
209
+ <!-- </div> -->
210
+ <!-- </div> -->
211
+
212
+ <div class="row">
213
+ <div class="span6">
214
+ <h3>DOM Components <small>such as <code>div</code> and <code>span</code>.</small>
215
+ </h3>
216
+ DOM components are always in scope when including <code>@jsx
217
+ React.DOM</code> in the first docblock comment. All DOM components
218
+ support <a href="#childrenexplain" class="hoverCardLink"
219
+ id="childrenexplain">children</a> in addition to standard DOM
220
+ attributes <code>class</code>, <code>href</code>, etc. The only thing to
221
+ remember, is that DOM attributes should be expressed in camelCase (<code>onClick</code>).
222
+ </div>
223
+ <div class="span6">
224
+ <h6><small>Fig 4: DOM Component attributes</small></h6>
225
+ <pre class="prettyprint linenums">
226
+var fbUrl = "www.facebook.com";
227
+var btn = <a href={fbUrl} class="butButton"> Visit Facebook </a>;
228
+ </pre>
229
+ </div>
230
+ </div>
231
+
232
+
233
+
234
+
235
+ <div class="row">
236
+ <div class="span6">
237
+ <h3>Composite Components <small>such as <code>Typeahead</code> and <code>LeftNav</code></h3>
238
+ <p>
239
+ <code>ReactCompositeComponent</code>s are "custom" components.
240
+ Composite components are not automatically "in scope" like
241
+ <code>ReactDOMComponent</code>s. The tag name will need to be
242
+ defined as a variable in the scope. By convention, each
243
+ <code>ReactCompositeComponent</code> is a commonJS module.
244
+ </p>
245
+ <br>
246
+ <p><span class="label label-important">Remember:</span> Composite
247
+ components must be in scope before use.</p>
248
+ </div>
249
+ <div class="span6">
250
+ <h6><small>Fig 5: Usage of COMPOSITE COMPONENT</small></h6>
251
+ <pre class="prettyprint linenums">
252
+// Suppose Typeahead is an instnace of ReactCompositeComponent
253
+var Typeahead = require('Typeahead');
254
+
255
+// Typeahead has chosen to accept a "selected" attribute
256
+// and children.
257
+var myTypeahead=
258
+ <Typeahead selected="jordanjcw" >
259
+ {something.dataset}
260
+ </Typeahead>;
261
+ </pre>
262
+ </div>
263
+ </div>
264
+
265
+
266
+
267
+ <br>
268
+ <br>
269
+ <h1 id="tutorial">Let's Build a Component <small>from scratch</small></h1>
270
+ <hr>
271
+ <div class="row">
272
+ <div class="span6">
273
+ <p>
274
+ The following tutorial shows you how to define a new component type
275
+ called <code>LikeToggler</code>.
276
+ The <code>LikeToggler</code> will render an image and allow the user to
277
+ toggle the like status on the image. See Image 1 to the right for a
278
+ screenshot of the final result.
279
+ </p>
280
+ <p>To create a new component type, we must specify: </p>
281
+ <ul>
282
+ <li>
283
+ The structure of the component - what is it composed of, and how it
284
+ should be rendered.
285
+ </li>
286
+ <li>
287
+ How it encapsulates state, and how that state changes over time.
288
+ </li>
289
+ <li>
290
+ The way in which user interactions may influence state changes.
291
+ </li>
292
+ </ul>
293
+ <p><span class="label label-info">Note:</span> React favors composition
294
+ over inheritance as a means of abstraction.</p>
295
+ </p>
296
+ </div>
297
+ <div class="span6">
298
+ <h6><small>Image 1: Final Result</small></h6>
299
+ <img style="padding-right:10px" class="thumbnail" src="./img/LikeToggler.png" />
300
+ </div>
301
+ </div>
302
+
303
+ <!-- <div class="row"> -->
304
+ <!-- <div class="span6"> -->
305
+ <!-- </div> -->
306
+ <!-- <div class="span6"> -->
307
+ <!-- </div> -->
308
+ <!-- </div> -->
309
+ <div class="row">
310
+ <div class="span6">
311
+ <h3>1. Begin the tutorial</h3>
312
+ <p>
313
+ All of the plumbing for this tutorial has been set up for you in
314
+ www/trunk. Simply edit the main tutorial javascript file and refresh
315
+ your browser. (See Figure 6 to the right).
316
+ </p>
317
+ </div>
318
+ <div class="span6">
319
+ <h6><small>Fig 6: Editing the tutorial</small></h6>
320
+ <pre class="prettyprint linenums">vim ~/www/html/js/components/ReactTutorial/ReactTutorial.js
321
+Open http://yourSandbox.facebook.com/intern/reacttutorial</pre>
322
+
323
+ </div>
324
+ </div>
325
+ <div class="row">
326
+ <div class="span6">
327
+ <h3>2. A New Component Shell</h3>
328
+ <p>
329
+ Here, we create a new component called <code>LikeToggler</code> by
330
+ making a call to <code>React.createClass</code>. We pass a
331
+ javascript object that describes the methods to include in the new
332
+ class. <code>render</code> is the most important method, and is the
333
+ only one required. It <i>describes</i> the structure of your
334
+ component.
335
+ </p>
336
+ <p><span class="label label-important">Remember:</span> <code>render</code> should never have side effects.</p>
337
+ <p><span class="label label-important">Remember:</span>
338
+ When returning <code>jsx</code> blocks, parenthesis guard
339
+ against <a class="hoverCardLink" id="asiexplain"
340
+ href="#asiexplain">ASI</a>.</p>
341
+ </div>
342
+ <div class="span6">
343
+ <h6><small>Fig 7: basic component definition</small></h6>
344
+ <pre class="prettyprint linenums">
345
+var LikeToggler = React.createClass({
346
+ render: function() {
347
+ return (
348
+ <div>
349
+ Welcome to the tutorial. Implement LikeToggler here!
350
+ </div>
351
+ );
352
+ }
353
+});</pre>
354
+ </div>
355
+ </div>
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+ <div class="row">
366
+ <div class="span6">
367
+ <h3>3. Add Richer Structure</h3>
368
+ Here, we've added a header component and a picture of Boo. We've
369
+ also placed a class on the outermost div to give the component some
370
+ style. In your tutorial file, change your <code>render</code>
371
+ function to match Figure 8.
372
+ </div>
373
+ <div class="span6">
374
+ <h6><small>Fig 8: Richer structure</small></h6>
375
+ <pre class="prettyprint linenums">
376
+var LikeToggler = React.createClass({
377
+ render: function() {
378
+ return (
379
+ <div class="LikeToggler">
380
+ <h5>Toggle your like.</h5>
381
+ <img src="https://graph.facebook.com/boo/picture" />
382
+ </div>
383
+ );
384
+ }
385
+});</pre>
386
+ </div>
387
+ </div>
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+
396
+ <div class="row">
397
+ <div class="span6">
398
+ <h3>4. Add Statefulness</h3>
399
+ <p>
400
+ Let's make our app interactive! We'll allow the user to "Like" Boo
401
+ through our component's interface. In order to do so, we'll want to
402
+ track that state in our component internally.
403
+ </p>
404
+ Add a method called <code>getInitialState</code> to your component.
405
+ <code>getInitialState</code> should return a javascript object that
406
+ represents your component's initial state. We'll return an object
407
+ with <code>likes</code> set to <code>false</code> to indicate that
408
+ the user does not initially like Boo.
409
+ </div>
410
+ <div class="span6">
411
+ <h6><small>Fig 9: Beginning statefulness</small></h6>
412
+ <pre class="prettyprint linenums">
413
+var LikeToggler = React.createClass({
414
+ getInitialState: function() { // <--New method here
415
+ return {likes: false};
416
+ },
417
+ render: function() {
418
+ return (
419
+ <div class="LikeToggler">
420
+ <h5>Toggle your like.</h5>
421
+ <img src="https://graph.facebook.com/boo/picture" />
422
+ </div>
423
+ );
424
+ }
425
+});</pre>
426
+ </div>
427
+ </div>
428
+
429
+
430
+
431
+
432
+
433
+
434
+
435
+
436
+
437
+ <div class="row">
438
+ <div class="span6">
439
+ <h3>5. Set Up User Interactions.</h3>
440
+ <ul>
441
+ <li>All DOM components support attributes and event handlers just as
442
+ you would expect (but are specified in the camelCase form).</li>
443
+ <li>
444
+ Add a new like toggler <code>span</code> in your rendered output.
445
+ </li>
446
+ <li>
447
+ Add a new <code>div</code> in your rendered output to display the
448
+ current like status.
449
+ </li>
450
+ <li>
451
+ Add a new member function that will handle the click on that new
452
+ like toggler. Call this method <code>doToggle</code>.
453
+ </li>
454
+ <li>
455
+ Set the <code>onClick</code> attribute of the <code>span</code> to
456
+ be the new member.
457
+ </li>
458
+ <li>
459
+ Place an alert inside of the <code>doToggle</code> handler to
460
+ confirm that your click is wired up correctly.
461
+ </li>
462
+ </ul>
463
+ <p><span class="label label-important">Remember:</span> Always specify DOM attributes in their camelCase form.</p>
464
+ </div>
465
+ <div class="span6">
466
+ <h6><small>Fig 10: Setting up user interactions </small></h6>
467
+ <pre class="prettyprint linenums">
468
+var LikeToggler = React.createClass({
469
+ getInitialState: function() {
470
+ return {likes: false};
471
+ },
472
+ doToggle: function(event) {
473
+ // What shall we do here?
474
+ },
475
+ render: function() {
476
+ return (
477
+ <div class="LikeToggler">
478
+ <h5>Toggle your like.</h5>
479
+ <img src="https://graph.facebook.com/boo/picture" />
480
+ <div class="btn" onClick={this.doToggle}>
481
+ Like Boo
482
+ </div>
483
+ <div></div>
484
+ </div>
485
+ );
486
+ }
487
+});</pre>
488
+ </div>
489
+ </div>
490
+
491
+
492
+
493
+
494
+
495
+
496
+ <div class="row">
497
+ <div class="span6">
498
+ <h3>6. Change State.</h3>
499
+ <p>
500
+ We need to accomplish the following when the user clicks.
501
+ </p>
502
+ <ul>
503
+ <li>Toggle our internal state field's <code>likes</code> field.</li>
504
+ <li>Change the content of the toggler <code>div</code> from
505
+ "Like Boo" to "Unlike Boo"</li>
506
+ <li>Change the content of the <code>span</code> from empty
507
+ to "You like this."</li>
508
+ </ul>
509
+ <p>You might be tempted to search for the DOM nodes whos content you
510
+ wish to change, and force them to change. However, React provides a
511
+ more powerful abstraction to help you express the dynamics of changing
512
+ content over time. In react, we change our state fields via a call to
513
+ <code>this.setState</code>. Then, we express <code>render</code>
514
+ as a function of <code>this.state</code> at <i>all points in time</i>
515
+ - for an <i>arbitrary</i> state. Nothing else is needed!</p>
516
+
517
+ <b><p>Here's how that plays out in our example:</p></b>
518
+ <p>
519
+ First, We set our next state's <code>likes</code> field to an
520
+ inversion/toggle of our current <code>likes</code> (Line 8).
521
+ Then, we make our like toggler button's content is an expression
522
+ that is a function or an <i>arbitrary</i> state:
523
+ </p>
524
+ <pre class="prettyprint linenums:14">
525
+<div class="btn" onClick={this.doToggle}>
526
+ {this.state.likes ? 'Unlike Boo' : 'Like Boo'}
527
+</div>
528
+</pre>
529
+ <p>
530
+ Finally, we do the same with the <code>span</code>'s content
531
+ </p>
532
+<pre class="prettyprint linenums:13">
533
+<span>{this.state.likes ? 'You Like This.' : ''}</span>
534
+</pre>
535
+ React guarantees that when state is updated, these expressions
536
+ will be reevaluated and the underlying DOM structures will be <a
537
+ id="reconcilexplain" class="hoverCardLink">reconciled</a>.
538
+ To be clear, you can put <i>any</i> expression in terms of
539
+ <code>this.state</code> inside of <code>render</code>. There are
540
+ essentially <b>no</b> limitations. Consider the
541
+ <code>render</code> function to be a constraint that you specify
542
+ and that React will <b>always</b> satisfy.
543
+ </div>
544
+ <div class="span6">
545
+ <h6><small>Fig 11: Changing State </small></h6>
546
+ <pre class="prettyprint linenums">
547
+var LikeToggler = React.createClass({
548
+ getInitialState: function() {
549
+ return {likes: false};
550
+ },
551
+ doToggle: function(event) {
552
+ this.setState({likes: !this.state.likes});
553
+ },
554
+ render: function() {
555
+ return (
556
+ <div class="LikeToggler">
557
+ <h5>Toggle your like.</h5>
558
+ <img src="https://graph.facebook.com/boo/picture" />
559
+ <span>{this.state.likes ? 'You Like This.' : ''}</span>
560
+ <div class="btn" onClick={this.doToggle}>
561
+ {this.state.likes ? 'Unlike Boo' : 'Like Boo'}
562
+ </div>
563
+ </div>
564
+ );
565
+ }
566
+});</pre>
567
+ </div>
568
+ </div>
569
+
570
+
571
+
572
+
573
+
574
+ <br>
575
+ <br>
576
+
577
+ <div class="row">
578
+ <div class="span6">
579
+ <h3>7. Add attributes <small>or <i>props</i></small></h3>
580
+ <p>
581
+ There's something lacking from our <code>LikeToggler</code>
582
+ component. Components such as <code>div</code> and <code>span</code>
583
+ accept attributes (such as <code>href</code> and
584
+ <code>class</code>), but currently, our component is instantiated as
585
+ follows, without attributes:
586
+ </p>
587
+ <pre class="prettyprint linenums">var myLikeToggler = <LikeToggler />;</pre>
588
+ <p>
589
+ Now suppose we want to control the entity being liked.
590
+ </p>
591
+ <pre class="prettyprint linenums">var myLikeToggler =
592
+ <LikeToggler
593
+ name="Boo"
594
+ imgSrc="http://graph.facebook.com/boo/picture"
595
+ />;</pre>
596
+ </p>
597
+ <p>
598
+ This is extremely easy to do! Inside of the <code>render</code>
599
+ method, all attributes are accessible through a special member called
600
+ <code>this.props</code>. See the Figure 12 for the complete component.
601
+ </p>
602
+ <p>
603
+ It's worth taking a close look at the last <code>span</code>'s
604
+ content. Recognize how the content depends on two separate pieces of
605
+ data, from two completely different locations (<code>props</code>
606
+ and <code>state</code>). <i>Any</i> time either of these data
607
+ change, the content of that <code>span</code> will always be
608
+ reconciled to the expression specified.
609
+ </p>
610
+<pre class="prettyprint linenums:14">
611
+<div class="btn" onClick={this.doToggle}>
612
+ {(this.state.likes ? 'Unlike ' : 'Like ') + this.props.name}
613
+</div>
614
+</pre>
615
+
616
+ </div>
617
+ <div class="span6">
618
+ <h6><small>Fig 12: Supporting Attributes</small></h6>
619
+ <pre class="prettyprint linenums">
620
+var LikeToggler = React.createClass({
621
+ getInitialState: function() {
622
+ return {likes: false};
623
+ },
624
+ doToggle: function(event) {
625
+ this.setState({likes: !this.state.likes});
626
+ },
627
+ render: function() {
628
+ return (
629
+ <div class="LikeToggler">
630
+ <h5>Toggle your like.</h5>
631
+ <img src={this.props.imgSrc} />
632
+ <span>{this.state.likes ? 'You Like This.' : ''}</span>
633
+ <div class="btn" onClick={this.doToggle}>
634
+ {(this.state.likes ? 'Unlike ' : 'Like ') + this.props.name}
635
+ </div>
636
+ </div>
637
+ );
638
+ }
639
+});</pre>
640
+ </div>
641
+ </div>
642
+
643
+
644
+
645
+
646
+
647
+
648
+
649
+
650
+ <br>
651
+ <br>
652
+ <br>
653
+ <br>
654
+ <h1>Properties and State <small>ownership of information</small></h1>
655
+ <hr>
656
+ <div class="row">
657
+ <div class="span6">
658
+ <p><span class="label label-info">Note:</span> The terms <code>attributes</code> and <code>props</code> used interchangably.</p>
659
+ <h3>Ownership:</h3>
660
+ <p>
661
+ When you look at <code>render</code>, anywhere you see tags
662
+ <code><...></code> there exists an implication of "ownership".
663
+ Meaning that whatever instance <code>render</code>s, also "owns"
664
+ those components that are rendered. For example, in Figure 13, we
665
+ define a new component type <code>LikeTogglerWrapper</code> that is
666
+ <i>composed</i> of the <code>LikeToggler</code> that we previously
667
+ defined.
668
+ The <code>LikeTogglerWrapper</code> instance clearly <i>owns</i> the
669
+ <code>LikeToggler</code> component. The
670
+ <code>LikeTogglerWrapper</code> is only thing thing that determines
671
+ the <code>props</code> (or <code>attributes</code>) of the
672
+ <code>LikeToggler</code>. Furthermore, it is the only thing that
673
+ determines its very existence.
674
+ </p>
675
+ </div>
676
+ <div class="span6">
677
+ <h6><small>Fig 13: new component</small></h6>
678
+ <pre class="prettyprint linenums">
679
+var LikeTogglerWrapper = React.createClass({
680
+ render: function() {
681
+ return (
682
+ <LikeToggler
683
+ imgSrc="https://graph.facebook.com//picture"
684
+ name="jwalke"
685
+ />
686
+ );
687
+ }
688
+});</pre>
689
+ </div>
690
+ </div>
691
+ <div class="row">
692
+ <div class="span6">
693
+ <h3>Control Of Information:</h3>
694
+ <p>
695
+
696
+ <p>Clearly, our new component is somehow "in charge" of the
697
+ <code>LikeToggler</code>, so it makes sense to use the term "owner".
698
+ However, there's still one thing it's not in charge of - the
699
+ internal <i><code>state</code></i> of the <code>LikeToggler</code>.
700
+ <code>state</code> and <code>props</code> are both simple packages
701
+ of information, but they are distinct in one <b>critical</b> aspect
702
+ - <b><i>control</i></b>.
703
+ </p>
704
+ <ul>
705
+ <li>
706
+ You control your <code>this.state</code>. You are the only one that
707
+ should ever update <code>this.state</code>. You never need to ask
708
+ permission to update your own state because you are in control of
709
+ it.
710
+ </li>
711
+ <li>
712
+ You do <i>not</i> control your <code>this.props</code>. Your
713
+ props are controlled by the same entity that instantiated
714
+ <i>you</i> - that is to say that your <code>this.props</code> are
715
+ controlled by your <i>owner</i>.
716
+ Therefore, you should never update your own <code>this.props</code>.
717
+ </li>
718
+ </ul>
719
+ <p>
720
+ The description of <code>this.state</code>
721
+ describes traditional encapsulation. But the description of
722
+ <code>this.props</code> is less familiar. We've described
723
+ <code>this.props</code> as public, but in a more restricted way than
724
+ in traditional OO design. Our props <i>can</i> be controlled from outside
725
+ of our component instance, because they can <i>only</i> be controlled from
726
+ outside of our component instance, by the owner of <i>us</i>. See
727
+ Figure 14 for an illustration of data flow, ownerhip and control.
728
+ </p>
729
+ <p>
730
+ These two conventions ensure that all data in the system has a
731
+ single owner. If you wish to control information that you do not
732
+ own, you must find a way to inform the <i>owner</i> of that
733
+ information that you wish to change it. In other programming
734
+ paradigms, these authoritatively owned packages of information may
735
+ be refered to as <i>models</i>.
736
+ </p>
737
+ <br>
738
+ <p>
739
+ <span class="label label-important">Remember:</span>
740
+ A component instance must be the only one to update its own
741
+ <code>this.state</code> via a call to
742
+ <code>this.setState({..})</code> and nothing else should update
743
+ its <code>this.state</code>.
744
+ </p>
745
+ <p>
746
+ <span class="label label-important">Remember:</span>
747
+ A component must never update its own <code>this.props</code>. Only
748
+ a component's "owner" (or the Reactive system) should ever
749
+ update its props.
750
+ </p>
751
+ <h3>Streams:</h3>
752
+ <p>
753
+ Examine Figure 14. It helps to think of <code>this.props</code> and
754
+ <code>this.state</code> as streams of information that your
755
+ <code>render</code> function operates on in order to return your
756
+ component's structure. <code>render</code> always
757
+ sees the freshest values of these streams. You do not need to
758
+ perform any setup to make this happen. You do not need to subscribe
759
+ to any changes. The React core makes sure that
760
+ <code>render</code> correctly describes your component's structure
761
+ whenever <code>this.props</code> or <code>this.state</code> may have
762
+ changed.
763
+ </p>
764
+ <h3>Flow Of Information:</h3>
765
+ <p>
766
+ We said that <code>render</code> always "sees the freshest values"
767
+ of <code>this.props</code> and <code>this.state</code>, but how does
768
+ this
769
+ happen? In particular, how does a component always see the freshest
770
+ values of <code>this.props</code>? If a component cannot update its
771
+ own <code>this.props</code>, then who does? The answer is that
772
+ changes to <code>this.props</code> will be the result of a call to
773
+ <code>setState()</code> at a higher level in the component
774
+ hierarchy. From the point of state update, the reactive system will
775
+ ensure that the component subtree is brought up to date by updating
776
+ the <code>props</code> of components below it in the hierarchy.
777
+ </p>
778
+ <p>
779
+ There are some exceptional cases, where it doesn't make sense to
780
+ merely rely on state changes to update props, but those cases are
781
+ rare. In those cases, React allows a way to attach a reference
782
+ handle to individual components returned from <code>render</code>
783
+ and to directly tell that component to update its props, bypassing
784
+ the standard reactive data flow. In doing so, we're not violating
785
+ the rules mentioned above. The component that specifies the
786
+ reference handles, and invokes `updateProps` is the rightful "owner"
787
+ of the referenced component and has full authority to update the
788
+ props directly.
789
+ </p>
790
+ <p><span class="label label-info">Note:</span> This will be
791
+ further documented in a new tutorial section discussing "refs" (not
792
+ yet written).</p>
793
+ </p>
794
+ </div>
795
+ <div class="span6">
796
+ <h6><small>Fig 14: Control of information</small></h6>
797
+ <img style="z-index:-999; position: relative; top: -40px" src="./img/ReactDataDiagram.png" />
798
+ </div>
799
+ </div>
800
+
801
+
802
+
803
+
804
+
805
+
806
+
807
+
808
+ <br>
809
+ <br>
810
+ <br>
811
+ <br>
812
+ <h1>Recap <small>memorize this</small></h1>
813
+ <hr>
814
+ <div class="row">
815
+ <div class="span12">
816
+ <ul>
817
+ <li>
818
+ Require other Composite Components by <code>require</code>ing
819
+ them. DOM components (such as <code><div /></code>) are
820
+ always in scope and do not need to be <code>require</code>d.
821
+ </li>
822
+ <li>
823
+ DOM components support the familiar attributes, but in camelCase form (such as <code>onClick</code>).
824
+ </li>
825
+ <li>
826
+ Use <code>React.createClass</code> to create a new custom component class.
827
+ </li>
828
+ <li>
829
+ Specify the visual structure of your component in
830
+ <code>render</code> as a function of an <i>arbitrary</i>
831
+ <code>this.state</code> and <code>this.props</code>.
832
+ </li>
833
+ <li>
834
+ Inside of <code>render</code>, you observe attributes by
835
+ referencing <code>this.props.attributeName</code>.
836
+ </li>
837
+ <li>
838
+ Inside of <code>render</code>, you observe internal state by
839
+ referencing <code>this.states.stateFieldName</code>.
840
+ </li>
841
+ <li>
842
+ <code>render</code> always sees the most up-to-date values for
843
+ <code>this.state</code> and <code>this.props</code>.
844
+ </li>
845
+ <li>
846
+ Render should <b>never</b> have side effects.
847
+ </li>
848
+ <li>
849
+ Perform state updates via calls to <code>this.setState({...})</code>.
850
+ </li>
851
+ <li>
852
+ Only <i>you</i> may update your <code>this.state</code>.
853
+ </li>
854
+ <li>
855
+ You may never update your own <code>this.props</code>.
856
+ </li>
857
+ <li>
858
+ <code>this.state</code> should only ever contain serializable data (think "JSON")
859
+ and you should never stuff react component instances into
860
+ <code>this.state</code>.
861
+ </li>
862
+ </ul>
863
+ </div>
864
+ </div>
865
+
866
+ <br>
867
+ <br>
868
+ <br>
869
+ <br>
870
+ <br>
871
+ <br>
872
+ <br>
873
+ <br>
874
+ <br>
875
+ <br>
876
+ <hr>
877
+ </div><!--/.fluid-container-->
878
+
879
+ <!-- Le javascript
880
+ ================================================== -->
881
+ <!-- Placed at the end of the document so the pages load faster -->
882
+ <script src="./docs/assets/js/jquery.js"></script>
883
+ <script src="./docs/assets/js/bootstrap-transition.js"></script>
884
+ <script src="./docs/assets/js/bootstrap-alert.js"></script>
885
+ <script src="./docs/assets/js/bootstrap-modal.js"></script>
886
+ <script src="./docs/assets/js/bootstrap-dropdown.js"></script>
887
+ <script src="./docs/assets/js/bootstrap-scrollspy.js"></script>
888
+ <script src="./docs/assets/js/bootstrap-tab.js"></script>
889
+ <script src="./docs/assets/js/bootstrap-tooltip.js"></script>
890
+ <script src="./docs/assets/js/bootstrap-popover.js"></script>
891
+ <script src="./docs/assets/js/bootstrap-button.js"></script>
892
+ <script src="./docs/assets/js/bootstrap-collapse.js"></script>
893
+ <script src="./docs/assets/js/bootstrap-carousel.js"></script>
894
+ <script src="./docs/assets/js/google-code-prettify/prettify.js"></script>
895
+ <script src="./docs/assets/js/bootstrap-typeahead.js"></script>
896
+
897
+ <script type="text/javascript" charset="utf-8">
898
+ $('#inheritancenote').popover({
899
+ trigger: 'hover',
900
+ title: 'Inheritance',
901
+ content: 'React does not encourage use of inheritance at the '+
902
+ 'application layer, and seldom uses inheritance in the core ' +
903
+ 'framework. Instead, React encouranges the functional ' +
904
+ 'style where possible. However, for the sake of discussion, ' +
905
+ 'it helps to think of the types of components as being in ' +
906
+ 'a hierarchy.'
907
+ })
908
+ $('#asiexplain').popover({
909
+ trigger: 'hover',
910
+ title: 'Automatic Semicolon Insertion',
911
+ content: "When you type return followed by a newline, javascript will insert a semicolon after \"return\", causing you to return undefined. The <code>jsx</code> syntax does't change how javascript works here, so you need to guard return values on new lines by grouping them in parenthesis, just like you\'re used to doing in javascript."
912
+ })
913
+ $('#childrenexplain').popover({
914
+ trigger: 'hover',
915
+ title: 'Children and Attributes',
916
+ content: 'Children could be thought of as an attribute as well. In the <code>jsx</code> syntax, what you place between the open and close tags specify children attributes.'
917
+ })
918
+ $('#reconcilexplain').popover({
919
+ trigger: 'hover',
920
+ title: 'Reconciliation',
921
+ content: "In order to reconcile efficiently, React employs a couple of strategies. <ul><li>React may know that only certain regions of the page may need to be reconciled so it only searches for changes from those points.</li><li>React can traverse large search spaces quickly quickly because it searches lightweight javascript object graphs as opposed to heavyweight DOM trees.</li><li>These reconciliation strategies are abstracted away so that we can innovate new reconciliation algorithms that are highly tuned for certain critical operations (such as scrolling).</li><li>The largest benefit is that, as an app developer, you\'ll never need to worry about these details because React handles this for you. Application speed will continue to increase as core framework engineers innovate on these algorithms.</li>"
922
+ })
923
+ $('#behindTheScenes').hide()
924
+ $('#behindTheScenesBtn').click(function() {
925
+ $('#behindTheScenesBtn').hide();
926
+ $('#behindTheScenes').fadeIn();
927
+ });
928
+ $('#navbar').scrollspy()
929
+ </script>
930
+ </body>
931
+</html>
docs/docs/likebutton/js/.jshintrc
new
+10
@@ -0,0 +1,10 @@
1
+{
2
+ "validthis": true,
3
+ "laxcomma" : true,
4
+ "laxbreak" : true,
5
+ "browser" : true,
6
+ "debug" : true,
7
+ "boss" : true,
8
+ "expr" : true,
9
+ "asi" : true
10
+}
\ No newline at end of file
docs/docs/likebutton/js/README.md
new
+112
@@ -0,0 +1,112 @@
1
+## 2.0 BOOTSTRAP JS PHILOSOPHY
2
+These are the high-level design rules which guide the development of Bootstrap's plugin apis.
3
+
4
+---
5
+
6
+### DATA-ATTRIBUTE API
7
+
8
+We believe you should be able to use all plugins provided by Bootstrap purely through the markup API without writing a single line of JavaScript. This is Bootstrap's first class API.
9
+
10
+We acknowledge that this isn't always the most performant and it may sometimes be desirable to turn this functionality off altogether. Therefore, as of 2.0 we provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this:
11
+
12
+ $('body').off('.data-api')
13
+
14
+To target a specific plugin, just include the plugins name as a namespace along with the data-api namespace like this:
15
+
16
+ $('body').off('.alert.data-api')
17
+
18
+---
19
+
20
+### PROGRAMATIC API
21
+
22
+We also believe you should be able to use all plugins provided by Bootstrap purely through the JavaScript API.
23
+
24
+All public APIs should be single, chainable methods, and return the collection acted upon.
25
+
26
+ $(".btn.danger").button("toggle").addClass("fat")
27
+
28
+All methods should accept an optional options object, a string which targets a particular method, or null which initiates the default behavior:
29
+
30
+ $("#myModal").modal() // initialized with defaults
31
+ $("#myModal").modal({ keyboard: false }) // initialized with no keyboard
32
+ $("#myModal").modal('show') // initializes and invokes show immediately
33
+
34
+---
35
+
36
+### OPTIONS
37
+
38
+Options should be sparse and add universal value. We should pick the right defaults.
39
+
40
+All plugins should have a default object which can be modified to affect all instances' default options. The defaults object should be available via `$.fn.plugin.defaults`.
41
+
42
+ $.fn.modal.defaults = { … }
43
+
44
+An options definition should take the following form:
45
+
46
+ *noun*: *adjective* - describes or modifies a quality of an instance
47
+
48
+Examples:
49
+
50
+ backdrop: true
51
+ keyboard: false
52
+ placement: 'top'
53
+
54
+---
55
+
56
+### EVENTS
57
+
58
+All events should have an infinitive and past participle form. The infinitive is fired just before an action takes place, the past participle on completion of the action.
59
+
60
+ show | shown
61
+ hide | hidden
62
+
63
+All infinitive events should provide preventDefault functionality. This provides the abililty to stop the execution of an action.
64
+
65
+ $('#myModal').on('show', function (e) {
66
+ if (!data) return e.preventDefault() // stops modal from being shown
67
+ })
68
+
69
+---
70
+
71
+### CONSTRUCTORS
72
+
73
+Each plugin should expose its raw constructor on a `Constructor` property -- accessed in the following way:
74
+
75
+
76
+ $.fn.popover.Constructor
77
+
78
+---
79
+
80
+### DATA ACCESSOR
81
+
82
+Each plugin stores a copy of the invoked class on an object. This class instance can be accessed directly through jQuery's data API like this:
83
+
84
+ $('[rel=popover]').data('popover') instanceof $.fn.popover.Constructor
85
+
86
+---
87
+
88
+### DATA ATTRIBUTES
89
+
90
+Data attributes should take the following form:
91
+
92
+- data-{{verb}}={{plugin}} - defines main interaction
93
+- data-target || href^=# - defined on "control" element (if element controls an element other than self)
94
+- data-{{noun}} - defines class instance options
95
+
96
+Examples:
97
+
98
+ // control other targets
99
+ data-toggle="modal" data-target="#foo"
100
+ data-toggle="collapse" data-target="#foo" data-parent="#bar"
101
+
102
+ // defined on element they control
103
+ data-spy="scroll"
104
+
105
+ data-dismiss="modal"
106
+ data-dismiss="alert"
107
+
108
+ data-toggle="dropdown"
109
+
110
+ data-toggle="button"
111
+ data-toggle="buttons-checkbox"
112
+ data-toggle="buttons-radio"
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-alert.js
new
+90
@@ -0,0 +1,90 @@
1
+/* ==========================================================
2
+ * bootstrap-alert.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
4
+ * ==========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* ALERT CLASS DEFINITION
27
+ * ====================== */
28
+
29
+ var dismiss = '[data-dismiss="alert"]'
30
+ , Alert = function (el) {
31
+ $(el).on('click', dismiss, this.close)
32
+ }
33
+
34
+ Alert.prototype.close = function (e) {
35
+ var $this = $(this)
36
+ , selector = $this.attr('data-target')
37
+ , $parent
38
+
39
+ if (!selector) {
40
+ selector = $this.attr('href')
41
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
42
+ }
43
+
44
+ $parent = $(selector)
45
+
46
+ e && e.preventDefault()
47
+
48
+ $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
49
+
50
+ $parent.trigger(e = $.Event('close'))
51
+
52
+ if (e.isDefaultPrevented()) return
53
+
54
+ $parent.removeClass('in')
55
+
56
+ function removeElement() {
57
+ $parent
58
+ .trigger('closed')
59
+ .remove()
60
+ }
61
+
62
+ $.support.transition && $parent.hasClass('fade') ?
63
+ $parent.on($.support.transition.end, removeElement) :
64
+ removeElement()
65
+ }
66
+
67
+
68
+ /* ALERT PLUGIN DEFINITION
69
+ * ======================= */
70
+
71
+ $.fn.alert = function (option) {
72
+ return this.each(function () {
73
+ var $this = $(this)
74
+ , data = $this.data('alert')
75
+ if (!data) $this.data('alert', (data = new Alert(this)))
76
+ if (typeof option == 'string') data[option].call($this)
77
+ })
78
+ }
79
+
80
+ $.fn.alert.Constructor = Alert
81
+
82
+
83
+ /* ALERT DATA-API
84
+ * ============== */
85
+
86
+ $(function () {
87
+ $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
88
+ })
89
+
90
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-button.js
new
+96
@@ -0,0 +1,96 @@
1
+/* ============================================================
2
+ * bootstrap-button.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
4
+ * ============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================ */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* BUTTON PUBLIC CLASS DEFINITION
27
+ * ============================== */
28
+
29
+ var Button = function (element, options) {
30
+ this.$element = $(element)
31
+ this.options = $.extend({}, $.fn.button.defaults, options)
32
+ }
33
+
34
+ Button.prototype.setState = function (state) {
35
+ var d = 'disabled'
36
+ , $el = this.$element
37
+ , data = $el.data()
38
+ , val = $el.is('input') ? 'val' : 'html'
39
+
40
+ state = state + 'Text'
41
+ data.resetText || $el.data('resetText', $el[val]())
42
+
43
+ $el[val](data[state] || this.options[state])
44
+
45
+ // push to event loop to allow forms to submit
46
+ setTimeout(function () {
47
+ state == 'loadingText' ?
48
+ $el.addClass(d).attr(d, d) :
49
+ $el.removeClass(d).removeAttr(d)
50
+ }, 0)
51
+ }
52
+
53
+ Button.prototype.toggle = function () {
54
+ var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
55
+
56
+ $parent && $parent
57
+ .find('.active')
58
+ .removeClass('active')
59
+
60
+ this.$element.toggleClass('active')
61
+ }
62
+
63
+
64
+ /* BUTTON PLUGIN DEFINITION
65
+ * ======================== */
66
+
67
+ $.fn.button = function (option) {
68
+ return this.each(function () {
69
+ var $this = $(this)
70
+ , data = $this.data('button')
71
+ , options = typeof option == 'object' && option
72
+ if (!data) $this.data('button', (data = new Button(this, options)))
73
+ if (option == 'toggle') data.toggle()
74
+ else if (option) data.setState(option)
75
+ })
76
+ }
77
+
78
+ $.fn.button.defaults = {
79
+ loadingText: 'loading...'
80
+ }
81
+
82
+ $.fn.button.Constructor = Button
83
+
84
+
85
+ /* BUTTON DATA-API
86
+ * =============== */
87
+
88
+ $(function () {
89
+ $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
90
+ var $btn = $(e.target)
91
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
92
+ $btn.button('toggle')
93
+ })
94
+ })
95
+
96
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-carousel.js
new
+169
@@ -0,0 +1,169 @@
1
+/* ==========================================================
2
+ * bootstrap-carousel.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
4
+ * ==========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* CAROUSEL CLASS DEFINITION
27
+ * ========================= */
28
+
29
+ var Carousel = function (element, options) {
30
+ this.$element = $(element)
31
+ this.options = options
32
+ this.options.slide && this.slide(this.options.slide)
33
+ this.options.pause == 'hover' && this.$element
34
+ .on('mouseenter', $.proxy(this.pause, this))
35
+ .on('mouseleave', $.proxy(this.cycle, this))
36
+ }
37
+
38
+ Carousel.prototype = {
39
+
40
+ cycle: function (e) {
41
+ if (!e) this.paused = false
42
+ this.options.interval
43
+ && !this.paused
44
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
45
+ return this
46
+ }
47
+
48
+ , to: function (pos) {
49
+ var $active = this.$element.find('.active')
50
+ , children = $active.parent().children()
51
+ , activePos = children.index($active)
52
+ , that = this
53
+
54
+ if (pos > (children.length - 1) || pos < 0) return
55
+
56
+ if (this.sliding) {
57
+ return this.$element.one('slid', function () {
58
+ that.to(pos)
59
+ })
60
+ }
61
+
62
+ if (activePos == pos) {
63
+ return this.pause().cycle()
64
+ }
65
+
66
+ return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
67
+ }
68
+
69
+ , pause: function (e) {
70
+ if (!e) this.paused = true
71
+ clearInterval(this.interval)
72
+ this.interval = null
73
+ return this
74
+ }
75
+
76
+ , next: function () {
77
+ if (this.sliding) return
78
+ return this.slide('next')
79
+ }
80
+
81
+ , prev: function () {
82
+ if (this.sliding) return
83
+ return this.slide('prev')
84
+ }
85
+
86
+ , slide: function (type, next) {
87
+ var $active = this.$element.find('.active')
88
+ , $next = next || $active[type]()
89
+ , isCycling = this.interval
90
+ , direction = type == 'next' ? 'left' : 'right'
91
+ , fallback = type == 'next' ? 'first' : 'last'
92
+ , that = this
93
+ , e = $.Event('slide')
94
+
95
+ this.sliding = true
96
+
97
+ isCycling && this.pause()
98
+
99
+ $next = $next.length ? $next : this.$element.find('.item')[fallback]()
100
+
101
+ if ($next.hasClass('active')) return
102
+
103
+ if ($.support.transition && this.$element.hasClass('slide')) {
104
+ this.$element.trigger(e)
105
+ if (e.isDefaultPrevented()) return
106
+ $next.addClass(type)
107
+ $next[0].offsetWidth // force reflow
108
+ $active.addClass(direction)
109
+ $next.addClass(direction)
110
+ this.$element.one($.support.transition.end, function () {
111
+ $next.removeClass([type, direction].join(' ')).addClass('active')
112
+ $active.removeClass(['active', direction].join(' '))
113
+ that.sliding = false
114
+ setTimeout(function () { that.$element.trigger('slid') }, 0)
115
+ })
116
+ } else {
117
+ this.$element.trigger(e)
118
+ if (e.isDefaultPrevented()) return
119
+ $active.removeClass('active')
120
+ $next.addClass('active')
121
+ this.sliding = false
122
+ this.$element.trigger('slid')
123
+ }
124
+
125
+ isCycling && this.cycle()
126
+
127
+ return this
128
+ }
129
+
130
+ }
131
+
132
+
133
+ /* CAROUSEL PLUGIN DEFINITION
134
+ * ========================== */
135
+
136
+ $.fn.carousel = function (option) {
137
+ return this.each(function () {
138
+ var $this = $(this)
139
+ , data = $this.data('carousel')
140
+ , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
141
+ if (!data) $this.data('carousel', (data = new Carousel(this, options)))
142
+ if (typeof option == 'number') data.to(option)
143
+ else if (typeof option == 'string' || (option = options.slide)) data[option]()
144
+ else if (options.interval) data.cycle()
145
+ })
146
+ }
147
+
148
+ $.fn.carousel.defaults = {
149
+ interval: 5000
150
+ , pause: 'hover'
151
+ }
152
+
153
+ $.fn.carousel.Constructor = Carousel
154
+
155
+
156
+ /* CAROUSEL DATA-API
157
+ * ================= */
158
+
159
+ $(function () {
160
+ $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
161
+ var $this = $(this), href
162
+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
163
+ , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
164
+ $target.carousel(options)
165
+ e.preventDefault()
166
+ })
167
+ })
168
+
169
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-collapse.js
new
+157
@@ -0,0 +1,157 @@
1
+/* =============================================================
2
+ * bootstrap-collapse.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
4
+ * =============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================ */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* COLLAPSE PUBLIC CLASS DEFINITION
27
+ * ================================ */
28
+
29
+ var Collapse = function (element, options) {
30
+ this.$element = $(element)
31
+ this.options = $.extend({}, $.fn.collapse.defaults, options)
32
+
33
+ if (this.options.parent) {
34
+ this.$parent = $(this.options.parent)
35
+ }
36
+
37
+ this.options.toggle && this.toggle()
38
+ }
39
+
40
+ Collapse.prototype = {
41
+
42
+ constructor: Collapse
43
+
44
+ , dimension: function () {
45
+ var hasWidth = this.$element.hasClass('width')
46
+ return hasWidth ? 'width' : 'height'
47
+ }
48
+
49
+ , show: function () {
50
+ var dimension
51
+ , scroll
52
+ , actives
53
+ , hasData
54
+
55
+ if (this.transitioning) return
56
+
57
+ dimension = this.dimension()
58
+ scroll = $.camelCase(['scroll', dimension].join('-'))
59
+ actives = this.$parent && this.$parent.find('> .accordion-group > .in')
60
+
61
+ if (actives && actives.length) {
62
+ hasData = actives.data('collapse')
63
+ if (hasData && hasData.transitioning) return
64
+ actives.collapse('hide')
65
+ hasData || actives.data('collapse', null)
66
+ }
67
+
68
+ this.$element[dimension](0)
69
+ this.transition('addClass', $.Event('show'), 'shown')
70
+ this.$element[dimension](this.$element[0][scroll])
71
+ }
72
+
73
+ , hide: function () {
74
+ var dimension
75
+ if (this.transitioning) return
76
+ dimension = this.dimension()
77
+ this.reset(this.$element[dimension]())
78
+ this.transition('removeClass', $.Event('hide'), 'hidden')
79
+ this.$element[dimension](0)
80
+ }
81
+
82
+ , reset: function (size) {
83
+ var dimension = this.dimension()
84
+
85
+ this.$element
86
+ .removeClass('collapse')
87
+ [dimension](size || 'auto')
88
+ [0].offsetWidth
89
+
90
+ this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
91
+
92
+ return this
93
+ }
94
+
95
+ , transition: function (method, startEvent, completeEvent) {
96
+ var that = this
97
+ , complete = function () {
98
+ if (startEvent.type == 'show') that.reset()
99
+ that.transitioning = 0
100
+ that.$element.trigger(completeEvent)
101
+ }
102
+
103
+ this.$element.trigger(startEvent)
104
+
105
+ if (startEvent.isDefaultPrevented()) return
106
+
107
+ this.transitioning = 1
108
+
109
+ this.$element[method]('in')
110
+
111
+ $.support.transition && this.$element.hasClass('collapse') ?
112
+ this.$element.one($.support.transition.end, complete) :
113
+ complete()
114
+ }
115
+
116
+ , toggle: function () {
117
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
118
+ }
119
+
120
+ }
121
+
122
+
123
+ /* COLLAPSIBLE PLUGIN DEFINITION
124
+ * ============================== */
125
+
126
+ $.fn.collapse = function (option) {
127
+ return this.each(function () {
128
+ var $this = $(this)
129
+ , data = $this.data('collapse')
130
+ , options = typeof option == 'object' && option
131
+ if (!data) $this.data('collapse', (data = new Collapse(this, options)))
132
+ if (typeof option == 'string') data[option]()
133
+ })
134
+ }
135
+
136
+ $.fn.collapse.defaults = {
137
+ toggle: true
138
+ }
139
+
140
+ $.fn.collapse.Constructor = Collapse
141
+
142
+
143
+ /* COLLAPSIBLE DATA-API
144
+ * ==================== */
145
+
146
+ $(function () {
147
+ $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {
148
+ var $this = $(this), href
149
+ , target = $this.attr('data-target')
150
+ || e.preventDefault()
151
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
152
+ , option = $(target).data('collapse') ? 'toggle' : $this.data()
153
+ $(target).collapse(option)
154
+ })
155
+ })
156
+
157
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-dropdown.js
new
+100
@@ -0,0 +1,100 @@
1
+/* ============================================================
2
+ * bootstrap-dropdown.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
4
+ * ============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================ */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* DROPDOWN CLASS DEFINITION
27
+ * ========================= */
28
+
29
+ var toggle = '[data-toggle="dropdown"]'
30
+ , Dropdown = function (element) {
31
+ var $el = $(element).on('click.dropdown.data-api', this.toggle)
32
+ $('html').on('click.dropdown.data-api', function () {
33
+ $el.parent().removeClass('open')
34
+ })
35
+ }
36
+
37
+ Dropdown.prototype = {
38
+
39
+ constructor: Dropdown
40
+
41
+ , toggle: function (e) {
42
+ var $this = $(this)
43
+ , $parent
44
+ , selector
45
+ , isActive
46
+
47
+ if ($this.is('.disabled, :disabled')) return
48
+
49
+ selector = $this.attr('data-target')
50
+
51
+ if (!selector) {
52
+ selector = $this.attr('href')
53
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
54
+ }
55
+
56
+ $parent = $(selector)
57
+ $parent.length || ($parent = $this.parent())
58
+
59
+ isActive = $parent.hasClass('open')
60
+
61
+ clearMenus()
62
+
63
+ if (!isActive) $parent.toggleClass('open')
64
+
65
+ return false
66
+ }
67
+
68
+ }
69
+
70
+ function clearMenus() {
71
+ $(toggle).parent().removeClass('open')
72
+ }
73
+
74
+
75
+ /* DROPDOWN PLUGIN DEFINITION
76
+ * ========================== */
77
+
78
+ $.fn.dropdown = function (option) {
79
+ return this.each(function () {
80
+ var $this = $(this)
81
+ , data = $this.data('dropdown')
82
+ if (!data) $this.data('dropdown', (data = new Dropdown(this)))
83
+ if (typeof option == 'string') data[option].call($this)
84
+ })
85
+ }
86
+
87
+ $.fn.dropdown.Constructor = Dropdown
88
+
89
+
90
+ /* APPLY TO STANDARD DROPDOWN ELEMENTS
91
+ * =================================== */
92
+
93
+ $(function () {
94
+ $('html').on('click.dropdown.data-api', clearMenus)
95
+ $('body')
96
+ .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
97
+ .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
98
+ })
99
+
100
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-modal.js
new
+218
@@ -0,0 +1,218 @@
1
+/* =========================================================
2
+ * bootstrap-modal.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#modals
4
+ * =========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================= */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* MODAL CLASS DEFINITION
27
+ * ====================== */
28
+
29
+ var Modal = function (content, options) {
30
+ this.options = options
31
+ this.$element = $(content)
32
+ .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
33
+ }
34
+
35
+ Modal.prototype = {
36
+
37
+ constructor: Modal
38
+
39
+ , toggle: function () {
40
+ return this[!this.isShown ? 'show' : 'hide']()
41
+ }
42
+
43
+ , show: function () {
44
+ var that = this
45
+ , e = $.Event('show')
46
+
47
+ this.$element.trigger(e)
48
+
49
+ if (this.isShown || e.isDefaultPrevented()) return
50
+
51
+ $('body').addClass('modal-open')
52
+
53
+ this.isShown = true
54
+
55
+ escape.call(this)
56
+ backdrop.call(this, function () {
57
+ var transition = $.support.transition && that.$element.hasClass('fade')
58
+
59
+ if (!that.$element.parent().length) {
60
+ that.$element.appendTo(document.body) //don't move modals dom position
61
+ }
62
+
63
+ that.$element
64
+ .show()
65
+
66
+ if (transition) {
67
+ that.$element[0].offsetWidth // force reflow
68
+ }
69
+
70
+ that.$element.addClass('in')
71
+
72
+ transition ?
73
+ that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
74
+ that.$element.trigger('shown')
75
+
76
+ })
77
+ }
78
+
79
+ , hide: function (e) {
80
+ e && e.preventDefault()
81
+
82
+ var that = this
83
+
84
+ e = $.Event('hide')
85
+
86
+ this.$element.trigger(e)
87
+
88
+ if (!this.isShown || e.isDefaultPrevented()) return
89
+
90
+ this.isShown = false
91
+
92
+ $('body').removeClass('modal-open')
93
+
94
+ escape.call(this)
95
+
96
+ this.$element.removeClass('in')
97
+
98
+ $.support.transition && this.$element.hasClass('fade') ?
99
+ hideWithTransition.call(this) :
100
+ hideModal.call(this)
101
+ }
102
+
103
+ }
104
+
105
+
106
+ /* MODAL PRIVATE METHODS
107
+ * ===================== */
108
+
109
+ function hideWithTransition() {
110
+ var that = this
111
+ , timeout = setTimeout(function () {
112
+ that.$element.off($.support.transition.end)
113
+ hideModal.call(that)
114
+ }, 500)
115
+
116
+ this.$element.one($.support.transition.end, function () {
117
+ clearTimeout(timeout)
118
+ hideModal.call(that)
119
+ })
120
+ }
121
+
122
+ function hideModal(that) {
123
+ this.$element
124
+ .hide()
125
+ .trigger('hidden')
126
+
127
+ backdrop.call(this)
128
+ }
129
+
130
+ function backdrop(callback) {
131
+ var that = this
132
+ , animate = this.$element.hasClass('fade') ? 'fade' : ''
133
+
134
+ if (this.isShown && this.options.backdrop) {
135
+ var doAnimate = $.support.transition && animate
136
+
137
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
138
+ .appendTo(document.body)
139
+
140
+ if (this.options.backdrop != 'static') {
141
+ this.$backdrop.click($.proxy(this.hide, this))
142
+ }
143
+
144
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
145
+
146
+ this.$backdrop.addClass('in')
147
+
148
+ doAnimate ?
149
+ this.$backdrop.one($.support.transition.end, callback) :
150
+ callback()
151
+
152
+ } else if (!this.isShown && this.$backdrop) {
153
+ this.$backdrop.removeClass('in')
154
+
155
+ $.support.transition && this.$element.hasClass('fade')?
156
+ this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
157
+ removeBackdrop.call(this)
158
+
159
+ } else if (callback) {
160
+ callback()
161
+ }
162
+ }
163
+
164
+ function removeBackdrop() {
165
+ this.$backdrop.remove()
166
+ this.$backdrop = null
167
+ }
168
+
169
+ function escape() {
170
+ var that = this
171
+ if (this.isShown && this.options.keyboard) {
172
+ $(document).on('keyup.dismiss.modal', function ( e ) {
173
+ e.which == 27 && that.hide()
174
+ })
175
+ } else if (!this.isShown) {
176
+ $(document).off('keyup.dismiss.modal')
177
+ }
178
+ }
179
+
180
+
181
+ /* MODAL PLUGIN DEFINITION
182
+ * ======================= */
183
+
184
+ $.fn.modal = function (option) {
185
+ return this.each(function () {
186
+ var $this = $(this)
187
+ , data = $this.data('modal')
188
+ , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
189
+ if (!data) $this.data('modal', (data = new Modal(this, options)))
190
+ if (typeof option == 'string') data[option]()
191
+ else if (options.show) data.show()
192
+ })
193
+ }
194
+
195
+ $.fn.modal.defaults = {
196
+ backdrop: true
197
+ , keyboard: true
198
+ , show: true
199
+ }
200
+
201
+ $.fn.modal.Constructor = Modal
202
+
203
+
204
+ /* MODAL DATA-API
205
+ * ============== */
206
+
207
+ $(function () {
208
+ $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
209
+ var $this = $(this), href
210
+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
211
+ , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())
212
+
213
+ e.preventDefault()
214
+ $target.modal(option)
215
+ })
216
+ })
217
+
218
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-popover.js
new
+98
@@ -0,0 +1,98 @@
1
+/* ===========================================================
2
+ * bootstrap-popover.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
4
+ * ===========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * =========================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* POPOVER PUBLIC CLASS DEFINITION
27
+ * =============================== */
28
+
29
+ var Popover = function ( element, options ) {
30
+ this.init('popover', element, options)
31
+ }
32
+
33
+
34
+ /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
35
+ ========================================== */
36
+
37
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
38
+
39
+ constructor: Popover
40
+
41
+ , setContent: function () {
42
+ var $tip = this.tip()
43
+ , title = this.getTitle()
44
+ , content = this.getContent()
45
+
46
+ $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title)
47
+ $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content)
48
+
49
+ $tip.removeClass('fade top bottom left right in')
50
+ }
51
+
52
+ , hasContent: function () {
53
+ return this.getTitle() || this.getContent()
54
+ }
55
+
56
+ , getContent: function () {
57
+ var content
58
+ , $e = this.$element
59
+ , o = this.options
60
+
61
+ content = $e.attr('data-content')
62
+ || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
63
+
64
+ return content
65
+ }
66
+
67
+ , tip: function () {
68
+ if (!this.$tip) {
69
+ this.$tip = $(this.options.template)
70
+ }
71
+ return this.$tip
72
+ }
73
+
74
+ })
75
+
76
+
77
+ /* POPOVER PLUGIN DEFINITION
78
+ * ======================= */
79
+
80
+ $.fn.popover = function (option) {
81
+ return this.each(function () {
82
+ var $this = $(this)
83
+ , data = $this.data('popover')
84
+ , options = typeof option == 'object' && option
85
+ if (!data) $this.data('popover', (data = new Popover(this, options)))
86
+ if (typeof option == 'string') data[option]()
87
+ })
88
+ }
89
+
90
+ $.fn.popover.Constructor = Popover
91
+
92
+ $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
93
+ placement: 'right'
94
+ , content: ''
95
+ , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
96
+ })
97
+
98
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-scrollspy.js
new
+151
@@ -0,0 +1,151 @@
1
+/* =============================================================
2
+ * bootstrap-scrollspy.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
4
+ * =============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* SCROLLSPY CLASS DEFINITION
27
+ * ========================== */
28
+
29
+ function ScrollSpy( element, options) {
30
+ var process = $.proxy(this.process, this)
31
+ , $element = $(element).is('body') ? $(window) : $(element)
32
+ , href
33
+ this.options = $.extend({}, $.fn.scrollspy.defaults, options)
34
+ this.$scrollElement = $element.on('scroll.scroll.data-api', process)
35
+ this.selector = (this.options.target
36
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
37
+ || '') + ' .nav li > a'
38
+ this.$body = $('body')
39
+ this.refresh()
40
+ this.process()
41
+ }
42
+
43
+ ScrollSpy.prototype = {
44
+
45
+ constructor: ScrollSpy
46
+
47
+ , refresh: function () {
48
+ var self = this
49
+ , $targets
50
+
51
+ this.offsets = $([])
52
+ this.targets = $([])
53
+
54
+ $targets = this.$body
55
+ .find(this.selector)
56
+ .map(function () {
57
+ var $el = $(this)
58
+ , href = $el.data('target') || $el.attr('href')
59
+ , $href = /^#\w/.test(href) && $(href)
60
+ return ( $href
61
+ && href.length
62
+ && [[ $href.position().top, href ]] ) || null
63
+ })
64
+ .sort(function (a, b) { return a[0] - b[0] })
65
+ .each(function () {
66
+ self.offsets.push(this[0])
67
+ self.targets.push(this[1])
68
+ })
69
+ }
70
+
71
+ , process: function () {
72
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
73
+ , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
74
+ , maxScroll = scrollHeight - this.$scrollElement.height()
75
+ , offsets = this.offsets
76
+ , targets = this.targets
77
+ , activeTarget = this.activeTarget
78
+ , i
79
+
80
+ if (scrollTop >= maxScroll) {
81
+ return activeTarget != (i = targets.last()[0])
82
+ && this.activate ( i )
83
+ }
84
+
85
+ for (i = offsets.length; i--;) {
86
+ activeTarget != targets[i]
87
+ && scrollTop >= offsets[i]
88
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
89
+ && this.activate( targets[i] )
90
+ }
91
+ }
92
+
93
+ , activate: function (target) {
94
+ var active
95
+ , selector
96
+
97
+ this.activeTarget = target
98
+
99
+ $(this.selector)
100
+ .parent('.active')
101
+ .removeClass('active')
102
+
103
+ selector = this.selector
104
+ + '[data-target="' + target + '"],'
105
+ + this.selector + '[href="' + target + '"]'
106
+
107
+ active = $(selector)
108
+ .parent('li')
109
+ .addClass('active')
110
+
111
+ if (active.parent('.dropdown-menu')) {
112
+ active = active.closest('li.dropdown').addClass('active')
113
+ }
114
+
115
+ active.trigger('activate')
116
+ }
117
+
118
+ }
119
+
120
+
121
+ /* SCROLLSPY PLUGIN DEFINITION
122
+ * =========================== */
123
+
124
+ $.fn.scrollspy = function ( option ) {
125
+ return this.each(function () {
126
+ var $this = $(this)
127
+ , data = $this.data('scrollspy')
128
+ , options = typeof option == 'object' && option
129
+ if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
130
+ if (typeof option == 'string') data[option]()
131
+ })
132
+ }
133
+
134
+ $.fn.scrollspy.Constructor = ScrollSpy
135
+
136
+ $.fn.scrollspy.defaults = {
137
+ offset: 10
138
+ }
139
+
140
+
141
+ /* SCROLLSPY DATA-API
142
+ * ================== */
143
+
144
+ $(function () {
145
+ $('[data-spy="scroll"]').each(function () {
146
+ var $spy = $(this)
147
+ $spy.scrollspy($spy.data())
148
+ })
149
+ })
150
+
151
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-tab.js
new
+135
@@ -0,0 +1,135 @@
1
+/* ========================================================
2
+ * bootstrap-tab.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
4
+ * ========================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ======================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* TAB CLASS DEFINITION
27
+ * ==================== */
28
+
29
+ var Tab = function ( element ) {
30
+ this.element = $(element)
31
+ }
32
+
33
+ Tab.prototype = {
34
+
35
+ constructor: Tab
36
+
37
+ , show: function () {
38
+ var $this = this.element
39
+ , $ul = $this.closest('ul:not(.dropdown-menu)')
40
+ , selector = $this.attr('data-target')
41
+ , previous
42
+ , $target
43
+ , e
44
+
45
+ if (!selector) {
46
+ selector = $this.attr('href')
47
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
48
+ }
49
+
50
+ if ( $this.parent('li').hasClass('active') ) return
51
+
52
+ previous = $ul.find('.active a').last()[0]
53
+
54
+ e = $.Event('show', {
55
+ relatedTarget: previous
56
+ })
57
+
58
+ $this.trigger(e)
59
+
60
+ if (e.isDefaultPrevented()) return
61
+
62
+ $target = $(selector)
63
+
64
+ this.activate($this.parent('li'), $ul)
65
+ this.activate($target, $target.parent(), function () {
66
+ $this.trigger({
67
+ type: 'shown'
68
+ , relatedTarget: previous
69
+ })
70
+ })
71
+ }
72
+
73
+ , activate: function ( element, container, callback) {
74
+ var $active = container.find('> .active')
75
+ , transition = callback
76
+ && $.support.transition
77
+ && $active.hasClass('fade')
78
+
79
+ function next() {
80
+ $active
81
+ .removeClass('active')
82
+ .find('> .dropdown-menu > .active')
83
+ .removeClass('active')
84
+
85
+ element.addClass('active')
86
+
87
+ if (transition) {
88
+ element[0].offsetWidth // reflow for transition
89
+ element.addClass('in')
90
+ } else {
91
+ element.removeClass('fade')
92
+ }
93
+
94
+ if ( element.parent('.dropdown-menu') ) {
95
+ element.closest('li.dropdown').addClass('active')
96
+ }
97
+
98
+ callback && callback()
99
+ }
100
+
101
+ transition ?
102
+ $active.one($.support.transition.end, next) :
103
+ next()
104
+
105
+ $active.removeClass('in')
106
+ }
107
+ }
108
+
109
+
110
+ /* TAB PLUGIN DEFINITION
111
+ * ===================== */
112
+
113
+ $.fn.tab = function ( option ) {
114
+ return this.each(function () {
115
+ var $this = $(this)
116
+ , data = $this.data('tab')
117
+ if (!data) $this.data('tab', (data = new Tab(this)))
118
+ if (typeof option == 'string') data[option]()
119
+ })
120
+ }
121
+
122
+ $.fn.tab.Constructor = Tab
123
+
124
+
125
+ /* TAB DATA-API
126
+ * ============ */
127
+
128
+ $(function () {
129
+ $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
130
+ e.preventDefault()
131
+ $(this).tab('show')
132
+ })
133
+ })
134
+
135
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-tooltip.js
new
+275
@@ -0,0 +1,275 @@
1
+/* ===========================================================
2
+ * bootstrap-tooltip.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
4
+ * Inspired by the original jQuery.tipsy by Jason Frame
5
+ * ===========================================================
6
+ * Copyright 2012 Twitter, Inc.
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ * ========================================================== */
20
+
21
+
22
+!function ($) {
23
+
24
+ "use strict"; // jshint ;_;
25
+
26
+
27
+ /* TOOLTIP PUBLIC CLASS DEFINITION
28
+ * =============================== */
29
+
30
+ var Tooltip = function (element, options) {
31
+ this.init('tooltip', element, options)
32
+ }
33
+
34
+ Tooltip.prototype = {
35
+
36
+ constructor: Tooltip
37
+
38
+ , init: function (type, element, options) {
39
+ var eventIn
40
+ , eventOut
41
+
42
+ this.type = type
43
+ this.$element = $(element)
44
+ this.options = this.getOptions(options)
45
+ this.enabled = true
46
+
47
+ if (this.options.trigger != 'manual') {
48
+ eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
49
+ eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
50
+ this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
51
+ this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
52
+ }
53
+
54
+ this.options.selector ?
55
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
56
+ this.fixTitle()
57
+ }
58
+
59
+ , getOptions: function (options) {
60
+ options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
61
+
62
+ if (options.delay && typeof options.delay == 'number') {
63
+ options.delay = {
64
+ show: options.delay
65
+ , hide: options.delay
66
+ }
67
+ }
68
+
69
+ return options
70
+ }
71
+
72
+ , enter: function (e) {
73
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
74
+
75
+ if (!self.options.delay || !self.options.delay.show) return self.show()
76
+
77
+ clearTimeout(this.timeout)
78
+ self.hoverState = 'in'
79
+ this.timeout = setTimeout(function() {
80
+ if (self.hoverState == 'in') self.show()
81
+ }, self.options.delay.show)
82
+ }
83
+
84
+ , leave: function (e) {
85
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
86
+
87
+ if (this.timeout) clearTimeout(this.timeout)
88
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
89
+
90
+ self.hoverState = 'out'
91
+ this.timeout = setTimeout(function() {
92
+ if (self.hoverState == 'out') self.hide()
93
+ }, self.options.delay.hide)
94
+ }
95
+
96
+ , show: function () {
97
+ var $tip
98
+ , inside
99
+ , pos
100
+ , actualWidth
101
+ , actualHeight
102
+ , placement
103
+ , tp
104
+
105
+ if (this.hasContent() && this.enabled) {
106
+ $tip = this.tip()
107
+ this.setContent()
108
+
109
+ if (this.options.animation) {
110
+ $tip.addClass('fade')
111
+ }
112
+
113
+ placement = typeof this.options.placement == 'function' ?
114
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
115
+ this.options.placement
116
+
117
+ inside = /in/.test(placement)
118
+
119
+ $tip
120
+ .remove()
121
+ .css({ top: 0, left: 0, display: 'block' })
122
+ .appendTo(inside ? this.$element : document.body)
123
+
124
+ pos = this.getPosition(inside)
125
+
126
+ actualWidth = $tip[0].offsetWidth
127
+ actualHeight = $tip[0].offsetHeight
128
+
129
+ switch (inside ? placement.split(' ')[1] : placement) {
130
+ case 'bottom':
131
+ tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
132
+ break
133
+ case 'top':
134
+ tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
135
+ break
136
+ case 'left':
137
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
138
+ break
139
+ case 'right':
140
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
141
+ break
142
+ }
143
+
144
+ $tip
145
+ .css(tp)
146
+ .addClass(placement)
147
+ .addClass('in')
148
+ }
149
+ }
150
+
151
+ , isHTML: function(text) {
152
+ // html string detection logic adapted from jQuery
153
+ return typeof text != 'string'
154
+ || ( text.charAt(0) === "<"
155
+ && text.charAt( text.length - 1 ) === ">"
156
+ && text.length >= 3
157
+ ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text)
158
+ }
159
+
160
+ , setContent: function () {
161
+ var $tip = this.tip()
162
+ , title = this.getTitle()
163
+
164
+ $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title)
165
+ $tip.removeClass('fade in top bottom left right')
166
+ }
167
+
168
+ , hide: function () {
169
+ var that = this
170
+ , $tip = this.tip()
171
+
172
+ $tip.removeClass('in')
173
+
174
+ function removeWithAnimation() {
175
+ var timeout = setTimeout(function () {
176
+ $tip.off($.support.transition.end).remove()
177
+ }, 500)
178
+
179
+ $tip.one($.support.transition.end, function () {
180
+ clearTimeout(timeout)
181
+ $tip.remove()
182
+ })
183
+ }
184
+
185
+ $.support.transition && this.$tip.hasClass('fade') ?
186
+ removeWithAnimation() :
187
+ $tip.remove()
188
+ }
189
+
190
+ , fixTitle: function () {
191
+ var $e = this.$element
192
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
193
+ $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
194
+ }
195
+ }
196
+
197
+ , hasContent: function () {
198
+ return this.getTitle()
199
+ }
200
+
201
+ , getPosition: function (inside) {
202
+ return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
203
+ width: this.$element[0].offsetWidth
204
+ , height: this.$element[0].offsetHeight
205
+ })
206
+ }
207
+
208
+ , getTitle: function () {
209
+ var title
210
+ , $e = this.$element
211
+ , o = this.options
212
+
213
+ title = $e.attr('data-original-title')
214
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
215
+
216
+ return title
217
+ }
218
+
219
+ , tip: function () {
220
+ return this.$tip = this.$tip || $(this.options.template)
221
+ }
222
+
223
+ , validate: function () {
224
+ if (!this.$element[0].parentNode) {
225
+ this.hide()
226
+ this.$element = null
227
+ this.options = null
228
+ }
229
+ }
230
+
231
+ , enable: function () {
232
+ this.enabled = true
233
+ }
234
+
235
+ , disable: function () {
236
+ this.enabled = false
237
+ }
238
+
239
+ , toggleEnabled: function () {
240
+ this.enabled = !this.enabled
241
+ }
242
+
243
+ , toggle: function () {
244
+ this[this.tip().hasClass('in') ? 'hide' : 'show']()
245
+ }
246
+
247
+ }
248
+
249
+
250
+ /* TOOLTIP PLUGIN DEFINITION
251
+ * ========================= */
252
+
253
+ $.fn.tooltip = function ( option ) {
254
+ return this.each(function () {
255
+ var $this = $(this)
256
+ , data = $this.data('tooltip')
257
+ , options = typeof option == 'object' && option
258
+ if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
259
+ if (typeof option == 'string') data[option]()
260
+ })
261
+ }
262
+
263
+ $.fn.tooltip.Constructor = Tooltip
264
+
265
+ $.fn.tooltip.defaults = {
266
+ animation: true
267
+ , placement: 'top'
268
+ , selector: false
269
+ , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
270
+ , trigger: 'hover'
271
+ , title: ''
272
+ , delay: 0
273
+ }
274
+
275
+}(window.jQuery);
docs/docs/likebutton/js/bootstrap-transition.js
new
+61
@@ -0,0 +1,61 @@
1
+/* ===================================================
2
+ * bootstrap-transition.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
4
+ * ===================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================== */
19
+
20
+
21
+!function ($) {
22
+
23
+ $(function () {
24
+
25
+ "use strict"; // jshint ;_;
26
+
27
+
28
+ /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
29
+ * ======================================================= */
30
+
31
+ $.support.transition = (function () {
32
+
33
+ var transitionEnd = (function () {
34
+
35
+ var el = document.createElement('bootstrap')
36
+ , transEndEventNames = {
37
+ 'WebkitTransition' : 'webkitTransitionEnd'
38
+ , 'MozTransition' : 'transitionend'
39
+ , 'OTransition' : 'oTransitionEnd'
40
+ , 'msTransition' : 'MSTransitionEnd'
41
+ , 'transition' : 'transitionend'
42
+ }
43
+ , name
44
+
45
+ for (name in transEndEventNames){
46
+ if (el.style[name] !== undefined) {
47
+ return transEndEventNames[name]
48
+ }
49
+ }
50
+
51
+ }())
52
+
53
+ return transitionEnd && {
54
+ end: transitionEnd
55
+ }
56
+
57
+ })()
58
+
59
+ })
60
+
61
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/bootstrap-typeahead.js
new
+285
@@ -0,0 +1,285 @@
1
+/* =============================================================
2
+ * bootstrap-typeahead.js v2.0.4
3
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
4
+ * =============================================================
5
+ * Copyright 2012 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ============================================================ */
19
+
20
+
21
+!function($){
22
+
23
+ "use strict"; // jshint ;_;
24
+
25
+
26
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
27
+ * ================================= */
28
+
29
+ var Typeahead = function (element, options) {
30
+ this.$element = $(element)
31
+ this.options = $.extend({}, $.fn.typeahead.defaults, options)
32
+ this.matcher = this.options.matcher || this.matcher
33
+ this.sorter = this.options.sorter || this.sorter
34
+ this.highlighter = this.options.highlighter || this.highlighter
35
+ this.updater = this.options.updater || this.updater
36
+ this.$menu = $(this.options.menu).appendTo('body')
37
+ this.source = this.options.source
38
+ this.shown = false
39
+ this.listen()
40
+ }
41
+
42
+ Typeahead.prototype = {
43
+
44
+ constructor: Typeahead
45
+
46
+ , select: function () {
47
+ var val = this.$menu.find('.active').attr('data-value')
48
+ this.$element
49
+ .val(this.updater(val))
50
+ .change()
51
+ return this.hide()
52
+ }
53
+
54
+ , updater: function (item) {
55
+ return item
56
+ }
57
+
58
+ , show: function () {
59
+ var pos = $.extend({}, this.$element.offset(), {
60
+ height: this.$element[0].offsetHeight
61
+ })
62
+
63
+ this.$menu.css({
64
+ top: pos.top + pos.height
65
+ , left: pos.left
66
+ })
67
+
68
+ this.$menu.show()
69
+ this.shown = true
70
+ return this
71
+ }
72
+
73
+ , hide: function () {
74
+ this.$menu.hide()
75
+ this.shown = false
76
+ return this
77
+ }
78
+
79
+ , lookup: function (event) {
80
+ var that = this
81
+ , items
82
+ , q
83
+
84
+ this.query = this.$element.val()
85
+
86
+ if (!this.query) {
87
+ return this.shown ? this.hide() : this
88
+ }
89
+
90
+ items = $.grep(this.source, function (item) {
91
+ return that.matcher(item)
92
+ })
93
+
94
+ items = this.sorter(items)
95
+
96
+ if (!items.length) {
97
+ return this.shown ? this.hide() : this
98
+ }
99
+
100
+ return this.render(items.slice(0, this.options.items)).show()
101
+ }
102
+
103
+ , matcher: function (item) {
104
+ return ~item.toLowerCase().indexOf(this.query.toLowerCase())
105
+ }
106
+
107
+ , sorter: function (items) {
108
+ var beginswith = []
109
+ , caseSensitive = []
110
+ , caseInsensitive = []
111
+ , item
112
+
113
+ while (item = items.shift()) {
114
+ if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
115
+ else if (~item.indexOf(this.query)) caseSensitive.push(item)
116
+ else caseInsensitive.push(item)
117
+ }
118
+
119
+ return beginswith.concat(caseSensitive, caseInsensitive)
120
+ }
121
+
122
+ , highlighter: function (item) {
123
+ var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
124
+ return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
125
+ return '<strong>' + match + '</strong>'
126
+ })
127
+ }
128
+
129
+ , render: function (items) {
130
+ var that = this
131
+
132
+ items = $(items).map(function (i, item) {
133
+ i = $(that.options.item).attr('data-value', item)
134
+ i.find('a').html(that.highlighter(item))
135
+ return i[0]
136
+ })
137
+
138
+ items.first().addClass('active')
139
+ this.$menu.html(items)
140
+ return this
141
+ }
142
+
143
+ , next: function (event) {
144
+ var active = this.$menu.find('.active').removeClass('active')
145
+ , next = active.next()
146
+
147
+ if (!next.length) {
148
+ next = $(this.$menu.find('li')[0])
149
+ }
150
+
151
+ next.addClass('active')
152
+ }
153
+
154
+ , prev: function (event) {
155
+ var active = this.$menu.find('.active').removeClass('active')
156
+ , prev = active.prev()
157
+
158
+ if (!prev.length) {
159
+ prev = this.$menu.find('li').last()
160
+ }
161
+
162
+ prev.addClass('active')
163
+ }
164
+
165
+ , listen: function () {
166
+ this.$element
167
+ .on('blur', $.proxy(this.blur, this))
168
+ .on('keypress', $.proxy(this.keypress, this))
169
+ .on('keyup', $.proxy(this.keyup, this))
170
+
171
+ if ($.browser.webkit || $.browser.msie) {
172
+ this.$element.on('keydown', $.proxy(this.keypress, this))
173
+ }
174
+
175
+ this.$menu
176
+ .on('click', $.proxy(this.click, this))
177
+ .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
178
+ }
179
+
180
+ , keyup: function (e) {
181
+ switch(e.keyCode) {
182
+ case 40: // down arrow
183
+ case 38: // up arrow
184
+ break
185
+
186
+ case 9: // tab
187
+ case 13: // enter
188
+ if (!this.shown) return
189
+ this.select()
190
+ break
191
+
192
+ case 27: // escape
193
+ if (!this.shown) return
194
+ this.hide()
195
+ break
196
+
197
+ default:
198
+ this.lookup()
199
+ }
200
+
201
+ e.stopPropagation()
202
+ e.preventDefault()
203
+ }
204
+
205
+ , keypress: function (e) {
206
+ if (!this.shown) return
207
+
208
+ switch(e.keyCode) {
209
+ case 9: // tab
210
+ case 13: // enter
211
+ case 27: // escape
212
+ e.preventDefault()
213
+ break
214
+
215
+ case 38: // up arrow
216
+ if (e.type != 'keydown') break
217
+ e.preventDefault()
218
+ this.prev()
219
+ break
220
+
221
+ case 40: // down arrow
222
+ if (e.type != 'keydown') break
223
+ e.preventDefault()
224
+ this.next()
225
+ break
226
+ }
227
+
228
+ e.stopPropagation()
229
+ }
230
+
231
+ , blur: function (e) {
232
+ var that = this
233
+ setTimeout(function () { that.hide() }, 150)
234
+ }
235
+
236
+ , click: function (e) {
237
+ e.stopPropagation()
238
+ e.preventDefault()
239
+ this.select()
240
+ }
241
+
242
+ , mouseenter: function (e) {
243
+ this.$menu.find('.active').removeClass('active')
244
+ $(e.currentTarget).addClass('active')
245
+ }
246
+
247
+ }
248
+
249
+
250
+ /* TYPEAHEAD PLUGIN DEFINITION
251
+ * =========================== */
252
+
253
+ $.fn.typeahead = function (option) {
254
+ return this.each(function () {
255
+ var $this = $(this)
256
+ , data = $this.data('typeahead')
257
+ , options = typeof option == 'object' && option
258
+ if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
259
+ if (typeof option == 'string') data[option]()
260
+ })
261
+ }
262
+
263
+ $.fn.typeahead.defaults = {
264
+ source: []
265
+ , items: 8
266
+ , menu: '<ul class="typeahead dropdown-menu"></ul>'
267
+ , item: '<li><a href="#"></a></li>'
268
+ }
269
+
270
+ $.fn.typeahead.Constructor = Typeahead
271
+
272
+
273
+ /* TYPEAHEAD DATA-API
274
+ * ================== */
275
+
276
+ $(function () {
277
+ $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
278
+ var $this = $(this)
279
+ if ($this.data('typeahead')) return
280
+ e.preventDefault()
281
+ $this.typeahead($this.data())
282
+ })
283
+ })
284
+
285
+}(window.jQuery);
\ No newline at end of file
docs/docs/likebutton/js/tests/index.html
new
+54
@@ -0,0 +1,54 @@
1
+<!DOCTYPE HTML>
2
+<html>
3
+<head>
4
+ <title>Bootstrap Plugin Test Suite</title>
5
+
6
+ <!-- jquery -->
7
+ <!--<script src="http://code.jquery.com/jquery-1.7.min.js"></script>-->
8
+ <script src="vendor/jquery.js"></script>
9
+
10
+ <!-- qunit -->
11
+ <link rel="stylesheet" href="vendor/qunit.css" type="text/css" media="screen" />
12
+ <script src="vendor/qunit.js"></script>
13
+
14
+ <!-- phantomjs logging script-->
15
+ <script src="unit/bootstrap-phantom.js"></script>
16
+
17
+ <!-- plugin sources -->
18
+ <script src="../../js/bootstrap-transition.js"></script>
19
+ <script src="../../js/bootstrap-alert.js"></script>
20
+ <script src="../../js/bootstrap-button.js"></script>
21
+ <script src="../../js/bootstrap-carousel.js"></script>
22
+ <script src="../../js/bootstrap-collapse.js"></script>
23
+ <script src="../../js/bootstrap-dropdown.js"></script>
24
+ <script src="../../js/bootstrap-modal.js"></script>
25
+ <script src="../../js/bootstrap-scrollspy.js"></script>
26
+ <script src="../../js/bootstrap-tab.js"></script>
27
+ <script src="../../js/bootstrap-tooltip.js"></script>
28
+ <script src="../../js/bootstrap-popover.js"></script>
29
+ <script src="../../js/bootstrap-typeahead.js"></script>
30
+
31
+ <!-- unit tests -->
32
+ <script src="unit/bootstrap-transition.js"></script>
33
+ <script src="unit/bootstrap-alert.js"></script>
34
+ <script src="unit/bootstrap-button.js"></script>
35
+ <script src="unit/bootstrap-carousel.js"></script>
36
+ <script src="unit/bootstrap-collapse.js"></script>
37
+ <script src="unit/bootstrap-dropdown.js"></script>
38
+ <script src="unit/bootstrap-modal.js"></script>
39
+ <script src="unit/bootstrap-scrollspy.js"></script>
40
+ <script src="unit/bootstrap-tab.js"></script>
41
+ <script src="unit/bootstrap-tooltip.js"></script>
42
+ <script src="unit/bootstrap-popover.js"></script>
43
+ <script src="unit/bootstrap-typeahead.js"></script>
44
+</head>
45
+<body>
46
+ <div>
47
+ <h1 id="qunit-header">Bootstrap Plugin Test Suite</h1>
48
+ <h2 id="qunit-banner"></h2>
49
+ <h2 id="qunit-userAgent"></h2>
50
+ <ol id="qunit-tests"></ol>
51
+ <div id="qunit-fixture"></div>
52
+ </div>
53
+</body>
54
+</html>
\ No newline at end of file
docs/docs/likebutton/js/tests/phantom.js
new
+63
@@ -0,0 +1,63 @@
1
+// Simple phantom.js integration script
2
+// Adapted from Modernizr
3
+
4
+function waitFor(testFx, onReady, timeOutMillis) {
5
+ var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 5001 //< Default Max Timout is 5s
6
+ , start = new Date().getTime()
7
+ , condition = false
8
+ , interval = setInterval(function () {
9
+ if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
10
+ // If not time-out yet and condition not yet fulfilled
11
+ condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()) //< defensive code
12
+ } else {
13
+ if (!condition) {
14
+ // If condition still not fulfilled (timeout but condition is 'false')
15
+ console.log("'waitFor()' timeout")
16
+ phantom.exit(1)
17
+ } else {
18
+ // Condition fulfilled (timeout and/or condition is 'true')
19
+ typeof(onReady) === "string" ? eval(onReady) : onReady() //< Do what it's supposed to do once the condition is fulfilled
20
+ clearInterval(interval) //< Stop this interval
21
+ }
22
+ }
23
+ }, 100) //< repeat check every 100ms
24
+}
25
+
26
+
27
+if (phantom.args.length === 0 || phantom.args.length > 2) {
28
+ console.log('Usage: phantom.js URL')
29
+ phantom.exit()
30
+}
31
+
32
+var page = new WebPage()
33
+
34
+// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
35
+page.onConsoleMessage = function(msg) {
36
+ console.log(msg)
37
+};
38
+
39
+page.open(phantom.args[0], function(status){
40
+ if (status !== "success") {
41
+ console.log("Unable to access network")
42
+ phantom.exit()
43
+ } else {
44
+ waitFor(function(){
45
+ return page.evaluate(function(){
46
+ var el = document.getElementById('qunit-testresult')
47
+ if (el && el.innerText.match('completed')) {
48
+ return true
49
+ }
50
+ return false
51
+ })
52
+ }, function(){
53
+ var failedNum = page.evaluate(function(){
54
+ var el = document.getElementById('qunit-testresult')
55
+ try {
56
+ return el.getElementsByClassName('failed')[0].innerHTML
57
+ } catch (e) { }
58
+ return 10000
59
+ });
60
+ phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0)
61
+ })
62
+ }
63
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/server.js
new
+14
@@ -0,0 +1,14 @@
1
+/*
2
+ * Simple connect server for phantom.js
3
+ * Adapted from Modernizr
4
+ */
5
+
6
+var connect = require('connect')
7
+ , http = require('http')
8
+ , fs = require('fs')
9
+ , app = connect()
10
+ .use(connect.static(__dirname + '/../../'));
11
+
12
+http.createServer(app).listen(3000);
13
+
14
+fs.writeFileSync(__dirname + '/pid.txt', process.pid, 'utf-8')
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-alert.js
new
+56
@@ -0,0 +1,56 @@
1
+$(function () {
2
+
3
+ module("bootstrap-alerts")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ ok($(document.body).alert, 'alert method is defined')
7
+ })
8
+
9
+ test("should return element", function () {
10
+ ok($(document.body).alert()[0] == document.body, 'document.body returned')
11
+ })
12
+
13
+ test("should fade element out on clicking .close", function () {
14
+ var alertHTML = '<div class="alert-message warning fade in">'
15
+ + '<a class="close" href="#" data-dismiss="alert">×</a>'
16
+ + '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>'
17
+ + '</div>'
18
+ , alert = $(alertHTML).alert()
19
+
20
+ alert.find('.close').click()
21
+
22
+ ok(!alert.hasClass('in'), 'remove .in class on .close click')
23
+ })
24
+
25
+ test("should remove element when clicking .close", function () {
26
+ $.support.transition = false
27
+
28
+ var alertHTML = '<div class="alert-message warning fade in">'
29
+ + '<a class="close" href="#" data-dismiss="alert">×</a>'
30
+ + '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>'
31
+ + '</div>'
32
+ , alert = $(alertHTML).appendTo('#qunit-fixture').alert()
33
+
34
+ ok($('#qunit-fixture').find('.alert-message').length, 'element added to dom')
35
+
36
+ alert.find('.close').click()
37
+
38
+ ok(!$('#qunit-fixture').find('.alert-message').length, 'element removed from dom')
39
+ })
40
+
41
+ test("should not fire closed when close is prevented", function () {
42
+ $.support.transition = false
43
+ stop();
44
+ $('<div class="alert"/>')
45
+ .bind('close', function (e) {
46
+ e.preventDefault();
47
+ ok(true);
48
+ start();
49
+ })
50
+ .bind('closed', function () {
51
+ ok(false);
52
+ })
53
+ .alert('close')
54
+ })
55
+
56
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-button.js
new
+77
@@ -0,0 +1,77 @@
1
+$(function () {
2
+
3
+ module("bootstrap-buttons")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ ok($(document.body).button, 'button method is defined')
7
+ })
8
+
9
+ test("should return element", function () {
10
+ ok($(document.body).button()[0] == document.body, 'document.body returned')
11
+ })
12
+
13
+ test("should return set state to loading", function () {
14
+ var btn = $('<button class="btn" data-loading-text="fat">mdo</button>')
15
+ equals(btn.html(), 'mdo', 'btn text equals mdo')
16
+ btn.button('loading')
17
+ equals(btn.html(), 'fat', 'btn text equals fat')
18
+ stop()
19
+ setTimeout(function () {
20
+ ok(btn.attr('disabled'), 'btn is disabled')
21
+ ok(btn.hasClass('disabled'), 'btn has disabled class')
22
+ start()
23
+ }, 0)
24
+ })
25
+
26
+ test("should return reset state", function () {
27
+ var btn = $('<button class="btn" data-loading-text="fat">mdo</button>')
28
+ equals(btn.html(), 'mdo', 'btn text equals mdo')
29
+ btn.button('loading')
30
+ equals(btn.html(), 'fat', 'btn text equals fat')
31
+ stop()
32
+ setTimeout(function () {
33
+ ok(btn.attr('disabled'), 'btn is disabled')
34
+ ok(btn.hasClass('disabled'), 'btn has disabled class')
35
+ start()
36
+ stop()
37
+ }, 0)
38
+ btn.button('reset')
39
+ equals(btn.html(), 'mdo', 'btn text equals mdo')
40
+ setTimeout(function () {
41
+ ok(!btn.attr('disabled'), 'btn is not disabled')
42
+ ok(!btn.hasClass('disabled'), 'btn does not have disabled class')
43
+ start()
44
+ }, 0)
45
+ })
46
+
47
+ test("should toggle active", function () {
48
+ var btn = $('<button class="btn">mdo</button>')
49
+ ok(!btn.hasClass('active'), 'btn does not have active class')
50
+ btn.button('toggle')
51
+ ok(btn.hasClass('active'), 'btn has class active')
52
+ })
53
+
54
+ test("should toggle active when btn children are clicked", function () {
55
+ var btn = $('<button class="btn" data-toggle="button">mdo</button>')
56
+ , inner = $('<i></i>')
57
+ btn
58
+ .append(inner)
59
+ .appendTo($('#qunit-fixture'))
60
+ ok(!btn.hasClass('active'), 'btn does not have active class')
61
+ inner.click()
62
+ ok(btn.hasClass('active'), 'btn has class active')
63
+ })
64
+
65
+ test("should toggle active when btn children are clicked within btn-group", function () {
66
+ var btngroup = $('<div class="btn-group" data-toggle="buttons-checkbox"></div>')
67
+ , btn = $('<button class="btn">fat</button>')
68
+ , inner = $('<i></i>')
69
+ btngroup
70
+ .append(btn.append(inner))
71
+ .appendTo($('#qunit-fixture'))
72
+ ok(!btn.hasClass('active'), 'btn does not have active class')
73
+ inner.click()
74
+ ok(btn.hasClass('active'), 'btn has class active')
75
+ })
76
+
77
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-carousel.js
new
+28
@@ -0,0 +1,28 @@
1
+$(function () {
2
+
3
+ module("bootstrap-carousel")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ ok($(document.body).carousel, 'carousel method is defined')
7
+ })
8
+
9
+ test("should return element", function () {
10
+ ok($(document.body).carousel()[0] == document.body, 'document.body returned')
11
+ })
12
+
13
+ test("should not fire sliden when slide is prevented", function () {
14
+ $.support.transition = false
15
+ stop();
16
+ $('<div class="carousel"/>')
17
+ .bind('slide', function (e) {
18
+ e.preventDefault();
19
+ ok(true);
20
+ start();
21
+ })
22
+ .bind('slid', function () {
23
+ ok(false);
24
+ })
25
+ .carousel('next')
26
+ })
27
+
28
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-collapse.js
new
+54
@@ -0,0 +1,54 @@
1
+$(function () {
2
+
3
+ module("bootstrap-collapse")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ ok($(document.body).collapse, 'collapse method is defined')
7
+ })
8
+
9
+ test("should return element", function () {
10
+ ok($(document.body).collapse()[0] == document.body, 'document.body returned')
11
+ })
12
+
13
+ test("should show a collapsed element", function () {
14
+ var el = $('<div class="collapse"></div>').collapse('show')
15
+ ok(el.hasClass('in'), 'has class in')
16
+ ok(/height/.test(el.attr('style')), 'has height set')
17
+ })
18
+
19
+ test("should hide a collapsed element", function () {
20
+ var el = $('<div class="collapse"></div>').collapse('hide')
21
+ ok(!el.hasClass('in'), 'does not have class in')
22
+ ok(/height/.test(el.attr('style')), 'has height set')
23
+ })
24
+
25
+ test("should not fire shown when show is prevented", function () {
26
+ $.support.transition = false
27
+ stop();
28
+ $('<div class="collapse"/>')
29
+ .bind('show', function (e) {
30
+ e.preventDefault();
31
+ ok(true);
32
+ start();
33
+ })
34
+ .bind('shown', function () {
35
+ ok(false);
36
+ })
37
+ .collapse('show')
38
+ })
39
+
40
+ test("should reset style to auto after finishing opening collapse", function () {
41
+ $.support.transition = false
42
+ stop();
43
+ $('<div class="collapse" style="height: 0px"/>')
44
+ .bind('show', function () {
45
+ ok(this.style.height == '0px')
46
+ })
47
+ .bind('shown', function () {
48
+ ok(this.style.height == 'auto')
49
+ start()
50
+ })
51
+ .collapse('show')
52
+ })
53
+
54
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-dropdown.js
new
+87
@@ -0,0 +1,87 @@
1
+$(function () {
2
+
3
+ module("bootstrap-dropdowns")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ ok($(document.body).dropdown, 'dropdown method is defined')
7
+ })
8
+
9
+ test("should return element", function () {
10
+ ok($(document.body).dropdown()[0] == document.body, 'document.body returned')
11
+ })
12
+
13
+ test("should not open dropdown if target is disabled", function () {
14
+ var dropdownHTML = '<ul class="tabs">'
15
+ + '<li class="dropdown">'
16
+ + '<button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>'
17
+ + '<ul class="dropdown-menu">'
18
+ + '<li><a href="#">Secondary link</a></li>'
19
+ + '<li><a href="#">Something else here</a></li>'
20
+ + '<li class="divider"></li>'
21
+ + '<li><a href="#">Another link</a></li>'
22
+ + '</ul>'
23
+ + '</li>'
24
+ + '</ul>'
25
+ , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click()
26
+
27
+ ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')
28
+ })
29
+
30
+ test("should not open dropdown if target is disabled", function () {
31
+ var dropdownHTML = '<ul class="tabs">'
32
+ + '<li class="dropdown">'
33
+ + '<button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>'
34
+ + '<ul class="dropdown-menu">'
35
+ + '<li><a href="#">Secondary link</a></li>'
36
+ + '<li><a href="#">Something else here</a></li>'
37
+ + '<li class="divider"></li>'
38
+ + '<li><a href="#">Another link</a></li>'
39
+ + '</ul>'
40
+ + '</li>'
41
+ + '</ul>'
42
+ , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click()
43
+
44
+ ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')
45
+ })
46
+
47
+ test("should add class open to menu if clicked", function () {
48
+ var dropdownHTML = '<ul class="tabs">'
49
+ + '<li class="dropdown">'
50
+ + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
51
+ + '<ul class="dropdown-menu">'
52
+ + '<li><a href="#">Secondary link</a></li>'
53
+ + '<li><a href="#">Something else here</a></li>'
54
+ + '<li class="divider"></li>'
55
+ + '<li><a href="#">Another link</a></li>'
56
+ + '</ul>'
57
+ + '</li>'
58
+ + '</ul>'
59
+ , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click()
60
+
61
+ ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')
62
+ })
63
+
64
+ test("should remove open class if body clicked", function () {
65
+ var dropdownHTML = '<ul class="tabs">'
66
+ + '<li class="dropdown">'
67
+ + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
68
+ + '<ul class="dropdown-menu">'
69
+ + '<li><a href="#">Secondary link</a></li>'
70
+ + '<li><a href="#">Something else here</a></li>'
71
+ + '<li class="divider"></li>'
72
+ + '<li><a href="#">Another link</a></li>'
73
+ + '</ul>'
74
+ + '</li>'
75
+ + '</ul>'
76
+ , dropdown = $(dropdownHTML)
77
+ .appendTo('#qunit-fixture')
78
+ .find('[data-toggle="dropdown"]')
79
+ .dropdown()
80
+ .click()
81
+ ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')
82
+ $('body').click()
83
+ ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class removed')
84
+ dropdown.remove()
85
+ })
86
+
87
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-modal.js
new
+114
@@ -0,0 +1,114 @@
1
+$(function () {
2
+
3
+ module("bootstrap-modal")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ var div = $("<div id='modal-test'></div>")
7
+ ok(div.modal, 'modal method is defined')
8
+ })
9
+
10
+ test("should return element", function () {
11
+ var div = $("<div id='modal-test'></div>")
12
+ ok(div.modal() == div, 'document.body returned')
13
+ $('#modal-test').remove()
14
+ })
15
+
16
+ test("should expose defaults var for settings", function () {
17
+ ok($.fn.modal.defaults, 'default object exposed')
18
+ })
19
+
20
+ test("should insert into dom when show method is called", function () {
21
+ stop()
22
+ $.support.transition = false
23
+ $("<div id='modal-test'></div>")
24
+ .bind("shown", function () {
25
+ ok($('#modal-test').length, 'modal insterted into dom')
26
+ $(this).remove()
27
+ start()
28
+ })
29
+ .modal("show")
30
+ })
31
+
32
+ test("should fire show event", function () {
33
+ stop()
34
+ $.support.transition = false
35
+ $("<div id='modal-test'></div>")
36
+ .bind("show", function () {
37
+ ok(true, "show was called")
38
+ })
39
+ .bind("shown", function () {
40
+ $(this).remove()
41
+ start()
42
+ })
43
+ .modal("show")
44
+ })
45
+
46
+ test("should not fire shown when default prevented", function () {
47
+ stop()
48
+ $.support.transition = false
49
+ $("<div id='modal-test'></div>")
50
+ .bind("show", function (e) {
51
+ e.preventDefault()
52
+ ok(true, "show was called")
53
+ start()
54
+ })
55
+ .bind("shown", function () {
56
+ ok(false, "shown was called")
57
+ })
58
+ .modal("show")
59
+ })
60
+
61
+ test("should hide modal when hide is called", function () {
62
+ stop()
63
+ $.support.transition = false
64
+
65
+ $("<div id='modal-test'></div>")
66
+ .bind("shown", function () {
67
+ ok($('#modal-test').is(":visible"), 'modal visible')
68
+ ok($('#modal-test').length, 'modal insterted into dom')
69
+ $(this).modal("hide")
70
+ })
71
+ .bind("hidden", function() {
72
+ ok(!$('#modal-test').is(":visible"), 'modal hidden')
73
+ $('#modal-test').remove()
74
+ start()
75
+ })
76
+ .modal("show")
77
+ })
78
+
79
+ test("should toggle when toggle is called", function () {
80
+ stop()
81
+ $.support.transition = false
82
+ var div = $("<div id='modal-test'></div>")
83
+ div
84
+ .bind("shown", function () {
85
+ ok($('#modal-test').is(":visible"), 'modal visible')
86
+ ok($('#modal-test').length, 'modal insterted into dom')
87
+ div.modal("toggle")
88
+ })
89
+ .bind("hidden", function() {
90
+ ok(!$('#modal-test').is(":visible"), 'modal hidden')
91
+ div.remove()
92
+ start()
93
+ })
94
+ .modal("toggle")
95
+ })
96
+
97
+ test("should remove from dom when click [data-dismiss=modal]", function () {
98
+ stop()
99
+ $.support.transition = false
100
+ var div = $("<div id='modal-test'><span class='close' data-dismiss='modal'></span></div>")
101
+ div
102
+ .bind("shown", function () {
103
+ ok($('#modal-test').is(":visible"), 'modal visible')
104
+ ok($('#modal-test').length, 'modal insterted into dom')
105
+ div.find('.close').click()
106
+ })
107
+ .bind("hidden", function() {
108
+ ok(!$('#modal-test').is(":visible"), 'modal hidden')
109
+ div.remove()
110
+ start()
111
+ })
112
+ .modal("toggle")
113
+ })
114
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-phantom.js
new
+21
@@ -0,0 +1,21 @@
1
+// Logging setup for phantom integration
2
+// adapted from Modernizr
3
+
4
+QUnit.begin = function () {
5
+ console.log("Starting test suite")
6
+ console.log("================================================\n")
7
+}
8
+
9
+QUnit.moduleDone = function (opts) {
10
+ if (opts.failed === 0) {
11
+ console.log("\u2714 All tests passed in '" + opts.name + "' module")
12
+ } else {
13
+ console.log("\u2716 " + opts.failed + " tests failed in '" + opts.name + "' module")
14
+ }
15
+}
16
+
17
+QUnit.done = function (opts) {
18
+ console.log("\n================================================")
19
+ console.log("Tests completed in " + opts.runtime + " milliseconds")
20
+ console.log(opts.passed + " tests of " + opts.total + " passed, " + opts.failed + " failed.")
21
+}
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-popover.js
new
+93
@@ -0,0 +1,93 @@
1
+$(function () {
2
+
3
+ module("bootstrap-popover")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ var div = $('<div></div>')
7
+ ok(div.popover, 'popover method is defined')
8
+ })
9
+
10
+ test("should return element", function () {
11
+ var div = $('<div></div>')
12
+ ok(div.popover() == div, 'document.body returned')
13
+ })
14
+
15
+ test("should render popover element", function () {
16
+ $.support.transition = false
17
+ var popover = $('<a href="#" title="mdo" data-content="http://twitter.com/mdo">@mdo</a>')
18
+ .appendTo('#qunit-fixture')
19
+ .popover('show')
20
+
21
+ ok($('.popover').length, 'popover was inserted')
22
+ popover.popover('hide')
23
+ ok(!$(".popover").length, 'popover removed')
24
+ })
25
+
26
+ test("should store popover instance in popover data object", function () {
27
+ $.support.transition = false
28
+ var popover = $('<a href="#" title="mdo" data-content="http://twitter.com/mdo">@mdo</a>')
29
+ .popover()
30
+
31
+ ok(!!popover.data('popover'), 'popover instance exists')
32
+ })
33
+
34
+ test("should get title and content from options", function () {
35
+ $.support.transition = false
36
+ var popover = $('<a href="#">@fat</a>')
37
+ .appendTo('#qunit-fixture')
38
+ .popover({
39
+ title: function () {
40
+ return '@fat'
41
+ }
42
+ , content: function () {
43
+ return 'loves writing tests (╯°□°)╯︵ ┻━┻'
44
+ }
45
+ })
46
+
47
+ popover.popover('show')
48
+
49
+ ok($('.popover').length, 'popover was inserted')
50
+ equals($('.popover .popover-title').text(), '@fat', 'title correctly inserted')
51
+ equals($('.popover .popover-content').text(), 'loves writing tests (╯°□°)╯︵ ┻━┻', 'content correctly inserted')
52
+
53
+ popover.popover('hide')
54
+ ok(!$('.popover').length, 'popover was removed')
55
+ $('#qunit-fixture').empty()
56
+ })
57
+
58
+ test("should get title and content from attributes", function () {
59
+ $.support.transition = false
60
+ var popover = $('<a href="#" title="@mdo" data-content="loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻" >@mdo</a>')
61
+ .appendTo('#qunit-fixture')
62
+ .popover()
63
+ .popover('show')
64
+
65
+ ok($('.popover').length, 'popover was inserted')
66
+ equals($('.popover .popover-title').text(), '@mdo', 'title correctly inserted')
67
+ equals($('.popover .popover-content').text(), "loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻", 'content correctly inserted')
68
+
69
+ popover.popover('hide')
70
+ ok(!$('.popover').length, 'popover was removed')
71
+ $('#qunit-fixture').empty()
72
+ })
73
+
74
+ test("should respect custom classes", function() {
75
+ $.support.transition = false
76
+ var popover = $('<a href="#">@fat</a>')
77
+ .appendTo('#qunit-fixture')
78
+ .popover({
79
+ title: 'Test'
80
+ , content: 'Test'
81
+ , template: '<div class="popover foobar"><div class="arrow"></div><div class="inner"><h3 class="title"></h3><div class="content"><p></p></div></div></div>'
82
+ })
83
+
84
+ popover.popover('show')
85
+
86
+ ok($('.popover').length, 'popover was inserted')
87
+ ok($('.popover').hasClass('foobar'), 'custom class is present')
88
+
89
+ popover.popover('hide')
90
+ ok(!$('.popover').length, 'popover was removed')
91
+ $('#qunit-fixture').empty()
92
+ })
93
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-scrollspy.js
new
+31
@@ -0,0 +1,31 @@
1
+$(function () {
2
+
3
+ module("bootstrap-scrollspy")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ ok($(document.body).scrollspy, 'scrollspy method is defined')
7
+ })
8
+
9
+ test("should return element", function () {
10
+ ok($(document.body).scrollspy()[0] == document.body, 'document.body returned')
11
+ })
12
+
13
+ test("should switch active class on scroll", function () {
14
+ var sectionHTML = '<div id="masthead"></div>'
15
+ , $section = $(sectionHTML).append('#qunit-fixture')
16
+ , topbarHTML ='<div class="topbar">'
17
+ + '<div class="topbar-inner">'
18
+ + '<div class="container">'
19
+ + '<h3><a href="#">Bootstrap</a></h3>'
20
+ + '<ul class="nav">'
21
+ + '<li><a href="#masthead">Overview</a></li>'
22
+ + '</ul>'
23
+ + '</div>'
24
+ + '</div>'
25
+ + '</div>'
26
+ , $topbar = $(topbarHTML).scrollspy()
27
+
28
+ ok($topbar.find('.active', true))
29
+ })
30
+
31
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-tab.js
new
+61
@@ -0,0 +1,61 @@
1
+$(function () {
2
+
3
+ module("bootstrap-tabs")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ ok($(document.body).tab, 'tabs method is defined')
7
+ })
8
+
9
+ test("should return element", function () {
10
+ ok($(document.body).tab()[0] == document.body, 'document.body returned')
11
+ })
12
+
13
+ test("should activate element by tab id", function () {
14
+ var tabsHTML =
15
+ '<ul class="tabs">'
16
+ + '<li><a href="#home">Home</a></li>'
17
+ + '<li><a href="#profile">Profile</a></li>'
18
+ + '</ul>'
19
+
20
+ $('<ul><li id="home"></li><li id="profile"></li></ul>').appendTo("#qunit-fixture")
21
+
22
+ $(tabsHTML).find('li:last a').tab('show')
23
+ equals($("#qunit-fixture").find('.active').attr('id'), "profile")
24
+
25
+ $(tabsHTML).find('li:first a').tab('show')
26
+ equals($("#qunit-fixture").find('.active').attr('id'), "home")
27
+ })
28
+
29
+ test("should activate element by tab id", function () {
30
+ var pillsHTML =
31
+ '<ul class="pills">'
32
+ + '<li><a href="#home">Home</a></li>'
33
+ + '<li><a href="#profile">Profile</a></li>'
34
+ + '</ul>'
35
+
36
+ $('<ul><li id="home"></li><li id="profile"></li></ul>').appendTo("#qunit-fixture")
37
+
38
+ $(pillsHTML).find('li:last a').tab('show')
39
+ equals($("#qunit-fixture").find('.active').attr('id'), "profile")
40
+
41
+ $(pillsHTML).find('li:first a').tab('show')
42
+ equals($("#qunit-fixture").find('.active').attr('id'), "home")
43
+ })
44
+
45
+
46
+ test("should not fire closed when close is prevented", function () {
47
+ $.support.transition = false
48
+ stop();
49
+ $('<div class="tab"/>')
50
+ .bind('show', function (e) {
51
+ e.preventDefault();
52
+ ok(true);
53
+ start();
54
+ })
55
+ .bind('shown', function () {
56
+ ok(false);
57
+ })
58
+ .tab('show')
59
+ })
60
+
61
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-tooltip.js
new
+155
@@ -0,0 +1,155 @@
1
+$(function () {
2
+
3
+ module("bootstrap-tooltip")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ var div = $("<div></div>")
7
+ ok(div.tooltip, 'popover method is defined')
8
+ })
9
+
10
+ test("should return element", function () {
11
+ var div = $("<div></div>")
12
+ ok(div.tooltip() == div, 'document.body returned')
13
+ })
14
+
15
+ test("should expose default settings", function () {
16
+ ok(!!$.fn.tooltip.defaults, 'defaults is defined')
17
+ })
18
+
19
+ test("should remove title attribute", function () {
20
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').tooltip()
21
+ ok(!tooltip.attr('title'), 'title tag was removed')
22
+ })
23
+
24
+ test("should add data attribute for referencing original title", function () {
25
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').tooltip()
26
+ equals(tooltip.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')
27
+ })
28
+
29
+ test("should place tooltips relative to placement option", function () {
30
+ $.support.transition = false
31
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
32
+ .appendTo('#qunit-fixture')
33
+ .tooltip({placement: 'bottom'})
34
+ .tooltip('show')
35
+
36
+ ok($(".tooltip").is('.fade.bottom.in'), 'has correct classes applied')
37
+ tooltip.tooltip('hide')
38
+ })
39
+
40
+ test("should always allow html entities", function () {
41
+ $.support.transition = false
42
+ var tooltip = $('<a href="#" rel="tooltip" title="<b>@fat</b>"></a>')
43
+ .appendTo('#qunit-fixture')
44
+ .tooltip('show')
45
+
46
+ ok($('.tooltip b').length, 'b tag was inserted')
47
+ tooltip.tooltip('hide')
48
+ ok(!$(".tooltip").length, 'tooltip removed')
49
+ })
50
+
51
+ test("should respect custom classes", function () {
52
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
53
+ .appendTo('#qunit-fixture')
54
+ .tooltip({ template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>'})
55
+ .tooltip('show')
56
+
57
+ ok($('.tooltip').hasClass('some-class'), 'custom class is present')
58
+ tooltip.tooltip('hide')
59
+ ok(!$(".tooltip").length, 'tooltip removed')
60
+ })
61
+
62
+ test("should not show tooltip if leave event occurs before delay expires", function () {
63
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
64
+ .appendTo('#qunit-fixture')
65
+ .tooltip({ delay: 200 })
66
+
67
+ stop()
68
+
69
+ tooltip.trigger('mouseenter')
70
+
71
+ setTimeout(function () {
72
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
73
+ tooltip.trigger('mouseout')
74
+ setTimeout(function () {
75
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
76
+ start()
77
+ }, 200)
78
+ }, 100)
79
+ })
80
+
81
+ test("should not show tooltip if leave event occurs before delay expires, even if hide delay is 0", function () {
82
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
83
+ .appendTo('#qunit-fixture')
84
+ .tooltip({ delay: { show: 200, hide: 0} })
85
+
86
+ stop()
87
+
88
+ tooltip.trigger('mouseenter')
89
+
90
+ setTimeout(function () {
91
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
92
+ tooltip.trigger('mouseout')
93
+ setTimeout(function () {
94
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
95
+ start()
96
+ }, 200)
97
+ }, 100)
98
+ })
99
+
100
+ test("should not show tooltip if leave event occurs before delay expires", function () {
101
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
102
+ .appendTo('#qunit-fixture')
103
+ .tooltip({ delay: 100 })
104
+ stop()
105
+ tooltip.trigger('mouseenter')
106
+ setTimeout(function () {
107
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
108
+ tooltip.trigger('mouseout')
109
+ setTimeout(function () {
110
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
111
+ start()
112
+ }, 100)
113
+ }, 50)
114
+ })
115
+
116
+ test("should show tooltip if leave event hasn't occured before delay expires", function () {
117
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
118
+ .appendTo('#qunit-fixture')
119
+ .tooltip({ delay: 150 })
120
+ stop()
121
+ tooltip.trigger('mouseenter')
122
+ setTimeout(function () {
123
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
124
+ }, 100)
125
+ setTimeout(function () {
126
+ ok($(".tooltip").is('.fade.in'), 'tooltip has faded in')
127
+ start()
128
+ }, 200)
129
+ })
130
+
131
+ test("should detect if title string is html or text: foo", function () {
132
+ ok(!$.fn.tooltip.Constructor.prototype.isHTML('foo'), 'correctly detected html')
133
+ })
134
+
135
+ test("should detect if title string is html or text: &lt;foo&gt;", function () {
136
+ ok(!$.fn.tooltip.Constructor.prototype.isHTML('<foo>'), 'correctly detected html')
137
+ })
138
+
139
+ test("should detect if title string is html or text: <div>foo</div>", function () {
140
+ ok($.fn.tooltip.Constructor.prototype.isHTML('<div>foo</div>'), 'correctly detected html')
141
+ })
142
+
143
+ test("should detect if title string is html or text: asdfa<div>foo</div>asdfasdf", function () {
144
+ ok($.fn.tooltip.Constructor.prototype.isHTML('asdfa<div>foo</div>asdfasdf'), 'correctly detected html')
145
+ })
146
+
147
+ test("should detect if title string is html or text: document.createElement('div')", function () {
148
+ ok($.fn.tooltip.Constructor.prototype.isHTML(document.createElement('div')), 'correctly detected html')
149
+ })
150
+
151
+ test("should detect if title string is html or text: $('<div />)", function () {
152
+ ok($.fn.tooltip.Constructor.prototype.isHTML($('<div></div>')), 'correctly detected html')
153
+ })
154
+
155
+})
docs/docs/likebutton/js/tests/unit/bootstrap-transition.js
new
+13
@@ -0,0 +1,13 @@
1
+$(function () {
2
+
3
+ module("bootstrap-transition")
4
+
5
+ test("should be defined on jquery support object", function () {
6
+ ok($.support.transition !== undefined, 'transition object is defined')
7
+ })
8
+
9
+ test("should provide an end object", function () {
10
+ ok($.support.transition ? $.support.transition.end : true, 'end string is defined')
11
+ })
12
+
13
+})
\ No newline at end of file
docs/docs/likebutton/js/tests/unit/bootstrap-typeahead.js
new
+148
@@ -0,0 +1,148 @@
1
+$(function () {
2
+
3
+ module("bootstrap-typeahead")
4
+
5
+ test("should be defined on jquery object", function () {
6
+ ok($(document.body).typeahead, 'alert method is defined')
7
+ })
8
+
9
+ test("should return element", function () {
10
+ ok($(document.body).typeahead()[0] == document.body, 'document.body returned')
11
+ })
12
+
13
+ test("should listen to an input", function () {
14
+ var $input = $('<input />')
15
+ $input.typeahead()
16
+ ok($input.data('events').blur, 'has a blur event')
17
+ ok($input.data('events').keypress, 'has a keypress event')
18
+ ok($input.data('events').keyup, 'has a keyup event')
19
+ if ($.browser.webkit || $.browser.msie) {
20
+ ok($input.data('events').keydown, 'has a keydown event')
21
+ } else {
22
+ ok($input.data('events').keydown, 'does not have a keydown event')
23
+ }
24
+ })
25
+
26
+ test("should create a menu", function () {
27
+ var $input = $('<input />')
28
+ ok($input.typeahead().data('typeahead').$menu, 'has a menu')
29
+ })
30
+
31
+ test("should listen to the menu", function () {
32
+ var $input = $('<input />')
33
+ , $menu = $input.typeahead().data('typeahead').$menu
34
+
35
+ ok($menu.data('events').mouseover, 'has a mouseover(pseudo: mouseenter)')
36
+ ok($menu.data('events').click, 'has a click')
37
+ })
38
+
39
+ test("should show menu when query entered", function () {
40
+ var $input = $('<input />').typeahead({
41
+ source: ['aa', 'ab', 'ac']
42
+ })
43
+ , typeahead = $input.data('typeahead')
44
+
45
+ $input.val('a')
46
+ typeahead.lookup()
47
+
48
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
49
+ equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
50
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
51
+
52
+ typeahead.$menu.remove()
53
+ })
54
+
55
+ test("should not explode when regex chars are entered", function () {
56
+ var $input = $('<input />').typeahead({
57
+ source: ['aa', 'ab', 'ac', 'mdo*', 'fat+']
58
+ })
59
+ , typeahead = $input.data('typeahead')
60
+
61
+ $input.val('+')
62
+ typeahead.lookup()
63
+
64
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
65
+ equals(typeahead.$menu.find('li').length, 1, 'has 1 item in menu')
66
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
67
+
68
+ typeahead.$menu.remove()
69
+ })
70
+
71
+ test("should hide menu when query entered", function () {
72
+ stop()
73
+ var $input = $('<input />').typeahead({
74
+ source: ['aa', 'ab', 'ac']
75
+ })
76
+ , typeahead = $input.data('typeahead')
77
+
78
+ $input.val('a')
79
+ typeahead.lookup()
80
+
81
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
82
+ equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
83
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
84
+
85
+ $input.blur()
86
+
87
+ setTimeout(function () {
88
+ ok(!typeahead.$menu.is(":visible"), "typeahead is no longer visible")
89
+ start()
90
+ }, 200)
91
+
92
+ typeahead.$menu.remove()
93
+ })
94
+
95
+ test("should set next item when down arrow is pressed", function () {
96
+ var $input = $('<input />').typeahead({
97
+ source: ['aa', 'ab', 'ac']
98
+ })
99
+ , typeahead = $input.data('typeahead')
100
+
101
+ $input.val('a')
102
+ typeahead.lookup()
103
+
104
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
105
+ equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
106
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
107
+ ok(typeahead.$menu.find('li').first().hasClass('active'), "first item is active")
108
+
109
+ $input.trigger({
110
+ type: 'keydown'
111
+ , keyCode: 40
112
+ })
113
+
114
+ ok(typeahead.$menu.find('li').first().next().hasClass('active'), "second item is active")
115
+
116
+
117
+ $input.trigger({
118
+ type: 'keydown'
119
+ , keyCode: 38
120
+ })
121
+
122
+ ok(typeahead.$menu.find('li').first().hasClass('active'), "first item is active")
123
+
124
+ typeahead.$menu.remove()
125
+ })
126
+
127
+
128
+ test("should set input value to selected item", function () {
129
+ var $input = $('<input />').typeahead({
130
+ source: ['aa', 'ab', 'ac']
131
+ })
132
+ , typeahead = $input.data('typeahead')
133
+ , changed = false
134
+
135
+ $input.val('a')
136
+ typeahead.lookup()
137
+
138
+ $input.change(function() { changed = true });
139
+
140
+ $(typeahead.$menu.find('li')[2]).mouseover().click()
141
+
142
+ equals($input.val(), 'ac', 'input value was correctly set')
143
+ ok(!typeahead.$menu.is(':visible'), 'the menu was hidden')
144
+ ok(changed, 'a change event was fired')
145
+
146
+ typeahead.$menu.remove()
147
+ })
148
+})
docs/docs/likebutton/js/tests/vendor/jquery.js
new
+9252
@@ -0,0 +1,9252 @@
1
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
2
+(function( window, undefined ) {
3
+
4
+// Use the correct document accordingly with window argument (sandbox)
5
+var document = window.document,
6
+ navigator = window.navigator,
7
+ location = window.location;
8
+var jQuery = (function() {
9
+
10
+// Define a local copy of jQuery
11
+var jQuery = function( selector, context ) {
12
+ // The jQuery object is actually just the init constructor 'enhanced'
13
+ return new jQuery.fn.init( selector, context, rootjQuery );
14
+ },
15
+
16
+ // Map over jQuery in case of overwrite
17
+ _jQuery = window.jQuery,
18
+
19
+ // Map over the $ in case of overwrite
20
+ _$ = window.$,
21
+
22
+ // A central reference to the root jQuery(document)
23
+ rootjQuery,
24
+
25
+ // A simple way to check for HTML strings or ID strings
26
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
27
+ quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
28
+
29
+ // Check if a string has a non-whitespace character in it
30
+ rnotwhite = /\S/,
31
+
32
+ // Used for trimming whitespace
33
+ trimLeft = /^\s+/,
34
+ trimRight = /\s+$/,
35
+
36
+ // Match a standalone tag
37
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
38
+
39
+ // JSON RegExp
40
+ rvalidchars = /^[\],:{}\s]*$/,
41
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
42
+ rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
43
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
44
+
45
+ // Useragent RegExp
46
+ rwebkit = /(webkit)[ \/]([\w.]+)/,
47
+ ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
48
+ rmsie = /(msie) ([\w.]+)/,
49
+ rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
50
+
51
+ // Matches dashed string for camelizing
52
+ rdashAlpha = /-([a-z]|[0-9])/ig,
53
+ rmsPrefix = /^-ms-/,
54
+
55
+ // Used by jQuery.camelCase as callback to replace()
56
+ fcamelCase = function( all, letter ) {
57
+ return ( letter + "" ).toUpperCase();
58
+ },
59
+
60
+ // Keep a UserAgent string for use with jQuery.browser
61
+ userAgent = navigator.userAgent,
62
+
63
+ // For matching the engine and version of the browser
64
+ browserMatch,
65
+
66
+ // The deferred used on DOM ready
67
+ readyList,
68
+
69
+ // The ready event handler
70
+ DOMContentLoaded,
71
+
72
+ // Save a reference to some core methods
73
+ toString = Object.prototype.toString,
74
+ hasOwn = Object.prototype.hasOwnProperty,
75
+ push = Array.prototype.push,
76
+ slice = Array.prototype.slice,
77
+ trim = String.prototype.trim,
78
+ indexOf = Array.prototype.indexOf,
79
+
80
+ // [[Class]] -> type pairs
81
+ class2type = {};
82
+
83
+jQuery.fn = jQuery.prototype = {
84
+ constructor: jQuery,
85
+ init: function( selector, context, rootjQuery ) {
86
+ var match, elem, ret, doc;
87
+
88
+ // Handle $(""), $(null), or $(undefined)
89
+ if ( !selector ) {
90
+ return this;
91
+ }
92
+
93
+ // Handle $(DOMElement)
94
+ if ( selector.nodeType ) {
95
+ this.context = this[0] = selector;
96
+ this.length = 1;
97
+ return this;
98
+ }
99
+
100
+ // The body element only exists once, optimize finding it
101
+ if ( selector === "body" && !context && document.body ) {
102
+ this.context = document;
103
+ this[0] = document.body;
104
+ this.selector = selector;
105
+ this.length = 1;
106
+ return this;
107
+ }
108
+
109
+ // Handle HTML strings
110
+ if ( typeof selector === "string" ) {
111
+ // Are we dealing with HTML string or an ID?
112
+ if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
113
+ // Assume that strings that start and end with <> are HTML and skip the regex check
114
+ match = [ null, selector, null ];
115
+
116
+ } else {
117
+ match = quickExpr.exec( selector );
118
+ }
119
+
120
+ // Verify a match, and that no context was specified for #id
121
+ if ( match && (match[1] || !context) ) {
122
+
123
+ // HANDLE: $(html) -> $(array)
124
+ if ( match[1] ) {
125
+ context = context instanceof jQuery ? context[0] : context;
126
+ doc = ( context ? context.ownerDocument || context : document );
127
+
128
+ // If a single string is passed in and it's a single tag
129
+ // just do a createElement and skip the rest
130
+ ret = rsingleTag.exec( selector );
131
+
132
+ if ( ret ) {
133
+ if ( jQuery.isPlainObject( context ) ) {
134
+ selector = [ document.createElement( ret[1] ) ];
135
+ jQuery.fn.attr.call( selector, context, true );
136
+
137
+ } else {
138
+ selector = [ doc.createElement( ret[1] ) ];
139
+ }
140
+
141
+ } else {
142
+ ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
143
+ selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
144
+ }
145
+
146
+ return jQuery.merge( this, selector );
147
+
148
+ // HANDLE: $("#id")
149
+ } else {
150
+ elem = document.getElementById( match[2] );
151
+
152
+ // Check parentNode to catch when Blackberry 4.6 returns
153
+ // nodes that are no longer in the document #6963
154
+ if ( elem && elem.parentNode ) {
155
+ // Handle the case where IE and Opera return items
156
+ // by name instead of ID
157
+ if ( elem.id !== match[2] ) {
158
+ return rootjQuery.find( selector );
159
+ }
160
+
161
+ // Otherwise, we inject the element directly into the jQuery object
162
+ this.length = 1;
163
+ this[0] = elem;
164
+ }
165
+
166
+ this.context = document;
167
+ this.selector = selector;
168
+ return this;
169
+ }
170
+
171
+ // HANDLE: $(expr, $(...))
172
+ } else if ( !context || context.jquery ) {
173
+ return ( context || rootjQuery ).find( selector );
174
+
175
+ // HANDLE: $(expr, context)
176
+ // (which is just equivalent to: $(context).find(expr)
177
+ } else {
178
+ return this.constructor( context ).find( selector );
179
+ }
180
+
181
+ // HANDLE: $(function)
182
+ // Shortcut for document ready
183
+ } else if ( jQuery.isFunction( selector ) ) {
184
+ return rootjQuery.ready( selector );
185
+ }
186
+
187
+ if ( selector.selector !== undefined ) {
188
+ this.selector = selector.selector;
189
+ this.context = selector.context;
190
+ }
191
+
192
+ return jQuery.makeArray( selector, this );
193
+ },
194
+
195
+ // Start with an empty selector
196
+ selector: "",
197
+
198
+ // The current version of jQuery being used
199
+ jquery: "1.7.1",
200
+
201
+ // The default length of a jQuery object is 0
202
+ length: 0,
203
+
204
+ // The number of elements contained in the matched element set
205
+ size: function() {
206
+ return this.length;
207
+ },
208
+
209
+ toArray: function() {
210
+ return slice.call( this, 0 );
211
+ },
212
+
213
+ // Get the Nth element in the matched element set OR
214
+ // Get the whole matched element set as a clean array
215
+ get: function( num ) {
216
+ return num == null ?
217
+
218
+ // Return a 'clean' array
219
+ this.toArray() :
220
+
221
+ // Return just the object
222
+ ( num < 0 ? this[ this.length + num ] : this[ num ] );
223
+ },
224
+
225
+ // Take an array of elements and push it onto the stack
226
+ // (returning the new matched element set)
227
+ pushStack: function( elems, name, selector ) {
228
+ // Build a new jQuery matched element set
229
+ var ret = this.constructor();
230
+
231
+ if ( jQuery.isArray( elems ) ) {
232
+ push.apply( ret, elems );
233
+
234
+ } else {
235
+ jQuery.merge( ret, elems );
236
+ }
237
+
238
+ // Add the old object onto the stack (as a reference)
239
+ ret.prevObject = this;
240
+
241
+ ret.context = this.context;
242
+
243
+ if ( name === "find" ) {
244
+ ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
245
+ } else if ( name ) {
246
+ ret.selector = this.selector + "." + name + "(" + selector + ")";
247
+ }
248
+
249
+ // Return the newly-formed element set
250
+ return ret;
251
+ },
252
+
253
+ // Execute a callback for every element in the matched set.
254
+ // (You can seed the arguments with an array of args, but this is
255
+ // only used internally.)
256
+ each: function( callback, args ) {
257
+ return jQuery.each( this, callback, args );
258
+ },
259
+
260
+ ready: function( fn ) {
261
+ // Attach the listeners
262
+ jQuery.bindReady();
263
+
264
+ // Add the callback
265
+ readyList.add( fn );
266
+
267
+ return this;
268
+ },
269
+
270
+ eq: function( i ) {
271
+ i = +i;
272
+ return i === -1 ?
273
+ this.slice( i ) :
274
+ this.slice( i, i + 1 );
275
+ },
276
+
277
+ first: function() {
278
+ return this.eq( 0 );
279
+ },
280
+
281
+ last: function() {
282
+ return this.eq( -1 );
283
+ },
284
+
285
+ slice: function() {
286
+ return this.pushStack( slice.apply( this, arguments ),
287
+ "slice", slice.call(arguments).join(",") );
288
+ },
289
+
290
+ map: function( callback ) {
291
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
292
+ return callback.call( elem, i, elem );
293
+ }));
294
+ },
295
+
296
+ end: function() {
297
+ return this.prevObject || this.constructor(null);
298
+ },
299
+
300
+ // For internal use only.
301
+ // Behaves like an Array's method, not like a jQuery method.
302
+ push: push,
303
+ sort: [].sort,
304
+ splice: [].splice
305
+};
306
+
307
+// Give the init function the jQuery prototype for later instantiation
308
+jQuery.fn.init.prototype = jQuery.fn;
309
+
310
+jQuery.extend = jQuery.fn.extend = function() {
311
+ var options, name, src, copy, copyIsArray, clone,
312
+ target = arguments[0] || {},
313
+ i = 1,
314
+ length = arguments.length,
315
+ deep = false;
316
+
317
+ // Handle a deep copy situation
318
+ if ( typeof target === "boolean" ) {
319
+ deep = target;
320
+ target = arguments[1] || {};
321
+ // skip the boolean and the target
322
+ i = 2;
323
+ }
324
+
325
+ // Handle case when target is a string or something (possible in deep copy)
326
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
327
+ target = {};
328
+ }
329
+
330
+ // extend jQuery itself if only one argument is passed
331
+ if ( length === i ) {
332
+ target = this;
333
+ --i;
334
+ }
335
+
336
+ for ( ; i < length; i++ ) {
337
+ // Only deal with non-null/undefined values
338
+ if ( (options = arguments[ i ]) != null ) {
339
+ // Extend the base object
340
+ for ( name in options ) {
341
+ src = target[ name ];
342
+ copy = options[ name ];
343
+
344
+ // Prevent never-ending loop
345
+ if ( target === copy ) {
346
+ continue;
347
+ }
348
+
349
+ // Recurse if we're merging plain objects or arrays
350
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
351
+ if ( copyIsArray ) {
352
+ copyIsArray = false;
353
+ clone = src && jQuery.isArray(src) ? src : [];
354
+
355
+ } else {
356
+ clone = src && jQuery.isPlainObject(src) ? src : {};
357
+ }
358
+
359
+ // Never move original objects, clone them
360
+ target[ name ] = jQuery.extend( deep, clone, copy );
361
+
362
+ // Don't bring in undefined values
363
+ } else if ( copy !== undefined ) {
364
+ target[ name ] = copy;
365
+ }
366
+ }
367
+ }
368
+ }
369
+
370
+ // Return the modified object
371
+ return target;
372
+};
373
+
374
+jQuery.extend({
375
+ noConflict: function( deep ) {
376
+ if ( window.$ === jQuery ) {
377
+ window.$ = _$;
378
+ }
379
+
380
+ if ( deep && window.jQuery === jQuery ) {
381
+ window.jQuery = _jQuery;
382
+ }
383
+
384
+ return jQuery;
385
+ },
386
+
387
+ // Is the DOM ready to be used? Set to true once it occurs.
388
+ isReady: false,
389
+
390
+ // A counter to track how many items to wait for before
391
+ // the ready event fires. See #6781
392
+ readyWait: 1,
393
+
394
+ // Hold (or release) the ready event
395
+ holdReady: function( hold ) {
396
+ if ( hold ) {
397
+ jQuery.readyWait++;
398
+ } else {
399
+ jQuery.ready( true );
400
+ }
401
+ },
402
+
403
+ // Handle when the DOM is ready
404
+ ready: function( wait ) {
405
+ // Either a released hold or an DOMready/load event and not yet ready
406
+ if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
407
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
408
+ if ( !document.body ) {
409
+ return setTimeout( jQuery.ready, 1 );
410
+ }
411
+
412
+ // Remember that the DOM is ready
413
+ jQuery.isReady = true;
414
+
415
+ // If a normal DOM Ready event fired, decrement, and wait if need be
416
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
417
+ return;
418
+ }
419
+
420
+ // If there are functions bound, to execute
421
+ readyList.fireWith( document, [ jQuery ] );
422
+
423
+ // Trigger any bound ready events
424
+ if ( jQuery.fn.trigger ) {
425
+ jQuery( document ).trigger( "ready" ).off( "ready" );
426
+ }
427
+ }
428
+ },
429
+
430
+ bindReady: function() {
431
+ if ( readyList ) {
432
+ return;
433
+ }
434
+
435
+ readyList = jQuery.Callbacks( "once memory" );
436
+
437
+ // Catch cases where $(document).ready() is called after the
438
+ // browser event has already occurred.
439
+ if ( document.readyState === "complete" ) {
440
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
441
+ return setTimeout( jQuery.ready, 1 );
442
+ }
443
+
444
+ // Mozilla, Opera and webkit nightlies currently support this event
445
+ if ( document.addEventListener ) {
446
+ // Use the handy event callback
447
+ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
448
+
449
+ // A fallback to window.onload, that will always work
450
+ window.addEventListener( "load", jQuery.ready, false );
451
+
452
+ // If IE event model is used
453
+ } else if ( document.attachEvent ) {
454
+ // ensure firing before onload,
455
+ // maybe late but safe also for iframes
456
+ document.attachEvent( "onreadystatechange", DOMContentLoaded );
457
+
458
+ // A fallback to window.onload, that will always work
459
+ window.attachEvent( "onload", jQuery.ready );
460
+
461
+ // If IE and not a frame
462
+ // continually check to see if the document is ready
463
+ var toplevel = false;
464
+
465
+ try {
466
+ toplevel = window.frameElement == null;
467
+ } catch(e) {}
468
+
469
+ if ( document.documentElement.doScroll && toplevel ) {
470
+ doScrollCheck();
471
+ }
472
+ }
473
+ },
474
+
475
+ // See test/unit/core.js for details concerning isFunction.
476
+ // Since version 1.3, DOM methods and functions like alert
477
+ // aren't supported. They return false on IE (#2968).
478
+ isFunction: function( obj ) {
479
+ return jQuery.type(obj) === "function";
480
+ },
481
+
482
+ isArray: Array.isArray || function( obj ) {
483
+ return jQuery.type(obj) === "array";
484
+ },
485
+
486
+ // A crude way of determining if an object is a window
487
+ isWindow: function( obj ) {
488
+ return obj && typeof obj === "object" && "setInterval" in obj;
489
+ },
490
+
491
+ isNumeric: function( obj ) {
492
+ return !isNaN( parseFloat(obj) ) && isFinite( obj );
493
+ },
494
+
495
+ type: function( obj ) {
496
+ return obj == null ?
497
+ String( obj ) :
498
+ class2type[ toString.call(obj) ] || "object";
499
+ },
500
+
501
+ isPlainObject: function( obj ) {
502
+ // Must be an Object.
503
+ // Because of IE, we also have to check the presence of the constructor property.
504
+ // Make sure that DOM nodes and window objects don't pass through, as well
505
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
506
+ return false;
507
+ }
508
+
509
+ try {
510
+ // Not own constructor property must be Object
511
+ if ( obj.constructor &&
512
+ !hasOwn.call(obj, "constructor") &&
513
+ !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
514
+ return false;
515
+ }
516
+ } catch ( e ) {
517
+ // IE8,9 Will throw exceptions on certain host objects #9897
518
+ return false;
519
+ }
520
+
521
+ // Own properties are enumerated firstly, so to speed up,
522
+ // if last one is own, then all properties are own.
523
+
524
+ var key;
525
+ for ( key in obj ) {}
526
+
527
+ return key === undefined || hasOwn.call( obj, key );
528
+ },
529
+
530
+ isEmptyObject: function( obj ) {
531
+ for ( var name in obj ) {
532
+ return false;
533
+ }
534
+ return true;
535
+ },
536
+
537
+ error: function( msg ) {
538
+ throw new Error( msg );
539
+ },
540
+
541
+ parseJSON: function( data ) {
542
+ if ( typeof data !== "string" || !data ) {
543
+ return null;
544
+ }
545
+
546
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
547
+ data = jQuery.trim( data );
548
+
549
+ // Attempt to parse using the native JSON parser first
550
+ if ( window.JSON && window.JSON.parse ) {
551
+ return window.JSON.parse( data );
552
+ }
553
+
554
+ // Make sure the incoming data is actual JSON
555
+ // Logic borrowed from http://json.org/json2.js
556
+ if ( rvalidchars.test( data.replace( rvalidescape, "@" )
557
+ .replace( rvalidtokens, "]" )
558
+ .replace( rvalidbraces, "")) ) {
559
+
560
+ return ( new Function( "return " + data ) )();
561
+
562
+ }
563
+ jQuery.error( "Invalid JSON: " + data );
564
+ },
565
+
566
+ // Cross-browser xml parsing
567
+ parseXML: function( data ) {
568
+ var xml, tmp;
569
+ try {
570
+ if ( window.DOMParser ) { // Standard
571
+ tmp = new DOMParser();
572
+ xml = tmp.parseFromString( data , "text/xml" );
573
+ } else { // IE
574
+ xml = new ActiveXObject( "Microsoft.XMLDOM" );
575
+ xml.async = "false";
576
+ xml.loadXML( data );
577
+ }
578
+ } catch( e ) {
579
+ xml = undefined;
580
+ }
581
+ if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
582
+ jQuery.error( "Invalid XML: " + data );
583
+ }
584
+ return xml;
585
+ },
586
+
587
+ noop: function() {},
588
+
589
+ // Evaluates a script in a global context
590
+ // Workarounds based on findings by Jim Driscoll
591
+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
592
+ globalEval: function( data ) {
593
+ if ( data && rnotwhite.test( data ) ) {
594
+ // We use execScript on Internet Explorer
595
+ // We use an anonymous function so that context is window
596
+ // rather than jQuery in Firefox
597
+ ( window.execScript || function( data ) {
598
+ window[ "eval" ].call( window, data );
599
+ } )( data );
600
+ }
601
+ },
602
+
603
+ // Convert dashed to camelCase; used by the css and data modules
604
+ // Microsoft forgot to hump their vendor prefix (#9572)
605
+ camelCase: function( string ) {
606
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
607
+ },
608
+
609
+ nodeName: function( elem, name ) {
610
+ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
611
+ },
612
+
613
+ // args is for internal usage only
614
+ each: function( object, callback, args ) {
615
+ var name, i = 0,
616
+ length = object.length,
617
+ isObj = length === undefined || jQuery.isFunction( object );
618
+
619
+ if ( args ) {
620
+ if ( isObj ) {
621
+ for ( name in object ) {
622
+ if ( callback.apply( object[ name ], args ) === false ) {
623
+ break;
624
+ }
625
+ }
626
+ } else {
627
+ for ( ; i < length; ) {
628
+ if ( callback.apply( object[ i++ ], args ) === false ) {
629
+ break;
630
+ }
631
+ }
632
+ }
633
+
634
+ // A special, fast, case for the most common use of each
635
+ } else {
636
+ if ( isObj ) {
637
+ for ( name in object ) {
638
+ if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
639
+ break;
640
+ }
641
+ }
642
+ } else {
643
+ for ( ; i < length; ) {
644
+ if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
645
+ break;
646
+ }
647
+ }
648
+ }
649
+ }
650
+
651
+ return object;
652
+ },
653
+
654
+ // Use native String.trim function wherever possible
655
+ trim: trim ?
656
+ function( text ) {
657
+ return text == null ?
658
+ "" :
659
+ trim.call( text );
660
+ } :
661
+
662
+ // Otherwise use our own trimming functionality
663
+ function( text ) {
664
+ return text == null ?
665
+ "" :
666
+ text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
667
+ },
668
+
669
+ // results is for internal usage only
670
+ makeArray: function( array, results ) {
671
+ var ret = results || [];
672
+
673
+ if ( array != null ) {
674
+ // The window, strings (and functions) also have 'length'
675
+ // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
676
+ var type = jQuery.type( array );
677
+
678
+ if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
679
+ push.call( ret, array );
680
+ } else {
681
+ jQuery.merge( ret, array );
682
+ }
683
+ }
684
+
685
+ return ret;
686
+ },
687
+
688
+ inArray: function( elem, array, i ) {
689
+ var len;
690
+
691
+ if ( array ) {
692
+ if ( indexOf ) {
693
+ return indexOf.call( array, elem, i );
694
+ }
695
+
696
+ len = array.length;
697
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
698
+
699
+ for ( ; i < len; i++ ) {
700
+ // Skip accessing in sparse arrays
701
+ if ( i in array && array[ i ] === elem ) {
702
+ return i;
703
+ }
704
+ }
705
+ }
706
+
707
+ return -1;
708
+ },
709
+
710
+ merge: function( first, second ) {
711
+ var i = first.length,
712
+ j = 0;
713
+
714
+ if ( typeof second.length === "number" ) {
715
+ for ( var l = second.length; j < l; j++ ) {
716
+ first[ i++ ] = second[ j ];
717
+ }
718
+
719
+ } else {
720
+ while ( second[j] !== undefined ) {
721
+ first[ i++ ] = second[ j++ ];
722
+ }
723
+ }
724
+
725
+ first.length = i;
726
+
727
+ return first;
728
+ },
729
+
730
+ grep: function( elems, callback, inv ) {
731
+ var ret = [], retVal;
732
+ inv = !!inv;
733
+
734
+ // Go through the array, only saving the items
735
+ // that pass the validator function
736
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
737
+ retVal = !!callback( elems[ i ], i );
738
+ if ( inv !== retVal ) {
739
+ ret.push( elems[ i ] );
740
+ }
741
+ }
742
+
743
+ return ret;
744
+ },
745
+
746
+ // arg is for internal usage only
747
+ map: function( elems, callback, arg ) {
748
+ var value, key, ret = [],
749
+ i = 0,
750
+ length = elems.length,
751
+ // jquery objects are treated as arrays
752
+ isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
753
+
754
+ // Go through the array, translating each of the items to their
755
+ if ( isArray ) {
756
+ for ( ; i < length; i++ ) {
757
+ value = callback( elems[ i ], i, arg );
758
+
759
+ if ( value != null ) {
760
+ ret[ ret.length ] = value;
761
+ }
762
+ }
763
+
764
+ // Go through every key on the object
765
+ } else {
766
+ for ( key in elems ) {
767
+ value = callback( elems[ key ], key, arg );
768
+
769
+ if ( value != null ) {
770
+ ret[ ret.length ] = value;
771
+ }
772
+ }
773
+ }
774
+
775
+ // Flatten any nested arrays
776
+ return ret.concat.apply( [], ret );
777
+ },
778
+
779
+ // A global GUID counter for objects
780
+ guid: 1,
781
+
782
+ // Bind a function to a context, optionally partially applying any
783
+ // arguments.
784
+ proxy: function( fn, context ) {
785
+ if ( typeof context === "string" ) {
786
+ var tmp = fn[ context ];
787
+ context = fn;
788
+ fn = tmp;
789
+ }
790
+
791
+ // Quick check to determine if target is callable, in the spec
792
+ // this throws a TypeError, but we will just return undefined.
793
+ if ( !jQuery.isFunction( fn ) ) {
794
+ return undefined;
795
+ }
796
+
797
+ // Simulated bind
798
+ var args = slice.call( arguments, 2 ),
799
+ proxy = function() {
800
+ return fn.apply( context, args.concat( slice.call( arguments ) ) );
801
+ };
802
+
803
+ // Set the guid of unique handler to the same of original handler, so it can be removed
804
+ proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
805
+
806
+ return proxy;
807
+ },
808
+
809
+ // Mutifunctional method to get and set values to a collection
810
+ // The value/s can optionally be executed if it's a function
811
+ access: function( elems, key, value, exec, fn, pass ) {
812
+ var length = elems.length;
813
+
814
+ // Setting many attributes
815
+ if ( typeof key === "object" ) {
816
+ for ( var k in key ) {
817
+ jQuery.access( elems, k, key[k], exec, fn, value );
818
+ }
819
+ return elems;
820
+ }
821
+
822
+ // Setting one attribute
823
+ if ( value !== undefined ) {
824
+ // Optionally, function values get executed if exec is true
825
+ exec = !pass && exec && jQuery.isFunction(value);
826
+
827
+ for ( var i = 0; i < length; i++ ) {
828
+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
829
+ }
830
+
831
+ return elems;
832
+ }
833
+
834
+ // Getting an attribute
835
+ return length ? fn( elems[0], key ) : undefined;
836
+ },
837
+
838
+ now: function() {
839
+ return ( new Date() ).getTime();
840
+ },
841
+
842
+ // Use of jQuery.browser is frowned upon.
843
+ // More details: http://docs.jquery.com/Utilities/jQuery.browser
844
+ uaMatch: function( ua ) {
845
+ ua = ua.toLowerCase();
846
+
847
+ var match = rwebkit.exec( ua ) ||
848
+ ropera.exec( ua ) ||
849
+ rmsie.exec( ua ) ||
850
+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
851
+ [];
852
+
853
+ return { browser: match[1] || "", version: match[2] || "0" };
854
+ },
855
+
856
+ sub: function() {
857
+ function jQuerySub( selector, context ) {
858
+ return new jQuerySub.fn.init( selector, context );
859
+ }
860
+ jQuery.extend( true, jQuerySub, this );
861
+ jQuerySub.superclass = this;
862
+ jQuerySub.fn = jQuerySub.prototype = this();
863
+ jQuerySub.fn.constructor = jQuerySub;
864
+ jQuerySub.sub = this.sub;
865
+ jQuerySub.fn.init = function init( selector, context ) {
866
+ if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
867
+ context = jQuerySub( context );
868
+ }
869
+
870
+ return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
871
+ };
872
+ jQuerySub.fn.init.prototype = jQuerySub.fn;
873
+ var rootjQuerySub = jQuerySub(document);
874
+ return jQuerySub;
875
+ },
876
+
877
+ browser: {}
878
+});
879
+
880
+// Populate the class2type map
881
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
882
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
883
+});
884
+
885
+browserMatch = jQuery.uaMatch( userAgent );
886
+if ( browserMatch.browser ) {
887
+ jQuery.browser[ browserMatch.browser ] = true;
888
+ jQuery.browser.version = browserMatch.version;
889
+}
890
+
891
+// Deprecated, use jQuery.browser.webkit instead
892
+if ( jQuery.browser.webkit ) {
893
+ jQuery.browser.safari = true;
894
+}
895
+
896
+// IE doesn't match non-breaking spaces with \s
897
+if ( rnotwhite.test( "\xA0" ) ) {
898
+ trimLeft = /^[\s\xA0]+/;
899
+ trimRight = /[\s\xA0]+$/;
900
+}
901
+
902
+// All jQuery objects should point back to these
903
+rootjQuery = jQuery(document);
904
+
905
+// Cleanup functions for the document ready method
906
+if ( document.addEventListener ) {
907
+ DOMContentLoaded = function() {
908
+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
909
+ jQuery.ready();
910
+ };
911
+
912
+} else if ( document.attachEvent ) {
913
+ DOMContentLoaded = function() {
914
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
915
+ if ( document.readyState === "complete" ) {
916
+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
917
+ jQuery.ready();
918
+ }
919
+ };
920
+}
921
+
922
+// The DOM ready check for Internet Explorer
923
+function doScrollCheck() {
924
+ if ( jQuery.isReady ) {
925
+ return;
926
+ }
927
+
928
+ try {
929
+ // If IE is used, use the trick by Diego Perini
930
+ // http://javascript.nwbox.com/IEContentLoaded/
931
+ document.documentElement.doScroll("left");
932
+ } catch(e) {
933
+ setTimeout( doScrollCheck, 1 );
934
+ return;
935
+ }
936
+
937
+ // and execute any waiting functions
938
+ jQuery.ready();
939
+}
940
+
941
+return jQuery;
942
+
943
+})();
944
+
945
+
946
+// String to Object flags format cache
947
+var flagsCache = {};
948
+
949
+// Convert String-formatted flags into Object-formatted ones and store in cache
950
+function createFlags( flags ) {
951
+ var object = flagsCache[ flags ] = {},
952
+ i, length;
953
+ flags = flags.split( /\s+/ );
954
+ for ( i = 0, length = flags.length; i < length; i++ ) {
955
+ object[ flags[i] ] = true;
956
+ }
957
+ return object;
958
+}
959
+
960
+/*
961
+ * Create a callback list using the following parameters:
962
+ *
963
+ * flags: an optional list of space-separated flags that will change how
964
+ * the callback list behaves
965
+ *
966
+ * By default a callback list will act like an event callback list and can be
967
+ * "fired" multiple times.
968
+ *
969
+ * Possible flags:
970
+ *
971
+ * once: will ensure the callback list can only be fired once (like a Deferred)
972
+ *
973
+ * memory: will keep track of previous values and will call any callback added
974
+ * after the list has been fired right away with the latest "memorized"
975
+ * values (like a Deferred)
976
+ *
977
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
978
+ *
979
+ * stopOnFalse: interrupt callings when a callback returns false
980
+ *
981
+ */
982
+jQuery.Callbacks = function( flags ) {
983
+
984
+ // Convert flags from String-formatted to Object-formatted
985
+ // (we check in cache first)
986
+ flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
987
+
988
+ var // Actual callback list
989
+ list = [],
990
+ // Stack of fire calls for repeatable lists
991
+ stack = [],
992
+ // Last fire value (for non-forgettable lists)
993
+ memory,
994
+ // Flag to know if list is currently firing
995
+ firing,
996
+ // First callback to fire (used internally by add and fireWith)
997
+ firingStart,
998
+ // End of the loop when firing
999
+ firingLength,
1000
+ // Index of currently firing callback (modified by remove if needed)
1001
+ firingIndex,
1002
+ // Add one or several callbacks to the list
1003
+ add = function( args ) {
1004
+ var i,
1005
+ length,
1006
+ elem,
1007
+ type,
1008
+ actual;
1009
+ for ( i = 0, length = args.length; i < length; i++ ) {
1010
+ elem = args[ i ];
1011
+ type = jQuery.type( elem );
1012
+ if ( type === "array" ) {
1013
+ // Inspect recursively
1014
+ add( elem );
1015
+ } else if ( type === "function" ) {
1016
+ // Add if not in unique mode and callback is not in
1017
+ if ( !flags.unique || !self.has( elem ) ) {
1018
+ list.push( elem );
1019
+ }
1020
+ }
1021
+ }
1022
+ },
1023
+ // Fire callbacks
1024
+ fire = function( context, args ) {
1025
+ args = args || [];
1026
+ memory = !flags.memory || [ context, args ];
1027
+ firing = true;
1028
+ firingIndex = firingStart || 0;
1029
+ firingStart = 0;
1030
+ firingLength = list.length;
1031
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
1032
+ if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
1033
+ memory = true; // Mark as halted
1034
+ break;
1035
+ }
1036
+ }
1037
+ firing = false;
1038
+ if ( list ) {
1039
+ if ( !flags.once ) {
1040
+ if ( stack && stack.length ) {
1041
+ memory = stack.shift();
1042
+ self.fireWith( memory[ 0 ], memory[ 1 ] );
1043
+ }
1044
+ } else if ( memory === true ) {
1045
+ self.disable();
1046
+ } else {
1047
+ list = [];
1048
+ }
1049
+ }
1050
+ },
1051
+ // Actual Callbacks object
1052
+ self = {
1053
+ // Add a callback or a collection of callbacks to the list
1054
+ add: function() {
1055
+ if ( list ) {
1056
+ var length = list.length;
1057
+ add( arguments );
1058
+ // Do we need to add the callbacks to the
1059
+ // current firing batch?
1060
+ if ( firing ) {
1061
+ firingLength = list.length;
1062
+ // With memory, if we're not firing then
1063
+ // we should call right away, unless previous
1064
+ // firing was halted (stopOnFalse)
1065
+ } else if ( memory && memory !== true ) {
1066
+ firingStart = length;
1067
+ fire( memory[ 0 ], memory[ 1 ] );
1068
+ }
1069
+ }
1070
+ return this;
1071
+ },
1072
+ // Remove a callback from the list
1073
+ remove: function() {
1074
+ if ( list ) {
1075
+ var args = arguments,
1076
+ argIndex = 0,
1077
+ argLength = args.length;
1078
+ for ( ; argIndex < argLength ; argIndex++ ) {
1079
+ for ( var i = 0; i < list.length; i++ ) {
1080
+ if ( args[ argIndex ] === list[ i ] ) {
1081
+ // Handle firingIndex and firingLength
1082
+ if ( firing ) {
1083
+ if ( i <= firingLength ) {
1084
+ firingLength--;
1085
+ if ( i <= firingIndex ) {
1086
+ firingIndex--;
1087
+ }
1088
+ }
1089
+ }
1090
+ // Remove the element
1091
+ list.splice( i--, 1 );
1092
+ // If we have some unicity property then
1093
+ // we only need to do this once
1094
+ if ( flags.unique ) {
1095
+ break;
1096
+ }
1097
+ }
1098
+ }
1099
+ }
1100
+ }
1101
+ return this;
1102
+ },
1103
+ // Control if a given callback is in the list
1104
+ has: function( fn ) {
1105
+ if ( list ) {
1106
+ var i = 0,
1107
+ length = list.length;
1108
+ for ( ; i < length; i++ ) {
1109
+ if ( fn === list[ i ] ) {
1110
+ return true;
1111
+ }
1112
+ }
1113
+ }
1114
+ return false;
1115
+ },
1116
+ // Remove all callbacks from the list
1117
+ empty: function() {
1118
+ list = [];
1119
+ return this;
1120
+ },
1121
+ // Have the list do nothing anymore
1122
+ disable: function() {
1123
+ list = stack = memory = undefined;
1124
+ return this;
1125
+ },
1126
+ // Is it disabled?
1127
+ disabled: function() {
1128
+ return !list;
1129
+ },
1130
+ // Lock the list in its current state
1131
+ lock: function() {
1132
+ stack = undefined;
1133
+ if ( !memory || memory === true ) {
1134
+ self.disable();
1135
+ }
1136
+ return this;
1137
+ },
1138
+ // Is it locked?
1139
+ locked: function() {
1140
+ return !stack;
1141
+ },
1142
+ // Call all callbacks with the given context and arguments
1143
+ fireWith: function( context, args ) {
1144
+ if ( stack ) {
1145
+ if ( firing ) {
1146
+ if ( !flags.once ) {
1147
+ stack.push( [ context, args ] );
1148
+ }
1149
+ } else if ( !( flags.once && memory ) ) {
1150
+ fire( context, args );
1151
+ }
1152
+ }
1153
+ return this;
1154
+ },
1155
+ // Call all the callbacks with the given arguments
1156
+ fire: function() {
1157
+ self.fireWith( this, arguments );
1158
+ return this;
1159
+ },
1160
+ // To know if the callbacks have already been called at least once
1161
+ fired: function() {
1162
+ return !!memory;
1163
+ }
1164
+ };
1165
+
1166
+ return self;
1167
+};
1168
+
1169
+
1170
+
1171
+
1172
+var // Static reference to slice
1173
+ sliceDeferred = [].slice;
1174
+
1175
+jQuery.extend({
1176
+
1177
+ Deferred: function( func ) {
1178
+ var doneList = jQuery.Callbacks( "once memory" ),
1179
+ failList = jQuery.Callbacks( "once memory" ),
1180
+ progressList = jQuery.Callbacks( "memory" ),
1181
+ state = "pending",
1182
+ lists = {
1183
+ resolve: doneList,
1184
+ reject: failList,
1185
+ notify: progressList
1186
+ },
1187
+ promise = {
1188
+ done: doneList.add,
1189
+ fail: failList.add,
1190
+ progress: progressList.add,
1191
+
1192
+ state: function() {
1193
+ return state;
1194
+ },
1195
+
1196
+ // Deprecated
1197
+ isResolved: doneList.fired,
1198
+ isRejected: failList.fired,
1199
+
1200
+ then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
1201
+ deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
1202
+ return this;
1203
+ },
1204
+ always: function() {
1205
+ deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
1206
+ return this;
1207
+ },
1208
+ pipe: function( fnDone, fnFail, fnProgress ) {
1209
+ return jQuery.Deferred(function( newDefer ) {
1210
+ jQuery.each( {
1211
+ done: [ fnDone, "resolve" ],
1212
+ fail: [ fnFail, "reject" ],
1213
+ progress: [ fnProgress, "notify" ]
1214
+ }, function( handler, data ) {
1215
+ var fn = data[ 0 ],
1216
+ action = data[ 1 ],
1217
+ returned;
1218
+ if ( jQuery.isFunction( fn ) ) {
1219
+ deferred[ handler ](function() {
1220
+ returned = fn.apply( this, arguments );
1221
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
1222
+ returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
1223
+ } else {
1224
+ newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
1225
+ }
1226
+ });
1227
+ } else {
1228
+ deferred[ handler ]( newDefer[ action ] );
1229
+ }
1230
+ });
1231
+ }).promise();
1232
+ },
1233
+ // Get a promise for this deferred
1234
+ // If obj is provided, the promise aspect is added to the object
1235
+ promise: function( obj ) {
1236
+ if ( obj == null ) {
1237
+ obj = promise;
1238
+ } else {
1239
+ for ( var key in promise ) {
1240
+ obj[ key ] = promise[ key ];
1241
+ }
1242
+ }
1243
+ return obj;
1244
+ }
1245
+ },
1246
+ deferred = promise.promise({}),
1247
+ key;
1248
+
1249
+ for ( key in lists ) {
1250
+ deferred[ key ] = lists[ key ].fire;
1251
+ deferred[ key + "With" ] = lists[ key ].fireWith;
1252
+ }
1253
+
1254
+ // Handle state
1255
+ deferred.done( function() {
1256
+ state = "resolved";
1257
+ }, failList.disable, progressList.lock ).fail( function() {
1258
+ state = "rejected";
1259
+ }, doneList.disable, progressList.lock );
1260
+
1261
+ // Call given func if any
1262
+ if ( func ) {
1263
+ func.call( deferred, deferred );
1264
+ }
1265
+
1266
+ // All done!
1267
+ return deferred;
1268
+ },
1269
+
1270
+ // Deferred helper
1271
+ when: function( firstParam ) {
1272
+ var args = sliceDeferred.call( arguments, 0 ),
1273
+ i = 0,
1274
+ length = args.length,
1275
+ pValues = new Array( length ),
1276
+ count = length,
1277
+ pCount = length,
1278
+ deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
1279
+ firstParam :
1280
+ jQuery.Deferred(),
1281
+ promise = deferred.promise();
1282
+ function resolveFunc( i ) {
1283
+ return function( value ) {
1284
+ args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1285
+ if ( !( --count ) ) {
1286
+ deferred.resolveWith( deferred, args );
1287
+ }
1288
+ };
1289
+ }
1290
+ function progressFunc( i ) {
1291
+ return function( value ) {
1292
+ pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1293
+ deferred.notifyWith( promise, pValues );
1294
+ };
1295
+ }
1296
+ if ( length > 1 ) {
1297
+ for ( ; i < length; i++ ) {
1298
+ if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
1299
+ args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
1300
+ } else {
1301
+ --count;
1302
+ }
1303
+ }
1304
+ if ( !count ) {
1305
+ deferred.resolveWith( deferred, args );
1306
+ }
1307
+ } else if ( deferred !== firstParam ) {
1308
+ deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
1309
+ }
1310
+ return promise;
1311
+ }
1312
+});
1313
+
1314
+
1315
+
1316
+
1317
+jQuery.support = (function() {
1318
+
1319
+ var support,
1320
+ all,
1321
+ a,
1322
+ select,
1323
+ opt,
1324
+ input,
1325
+ marginDiv,
1326
+ fragment,
1327
+ tds,
1328
+ events,
1329
+ eventName,
1330
+ i,
1331
+ isSupported,
1332
+ div = document.createElement( "div" ),
1333
+ documentElement = document.documentElement;
1334
+
1335
+ // Preliminary tests
1336
+ div.setAttribute("className", "t");
1337
+ div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1338
+
1339
+ all = div.getElementsByTagName( "*" );
1340
+ a = div.getElementsByTagName( "a" )[ 0 ];
1341
+
1342
+ // Can't get basic test support
1343
+ if ( !all || !all.length || !a ) {
1344
+ return {};
1345
+ }
1346
+
1347
+ // First batch of supports tests
1348
+ select = document.createElement( "select" );
1349
+ opt = select.appendChild( document.createElement("option") );
1350
+ input = div.getElementsByTagName( "input" )[ 0 ];
1351
+
1352
+ support = {
1353
+ // IE strips leading whitespace when .innerHTML is used
1354
+ leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1355
+
1356
+ // Make sure that tbody elements aren't automatically inserted
1357
+ // IE will insert them into empty tables
1358
+ tbody: !div.getElementsByTagName("tbody").length,
1359
+
1360
+ // Make sure that link elements get serialized correctly by innerHTML
1361
+ // This requires a wrapper element in IE
1362
+ htmlSerialize: !!div.getElementsByTagName("link").length,
1363
+
1364
+ // Get the style information from getAttribute
1365
+ // (IE uses .cssText instead)
1366
+ style: /top/.test( a.getAttribute("style") ),
1367
+
1368
+ // Make sure that URLs aren't manipulated
1369
+ // (IE normalizes it by default)
1370
+ hrefNormalized: ( a.getAttribute("href") === "/a" ),
1371
+
1372
+ // Make sure that element opacity exists
1373
+ // (IE uses filter instead)
1374
+ // Use a regex to work around a WebKit issue. See #5145
1375
+ opacity: /^0.55/.test( a.style.opacity ),
1376
+
1377
+ // Verify style float existence
1378
+ // (IE uses styleFloat instead of cssFloat)
1379
+ cssFloat: !!a.style.cssFloat,
1380
+
1381
+ // Make sure that if no value is specified for a checkbox
1382
+ // that it defaults to "on".
1383
+ // (WebKit defaults to "" instead)
1384
+ checkOn: ( input.value === "on" ),
1385
+
1386
+ // Make sure that a selected-by-default option has a working selected property.
1387
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1388
+ optSelected: opt.selected,
1389
+
1390
+ // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1391
+ getSetAttribute: div.className !== "t",
1392
+
1393
+ // Tests for enctype support on a form(#6743)
1394
+ enctype: !!document.createElement("form").enctype,
1395
+
1396
+ // Makes sure cloning an html5 element does not cause problems
1397
+ // Where outerHTML is undefined, this still works
1398
+ html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
1399
+
1400
+ // Will be defined later
1401
+ submitBubbles: true,
1402
+ changeBubbles: true,
1403
+ focusinBubbles: false,
1404
+ deleteExpando: true,
1405
+ noCloneEvent: true,
1406
+ inlineBlockNeedsLayout: false,
1407
+ shrinkWrapBlocks: false,
1408
+ reliableMarginRight: true
1409
+ };
1410
+
1411
+ // Make sure checked status is properly cloned
1412
+ input.checked = true;
1413
+ support.noCloneChecked = input.cloneNode( true ).checked;
1414
+
1415
+ // Make sure that the options inside disabled selects aren't marked as disabled
1416
+ // (WebKit marks them as disabled)
1417
+ select.disabled = true;
1418
+ support.optDisabled = !opt.disabled;
1419
+
1420
+ // Test to see if it's possible to delete an expando from an element
1421
+ // Fails in Internet Explorer
1422
+ try {
1423
+ delete div.test;
1424
+ } catch( e ) {
1425
+ support.deleteExpando = false;
1426
+ }
1427
+
1428
+ if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1429
+ div.attachEvent( "onclick", function() {
1430
+ // Cloning a node shouldn't copy over any
1431
+ // bound event handlers (IE does this)
1432
+ support.noCloneEvent = false;
1433
+ });
1434
+ div.cloneNode( true ).fireEvent( "onclick" );
1435
+ }
1436
+
1437
+ // Check if a radio maintains its value
1438
+ // after being appended to the DOM
1439
+ input = document.createElement("input");
1440
+ input.value = "t";
1441
+ input.setAttribute("type", "radio");
1442
+ support.radioValue = input.value === "t";
1443
+
1444
+ input.setAttribute("checked", "checked");
1445
+ div.appendChild( input );
1446
+ fragment = document.createDocumentFragment();
1447
+ fragment.appendChild( div.lastChild );
1448
+
1449
+ // WebKit doesn't clone checked state correctly in fragments
1450
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1451
+
1452
+ // Check if a disconnected checkbox will retain its checked
1453
+ // value of true after appended to the DOM (IE6/7)
1454
+ support.appendChecked = input.checked;
1455
+
1456
+ fragment.removeChild( input );
1457
+ fragment.appendChild( div );
1458
+
1459
+ div.innerHTML = "";
1460
+
1461
+ // Check if div with explicit width and no margin-right incorrectly
1462
+ // gets computed margin-right based on width of container. For more
1463
+ // info see bug #3333
1464
+ // Fails in WebKit before Feb 2011 nightlies
1465
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1466
+ if ( window.getComputedStyle ) {
1467
+ marginDiv = document.createElement( "div" );
1468
+ marginDiv.style.width = "0";
1469
+ marginDiv.style.marginRight = "0";
1470
+ div.style.width = "2px";
1471
+ div.appendChild( marginDiv );
1472
+ support.reliableMarginRight =
1473
+ ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
1474
+ }
1475
+
1476
+ // Technique from Juriy Zaytsev
1477
+ // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
1478
+ // We only care about the case where non-standard event systems
1479
+ // are used, namely in IE. Short-circuiting here helps us to
1480
+ // avoid an eval call (in setAttribute) which can cause CSP
1481
+ // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1482
+ if ( div.attachEvent ) {
1483
+ for( i in {
1484
+ submit: 1,
1485
+ change: 1,
1486
+ focusin: 1
1487
+ }) {
1488
+ eventName = "on" + i;
1489
+ isSupported = ( eventName in div );
1490
+ if ( !isSupported ) {
1491
+ div.setAttribute( eventName, "return;" );
1492
+ isSupported = ( typeof div[ eventName ] === "function" );
1493
+ }
1494
+ support[ i + "Bubbles" ] = isSupported;
1495
+ }
1496
+ }
1497
+
1498
+ fragment.removeChild( div );
1499
+
1500
+ // Null elements to avoid leaks in IE
1501
+ fragment = select = opt = marginDiv = div = input = null;
1502
+
1503
+ // Run tests that need a body at doc ready
1504
+ jQuery(function() {
1505
+ var container, outer, inner, table, td, offsetSupport,
1506
+ conMarginTop, ptlm, vb, style, html,
1507
+ body = document.getElementsByTagName("body")[0];
1508
+
1509
+ if ( !body ) {
1510
+ // Return for frameset docs that don't have a body
1511
+ return;
1512
+ }
1513
+
1514
+ conMarginTop = 1;
1515
+ ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
1516
+ vb = "visibility:hidden;border:0;";
1517
+ style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
1518
+ html = "<div " + style + "><div></div></div>" +
1519
+ "<table " + style + " cellpadding='0' cellspacing='0'>" +
1520
+ "<tr><td></td></tr></table>";
1521
+
1522
+ container = document.createElement("div");
1523
+ container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
1524
+ body.insertBefore( container, body.firstChild );
1525
+
1526
+ // Construct the test element
1527
+ div = document.createElement("div");
1528
+ container.appendChild( div );
1529
+
1530
+ // Check if table cells still have offsetWidth/Height when they are set
1531
+ // to display:none and there are still other visible table cells in a
1532
+ // table row; if so, offsetWidth/Height are not reliable for use when
1533
+ // determining if an element has been hidden directly using
1534
+ // display:none (it is still safe to use offsets if a parent element is
1535
+ // hidden; don safety goggles and see bug #4512 for more information).
1536
+ // (only IE 8 fails this test)
1537
+ div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1538
+ tds = div.getElementsByTagName( "td" );
1539
+ isSupported = ( tds[ 0 ].offsetHeight === 0 );
1540
+
1541
+ tds[ 0 ].style.display = "";
1542
+ tds[ 1 ].style.display = "none";
1543
+
1544
+ // Check if empty table cells still have offsetWidth/Height
1545
+ // (IE <= 8 fail this test)
1546
+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1547
+
1548
+ // Figure out if the W3C box model works as expected
1549
+ div.innerHTML = "";
1550
+ div.style.width = div.style.paddingLeft = "1px";
1551
+ jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
1552
+
1553
+ if ( typeof div.style.zoom !== "undefined" ) {
1554
+ // Check if natively block-level elements act like inline-block
1555
+ // elements when setting their display to 'inline' and giving
1556
+ // them layout
1557
+ // (IE < 8 does this)
1558
+ div.style.display = "inline";
1559
+ div.style.zoom = 1;
1560
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
1561
+
1562
+ // Check if elements with layout shrink-wrap their children
1563
+ // (IE 6 does this)
1564
+ div.style.display = "";
1565
+ div.innerHTML = "<div style='width:4px;'></div>";
1566
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
1567
+ }
1568
+
1569
+ div.style.cssText = ptlm + vb;
1570
+ div.innerHTML = html;
1571
+
1572
+ outer = div.firstChild;
1573
+ inner = outer.firstChild;
1574
+ td = outer.nextSibling.firstChild.firstChild;
1575
+
1576
+ offsetSupport = {
1577
+ doesNotAddBorder: ( inner.offsetTop !== 5 ),
1578
+ doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
1579
+ };
1580
+
1581
+ inner.style.position = "fixed";
1582
+ inner.style.top = "20px";
1583
+
1584
+ // safari subtracts parent border width here which is 5px
1585
+ offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
1586
+ inner.style.position = inner.style.top = "";
1587
+
1588
+ outer.style.overflow = "hidden";
1589
+ outer.style.position = "relative";
1590
+
1591
+ offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
1592
+ offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
1593
+
1594
+ body.removeChild( container );
1595
+ div = container = null;
1596
+
1597
+ jQuery.extend( support, offsetSupport );
1598
+ });
1599
+
1600
+ return support;
1601
+})();
1602
+
1603
+
1604
+
1605
+
1606
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
1607
+ rmultiDash = /([A-Z])/g;
1608
+
1609
+jQuery.extend({
1610
+ cache: {},
1611
+
1612
+ // Please use with caution
1613
+ uuid: 0,
1614
+
1615
+ // Unique for each copy of jQuery on the page
1616
+ // Non-digits removed to match rinlinejQuery
1617
+ expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1618
+
1619
+ // The following elements throw uncatchable exceptions if you
1620
+ // attempt to add expando properties to them.
1621
+ noData: {
1622
+ "embed": true,
1623
+ // Ban all objects except for Flash (which handle expandos)
1624
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1625
+ "applet": true
1626
+ },
1627
+
1628
+ hasData: function( elem ) {
1629
+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1630
+ return !!elem && !isEmptyDataObject( elem );
1631
+ },
1632
+
1633
+ data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1634
+ if ( !jQuery.acceptData( elem ) ) {
1635
+ return;
1636
+ }
1637
+
1638
+ var privateCache, thisCache, ret,
1639
+ internalKey = jQuery.expando,
1640
+ getByName = typeof name === "string",
1641
+
1642
+ // We have to handle DOM nodes and JS objects differently because IE6-7
1643
+ // can't GC object references properly across the DOM-JS boundary
1644
+ isNode = elem.nodeType,
1645
+
1646
+ // Only DOM nodes need the global jQuery cache; JS object data is
1647
+ // attached directly to the object so GC can occur automatically
1648
+ cache = isNode ? jQuery.cache : elem,
1649
+
1650
+ // Only defining an ID for JS objects if its cache already exists allows
1651
+ // the code to shortcut on the same path as a DOM node with no cache
1652
+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
1653
+ isEvents = name === "events";
1654
+
1655
+ // Avoid doing any more work than we need to when trying to get data on an
1656
+ // object that has no data at all
1657
+ if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
1658
+ return;
1659
+ }
1660
+
1661
+ if ( !id ) {
1662
+ // Only DOM nodes need a new unique ID for each element since their data
1663
+ // ends up in the global cache
1664
+ if ( isNode ) {
1665
+ elem[ internalKey ] = id = ++jQuery.uuid;
1666
+ } else {
1667
+ id = internalKey;
1668
+ }
1669
+ }
1670
+
1671
+ if ( !cache[ id ] ) {
1672
+ cache[ id ] = {};
1673
+
1674
+ // Avoids exposing jQuery metadata on plain JS objects when the object
1675
+ // is serialized using JSON.stringify
1676
+ if ( !isNode ) {
1677
+ cache[ id ].toJSON = jQuery.noop;
1678
+ }
1679
+ }
1680
+
1681
+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
1682
+ // shallow copied over onto the existing cache
1683
+ if ( typeof name === "object" || typeof name === "function" ) {
1684
+ if ( pvt ) {
1685
+ cache[ id ] = jQuery.extend( cache[ id ], name );
1686
+ } else {
1687
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
1688
+ }
1689
+ }
1690
+
1691
+ privateCache = thisCache = cache[ id ];
1692
+
1693
+ // jQuery data() is stored in a separate object inside the object's internal data
1694
+ // cache in order to avoid key collisions between internal data and user-defined
1695
+ // data.
1696
+ if ( !pvt ) {
1697
+ if ( !thisCache.data ) {
1698
+ thisCache.data = {};
1699
+ }
1700
+
1701
+ thisCache = thisCache.data;
1702
+ }
1703
+
1704
+ if ( data !== undefined ) {
1705
+ thisCache[ jQuery.camelCase( name ) ] = data;
1706
+ }
1707
+
1708
+ // Users should not attempt to inspect the internal events object using jQuery.data,
1709
+ // it is undocumented and subject to change. But does anyone listen? No.
1710
+ if ( isEvents && !thisCache[ name ] ) {
1711
+ return privateCache.events;
1712
+ }
1713
+
1714
+ // Check for both converted-to-camel and non-converted data property names
1715
+ // If a data property was specified
1716
+ if ( getByName ) {
1717
+
1718
+ // First Try to find as-is property data
1719
+ ret = thisCache[ name ];
1720
+
1721
+ // Test for null|undefined property data
1722
+ if ( ret == null ) {
1723
+
1724
+ // Try to find the camelCased property
1725
+ ret = thisCache[ jQuery.camelCase( name ) ];
1726
+ }
1727
+ } else {
1728
+ ret = thisCache;
1729
+ }
1730
+
1731
+ return ret;
1732
+ },
1733
+
1734
+ removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1735
+ if ( !jQuery.acceptData( elem ) ) {
1736
+ return;
1737
+ }
1738
+
1739
+ var thisCache, i, l,
1740
+
1741
+ // Reference to internal data cache key
1742
+ internalKey = jQuery.expando,
1743
+
1744
+ isNode = elem.nodeType,
1745
+
1746
+ // See jQuery.data for more information
1747
+ cache = isNode ? jQuery.cache : elem,
1748
+
1749
+ // See jQuery.data for more information
1750
+ id = isNode ? elem[ internalKey ] : internalKey;
1751
+
1752
+ // If there is already no cache entry for this object, there is no
1753
+ // purpose in continuing
1754
+ if ( !cache[ id ] ) {
1755
+ return;
1756
+ }
1757
+
1758
+ if ( name ) {
1759
+
1760
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
1761
+
1762
+ if ( thisCache ) {
1763
+
1764
+ // Support array or space separated string names for data keys
1765
+ if ( !jQuery.isArray( name ) ) {
1766
+
1767
+ // try the string as a key before any manipulation
1768
+ if ( name in thisCache ) {
1769
+ name = [ name ];
1770
+ } else {
1771
+
1772
+ // split the camel cased version by spaces unless a key with the spaces exists
1773
+ name = jQuery.camelCase( name );
1774
+ if ( name in thisCache ) {
1775
+ name = [ name ];
1776
+ } else {
1777
+ name = name.split( " " );
1778
+ }
1779
+ }
1780
+ }
1781
+
1782
+ for ( i = 0, l = name.length; i < l; i++ ) {
1783
+ delete thisCache[ name[i] ];
1784
+ }
1785
+
1786
+ // If there is no data left in the cache, we want to continue
1787
+ // and let the cache object itself get destroyed
1788
+ if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
1789
+ return;
1790
+ }
1791
+ }
1792
+ }
1793
+
1794
+ // See jQuery.data for more information
1795
+ if ( !pvt ) {
1796
+ delete cache[ id ].data;
1797
+
1798
+ // Don't destroy the parent cache unless the internal data object
1799
+ // had been the only thing left in it
1800
+ if ( !isEmptyDataObject(cache[ id ]) ) {
1801
+ return;
1802
+ }
1803
+ }
1804
+
1805
+ // Browsers that fail expando deletion also refuse to delete expandos on
1806
+ // the window, but it will allow it on all other JS objects; other browsers
1807
+ // don't care
1808
+ // Ensure that `cache` is not a window object #10080
1809
+ if ( jQuery.support.deleteExpando || !cache.setInterval ) {
1810
+ delete cache[ id ];
1811
+ } else {
1812
+ cache[ id ] = null;
1813
+ }
1814
+
1815
+ // We destroyed the cache and need to eliminate the expando on the node to avoid
1816
+ // false lookups in the cache for entries that no longer exist
1817
+ if ( isNode ) {
1818
+ // IE does not allow us to delete expando properties from nodes,
1819
+ // nor does it have a removeAttribute function on Document nodes;
1820
+ // we must handle all of these cases
1821
+ if ( jQuery.support.deleteExpando ) {
1822
+ delete elem[ internalKey ];
1823
+ } else if ( elem.removeAttribute ) {
1824
+ elem.removeAttribute( internalKey );
1825
+ } else {
1826
+ elem[ internalKey ] = null;
1827
+ }
1828
+ }
1829
+ },
1830
+
1831
+ // For internal use only.
1832
+ _data: function( elem, name, data ) {
1833
+ return jQuery.data( elem, name, data, true );
1834
+ },
1835
+
1836
+ // A method for determining if a DOM node can handle the data expando
1837
+ acceptData: function( elem ) {
1838
+ if ( elem.nodeName ) {
1839
+ var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1840
+
1841
+ if ( match ) {
1842
+ return !(match === true || elem.getAttribute("classid") !== match);
1843
+ }
1844
+ }
1845
+
1846
+ return true;
1847
+ }
1848
+});
1849
+
1850
+jQuery.fn.extend({
1851
+ data: function( key, value ) {
1852
+ var parts, attr, name,
1853
+ data = null;
1854
+
1855
+ if ( typeof key === "undefined" ) {
1856
+ if ( this.length ) {
1857
+ data = jQuery.data( this[0] );
1858
+
1859
+ if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
1860
+ attr = this[0].attributes;
1861
+ for ( var i = 0, l = attr.length; i < l; i++ ) {
1862
+ name = attr[i].name;
1863
+
1864
+ if ( name.indexOf( "data-" ) === 0 ) {
1865
+ name = jQuery.camelCase( name.substring(5) );
1866
+
1867
+ dataAttr( this[0], name, data[ name ] );
1868
+ }
1869
+ }
1870
+ jQuery._data( this[0], "parsedAttrs", true );
1871
+ }
1872
+ }
1873
+
1874
+ return data;
1875
+
1876
+ } else if ( typeof key === "object" ) {
1877
+ return this.each(function() {
1878
+ jQuery.data( this, key );
1879
+ });
1880
+ }
1881
+
1882
+ parts = key.split(".");
1883
+ parts[1] = parts[1] ? "." + parts[1] : "";
1884
+
1885
+ if ( value === undefined ) {
1886
+ data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1887
+
1888
+ // Try to fetch any internally stored data first
1889
+ if ( data === undefined && this.length ) {
1890
+ data = jQuery.data( this[0], key );
1891
+ data = dataAttr( this[0], key, data );
1892
+ }
1893
+
1894
+ return data === undefined && parts[1] ?
1895
+ this.data( parts[0] ) :
1896
+ data;
1897
+
1898
+ } else {
1899
+ return this.each(function() {
1900
+ var self = jQuery( this ),
1901
+ args = [ parts[0], value ];
1902
+
1903
+ self.triggerHandler( "setData" + parts[1] + "!", args );
1904
+ jQuery.data( this, key, value );
1905
+ self.triggerHandler( "changeData" + parts[1] + "!", args );
1906
+ });
1907
+ }
1908
+ },
1909
+
1910
+ removeData: function( key ) {
1911
+ return this.each(function() {
1912
+ jQuery.removeData( this, key );
1913
+ });
1914
+ }
1915
+});
1916
+
1917
+function dataAttr( elem, key, data ) {
1918
+ // If nothing was found internally, try to fetch any
1919
+ // data from the HTML5 data-* attribute
1920
+ if ( data === undefined && elem.nodeType === 1 ) {
1921
+
1922
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
1923
+
1924
+ data = elem.getAttribute( name );
1925
+
1926
+ if ( typeof data === "string" ) {
1927
+ try {
1928
+ data = data === "true" ? true :
1929
+ data === "false" ? false :
1930
+ data === "null" ? null :
1931
+ jQuery.isNumeric( data ) ? parseFloat( data ) :
1932
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
1933
+ data;
1934
+ } catch( e ) {}
1935
+
1936
+ // Make sure we set the data so it isn't changed later
1937
+ jQuery.data( elem, key, data );
1938
+
1939
+ } else {
1940
+ data = undefined;
1941
+ }
1942
+ }
1943
+
1944
+ return data;
1945
+}
1946
+
1947
+// checks a cache object for emptiness
1948
+function isEmptyDataObject( obj ) {
1949
+ for ( var name in obj ) {
1950
+
1951
+ // if the public data object is empty, the private is still empty
1952
+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
1953
+ continue;
1954
+ }
1955
+ if ( name !== "toJSON" ) {
1956
+ return false;
1957
+ }
1958
+ }
1959
+
1960
+ return true;
1961
+}
1962
+
1963
+
1964
+
1965
+
1966
+function handleQueueMarkDefer( elem, type, src ) {
1967
+ var deferDataKey = type + "defer",
1968
+ queueDataKey = type + "queue",
1969
+ markDataKey = type + "mark",
1970
+ defer = jQuery._data( elem, deferDataKey );
1971
+ if ( defer &&
1972
+ ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
1973
+ ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
1974
+ // Give room for hard-coded callbacks to fire first
1975
+ // and eventually mark/queue something else on the element
1976
+ setTimeout( function() {
1977
+ if ( !jQuery._data( elem, queueDataKey ) &&
1978
+ !jQuery._data( elem, markDataKey ) ) {
1979
+ jQuery.removeData( elem, deferDataKey, true );
1980
+ defer.fire();
1981
+ }
1982
+ }, 0 );
1983
+ }
1984
+}
1985
+
1986
+jQuery.extend({
1987
+
1988
+ _mark: function( elem, type ) {
1989
+ if ( elem ) {
1990
+ type = ( type || "fx" ) + "mark";
1991
+ jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
1992
+ }
1993
+ },
1994
+
1995
+ _unmark: function( force, elem, type ) {
1996
+ if ( force !== true ) {
1997
+ type = elem;
1998
+ elem = force;
1999
+ force = false;
2000
+ }
2001
+ if ( elem ) {
2002
+ type = type || "fx";
2003
+ var key = type + "mark",
2004
+ count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
2005
+ if ( count ) {
2006
+ jQuery._data( elem, key, count );
2007
+ } else {
2008
+ jQuery.removeData( elem, key, true );
2009
+ handleQueueMarkDefer( elem, type, "mark" );
2010
+ }
2011
+ }
2012
+ },
2013
+
2014
+ queue: function( elem, type, data ) {
2015
+ var q;
2016
+ if ( elem ) {
2017
+ type = ( type || "fx" ) + "queue";
2018
+ q = jQuery._data( elem, type );
2019
+
2020
+ // Speed up dequeue by getting out quickly if this is just a lookup
2021
+ if ( data ) {
2022
+ if ( !q || jQuery.isArray(data) ) {
2023
+ q = jQuery._data( elem, type, jQuery.makeArray(data) );
2024
+ } else {
2025
+ q.push( data );
2026
+ }
2027
+ }
2028
+ return q || [];
2029
+ }
2030
+ },
2031
+
2032
+ dequeue: function( elem, type ) {
2033
+ type = type || "fx";
2034
+
2035
+ var queue = jQuery.queue( elem, type ),
2036
+ fn = queue.shift(),
2037
+ hooks = {};
2038
+
2039
+ // If the fx queue is dequeued, always remove the progress sentinel
2040
+ if ( fn === "inprogress" ) {
2041
+ fn = queue.shift();
2042
+ }
2043
+
2044
+ if ( fn ) {
2045
+ // Add a progress sentinel to prevent the fx queue from being
2046
+ // automatically dequeued
2047
+ if ( type === "fx" ) {
2048
+ queue.unshift( "inprogress" );
2049
+ }
2050
+
2051
+ jQuery._data( elem, type + ".run", hooks );
2052
+ fn.call( elem, function() {
2053
+ jQuery.dequeue( elem, type );
2054
+ }, hooks );
2055
+ }
2056
+
2057
+ if ( !queue.length ) {
2058
+ jQuery.removeData( elem, type + "queue " + type + ".run", true );
2059
+ handleQueueMarkDefer( elem, type, "queue" );
2060
+ }
2061
+ }
2062
+});
2063
+
2064
+jQuery.fn.extend({
2065
+ queue: function( type, data ) {
2066
+ if ( typeof type !== "string" ) {
2067
+ data = type;
2068
+ type = "fx";
2069
+ }
2070
+
2071
+ if ( data === undefined ) {
2072
+ return jQuery.queue( this[0], type );
2073
+ }
2074
+ return this.each(function() {
2075
+ var queue = jQuery.queue( this, type, data );
2076
+
2077
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
2078
+ jQuery.dequeue( this, type );
2079
+ }
2080
+ });
2081
+ },
2082
+ dequeue: function( type ) {
2083
+ return this.each(function() {
2084
+ jQuery.dequeue( this, type );
2085
+ });
2086
+ },
2087
+ // Based off of the plugin by Clint Helfers, with permission.
2088
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
2089
+ delay: function( time, type ) {
2090
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
2091
+ type = type || "fx";
2092
+
2093
+ return this.queue( type, function( next, hooks ) {
2094
+ var timeout = setTimeout( next, time );
2095
+ hooks.stop = function() {
2096
+ clearTimeout( timeout );
2097
+ };
2098
+ });
2099
+ },
2100
+ clearQueue: function( type ) {
2101
+ return this.queue( type || "fx", [] );
2102
+ },
2103
+ // Get a promise resolved when queues of a certain type
2104
+ // are emptied (fx is the type by default)
2105
+ promise: function( type, object ) {
2106
+ if ( typeof type !== "string" ) {
2107
+ object = type;
2108
+ type = undefined;
2109
+ }
2110
+ type = type || "fx";
2111
+ var defer = jQuery.Deferred(),
2112
+ elements = this,
2113
+ i = elements.length,
2114
+ count = 1,
2115
+ deferDataKey = type + "defer",
2116
+ queueDataKey = type + "queue",
2117
+ markDataKey = type + "mark",
2118
+ tmp;
2119
+ function resolve() {
2120
+ if ( !( --count ) ) {
2121
+ defer.resolveWith( elements, [ elements ] );
2122
+ }
2123
+ }
2124
+ while( i-- ) {
2125
+ if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
2126
+ ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
2127
+ jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
2128
+ jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
2129
+ count++;
2130
+ tmp.add( resolve );
2131
+ }
2132
+ }
2133
+ resolve();
2134
+ return defer.promise();
2135
+ }
2136
+});
2137
+
2138
+
2139
+
2140
+
2141
+var rclass = /[\n\t\r]/g,
2142
+ rspace = /\s+/,
2143
+ rreturn = /\r/g,
2144
+ rtype = /^(?:button|input)$/i,
2145
+ rfocusable = /^(?:button|input|object|select|textarea)$/i,
2146
+ rclickable = /^a(?:rea)?$/i,
2147
+ rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
2148
+ getSetAttribute = jQuery.support.getSetAttribute,
2149
+ nodeHook, boolHook, fixSpecified;
2150
+
2151
+jQuery.fn.extend({
2152
+ attr: function( name, value ) {
2153
+ return jQuery.access( this, name, value, true, jQuery.attr );
2154
+ },
2155
+
2156
+ removeAttr: function( name ) {
2157
+ return this.each(function() {
2158
+ jQuery.removeAttr( this, name );
2159
+ });
2160
+ },
2161
+
2162
+ prop: function( name, value ) {
2163
+ return jQuery.access( this, name, value, true, jQuery.prop );
2164
+ },
2165
+
2166
+ removeProp: function( name ) {
2167
+ name = jQuery.propFix[ name ] || name;
2168
+ return this.each(function() {
2169
+ // try/catch handles cases where IE balks (such as removing a property on window)
2170
+ try {
2171
+ this[ name ] = undefined;
2172
+ delete this[ name ];
2173
+ } catch( e ) {}
2174
+ });
2175
+ },
2176
+
2177
+ addClass: function( value ) {
2178
+ var classNames, i, l, elem,
2179
+ setClass, c, cl;
2180
+
2181
+ if ( jQuery.isFunction( value ) ) {
2182
+ return this.each(function( j ) {
2183
+ jQuery( this ).addClass( value.call(this, j, this.className) );
2184
+ });
2185
+ }
2186
+
2187
+ if ( value && typeof value === "string" ) {
2188
+ classNames = value.split( rspace );
2189
+
2190
+ for ( i = 0, l = this.length; i < l; i++ ) {
2191
+ elem = this[ i ];
2192
+
2193
+ if ( elem.nodeType === 1 ) {
2194
+ if ( !elem.className && classNames.length === 1 ) {
2195
+ elem.className = value;
2196
+
2197
+ } else {
2198
+ setClass = " " + elem.className + " ";
2199
+
2200
+ for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2201
+ if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
2202
+ setClass += classNames[ c ] + " ";
2203
+ }
2204
+ }
2205
+ elem.className = jQuery.trim( setClass );
2206
+ }
2207
+ }
2208
+ }
2209
+ }
2210
+
2211
+ return this;
2212
+ },
2213
+
2214
+ removeClass: function( value ) {
2215
+ var classNames, i, l, elem, className, c, cl;
2216
+
2217
+ if ( jQuery.isFunction( value ) ) {
2218
+ return this.each(function( j ) {
2219
+ jQuery( this ).removeClass( value.call(this, j, this.className) );
2220
+ });
2221
+ }
2222
+
2223
+ if ( (value && typeof value === "string") || value === undefined ) {
2224
+ classNames = ( value || "" ).split( rspace );
2225
+
2226
+ for ( i = 0, l = this.length; i < l; i++ ) {
2227
+ elem = this[ i ];
2228
+
2229
+ if ( elem.nodeType === 1 && elem.className ) {
2230
+ if ( value ) {
2231
+ className = (" " + elem.className + " ").replace( rclass, " " );
2232
+ for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2233
+ className = className.replace(" " + classNames[ c ] + " ", " ");
2234
+ }
2235
+ elem.className = jQuery.trim( className );
2236
+
2237
+ } else {
2238
+ elem.className = "";
2239
+ }
2240
+ }
2241
+ }
2242
+ }
2243
+
2244
+ return this;
2245
+ },
2246
+
2247
+ toggleClass: function( value, stateVal ) {
2248
+ var type = typeof value,
2249
+ isBool = typeof stateVal === "boolean";
2250
+
2251
+ if ( jQuery.isFunction( value ) ) {
2252
+ return this.each(function( i ) {
2253
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2254
+ });
2255
+ }
2256
+
2257
+ return this.each(function() {
2258
+ if ( type === "string" ) {
2259
+ // toggle individual class names
2260
+ var className,
2261
+ i = 0,
2262
+ self = jQuery( this ),
2263
+ state = stateVal,
2264
+ classNames = value.split( rspace );
2265
+
2266
+ while ( (className = classNames[ i++ ]) ) {
2267
+ // check each className given, space seperated list
2268
+ state = isBool ? state : !self.hasClass( className );
2269
+ self[ state ? "addClass" : "removeClass" ]( className );
2270
+ }
2271
+
2272
+ } else if ( type === "undefined" || type === "boolean" ) {
2273
+ if ( this.className ) {
2274
+ // store className if set
2275
+ jQuery._data( this, "__className__", this.className );
2276
+ }
2277
+
2278
+ // toggle whole className
2279
+ this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2280
+ }
2281
+ });
2282
+ },
2283
+
2284
+ hasClass: function( selector ) {
2285
+ var className = " " + selector + " ",
2286
+ i = 0,
2287
+ l = this.length;
2288
+ for ( ; i < l; i++ ) {
2289
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
2290
+ return true;
2291
+ }
2292
+ }
2293
+
2294
+ return false;
2295
+ },
2296
+
2297
+ val: function( value ) {
2298
+ var hooks, ret, isFunction,
2299
+ elem = this[0];
2300
+
2301
+ if ( !arguments.length ) {
2302
+ if ( elem ) {
2303
+ hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
2304
+
2305
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2306
+ return ret;
2307
+ }
2308
+
2309
+ ret = elem.value;
2310
+
2311
+ return typeof ret === "string" ?
2312
+ // handle most common string cases
2313
+ ret.replace(rreturn, "") :
2314
+ // handle cases where value is null/undef or number
2315
+ ret == null ? "" : ret;
2316
+ }
2317
+
2318
+ return;
2319
+ }
2320
+
2321
+ isFunction = jQuery.isFunction( value );
2322
+
2323
+ return this.each(function( i ) {
2324
+ var self = jQuery(this), val;
2325
+
2326
+ if ( this.nodeType !== 1 ) {
2327
+ return;
2328
+ }
2329
+
2330
+ if ( isFunction ) {
2331
+ val = value.call( this, i, self.val() );
2332
+ } else {
2333
+ val = value;
2334
+ }
2335
+
2336
+ // Treat null/undefined as ""; convert numbers to string
2337
+ if ( val == null ) {
2338
+ val = "";
2339
+ } else if ( typeof val === "number" ) {
2340
+ val += "";
2341
+ } else if ( jQuery.isArray( val ) ) {
2342
+ val = jQuery.map(val, function ( value ) {
2343
+ return value == null ? "" : value + "";
2344
+ });
2345
+ }
2346
+
2347
+ hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
2348
+
2349
+ // If set returns undefined, fall back to normal setting
2350
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2351
+ this.value = val;
2352
+ }
2353
+ });
2354
+ }
2355
+});
2356
+
2357
+jQuery.extend({
2358
+ valHooks: {
2359
+ option: {
2360
+ get: function( elem ) {
2361
+ // attributes.value is undefined in Blackberry 4.7 but
2362
+ // uses .value. See #6932
2363
+ var val = elem.attributes.value;
2364
+ return !val || val.specified ? elem.value : elem.text;
2365
+ }
2366
+ },
2367
+ select: {
2368
+ get: function( elem ) {
2369
+ var value, i, max, option,
2370
+ index = elem.selectedIndex,
2371
+ values = [],
2372
+ options = elem.options,
2373
+ one = elem.type === "select-one";
2374
+
2375
+ // Nothing was selected
2376
+ if ( index < 0 ) {
2377
+ return null;
2378
+ }
2379
+
2380
+ // Loop through all the selected options
2381
+ i = one ? index : 0;
2382
+ max = one ? index + 1 : options.length;
2383
+ for ( ; i < max; i++ ) {
2384
+ option = options[ i ];
2385
+
2386
+ // Don't return options that are disabled or in a disabled optgroup
2387
+ if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
2388
+ (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
2389
+
2390
+ // Get the specific value for the option
2391
+ value = jQuery( option ).val();
2392
+
2393
+ // We don't need an array for one selects
2394
+ if ( one ) {
2395
+ return value;
2396
+ }
2397
+
2398
+ // Multi-Selects return an array
2399
+ values.push( value );
2400
+ }
2401
+ }
2402
+
2403
+ // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
2404
+ if ( one && !values.length && options.length ) {
2405
+ return jQuery( options[ index ] ).val();
2406
+ }
2407
+
2408
+ return values;
2409
+ },
2410
+
2411
+ set: function( elem, value ) {
2412
+ var values = jQuery.makeArray( value );
2413
+
2414
+ jQuery(elem).find("option").each(function() {
2415
+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2416
+ });
2417
+
2418
+ if ( !values.length ) {
2419
+ elem.selectedIndex = -1;
2420
+ }
2421
+ return values;
2422
+ }
2423
+ }
2424
+ },
2425
+
2426
+ attrFn: {
2427
+ val: true,
2428
+ css: true,
2429
+ html: true,
2430
+ text: true,
2431
+ data: true,
2432
+ width: true,
2433
+ height: true,
2434
+ offset: true
2435
+ },
2436
+
2437
+ attr: function( elem, name, value, pass ) {
2438
+ var ret, hooks, notxml,
2439
+ nType = elem.nodeType;
2440
+
2441
+ // don't get/set attributes on text, comment and attribute nodes
2442
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2443
+ return;
2444
+ }
2445
+
2446
+ if ( pass && name in jQuery.attrFn ) {
2447
+ return jQuery( elem )[ name ]( value );
2448
+ }
2449
+
2450
+ // Fallback to prop when attributes are not supported
2451
+ if ( typeof elem.getAttribute === "undefined" ) {
2452
+ return jQuery.prop( elem, name, value );
2453
+ }
2454
+
2455
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2456
+
2457
+ // All attributes are lowercase
2458
+ // Grab necessary hook if one is defined
2459
+ if ( notxml ) {
2460
+ name = name.toLowerCase();
2461
+ hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
2462
+ }
2463
+
2464
+ if ( value !== undefined ) {
2465
+
2466
+ if ( value === null ) {
2467
+ jQuery.removeAttr( elem, name );
2468
+ return;
2469
+
2470
+ } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2471
+ return ret;
2472
+
2473
+ } else {
2474
+ elem.setAttribute( name, "" + value );
2475
+ return value;
2476
+ }
2477
+
2478
+ } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
2479
+ return ret;
2480
+
2481
+ } else {
2482
+
2483
+ ret = elem.getAttribute( name );
2484
+
2485
+ // Non-existent attributes return null, we normalize to undefined
2486
+ return ret === null ?
2487
+ undefined :
2488
+ ret;
2489
+ }
2490
+ },
2491
+
2492
+ removeAttr: function( elem, value ) {
2493
+ var propName, attrNames, name, l,
2494
+ i = 0;
2495
+
2496
+ if ( value && elem.nodeType === 1 ) {
2497
+ attrNames = value.toLowerCase().split( rspace );
2498
+ l = attrNames.length;
2499
+
2500
+ for ( ; i < l; i++ ) {
2501
+ name = attrNames[ i ];
2502
+
2503
+ if ( name ) {
2504
+ propName = jQuery.propFix[ name ] || name;
2505
+
2506
+ // See #9699 for explanation of this approach (setting first, then removal)
2507
+ jQuery.attr( elem, name, "" );
2508
+ elem.removeAttribute( getSetAttribute ? name : propName );
2509
+
2510
+ // Set corresponding property to false for boolean attributes
2511
+ if ( rboolean.test( name ) && propName in elem ) {
2512
+ elem[ propName ] = false;
2513
+ }
2514
+ }
2515
+ }
2516
+ }
2517
+ },
2518
+
2519
+ attrHooks: {
2520
+ type: {
2521
+ set: function( elem, value ) {
2522
+ // We can't allow the type property to be changed (since it causes problems in IE)
2523
+ if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2524
+ jQuery.error( "type property can't be changed" );
2525
+ } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2526
+ // Setting the type on a radio button after the value resets the value in IE6-9
2527
+ // Reset value to it's default in case type is set after value
2528
+ // This is for element creation
2529
+ var val = elem.value;
2530
+ elem.setAttribute( "type", value );
2531
+ if ( val ) {
2532
+ elem.value = val;
2533
+ }
2534
+ return value;
2535
+ }
2536
+ }
2537
+ },
2538
+ // Use the value property for back compat
2539
+ // Use the nodeHook for button elements in IE6/7 (#1954)
2540
+ value: {
2541
+ get: function( elem, name ) {
2542
+ if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2543
+ return nodeHook.get( elem, name );
2544
+ }
2545
+ return name in elem ?
2546
+ elem.value :
2547
+ null;
2548
+ },
2549
+ set: function( elem, value, name ) {
2550
+ if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2551
+ return nodeHook.set( elem, value, name );
2552
+ }
2553
+ // Does not return so that setAttribute is also used
2554
+ elem.value = value;
2555
+ }
2556
+ }
2557
+ },
2558
+
2559
+ propFix: {
2560
+ tabindex: "tabIndex",
2561
+ readonly: "readOnly",
2562
+ "for": "htmlFor",
2563
+ "class": "className",
2564
+ maxlength: "maxLength",
2565
+ cellspacing: "cellSpacing",
2566
+ cellpadding: "cellPadding",
2567
+ rowspan: "rowSpan",
2568
+ colspan: "colSpan",
2569
+ usemap: "useMap",
2570
+ frameborder: "frameBorder",
2571
+ contenteditable: "contentEditable"
2572
+ },
2573
+
2574
+ prop: function( elem, name, value ) {
2575
+ var ret, hooks, notxml,
2576
+ nType = elem.nodeType;
2577
+
2578
+ // don't get/set properties on text, comment and attribute nodes
2579
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2580
+ return;
2581
+ }
2582
+
2583
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2584
+
2585
+ if ( notxml ) {
2586
+ // Fix name and attach hooks
2587
+ name = jQuery.propFix[ name ] || name;
2588
+ hooks = jQuery.propHooks[ name ];
2589
+ }
2590
+
2591
+ if ( value !== undefined ) {
2592
+ if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2593
+ return ret;
2594
+
2595
+ } else {
2596
+ return ( elem[ name ] = value );
2597
+ }
2598
+
2599
+ } else {
2600
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2601
+ return ret;
2602
+
2603
+ } else {
2604
+ return elem[ name ];
2605
+ }
2606
+ }
2607
+ },
2608
+
2609
+ propHooks: {
2610
+ tabIndex: {
2611
+ get: function( elem ) {
2612
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2613
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2614
+ var attributeNode = elem.getAttributeNode("tabindex");
2615
+
2616
+ return attributeNode && attributeNode.specified ?
2617
+ parseInt( attributeNode.value, 10 ) :
2618
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2619
+ 0 :
2620
+ undefined;
2621
+ }
2622
+ }
2623
+ }
2624
+});
2625
+
2626
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
2627
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
2628
+
2629
+// Hook for boolean attributes
2630
+boolHook = {
2631
+ get: function( elem, name ) {
2632
+ // Align boolean attributes with corresponding properties
2633
+ // Fall back to attribute presence where some booleans are not supported
2634
+ var attrNode,
2635
+ property = jQuery.prop( elem, name );
2636
+ return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
2637
+ name.toLowerCase() :
2638
+ undefined;
2639
+ },
2640
+ set: function( elem, value, name ) {
2641
+ var propName;
2642
+ if ( value === false ) {
2643
+ // Remove boolean attributes when set to false
2644
+ jQuery.removeAttr( elem, name );
2645
+ } else {
2646
+ // value is true since we know at this point it's type boolean and not false
2647
+ // Set boolean attributes to the same name and set the DOM property
2648
+ propName = jQuery.propFix[ name ] || name;
2649
+ if ( propName in elem ) {
2650
+ // Only set the IDL specifically if it already exists on the element
2651
+ elem[ propName ] = true;
2652
+ }
2653
+
2654
+ elem.setAttribute( name, name.toLowerCase() );
2655
+ }
2656
+ return name;
2657
+ }
2658
+};
2659
+
2660
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
2661
+if ( !getSetAttribute ) {
2662
+
2663
+ fixSpecified = {
2664
+ name: true,
2665
+ id: true
2666
+ };
2667
+
2668
+ // Use this for any attribute in IE6/7
2669
+ // This fixes almost every IE6/7 issue
2670
+ nodeHook = jQuery.valHooks.button = {
2671
+ get: function( elem, name ) {
2672
+ var ret;
2673
+ ret = elem.getAttributeNode( name );
2674
+ return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
2675
+ ret.nodeValue :
2676
+ undefined;
2677
+ },
2678
+ set: function( elem, value, name ) {
2679
+ // Set the existing or create a new attribute node
2680
+ var ret = elem.getAttributeNode( name );
2681
+ if ( !ret ) {
2682
+ ret = document.createAttribute( name );
2683
+ elem.setAttributeNode( ret );
2684
+ }
2685
+ return ( ret.nodeValue = value + "" );
2686
+ }
2687
+ };
2688
+
2689
+ // Apply the nodeHook to tabindex
2690
+ jQuery.attrHooks.tabindex.set = nodeHook.set;
2691
+
2692
+ // Set width and height to auto instead of 0 on empty string( Bug #8150 )
2693
+ // This is for removals
2694
+ jQuery.each([ "width", "height" ], function( i, name ) {
2695
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2696
+ set: function( elem, value ) {
2697
+ if ( value === "" ) {
2698
+ elem.setAttribute( name, "auto" );
2699
+ return value;
2700
+ }
2701
+ }
2702
+ });
2703
+ });
2704
+
2705
+ // Set contenteditable to false on removals(#10429)
2706
+ // Setting to empty string throws an error as an invalid value
2707
+ jQuery.attrHooks.contenteditable = {
2708
+ get: nodeHook.get,
2709
+ set: function( elem, value, name ) {
2710
+ if ( value === "" ) {
2711
+ value = "false";
2712
+ }
2713
+ nodeHook.set( elem, value, name );
2714
+ }
2715
+ };
2716
+}
2717
+
2718
+
2719
+// Some attributes require a special call on IE
2720
+if ( !jQuery.support.hrefNormalized ) {
2721
+ jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2722
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2723
+ get: function( elem ) {
2724
+ var ret = elem.getAttribute( name, 2 );
2725
+ return ret === null ? undefined : ret;
2726
+ }
2727
+ });
2728
+ });
2729
+}
2730
+
2731
+if ( !jQuery.support.style ) {
2732
+ jQuery.attrHooks.style = {
2733
+ get: function( elem ) {
2734
+ // Return undefined in the case of empty string
2735
+ // Normalize to lowercase since IE uppercases css property names
2736
+ return elem.style.cssText.toLowerCase() || undefined;
2737
+ },
2738
+ set: function( elem, value ) {
2739
+ return ( elem.style.cssText = "" + value );
2740
+ }
2741
+ };
2742
+}
2743
+
2744
+// Safari mis-reports the default selected property of an option
2745
+// Accessing the parent's selectedIndex property fixes it
2746
+if ( !jQuery.support.optSelected ) {
2747
+ jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2748
+ get: function( elem ) {
2749
+ var parent = elem.parentNode;
2750
+
2751
+ if ( parent ) {
2752
+ parent.selectedIndex;
2753
+
2754
+ // Make sure that it also works with optgroups, see #5701
2755
+ if ( parent.parentNode ) {
2756
+ parent.parentNode.selectedIndex;
2757
+ }
2758
+ }
2759
+ return null;
2760
+ }
2761
+ });
2762
+}
2763
+
2764
+// IE6/7 call enctype encoding
2765
+if ( !jQuery.support.enctype ) {
2766
+ jQuery.propFix.enctype = "encoding";
2767
+}
2768
+
2769
+// Radios and checkboxes getter/setter
2770
+if ( !jQuery.support.checkOn ) {
2771
+ jQuery.each([ "radio", "checkbox" ], function() {
2772
+ jQuery.valHooks[ this ] = {
2773
+ get: function( elem ) {
2774
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2775
+ return elem.getAttribute("value") === null ? "on" : elem.value;
2776
+ }
2777
+ };
2778
+ });
2779
+}
2780
+jQuery.each([ "radio", "checkbox" ], function() {
2781
+ jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2782
+ set: function( elem, value ) {
2783
+ if ( jQuery.isArray( value ) ) {
2784
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
2785
+ }
2786
+ }
2787
+ });
2788
+});
2789
+
2790
+
2791
+
2792
+
2793
+var rformElems = /^(?:textarea|input|select)$/i,
2794
+ rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
2795
+ rhoverHack = /\bhover(\.\S+)?\b/,
2796
+ rkeyEvent = /^key/,
2797
+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
2798
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
2799
+ rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
2800
+ quickParse = function( selector ) {
2801
+ var quick = rquickIs.exec( selector );
2802
+ if ( quick ) {
2803
+ // 0 1 2 3
2804
+ // [ _, tag, id, class ]
2805
+ quick[1] = ( quick[1] || "" ).toLowerCase();
2806
+ quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
2807
+ }
2808
+ return quick;
2809
+ },
2810
+ quickIs = function( elem, m ) {
2811
+ var attrs = elem.attributes || {};
2812
+ return (
2813
+ (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
2814
+ (!m[2] || (attrs.id || {}).value === m[2]) &&
2815
+ (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
2816
+ );
2817
+ },
2818
+ hoverHack = function( events ) {
2819
+ return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
2820
+ };
2821
+
2822
+/*
2823
+ * Helper functions for managing events -- not part of the public interface.
2824
+ * Props to Dean Edwards' addEvent library for many of the ideas.
2825
+ */
2826
+jQuery.event = {
2827
+
2828
+ add: function( elem, types, handler, data, selector ) {
2829
+
2830
+ var elemData, eventHandle, events,
2831
+ t, tns, type, namespaces, handleObj,
2832
+ handleObjIn, quick, handlers, special;
2833
+
2834
+ // Don't attach events to noData or text/comment nodes (allow plain objects tho)
2835
+ if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
2836
+ return;
2837
+ }
2838
+
2839
+ // Caller can pass in an object of custom data in lieu of the handler
2840
+ if ( handler.handler ) {
2841
+ handleObjIn = handler;
2842
+ handler = handleObjIn.handler;
2843
+ }
2844
+
2845
+ // Make sure that the handler has a unique ID, used to find/remove it later
2846
+ if ( !handler.guid ) {
2847
+ handler.guid = jQuery.guid++;
2848
+ }
2849
+
2850
+ // Init the element's event structure and main handler, if this is the first
2851
+ events = elemData.events;
2852
+ if ( !events ) {
2853
+ elemData.events = events = {};
2854
+ }
2855
+ eventHandle = elemData.handle;
2856
+ if ( !eventHandle ) {
2857
+ elemData.handle = eventHandle = function( e ) {
2858
+ // Discard the second event of a jQuery.event.trigger() and
2859
+ // when an event is called after a page has unloaded
2860
+ return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2861
+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2862
+ undefined;
2863
+ };
2864
+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
2865
+ eventHandle.elem = elem;
2866
+ }
2867
+
2868
+ // Handle multiple events separated by a space
2869
+ // jQuery(...).bind("mouseover mouseout", fn);
2870
+ types = jQuery.trim( hoverHack(types) ).split( " " );
2871
+ for ( t = 0; t < types.length; t++ ) {
2872
+
2873
+ tns = rtypenamespace.exec( types[t] ) || [];
2874
+ type = tns[1];
2875
+ namespaces = ( tns[2] || "" ).split( "." ).sort();
2876
+
2877
+ // If event changes its type, use the special event handlers for the changed type
2878
+ special = jQuery.event.special[ type ] || {};
2879
+
2880
+ // If selector defined, determine special event api type, otherwise given type
2881
+ type = ( selector ? special.delegateType : special.bindType ) || type;
2882
+
2883
+ // Update special based on newly reset type
2884
+ special = jQuery.event.special[ type ] || {};
2885
+
2886
+ // handleObj is passed to all event handlers
2887
+ handleObj = jQuery.extend({
2888
+ type: type,
2889
+ origType: tns[1],
2890
+ data: data,
2891
+ handler: handler,
2892
+ guid: handler.guid,
2893
+ selector: selector,
2894
+ quick: quickParse( selector ),
2895
+ namespace: namespaces.join(".")
2896
+ }, handleObjIn );
2897
+
2898
+ // Init the event handler queue if we're the first
2899
+ handlers = events[ type ];
2900
+ if ( !handlers ) {
2901
+ handlers = events[ type ] = [];
2902
+ handlers.delegateCount = 0;
2903
+
2904
+ // Only use addEventListener/attachEvent if the special events handler returns false
2905
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2906
+ // Bind the global event handler to the element
2907
+ if ( elem.addEventListener ) {
2908
+ elem.addEventListener( type, eventHandle, false );
2909
+
2910
+ } else if ( elem.attachEvent ) {
2911
+ elem.attachEvent( "on" + type, eventHandle );
2912
+ }
2913
+ }
2914
+ }
2915
+
2916
+ if ( special.add ) {
2917
+ special.add.call( elem, handleObj );
2918
+
2919
+ if ( !handleObj.handler.guid ) {
2920
+ handleObj.handler.guid = handler.guid;
2921
+ }
2922
+ }
2923
+
2924
+ // Add to the element's handler list, delegates in front
2925
+ if ( selector ) {
2926
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
2927
+ } else {
2928
+ handlers.push( handleObj );
2929
+ }
2930
+
2931
+ // Keep track of which events have ever been used, for event optimization
2932
+ jQuery.event.global[ type ] = true;
2933
+ }
2934
+
2935
+ // Nullify elem to prevent memory leaks in IE
2936
+ elem = null;
2937
+ },
2938
+
2939
+ global: {},
2940
+
2941
+ // Detach an event or set of events from an element
2942
+ remove: function( elem, types, handler, selector, mappedTypes ) {
2943
+
2944
+ var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
2945
+ t, tns, type, origType, namespaces, origCount,
2946
+ j, events, special, handle, eventType, handleObj;
2947
+
2948
+ if ( !elemData || !(events = elemData.events) ) {
2949
+ return;
2950
+ }
2951
+
2952
+ // Once for each type.namespace in types; type may be omitted
2953
+ types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
2954
+ for ( t = 0; t < types.length; t++ ) {
2955
+ tns = rtypenamespace.exec( types[t] ) || [];
2956
+ type = origType = tns[1];
2957
+ namespaces = tns[2];
2958
+
2959
+ // Unbind all events (on this namespace, if provided) for the element
2960
+ if ( !type ) {
2961
+ for ( type in events ) {
2962
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
2963
+ }
2964
+ continue;
2965
+ }
2966
+
2967
+ special = jQuery.event.special[ type ] || {};
2968
+ type = ( selector? special.delegateType : special.bindType ) || type;
2969
+ eventType = events[ type ] || [];
2970
+ origCount = eventType.length;
2971
+ namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
2972
+
2973
+ // Remove matching events
2974
+ for ( j = 0; j < eventType.length; j++ ) {
2975
+ handleObj = eventType[ j ];
2976
+
2977
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
2978
+ ( !handler || handler.guid === handleObj.guid ) &&
2979
+ ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
2980
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
2981
+ eventType.splice( j--, 1 );
2982
+
2983
+ if ( handleObj.selector ) {
2984
+ eventType.delegateCount--;
2985
+ }
2986
+ if ( special.remove ) {
2987
+ special.remove.call( elem, handleObj );
2988
+ }
2989
+ }
2990
+ }
2991
+
2992
+ // Remove generic event handler if we removed something and no more handlers exist
2993
+ // (avoids potential for endless recursion during removal of special event handlers)
2994
+ if ( eventType.length === 0 && origCount !== eventType.length ) {
2995
+ if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
2996
+ jQuery.removeEvent( elem, type, elemData.handle );
2997
+ }
2998
+
2999
+ delete events[ type ];
3000
+ }
3001
+ }
3002
+
3003
+ // Remove the expando if it's no longer used
3004
+ if ( jQuery.isEmptyObject( events ) ) {
3005
+ handle = elemData.handle;
3006
+ if ( handle ) {
3007
+ handle.elem = null;
3008
+ }
3009
+
3010
+ // removeData also checks for emptiness and clears the expando if empty
3011
+ // so use it instead of delete
3012
+ jQuery.removeData( elem, [ "events", "handle" ], true );
3013
+ }
3014
+ },
3015
+
3016
+ // Events that are safe to short-circuit if no handlers are attached.
3017
+ // Native DOM events should not be added, they may have inline handlers.
3018
+ customEvent: {
3019
+ "getData": true,
3020
+ "setData": true,
3021
+ "changeData": true
3022
+ },
3023
+
3024
+ trigger: function( event, data, elem, onlyHandlers ) {
3025
+ // Don't do events on text and comment nodes
3026
+ if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
3027
+ return;
3028
+ }
3029
+
3030
+ // Event object or event type
3031
+ var type = event.type || event,
3032
+ namespaces = [],
3033
+ cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
3034
+
3035
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
3036
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
3037
+ return;
3038
+ }
3039
+
3040
+ if ( type.indexOf( "!" ) >= 0 ) {
3041
+ // Exclusive events trigger only for the exact event (no namespaces)
3042
+ type = type.slice(0, -1);
3043
+ exclusive = true;
3044
+ }
3045
+
3046
+ if ( type.indexOf( "." ) >= 0 ) {
3047
+ // Namespaced trigger; create a regexp to match event type in handle()
3048
+ namespaces = type.split(".");
3049
+ type = namespaces.shift();
3050
+ namespaces.sort();
3051
+ }
3052
+
3053
+ if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
3054
+ // No jQuery handlers for this event type, and it can't have inline handlers
3055
+ return;
3056
+ }
3057
+
3058
+ // Caller can pass in an Event, Object, or just an event type string
3059
+ event = typeof event === "object" ?
3060
+ // jQuery.Event object
3061
+ event[ jQuery.expando ] ? event :
3062
+ // Object literal
3063
+ new jQuery.Event( type, event ) :
3064
+ // Just the event type (string)
3065
+ new jQuery.Event( type );
3066
+
3067
+ event.type = type;
3068
+ event.isTrigger = true;
3069
+ event.exclusive = exclusive;
3070
+ event.namespace = namespaces.join( "." );
3071
+ event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
3072
+ ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
3073
+
3074
+ // Handle a global trigger
3075
+ if ( !elem ) {
3076
+
3077
+ // TODO: Stop taunting the data cache; remove global events and always attach to document
3078
+ cache = jQuery.cache;
3079
+ for ( i in cache ) {
3080
+ if ( cache[ i ].events && cache[ i ].events[ type ] ) {
3081
+ jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
3082
+ }
3083
+ }
3084
+ return;
3085
+ }
3086
+
3087
+ // Clean up the event in case it is being reused
3088
+ event.result = undefined;
3089
+ if ( !event.target ) {
3090
+ event.target = elem;
3091
+ }
3092
+
3093
+ // Clone any incoming data and prepend the event, creating the handler arg list
3094
+ data = data != null ? jQuery.makeArray( data ) : [];
3095
+ data.unshift( event );
3096
+
3097
+ // Allow special events to draw outside the lines
3098
+ special = jQuery.event.special[ type ] || {};
3099
+ if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
3100
+ return;
3101
+ }
3102
+
3103
+ // Determine event propagation path in advance, per W3C events spec (#9951)
3104
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
3105
+ eventPath = [[ elem, special.bindType || type ]];
3106
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
3107
+
3108
+ bubbleType = special.delegateType || type;
3109
+ cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
3110
+ old = null;
3111
+ for ( ; cur; cur = cur.parentNode ) {
3112
+ eventPath.push([ cur, bubbleType ]);
3113
+ old = cur;
3114
+ }
3115
+
3116
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
3117
+ if ( old && old === elem.ownerDocument ) {
3118
+ eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
3119
+ }
3120
+ }
3121
+
3122
+ // Fire handlers on the event path
3123
+ for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
3124
+
3125
+ cur = eventPath[i][0];
3126
+ event.type = eventPath[i][1];
3127
+
3128
+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
3129
+ if ( handle ) {
3130
+ handle.apply( cur, data );
3131
+ }
3132
+ // Note that this is a bare JS function and not a jQuery handler
3133
+ handle = ontype && cur[ ontype ];
3134
+ if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
3135
+ event.preventDefault();
3136
+ }
3137
+ }
3138
+ event.type = type;
3139
+
3140
+ // If nobody prevented the default action, do it now
3141
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
3142
+
3143
+ if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
3144
+ !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
3145
+
3146
+ // Call a native DOM method on the target with the same name name as the event.
3147
+ // Can't use an .isFunction() check here because IE6/7 fails that test.
3148
+ // Don't do default actions on window, that's where global variables be (#6170)
3149
+ // IE<9 dies on focus/blur to hidden element (#1486)
3150
+ if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
3151
+
3152
+ // Don't re-trigger an onFOO event when we call its FOO() method
3153
+ old = elem[ ontype ];
3154
+
3155
+ if ( old ) {
3156
+ elem[ ontype ] = null;
3157
+ }
3158
+
3159
+ // Prevent re-triggering of the same event, since we already bubbled it above
3160
+ jQuery.event.triggered = type;
3161
+ elem[ type ]();
3162
+ jQuery.event.triggered = undefined;
3163
+
3164
+ if ( old ) {
3165
+ elem[ ontype ] = old;
3166
+ }
3167
+ }
3168
+ }
3169
+ }
3170
+
3171
+ return event.result;
3172
+ },
3173
+
3174
+ dispatch: function( event ) {
3175
+
3176
+ // Make a writable jQuery.Event from the native event object
3177
+ event = jQuery.event.fix( event || window.event );
3178
+
3179
+ var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
3180
+ delegateCount = handlers.delegateCount,
3181
+ args = [].slice.call( arguments, 0 ),
3182
+ run_all = !event.exclusive && !event.namespace,
3183
+ handlerQueue = [],
3184
+ i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
3185
+
3186
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
3187
+ args[0] = event;
3188
+ event.delegateTarget = this;
3189
+
3190
+ // Determine handlers that should run if there are delegated events
3191
+ // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
3192
+ if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
3193
+
3194
+ // Pregenerate a single jQuery object for reuse with .is()
3195
+ jqcur = jQuery(this);
3196
+ jqcur.context = this.ownerDocument || this;
3197
+
3198
+ for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
3199
+ selMatch = {};
3200
+ matches = [];
3201
+ jqcur[0] = cur;
3202
+ for ( i = 0; i < delegateCount; i++ ) {
3203
+ handleObj = handlers[ i ];
3204
+ sel = handleObj.selector;
3205
+
3206
+ if ( selMatch[ sel ] === undefined ) {
3207
+ selMatch[ sel ] = (
3208
+ handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
3209
+ );
3210
+ }
3211
+ if ( selMatch[ sel ] ) {
3212
+ matches.push( handleObj );
3213
+ }
3214
+ }
3215
+ if ( matches.length ) {
3216
+ handlerQueue.push({ elem: cur, matches: matches });
3217
+ }
3218
+ }
3219
+ }
3220
+
3221
+ // Add the remaining (directly-bound) handlers
3222
+ if ( handlers.length > delegateCount ) {
3223
+ handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
3224
+ }
3225
+
3226
+ // Run delegates first; they may want to stop propagation beneath us
3227
+ for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
3228
+ matched = handlerQueue[ i ];
3229
+ event.currentTarget = matched.elem;
3230
+
3231
+ for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
3232
+ handleObj = matched.matches[ j ];
3233
+
3234
+ // Triggered event must either 1) be non-exclusive and have no namespace, or
3235
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
3236
+ if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
3237
+
3238
+ event.data = handleObj.data;
3239
+ event.handleObj = handleObj;
3240
+
3241
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
3242
+ .apply( matched.elem, args );
3243
+
3244
+ if ( ret !== undefined ) {
3245
+ event.result = ret;
3246
+ if ( ret === false ) {
3247
+ event.preventDefault();
3248
+ event.stopPropagation();
3249
+ }
3250
+ }
3251
+ }
3252
+ }
3253
+ }
3254
+
3255
+ return event.result;
3256
+ },
3257
+
3258
+ // Includes some event props shared by KeyEvent and MouseEvent
3259
+ // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
3260
+ props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
3261
+
3262
+ fixHooks: {},
3263
+
3264
+ keyHooks: {
3265
+ props: "char charCode key keyCode".split(" "),
3266
+ filter: function( event, original ) {
3267
+
3268
+ // Add which for key events
3269
+ if ( event.which == null ) {
3270
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
3271
+ }
3272
+
3273
+ return event;
3274
+ }
3275
+ },
3276
+
3277
+ mouseHooks: {
3278
+ props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
3279
+ filter: function( event, original ) {
3280
+ var eventDoc, doc, body,
3281
+ button = original.button,
3282
+ fromElement = original.fromElement;
3283
+
3284
+ // Calculate pageX/Y if missing and clientX/Y available
3285
+ if ( event.pageX == null && original.clientX != null ) {
3286
+ eventDoc = event.target.ownerDocument || document;
3287
+ doc = eventDoc.documentElement;
3288
+ body = eventDoc.body;
3289
+
3290
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
3291
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
3292
+ }
3293
+
3294
+ // Add relatedTarget, if necessary
3295
+ if ( !event.relatedTarget && fromElement ) {
3296
+ event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
3297
+ }
3298
+
3299
+ // Add which for click: 1 === left; 2 === middle; 3 === right
3300
+ // Note: button is not normalized, so don't use it
3301
+ if ( !event.which && button !== undefined ) {
3302
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
3303
+ }
3304
+
3305
+ return event;
3306
+ }
3307
+ },
3308
+
3309
+ fix: function( event ) {
3310
+ if ( event[ jQuery.expando ] ) {
3311
+ return event;
3312
+ }
3313
+
3314
+ // Create a writable copy of the event object and normalize some properties
3315
+ var i, prop,
3316
+ originalEvent = event,
3317
+ fixHook = jQuery.event.fixHooks[ event.type ] || {},
3318
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3319
+
3320
+ event = jQuery.Event( originalEvent );
3321
+
3322
+ for ( i = copy.length; i; ) {
3323
+ prop = copy[ --i ];
3324
+ event[ prop ] = originalEvent[ prop ];
3325
+ }
3326
+
3327
+ // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
3328
+ if ( !event.target ) {
3329
+ event.target = originalEvent.srcElement || document;
3330
+ }
3331
+
3332
+ // Target should not be a text node (#504, Safari)
3333
+ if ( event.target.nodeType === 3 ) {
3334
+ event.target = event.target.parentNode;
3335
+ }
3336
+
3337
+ // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
3338
+ if ( event.metaKey === undefined ) {
3339
+ event.metaKey = event.ctrlKey;
3340
+ }
3341
+
3342
+ return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
3343
+ },
3344
+
3345
+ special: {
3346
+ ready: {
3347
+ // Make sure the ready event is setup
3348
+ setup: jQuery.bindReady
3349
+ },
3350
+
3351
+ load: {
3352
+ // Prevent triggered image.load events from bubbling to window.load
3353
+ noBubble: true
3354
+ },
3355
+
3356
+ focus: {
3357
+ delegateType: "focusin"
3358
+ },
3359
+ blur: {
3360
+ delegateType: "focusout"
3361
+ },
3362
+
3363
+ beforeunload: {
3364
+ setup: function( data, namespaces, eventHandle ) {
3365
+ // We only want to do this special case on windows
3366
+ if ( jQuery.isWindow( this ) ) {
3367
+ this.onbeforeunload = eventHandle;
3368
+ }
3369
+ },
3370
+
3371
+ teardown: function( namespaces, eventHandle ) {
3372
+ if ( this.onbeforeunload === eventHandle ) {
3373
+ this.onbeforeunload = null;
3374
+ }
3375
+ }
3376
+ }
3377
+ },
3378
+
3379
+ simulate: function( type, elem, event, bubble ) {
3380
+ // Piggyback on a donor event to simulate a different one.
3381
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
3382
+ // simulated event prevents default then we do the same on the donor.
3383
+ var e = jQuery.extend(
3384
+ new jQuery.Event(),
3385
+ event,
3386
+ { type: type,
3387
+ isSimulated: true,
3388
+ originalEvent: {}
3389
+ }
3390
+ );
3391
+ if ( bubble ) {
3392
+ jQuery.event.trigger( e, null, elem );
3393
+ } else {
3394
+ jQuery.event.dispatch.call( elem, e );
3395
+ }
3396
+ if ( e.isDefaultPrevented() ) {
3397
+ event.preventDefault();
3398
+ }
3399
+ }
3400
+};
3401
+
3402
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
3403
+// The 1.7 special event interface should provide all the hooks needed now.
3404
+jQuery.event.handle = jQuery.event.dispatch;
3405
+
3406
+jQuery.removeEvent = document.removeEventListener ?
3407
+ function( elem, type, handle ) {
3408
+ if ( elem.removeEventListener ) {
3409
+ elem.removeEventListener( type, handle, false );
3410
+ }
3411
+ } :
3412
+ function( elem, type, handle ) {
3413
+ if ( elem.detachEvent ) {
3414
+ elem.detachEvent( "on" + type, handle );
3415
+ }
3416
+ };
3417
+
3418
+jQuery.Event = function( src, props ) {
3419
+ // Allow instantiation without the 'new' keyword
3420
+ if ( !(this instanceof jQuery.Event) ) {
3421
+ return new jQuery.Event( src, props );
3422
+ }
3423
+
3424
+ // Event object
3425
+ if ( src && src.type ) {
3426
+ this.originalEvent = src;
3427
+ this.type = src.type;
3428
+
3429
+ // Events bubbling up the document may have been marked as prevented
3430
+ // by a handler lower down the tree; reflect the correct value.
3431
+ this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
3432
+ src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
3433
+
3434
+ // Event type
3435
+ } else {
3436
+ this.type = src;
3437
+ }
3438
+
3439
+ // Put explicitly provided properties onto the event object
3440
+ if ( props ) {
3441
+ jQuery.extend( this, props );
3442
+ }
3443
+
3444
+ // Create a timestamp if incoming event doesn't have one
3445
+ this.timeStamp = src && src.timeStamp || jQuery.now();
3446
+
3447
+ // Mark it as fixed
3448
+ this[ jQuery.expando ] = true;
3449
+};
3450
+
3451
+function returnFalse() {
3452
+ return false;
3453
+}
3454
+function returnTrue() {
3455
+ return true;
3456
+}
3457
+
3458
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3459
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3460
+jQuery.Event.prototype = {
3461
+ preventDefault: function() {
3462
+ this.isDefaultPrevented = returnTrue;
3463
+
3464
+ var e = this.originalEvent;
3465
+ if ( !e ) {
3466
+ return;
3467
+ }
3468
+
3469
+ // if preventDefault exists run it on the original event
3470
+ if ( e.preventDefault ) {
3471
+ e.preventDefault();
3472
+
3473
+ // otherwise set the returnValue property of the original event to false (IE)
3474
+ } else {
3475
+ e.returnValue = false;
3476
+ }
3477
+ },
3478
+ stopPropagation: function() {
3479
+ this.isPropagationStopped = returnTrue;
3480
+
3481
+ var e = this.originalEvent;
3482
+ if ( !e ) {
3483
+ return;
3484
+ }
3485
+ // if stopPropagation exists run it on the original event
3486
+ if ( e.stopPropagation ) {
3487
+ e.stopPropagation();
3488
+ }
3489
+ // otherwise set the cancelBubble property of the original event to true (IE)
3490
+ e.cancelBubble = true;
3491
+ },
3492
+ stopImmediatePropagation: function() {
3493
+ this.isImmediatePropagationStopped = returnTrue;
3494
+ this.stopPropagation();
3495
+ },
3496
+ isDefaultPrevented: returnFalse,
3497
+ isPropagationStopped: returnFalse,
3498
+ isImmediatePropagationStopped: returnFalse
3499
+};
3500
+
3501
+// Create mouseenter/leave events using mouseover/out and event-time checks
3502
+jQuery.each({
3503
+ mouseenter: "mouseover",
3504
+ mouseleave: "mouseout"
3505
+}, function( orig, fix ) {
3506
+ jQuery.event.special[ orig ] = {
3507
+ delegateType: fix,
3508
+ bindType: fix,
3509
+
3510
+ handle: function( event ) {
3511
+ var target = this,
3512
+ related = event.relatedTarget,
3513
+ handleObj = event.handleObj,
3514
+ selector = handleObj.selector,
3515
+ ret;
3516
+
3517
+ // For mousenter/leave call the handler if related is outside the target.
3518
+ // NB: No relatedTarget if the mouse left/entered the browser window
3519
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
3520
+ event.type = handleObj.origType;
3521
+ ret = handleObj.handler.apply( this, arguments );
3522
+ event.type = fix;
3523
+ }
3524
+ return ret;
3525
+ }
3526
+ };
3527
+});
3528
+
3529
+// IE submit delegation
3530
+if ( !jQuery.support.submitBubbles ) {
3531
+
3532
+ jQuery.event.special.submit = {
3533
+ setup: function() {
3534
+ // Only need this for delegated form submit events
3535
+ if ( jQuery.nodeName( this, "form" ) ) {
3536
+ return false;
3537
+ }
3538
+
3539
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
3540
+ jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
3541
+ // Node name check avoids a VML-related crash in IE (#9807)
3542
+ var elem = e.target,
3543
+ form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
3544
+ if ( form && !form._submit_attached ) {
3545
+ jQuery.event.add( form, "submit._submit", function( event ) {
3546
+ // If form was submitted by the user, bubble the event up the tree
3547
+ if ( this.parentNode && !event.isTrigger ) {
3548
+ jQuery.event.simulate( "submit", this.parentNode, event, true );
3549
+ }
3550
+ });
3551
+ form._submit_attached = true;
3552
+ }
3553
+ });
3554
+ // return undefined since we don't need an event listener
3555
+ },
3556
+
3557
+ teardown: function() {
3558
+ // Only need this for delegated form submit events
3559
+ if ( jQuery.nodeName( this, "form" ) ) {
3560
+ return false;
3561
+ }
3562
+
3563
+ // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
3564
+ jQuery.event.remove( this, "._submit" );
3565
+ }
3566
+ };
3567
+}
3568
+
3569
+// IE change delegation and checkbox/radio fix
3570
+if ( !jQuery.support.changeBubbles ) {
3571
+
3572
+ jQuery.event.special.change = {
3573
+
3574
+ setup: function() {
3575
+
3576
+ if ( rformElems.test( this.nodeName ) ) {
3577
+ // IE doesn't fire change on a check/radio until blur; trigger it on click
3578
+ // after a propertychange. Eat the blur-change in special.change.handle.
3579
+ // This still fires onchange a second time for check/radio after blur.
3580
+ if ( this.type === "checkbox" || this.type === "radio" ) {
3581
+ jQuery.event.add( this, "propertychange._change", function( event ) {
3582
+ if ( event.originalEvent.propertyName === "checked" ) {
3583
+ this._just_changed = true;
3584
+ }
3585
+ });
3586
+ jQuery.event.add( this, "click._change", function( event ) {
3587
+ if ( this._just_changed && !event.isTrigger ) {
3588
+ this._just_changed = false;
3589
+ jQuery.event.simulate( "change", this, event, true );
3590
+ }
3591
+ });
3592
+ }
3593
+ return false;
3594
+ }
3595
+ // Delegated event; lazy-add a change handler on descendant inputs
3596
+ jQuery.event.add( this, "beforeactivate._change", function( e ) {
3597
+ var elem = e.target;
3598
+
3599
+ if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
3600
+ jQuery.event.add( elem, "change._change", function( event ) {
3601
+ if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
3602
+ jQuery.event.simulate( "change", this.parentNode, event, true );
3603
+ }
3604
+ });
3605
+ elem._change_attached = true;
3606
+ }
3607
+ });
3608
+ },
3609
+
3610
+ handle: function( event ) {
3611
+ var elem = event.target;
3612
+
3613
+ // Swallow native change events from checkbox/radio, we already triggered them above
3614
+ if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
3615
+ return event.handleObj.handler.apply( this, arguments );
3616
+ }
3617
+ },
3618
+
3619
+ teardown: function() {
3620
+ jQuery.event.remove( this, "._change" );
3621
+
3622
+ return rformElems.test( this.nodeName );
3623
+ }
3624
+ };
3625
+}
3626
+
3627
+// Create "bubbling" focus and blur events
3628
+if ( !jQuery.support.focusinBubbles ) {
3629
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3630
+
3631
+ // Attach a single capturing handler while someone wants focusin/focusout
3632
+ var attaches = 0,
3633
+ handler = function( event ) {
3634
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
3635
+ };
3636
+
3637
+ jQuery.event.special[ fix ] = {
3638
+ setup: function() {
3639
+ if ( attaches++ === 0 ) {
3640
+ document.addEventListener( orig, handler, true );
3641
+ }
3642
+ },
3643
+ teardown: function() {
3644
+ if ( --attaches === 0 ) {
3645
+ document.removeEventListener( orig, handler, true );
3646
+ }
3647
+ }
3648
+ };
3649
+ });
3650
+}
3651
+
3652
+jQuery.fn.extend({
3653
+
3654
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3655
+ var origFn, type;
3656
+
3657
+ // Types can be a map of types/handlers
3658
+ if ( typeof types === "object" ) {
3659
+ // ( types-Object, selector, data )
3660
+ if ( typeof selector !== "string" ) {
3661
+ // ( types-Object, data )
3662
+ data = selector;
3663
+ selector = undefined;
3664
+ }
3665
+ for ( type in types ) {
3666
+ this.on( type, selector, data, types[ type ], one );
3667
+ }
3668
+ return this;
3669
+ }
3670
+
3671
+ if ( data == null && fn == null ) {
3672
+ // ( types, fn )
3673
+ fn = selector;
3674
+ data = selector = undefined;
3675
+ } else if ( fn == null ) {
3676
+ if ( typeof selector === "string" ) {
3677
+ // ( types, selector, fn )
3678
+ fn = data;
3679
+ data = undefined;
3680
+ } else {
3681
+ // ( types, data, fn )
3682
+ fn = data;
3683
+ data = selector;
3684
+ selector = undefined;
3685
+ }
3686
+ }
3687
+ if ( fn === false ) {
3688
+ fn = returnFalse;
3689
+ } else if ( !fn ) {
3690
+ return this;
3691
+ }
3692
+
3693
+ if ( one === 1 ) {
3694
+ origFn = fn;
3695
+ fn = function( event ) {
3696
+ // Can use an empty set, since event contains the info
3697
+ jQuery().off( event );
3698
+ return origFn.apply( this, arguments );
3699
+ };
3700
+ // Use same guid so caller can remove using origFn
3701
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
3702
+ }
3703
+ return this.each( function() {
3704
+ jQuery.event.add( this, types, fn, data, selector );
3705
+ });
3706
+ },
3707
+ one: function( types, selector, data, fn ) {
3708
+ return this.on.call( this, types, selector, data, fn, 1 );
3709
+ },
3710
+ off: function( types, selector, fn ) {
3711
+ if ( types && types.preventDefault && types.handleObj ) {
3712
+ // ( event ) dispatched jQuery.Event
3713
+ var handleObj = types.handleObj;
3714
+ jQuery( types.delegateTarget ).off(
3715
+ handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
3716
+ handleObj.selector,
3717
+ handleObj.handler
3718
+ );
3719
+ return this;
3720
+ }
3721
+ if ( typeof types === "object" ) {
3722
+ // ( types-object [, selector] )
3723
+ for ( var type in types ) {
3724
+ this.off( type, selector, types[ type ] );
3725
+ }
3726
+ return this;
3727
+ }
3728
+ if ( selector === false || typeof selector === "function" ) {
3729
+ // ( types [, fn] )
3730
+ fn = selector;
3731
+ selector = undefined;
3732
+ }
3733
+ if ( fn === false ) {
3734
+ fn = returnFalse;
3735
+ }
3736
+ return this.each(function() {
3737
+ jQuery.event.remove( this, types, fn, selector );
3738
+ });
3739
+ },
3740
+
3741
+ bind: function( types, data, fn ) {
3742
+ return this.on( types, null, data, fn );
3743
+ },
3744
+ unbind: function( types, fn ) {
3745
+ return this.off( types, null, fn );
3746
+ },
3747
+
3748
+ live: function( types, data, fn ) {
3749
+ jQuery( this.context ).on( types, this.selector, data, fn );
3750
+ return this;
3751
+ },
3752
+ die: function( types, fn ) {
3753
+ jQuery( this.context ).off( types, this.selector || "**", fn );
3754
+ return this;
3755
+ },
3756
+
3757
+ delegate: function( selector, types, data, fn ) {
3758
+ return this.on( types, selector, data, fn );
3759
+ },
3760
+ undelegate: function( selector, types, fn ) {
3761
+ // ( namespace ) or ( selector, types [, fn] )
3762
+ return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
3763
+ },
3764
+
3765
+ trigger: function( type, data ) {
3766
+ return this.each(function() {
3767
+ jQuery.event.trigger( type, data, this );
3768
+ });
3769
+ },
3770
+ triggerHandler: function( type, data ) {
3771
+ if ( this[0] ) {
3772
+ return jQuery.event.trigger( type, data, this[0], true );
3773
+ }
3774
+ },
3775
+
3776
+ toggle: function( fn ) {
3777
+ // Save reference to arguments for access in closure
3778
+ var args = arguments,
3779
+ guid = fn.guid || jQuery.guid++,
3780
+ i = 0,
3781
+ toggler = function( event ) {
3782
+ // Figure out which function to execute
3783
+ var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3784
+ jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3785
+
3786
+ // Make sure that clicks stop
3787
+ event.preventDefault();
3788
+
3789
+ // and execute the function
3790
+ return args[ lastToggle ].apply( this, arguments ) || false;
3791
+ };
3792
+
3793
+ // link all the functions, so any of them can unbind this click handler
3794
+ toggler.guid = guid;
3795
+ while ( i < args.length ) {
3796
+ args[ i++ ].guid = guid;
3797
+ }
3798
+
3799
+ return this.click( toggler );
3800
+ },
3801
+
3802
+ hover: function( fnOver, fnOut ) {
3803
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3804
+ }
3805
+});
3806
+
3807
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3808
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3809
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
3810
+
3811
+ // Handle event binding
3812
+ jQuery.fn[ name ] = function( data, fn ) {
3813
+ if ( fn == null ) {
3814
+ fn = data;
3815
+ data = null;
3816
+ }
3817
+
3818
+ return arguments.length > 0 ?
3819
+ this.on( name, null, data, fn ) :
3820
+ this.trigger( name );
3821
+ };
3822
+
3823
+ if ( jQuery.attrFn ) {
3824
+ jQuery.attrFn[ name ] = true;
3825
+ }
3826
+
3827
+ if ( rkeyEvent.test( name ) ) {
3828
+ jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
3829
+ }
3830
+
3831
+ if ( rmouseEvent.test( name ) ) {
3832
+ jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
3833
+ }
3834
+});
3835
+
3836
+
3837
+
3838
+/*!
3839
+ * Sizzle CSS Selector Engine
3840
+ * Copyright 2012, The Dojo Foundation
3841
+ * Released under the MIT, BSD, and GPL Licenses.
3842
+ * More information: http://sizzlejs.com/
3843
+ */
3844
+(function(){
3845
+
3846
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3847
+ expando = "sizcache" + (Math.random() + '').replace('.', ''),
3848
+ done = 0,
3849
+ toString = Object.prototype.toString,
3850
+ hasDuplicate = false,
3851
+ baseHasDuplicate = true,
3852
+ rBackslash = /\\/g,
3853
+ rReturn = /\r\n/g,
3854
+ rNonWord = /\W/;
3855
+
3856
+// Here we check if the JavaScript engine is using some sort of
3857
+// optimization where it does not always call our comparision
3858
+// function. If that is the case, discard the hasDuplicate value.
3859
+// Thus far that includes Google Chrome.
3860
+[0, 0].sort(function() {
3861
+ baseHasDuplicate = false;
3862
+ return 0;
3863
+});
3864
+
3865
+var Sizzle = function( selector, context, results, seed ) {
3866
+ results = results || [];
3867
+ context = context || document;
3868
+
3869
+ var origContext = context;
3870
+
3871
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3872
+ return [];
3873
+ }
3874
+
3875
+ if ( !selector || typeof selector !== "string" ) {
3876
+ return results;
3877
+ }
3878
+
3879
+ var m, set, checkSet, extra, ret, cur, pop, i,
3880
+ prune = true,
3881
+ contextXML = Sizzle.isXML( context ),
3882
+ parts = [],
3883
+ soFar = selector;
3884
+
3885
+ // Reset the position of the chunker regexp (start from head)
3886
+ do {
3887
+ chunker.exec( "" );
3888
+ m = chunker.exec( soFar );
3889
+
3890
+ if ( m ) {
3891
+ soFar = m[3];
3892
+
3893
+ parts.push( m[1] );
3894
+
3895
+ if ( m[2] ) {
3896
+ extra = m[3];
3897
+ break;
3898
+ }
3899
+ }
3900
+ } while ( m );
3901
+
3902
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
3903
+
3904
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3905
+ set = posProcess( parts[0] + parts[1], context, seed );
3906
+
3907
+ } else {
3908
+ set = Expr.relative[ parts[0] ] ?
3909
+ [ context ] :
3910
+ Sizzle( parts.shift(), context );
3911
+
3912
+ while ( parts.length ) {
3913
+ selector = parts.shift();
3914
+
3915
+ if ( Expr.relative[ selector ] ) {
3916
+ selector += parts.shift();
3917
+ }
3918
+
3919
+ set = posProcess( selector, set, seed );
3920
+ }
3921
+ }
3922
+
3923
+ } else {
3924
+ // Take a shortcut and set the context if the root selector is an ID
3925
+ // (but not if it'll be faster if the inner selector is an ID)
3926
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3927
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3928
+
3929
+ ret = Sizzle.find( parts.shift(), context, contextXML );
3930
+ context = ret.expr ?
3931
+ Sizzle.filter( ret.expr, ret.set )[0] :
3932
+ ret.set[0];
3933
+ }
3934
+
3935
+ if ( context ) {
3936
+ ret = seed ?
3937
+ { expr: parts.pop(), set: makeArray(seed) } :
3938
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3939
+
3940
+ set = ret.expr ?
3941
+ Sizzle.filter( ret.expr, ret.set ) :
3942
+ ret.set;
3943
+
3944
+ if ( parts.length > 0 ) {
3945
+ checkSet = makeArray( set );
3946
+
3947
+ } else {
3948
+ prune = false;
3949
+ }
3950
+
3951
+ while ( parts.length ) {
3952
+ cur = parts.pop();
3953
+ pop = cur;
3954
+
3955
+ if ( !Expr.relative[ cur ] ) {
3956
+ cur = "";
3957
+ } else {
3958
+ pop = parts.pop();
3959
+ }
3960
+
3961
+ if ( pop == null ) {
3962
+ pop = context;
3963
+ }
3964
+
3965
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
3966
+ }
3967
+
3968
+ } else {
3969
+ checkSet = parts = [];
3970
+ }
3971
+ }
3972
+
3973
+ if ( !checkSet ) {
3974
+ checkSet = set;
3975
+ }
3976
+
3977
+ if ( !checkSet ) {
3978
+ Sizzle.error( cur || selector );
3979
+ }
3980
+
3981
+ if ( toString.call(checkSet) === "[object Array]" ) {
3982
+ if ( !prune ) {
3983
+ results.push.apply( results, checkSet );
3984
+
3985
+ } else if ( context && context.nodeType === 1 ) {
3986
+ for ( i = 0; checkSet[i] != null; i++ ) {
3987
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
3988
+ results.push( set[i] );
3989
+ }
3990
+ }
3991
+
3992
+ } else {
3993
+ for ( i = 0; checkSet[i] != null; i++ ) {
3994
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
3995
+ results.push( set[i] );
3996
+ }
3997
+ }
3998
+ }
3999
+
4000
+ } else {
4001
+ makeArray( checkSet, results );
4002
+ }
4003
+
4004
+ if ( extra ) {
4005
+ Sizzle( extra, origContext, results, seed );
4006
+ Sizzle.uniqueSort( results );
4007
+ }
4008
+
4009
+ return results;
4010
+};
4011
+
4012
+Sizzle.uniqueSort = function( results ) {
4013
+ if ( sortOrder ) {
4014
+ hasDuplicate = baseHasDuplicate;
4015
+ results.sort( sortOrder );
4016
+
4017
+ if ( hasDuplicate ) {
4018
+ for ( var i = 1; i < results.length; i++ ) {
4019
+ if ( results[i] === results[ i - 1 ] ) {
4020
+ results.splice( i--, 1 );
4021
+ }
4022
+ }
4023
+ }
4024
+ }
4025
+
4026
+ return results;
4027
+};
4028
+
4029
+Sizzle.matches = function( expr, set ) {
4030
+ return Sizzle( expr, null, null, set );
4031
+};
4032
+
4033
+Sizzle.matchesSelector = function( node, expr ) {
4034
+ return Sizzle( expr, null, null, [node] ).length > 0;
4035
+};
4036
+
4037
+Sizzle.find = function( expr, context, isXML ) {
4038
+ var set, i, len, match, type, left;
4039
+
4040
+ if ( !expr ) {
4041
+ return [];
4042
+ }
4043
+
4044
+ for ( i = 0, len = Expr.order.length; i < len; i++ ) {
4045
+ type = Expr.order[i];
4046
+
4047
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
4048
+ left = match[1];
4049
+ match.splice( 1, 1 );
4050
+
4051
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
4052
+ match[1] = (match[1] || "").replace( rBackslash, "" );
4053
+ set = Expr.find[ type ]( match, context, isXML );
4054
+
4055
+ if ( set != null ) {
4056
+ expr = expr.replace( Expr.match[ type ], "" );
4057
+ break;
4058
+ }
4059
+ }
4060
+ }
4061
+ }
4062
+
4063
+ if ( !set ) {
4064
+ set = typeof context.getElementsByTagName !== "undefined" ?
4065
+ context.getElementsByTagName( "*" ) :
4066
+ [];
4067
+ }
4068
+
4069
+ return { set: set, expr: expr };
4070
+};
4071
+
4072
+Sizzle.filter = function( expr, set, inplace, not ) {
4073
+ var match, anyFound,
4074
+ type, found, item, filter, left,
4075
+ i, pass,
4076
+ old = expr,
4077
+ result = [],
4078
+ curLoop = set,
4079
+ isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
4080
+
4081
+ while ( expr && set.length ) {
4082
+ for ( type in Expr.filter ) {
4083
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
4084
+ filter = Expr.filter[ type ];
4085
+ left = match[1];
4086
+
4087
+ anyFound = false;
4088
+
4089
+ match.splice(1,1);
4090
+
4091
+ if ( left.substr( left.length - 1 ) === "\\" ) {
4092
+ continue;
4093
+ }
4094
+
4095
+ if ( curLoop === result ) {
4096
+ result = [];
4097
+ }
4098
+
4099
+ if ( Expr.preFilter[ type ] ) {
4100
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
4101
+
4102
+ if ( !match ) {
4103
+ anyFound = found = true;
4104
+
4105
+ } else if ( match === true ) {
4106
+ continue;
4107
+ }
4108
+ }
4109
+
4110
+ if ( match ) {
4111
+ for ( i = 0; (item = curLoop[i]) != null; i++ ) {
4112
+ if ( item ) {
4113
+ found = filter( item, match, i, curLoop );
4114
+ pass = not ^ found;
4115
+
4116
+ if ( inplace && found != null ) {
4117
+ if ( pass ) {
4118
+ anyFound = true;
4119
+
4120
+ } else {
4121
+ curLoop[i] = false;
4122
+ }
4123
+
4124
+ } else if ( pass ) {
4125
+ result.push( item );
4126
+ anyFound = true;
4127
+ }
4128
+ }
4129
+ }
4130
+ }
4131
+
4132
+ if ( found !== undefined ) {
4133
+ if ( !inplace ) {
4134
+ curLoop = result;
4135
+ }
4136
+
4137
+ expr = expr.replace( Expr.match[ type ], "" );
4138
+
4139
+ if ( !anyFound ) {
4140
+ return [];
4141
+ }
4142
+
4143
+ break;
4144
+ }
4145
+ }
4146
+ }
4147
+
4148
+ // Improper expression
4149
+ if ( expr === old ) {
4150
+ if ( anyFound == null ) {
4151
+ Sizzle.error( expr );
4152
+
4153
+ } else {
4154
+ break;
4155
+ }
4156
+ }
4157
+
4158
+ old = expr;
4159
+ }
4160
+
4161
+ return curLoop;
4162
+};
4163
+
4164
+Sizzle.error = function( msg ) {
4165
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
4166
+};
4167
+
4168
+/**
4169
+ * Utility function for retreiving the text value of an array of DOM nodes
4170
+ * @param {Array|Element} elem
4171
+ */
4172
+var getText = Sizzle.getText = function( elem ) {
4173
+ var i, node,
4174
+ nodeType = elem.nodeType,
4175
+ ret = "";
4176
+
4177
+ if ( nodeType ) {
4178
+ if ( nodeType === 1 || nodeType === 9 ) {
4179
+ // Use textContent || innerText for elements
4180
+ if ( typeof elem.textContent === 'string' ) {
4181
+ return elem.textContent;
4182
+ } else if ( typeof elem.innerText === 'string' ) {
4183
+ // Replace IE's carriage returns
4184
+ return elem.innerText.replace( rReturn, '' );
4185
+ } else {
4186
+ // Traverse it's children
4187
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
4188
+ ret += getText( elem );
4189
+ }
4190
+ }
4191
+ } else if ( nodeType === 3 || nodeType === 4 ) {
4192
+ return elem.nodeValue;
4193
+ }
4194
+ } else {
4195
+
4196
+ // If no nodeType, this is expected to be an array
4197
+ for ( i = 0; (node = elem[i]); i++ ) {
4198
+ // Do not traverse comment nodes
4199
+ if ( node.nodeType !== 8 ) {
4200
+ ret += getText( node );
4201
+ }
4202
+ }
4203
+ }
4204
+ return ret;
4205
+};
4206
+
4207
+var Expr = Sizzle.selectors = {
4208
+ order: [ "ID", "NAME", "TAG" ],
4209
+
4210
+ match: {
4211
+ ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4212
+ CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4213
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
4214
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
4215
+ TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
4216
+ CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
4217
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
4218
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
4219
+ },
4220
+
4221
+ leftMatch: {},
4222
+
4223
+ attrMap: {
4224
+ "class": "className",
4225
+ "for": "htmlFor"
4226
+ },
4227
+
4228
+ attrHandle: {
4229
+ href: function( elem ) {
4230
+ return elem.getAttribute( "href" );
4231
+ },
4232
+ type: function( elem ) {
4233
+ return elem.getAttribute( "type" );
4234
+ }
4235
+ },
4236
+
4237
+ relative: {
4238
+ "+": function(checkSet, part){
4239
+ var isPartStr = typeof part === "string",
4240
+ isTag = isPartStr && !rNonWord.test( part ),
4241
+ isPartStrNotTag = isPartStr && !isTag;
4242
+
4243
+ if ( isTag ) {
4244
+ part = part.toLowerCase();
4245
+ }
4246
+
4247
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4248
+ if ( (elem = checkSet[i]) ) {
4249
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
4250
+
4251
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
4252
+ elem || false :
4253
+ elem === part;
4254
+ }
4255
+ }
4256
+
4257
+ if ( isPartStrNotTag ) {
4258
+ Sizzle.filter( part, checkSet, true );
4259
+ }
4260
+ },
4261
+
4262
+ ">": function( checkSet, part ) {
4263
+ var elem,
4264
+ isPartStr = typeof part === "string",
4265
+ i = 0,
4266
+ l = checkSet.length;
4267
+
4268
+ if ( isPartStr && !rNonWord.test( part ) ) {
4269
+ part = part.toLowerCase();
4270
+
4271
+ for ( ; i < l; i++ ) {
4272
+ elem = checkSet[i];
4273
+
4274
+ if ( elem ) {
4275
+ var parent = elem.parentNode;
4276
+ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
4277
+ }
4278
+ }
4279
+
4280
+ } else {
4281
+ for ( ; i < l; i++ ) {
4282
+ elem = checkSet[i];
4283
+
4284
+ if ( elem ) {
4285
+ checkSet[i] = isPartStr ?
4286
+ elem.parentNode :
4287
+ elem.parentNode === part;
4288
+ }
4289
+ }
4290
+
4291
+ if ( isPartStr ) {
4292
+ Sizzle.filter( part, checkSet, true );
4293
+ }
4294
+ }
4295
+ },
4296
+
4297
+ "": function(checkSet, part, isXML){
4298
+ var nodeCheck,
4299
+ doneName = done++,
4300
+ checkFn = dirCheck;
4301
+
4302
+ if ( typeof part === "string" && !rNonWord.test( part ) ) {
4303
+ part = part.toLowerCase();
4304
+ nodeCheck = part;
4305
+ checkFn = dirNodeCheck;
4306
+ }
4307
+
4308
+ checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
4309
+ },
4310
+
4311
+ "~": function( checkSet, part, isXML ) {
4312
+ var nodeCheck,
4313
+ doneName = done++,
4314
+ checkFn = dirCheck;
4315
+
4316
+ if ( typeof part === "string" && !rNonWord.test( part ) ) {
4317
+ part = part.toLowerCase();
4318
+ nodeCheck = part;
4319
+ checkFn = dirNodeCheck;
4320
+ }
4321
+
4322
+ checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
4323
+ }
4324
+ },
4325
+
4326
+ find: {
4327
+ ID: function( match, context, isXML ) {
4328
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
4329
+ var m = context.getElementById(match[1]);
4330
+ // Check parentNode to catch when Blackberry 4.6 returns
4331
+ // nodes that are no longer in the document #6963
4332
+ return m && m.parentNode ? [m] : [];
4333
+ }
4334
+ },
4335
+
4336
+ NAME: function( match, context ) {
4337
+ if ( typeof context.getElementsByName !== "undefined" ) {
4338
+ var ret = [],
4339
+ results = context.getElementsByName( match[1] );
4340
+
4341
+ for ( var i = 0, l = results.length; i < l; i++ ) {
4342
+ if ( results[i].getAttribute("name") === match[1] ) {
4343
+ ret.push( results[i] );
4344
+ }
4345
+ }
4346
+
4347
+ return ret.length === 0 ? null : ret;
4348
+ }
4349
+ },
4350
+
4351
+ TAG: function( match, context ) {
4352
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
4353
+ return context.getElementsByTagName( match[1] );
4354
+ }
4355
+ }
4356
+ },
4357
+ preFilter: {
4358
+ CLASS: function( match, curLoop, inplace, result, not, isXML ) {
4359
+ match = " " + match[1].replace( rBackslash, "" ) + " ";
4360
+
4361
+ if ( isXML ) {
4362
+ return match;
4363
+ }
4364
+
4365
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4366
+ if ( elem ) {
4367
+ if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
4368
+ if ( !inplace ) {
4369
+ result.push( elem );
4370
+ }
4371
+
4372
+ } else if ( inplace ) {
4373
+ curLoop[i] = false;
4374
+ }
4375
+ }
4376
+ }
4377
+
4378
+ return false;
4379
+ },
4380
+
4381
+ ID: function( match ) {
4382
+ return match[1].replace( rBackslash, "" );
4383
+ },
4384
+
4385
+ TAG: function( match, curLoop ) {
4386
+ return match[1].replace( rBackslash, "" ).toLowerCase();
4387
+ },
4388
+
4389
+ CHILD: function( match ) {
4390
+ if ( match[1] === "nth" ) {
4391
+ if ( !match[2] ) {
4392
+ Sizzle.error( match[0] );
4393
+ }
4394
+
4395
+ match[2] = match[2].replace(/^\+|\s*/g, '');
4396
+
4397
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
4398
+ var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
4399
+ match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
4400
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4401
+
4402
+ // calculate the numbers (first)n+(last) including if they are negative
4403
+ match[2] = (test[1] + (test[2] || 1)) - 0;
4404
+ match[3] = test[3] - 0;
4405
+ }
4406
+ else if ( match[2] ) {
4407
+ Sizzle.error( match[0] );
4408
+ }
4409
+
4410
+ // TODO: Move to normal caching system
4411
+ match[0] = done++;
4412
+
4413
+ return match;
4414
+ },
4415
+
4416
+ ATTR: function( match, curLoop, inplace, result, not, isXML ) {
4417
+ var name = match[1] = match[1].replace( rBackslash, "" );
4418
+
4419
+ if ( !isXML && Expr.attrMap[name] ) {
4420
+ match[1] = Expr.attrMap[name];
4421
+ }
4422
+
4423
+ // Handle if an un-quoted value was used
4424
+ match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
4425
+
4426
+ if ( match[2] === "~=" ) {
4427
+ match[4] = " " + match[4] + " ";
4428
+ }
4429
+
4430
+ return match;
4431
+ },
4432
+
4433
+ PSEUDO: function( match, curLoop, inplace, result, not ) {
4434
+ if ( match[1] === "not" ) {
4435
+ // If we're dealing with a complex expression, or a simple one
4436
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4437
+ match[3] = Sizzle(match[3], null, null, curLoop);
4438
+
4439
+ } else {
4440
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4441
+
4442
+ if ( !inplace ) {
4443
+ result.push.apply( result, ret );
4444
+ }
4445
+
4446
+ return false;
4447
+ }
4448
+
4449
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4450
+ return true;
4451
+ }
4452
+
4453
+ return match;
4454
+ },
4455
+
4456
+ POS: function( match ) {
4457
+ match.unshift( true );
4458
+
4459
+ return match;
4460
+ }
4461
+ },
4462
+
4463
+ filters: {
4464
+ enabled: function( elem ) {
4465
+ return elem.disabled === false && elem.type !== "hidden";
4466
+ },
4467
+
4468
+ disabled: function( elem ) {
4469
+ return elem.disabled === true;
4470
+ },
4471
+
4472
+ checked: function( elem ) {
4473
+ return elem.checked === true;
4474
+ },
4475
+
4476
+ selected: function( elem ) {
4477
+ // Accessing this property makes selected-by-default
4478
+ // options in Safari work properly
4479
+ if ( elem.parentNode ) {
4480
+ elem.parentNode.selectedIndex;
4481
+ }
4482
+
4483
+ return elem.selected === true;
4484
+ },
4485
+
4486
+ parent: function( elem ) {
4487
+ return !!elem.firstChild;
4488
+ },
4489
+
4490
+ empty: function( elem ) {
4491
+ return !elem.firstChild;
4492
+ },
4493
+
4494
+ has: function( elem, i, match ) {
4495
+ return !!Sizzle( match[3], elem ).length;
4496
+ },
4497
+
4498
+ header: function( elem ) {
4499
+ return (/h\d/i).test( elem.nodeName );
4500
+ },
4501
+
4502
+ text: function( elem ) {
4503
+ var attr = elem.getAttribute( "type" ), type = elem.type;
4504
+ // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
4505
+ // use getAttribute instead to test this case
4506
+ return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
4507
+ },
4508
+
4509
+ radio: function( elem ) {
4510
+ return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
4511
+ },
4512
+
4513
+ checkbox: function( elem ) {
4514
+ return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
4515
+ },
4516
+
4517
+ file: function( elem ) {
4518
+ return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
4519
+ },
4520
+
4521
+ password: function( elem ) {
4522
+ return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
4523
+ },
4524
+
4525
+ submit: function( elem ) {
4526
+ var name = elem.nodeName.toLowerCase();
4527
+ return (name === "input" || name === "button") && "submit" === elem.type;
4528
+ },
4529
+
4530
+ image: function( elem ) {
4531
+ return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
4532
+ },
4533
+
4534
+ reset: function( elem ) {
4535
+ var name = elem.nodeName.toLowerCase();
4536
+ return (name === "input" || name === "button") && "reset" === elem.type;
4537
+ },
4538
+
4539
+ button: function( elem ) {
4540
+ var name = elem.nodeName.toLowerCase();
4541
+ return name === "input" && "button" === elem.type || name === "button";
4542
+ },
4543
+
4544
+ input: function( elem ) {
4545
+ return (/input|select|textarea|button/i).test( elem.nodeName );
4546
+ },
4547
+
4548
+ focus: function( elem ) {
4549
+ return elem === elem.ownerDocument.activeElement;
4550
+ }
4551
+ },
4552
+ setFilters: {
4553
+ first: function( elem, i ) {
4554
+ return i === 0;
4555
+ },
4556
+
4557
+ last: function( elem, i, match, array ) {
4558
+ return i === array.length - 1;
4559
+ },
4560
+
4561
+ even: function( elem, i ) {
4562
+ return i % 2 === 0;
4563
+ },
4564
+
4565
+ odd: function( elem, i ) {
4566
+ return i % 2 === 1;
4567
+ },
4568
+
4569
+ lt: function( elem, i, match ) {
4570
+ return i < match[3] - 0;
4571
+ },
4572
+
4573
+ gt: function( elem, i, match ) {
4574
+ return i > match[3] - 0;
4575
+ },
4576
+
4577
+ nth: function( elem, i, match ) {
4578
+ return match[3] - 0 === i;
4579
+ },
4580
+
4581
+ eq: function( elem, i, match ) {
4582
+ return match[3] - 0 === i;
4583
+ }
4584
+ },
4585
+ filter: {
4586
+ PSEUDO: function( elem, match, i, array ) {
4587
+ var name = match[1],
4588
+ filter = Expr.filters[ name ];
4589
+
4590
+ if ( filter ) {
4591
+ return filter( elem, i, match, array );
4592
+
4593
+ } else if ( name === "contains" ) {
4594
+ return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
4595
+
4596
+ } else if ( name === "not" ) {
4597
+ var not = match[3];
4598
+
4599
+ for ( var j = 0, l = not.length; j < l; j++ ) {
4600
+ if ( not[j] === elem ) {
4601
+ return false;
4602
+ }
4603
+ }
4604
+
4605
+ return true;
4606
+
4607
+ } else {
4608
+ Sizzle.error( name );
4609
+ }
4610
+ },
4611
+
4612
+ CHILD: function( elem, match ) {
4613
+ var first, last,
4614
+ doneName, parent, cache,
4615
+ count, diff,
4616
+ type = match[1],
4617
+ node = elem;
4618
+
4619
+ switch ( type ) {
4620
+ case "only":
4621
+ case "first":
4622
+ while ( (node = node.previousSibling) ) {
4623
+ if ( node.nodeType === 1 ) {
4624
+ return false;
4625
+ }
4626
+ }
4627
+
4628
+ if ( type === "first" ) {
4629
+ return true;
4630
+ }
4631
+
4632
+ node = elem;
4633
+
4634
+ case "last":
4635
+ while ( (node = node.nextSibling) ) {
4636
+ if ( node.nodeType === 1 ) {
4637
+ return false;
4638
+ }
4639
+ }
4640
+
4641
+ return true;
4642
+
4643
+ case "nth":
4644
+ first = match[2];
4645
+ last = match[3];
4646
+
4647
+ if ( first === 1 && last === 0 ) {
4648
+ return true;
4649
+ }
4650
+
4651
+ doneName = match[0];
4652
+ parent = elem.parentNode;
4653
+
4654
+ if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
4655
+ count = 0;
4656
+
4657
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
4658
+ if ( node.nodeType === 1 ) {
4659
+ node.nodeIndex = ++count;
4660
+ }
4661
+ }
4662
+
4663
+ parent[ expando ] = doneName;
4664
+ }
4665
+
4666
+ diff = elem.nodeIndex - last;
4667
+
4668
+ if ( first === 0 ) {
4669
+ return diff === 0;
4670
+
4671
+ } else {
4672
+ return ( diff % first === 0 && diff / first >= 0 );
4673
+ }
4674
+ }
4675
+ },
4676
+
4677
+ ID: function( elem, match ) {
4678
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
4679
+ },
4680
+
4681
+ TAG: function( elem, match ) {
4682
+ return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
4683
+ },
4684
+
4685
+ CLASS: function( elem, match ) {
4686
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
4687
+ .indexOf( match ) > -1;
4688
+ },
4689
+
4690
+ ATTR: function( elem, match ) {
4691
+ var name = match[1],
4692
+ result = Sizzle.attr ?
4693
+ Sizzle.attr( elem, name ) :
4694
+ Expr.attrHandle[ name ] ?
4695
+ Expr.attrHandle[ name ]( elem ) :
4696
+ elem[ name ] != null ?
4697
+ elem[ name ] :
4698
+ elem.getAttribute( name ),
4699
+ value = result + "",
4700
+ type = match[2],
4701
+ check = match[4];
4702
+
4703
+ return result == null ?
4704
+ type === "!=" :
4705
+ !type && Sizzle.attr ?
4706
+ result != null :
4707
+ type === "=" ?
4708
+ value === check :
4709
+ type === "*=" ?
4710
+ value.indexOf(check) >= 0 :
4711
+ type === "~=" ?
4712
+ (" " + value + " ").indexOf(check) >= 0 :
4713
+ !check ?
4714
+ value && result !== false :
4715
+ type === "!=" ?
4716
+ value !== check :
4717
+ type === "^=" ?
4718
+ value.indexOf(check) === 0 :
4719
+ type === "$=" ?
4720
+ value.substr(value.length - check.length) === check :
4721
+ type === "|=" ?
4722
+ value === check || value.substr(0, check.length + 1) === check + "-" :
4723
+ false;
4724
+ },
4725
+
4726
+ POS: function( elem, match, i, array ) {
4727
+ var name = match[2],
4728
+ filter = Expr.setFilters[ name ];
4729
+
4730
+ if ( filter ) {
4731
+ return filter( elem, i, match, array );
4732
+ }
4733
+ }
4734
+ }
4735
+};
4736
+
4737
+var origPOS = Expr.match.POS,
4738
+ fescape = function(all, num){
4739
+ return "\\" + (num - 0 + 1);
4740
+ };
4741
+
4742
+for ( var type in Expr.match ) {
4743
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4744
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4745
+}
4746
+
4747
+var makeArray = function( array, results ) {
4748
+ array = Array.prototype.slice.call( array, 0 );
4749
+
4750
+ if ( results ) {
4751
+ results.push.apply( results, array );
4752
+ return results;
4753
+ }
4754
+
4755
+ return array;
4756
+};
4757
+
4758
+// Perform a simple check to determine if the browser is capable of
4759
+// converting a NodeList to an array using builtin methods.
4760
+// Also verifies that the returned array holds DOM nodes
4761
+// (which is not the case in the Blackberry browser)
4762
+try {
4763
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
4764
+
4765
+// Provide a fallback method if it does not work
4766
+} catch( e ) {
4767
+ makeArray = function( array, results ) {
4768
+ var i = 0,
4769
+ ret = results || [];
4770
+
4771
+ if ( toString.call(array) === "[object Array]" ) {
4772
+ Array.prototype.push.apply( ret, array );
4773
+
4774
+ } else {
4775
+ if ( typeof array.length === "number" ) {
4776
+ for ( var l = array.length; i < l; i++ ) {
4777
+ ret.push( array[i] );
4778
+ }
4779
+
4780
+ } else {
4781
+ for ( ; array[i]; i++ ) {
4782
+ ret.push( array[i] );
4783
+ }
4784
+ }
4785
+ }
4786
+
4787
+ return ret;
4788
+ };
4789
+}
4790
+
4791
+var sortOrder, siblingCheck;
4792
+
4793
+if ( document.documentElement.compareDocumentPosition ) {
4794
+ sortOrder = function( a, b ) {
4795
+ if ( a === b ) {
4796
+ hasDuplicate = true;
4797
+ return 0;
4798
+ }
4799
+
4800
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4801
+ return a.compareDocumentPosition ? -1 : 1;
4802
+ }
4803
+
4804
+ return a.compareDocumentPosition(b) & 4 ? -1 : 1;
4805
+ };
4806
+
4807
+} else {
4808
+ sortOrder = function( a, b ) {
4809
+ // The nodes are identical, we can exit early
4810
+ if ( a === b ) {
4811
+ hasDuplicate = true;
4812
+ return 0;
4813
+
4814
+ // Fallback to using sourceIndex (in IE) if it's available on both nodes
4815
+ } else if ( a.sourceIndex && b.sourceIndex ) {
4816
+ return a.sourceIndex - b.sourceIndex;
4817
+ }
4818
+
4819
+ var al, bl,
4820
+ ap = [],
4821
+ bp = [],
4822
+ aup = a.parentNode,
4823
+ bup = b.parentNode,
4824
+ cur = aup;
4825
+
4826
+ // If the nodes are siblings (or identical) we can do a quick check
4827
+ if ( aup === bup ) {
4828
+ return siblingCheck( a, b );
4829
+
4830
+ // If no parents were found then the nodes are disconnected
4831
+ } else if ( !aup ) {
4832
+ return -1;
4833
+
4834
+ } else if ( !bup ) {
4835
+ return 1;
4836
+ }
4837
+
4838
+ // Otherwise they're somewhere else in the tree so we need
4839
+ // to build up a full list of the parentNodes for comparison
4840
+ while ( cur ) {
4841
+ ap.unshift( cur );
4842
+ cur = cur.parentNode;
4843
+ }
4844
+
4845
+ cur = bup;
4846
+
4847
+ while ( cur ) {
4848
+ bp.unshift( cur );
4849
+ cur = cur.parentNode;
4850
+ }
4851
+
4852
+ al = ap.length;
4853
+ bl = bp.length;
4854
+
4855
+ // Start walking down the tree looking for a discrepancy
4856
+ for ( var i = 0; i < al && i < bl; i++ ) {
4857
+ if ( ap[i] !== bp[i] ) {
4858
+ return siblingCheck( ap[i], bp[i] );
4859
+ }
4860
+ }
4861
+
4862
+ // We ended someplace up the tree so do a sibling check
4863
+ return i === al ?
4864
+ siblingCheck( a, bp[i], -1 ) :
4865
+ siblingCheck( ap[i], b, 1 );
4866
+ };
4867
+
4868
+ siblingCheck = function( a, b, ret ) {
4869
+ if ( a === b ) {
4870
+ return ret;
4871
+
4872
+ var cur = a.nextSibling;
4873
+ }
4874
+
4875
+ while ( cur ) {
4876
+ if ( cur === b ) {
4877
+ return -1;
4878
+ }
4879
+
4880
+ cur = cur.nextSibling;
4881
+ }
4882
+
4883
+ return 1;
4884
+ };
4885
+}
4886
+
4887
+// Check to see if the browser returns elements by name when
4888
+// querying by getElementById (and provide a workaround)
4889
+(function(){
4890
+ // We're going to inject a fake input element with a specified name
4891
+ var form = document.createElement("div"),
4892
+ id = "script" + (new Date()).getTime(),
4893
+ root = document.documentElement;
4894
+
4895
+ form.innerHTML = "<a name='" + id + "'/>";
4896
+
4897
+ // Inject it into the root element, check its status, and remove it quickly
4898
+ root.insertBefore( form, root.firstChild );
4899
+
4900
+ // The workaround has to do additional checks after a getElementById
4901
+ // Which slows things down for other browsers (hence the branching)
4902
+ if ( document.getElementById( id ) ) {
4903
+ Expr.find.ID = function( match, context, isXML ) {
4904
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
4905
+ var m = context.getElementById(match[1]);
4906
+
4907
+ return m ?
4908
+ m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4909
+ [m] :
4910
+ undefined :
4911
+ [];
4912
+ }
4913
+ };
4914
+
4915
+ Expr.filter.ID = function( elem, match ) {
4916
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4917
+
4918
+ return elem.nodeType === 1 && node && node.nodeValue === match;
4919
+ };
4920
+ }
4921
+
4922
+ root.removeChild( form );
4923
+
4924
+ // release memory in IE
4925
+ root = form = null;
4926
+})();
4927
+
4928
+(function(){
4929
+ // Check to see if the browser returns only elements
4930
+ // when doing getElementsByTagName("*")
4931
+
4932
+ // Create a fake element
4933
+ var div = document.createElement("div");
4934
+ div.appendChild( document.createComment("") );
4935
+
4936
+ // Make sure no comments are found
4937
+ if ( div.getElementsByTagName("*").length > 0 ) {
4938
+ Expr.find.TAG = function( match, context ) {
4939
+ var results = context.getElementsByTagName( match[1] );
4940
+
4941
+ // Filter out possible comments
4942
+ if ( match[1] === "*" ) {
4943
+ var tmp = [];
4944
+
4945
+ for ( var i = 0; results[i]; i++ ) {
4946
+ if ( results[i].nodeType === 1 ) {
4947
+ tmp.push( results[i] );
4948
+ }
4949
+ }
4950
+
4951
+ results = tmp;
4952
+ }
4953
+
4954
+ return results;
4955
+ };
4956
+ }
4957
+
4958
+ // Check to see if an attribute returns normalized href attributes
4959
+ div.innerHTML = "<a href='#'></a>";
4960
+
4961
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4962
+ div.firstChild.getAttribute("href") !== "#" ) {
4963
+
4964
+ Expr.attrHandle.href = function( elem ) {
4965
+ return elem.getAttribute( "href", 2 );
4966
+ };
4967
+ }
4968
+
4969
+ // release memory in IE
4970
+ div = null;
4971
+})();
4972
+
4973
+if ( document.querySelectorAll ) {
4974
+ (function(){
4975
+ var oldSizzle = Sizzle,
4976
+ div = document.createElement("div"),
4977
+ id = "__sizzle__";
4978
+
4979
+ div.innerHTML = "<p class='TEST'></p>";
4980
+
4981
+ // Safari can't handle uppercase or unicode characters when
4982
+ // in quirks mode.
4983
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4984
+ return;
4985
+ }
4986
+
4987
+ Sizzle = function( query, context, extra, seed ) {
4988
+ context = context || document;
4989
+
4990
+ // Only use querySelectorAll on non-XML documents
4991
+ // (ID selectors don't work in non-HTML documents)
4992
+ if ( !seed && !Sizzle.isXML(context) ) {
4993
+ // See if we find a selector to speed up
4994
+ var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
4995
+
4996
+ if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
4997
+ // Speed-up: Sizzle("TAG")
4998
+ if ( match[1] ) {
4999
+ return makeArray( context.getElementsByTagName( query ), extra );
This file is too large to show in full.
docs/docs/likebutton/js/tests/vendor/qunit.css
new
+232
@@ -0,0 +1,232 @@
1
+/**
2
+ * QUnit - A JavaScript Unit Testing Framework
3
+ *
4
+ * http://docs.jquery.com/QUnit
5
+ *
6
+ * Copyright (c) 2012 John Resig, Jörn Zaefferer
7
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
8
+ * or GPL (GPL-LICENSE.txt) licenses.
9
+ */
10
+
11
+/** Font Family and Sizes */
12
+
13
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
14
+ font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
15
+}
16
+
17
+#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
18
+#qunit-tests { font-size: smaller; }
19
+
20
+
21
+/** Resets */
22
+
23
+#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
24
+ margin: 0;
25
+ padding: 0;
26
+}
27
+
28
+
29
+/** Header */
30
+
31
+#qunit-header {
32
+ padding: 0.5em 0 0.5em 1em;
33
+
34
+ color: #8699a4;
35
+ background-color: #0d3349;
36
+
37
+ font-size: 1.5em;
38
+ line-height: 1em;
39
+ font-weight: normal;
40
+
41
+ border-radius: 15px 15px 0 0;
42
+ -moz-border-radius: 15px 15px 0 0;
43
+ -webkit-border-top-right-radius: 15px;
44
+ -webkit-border-top-left-radius: 15px;
45
+}
46
+
47
+#qunit-header a {
48
+ text-decoration: none;
49
+ color: #c2ccd1;
50
+}
51
+
52
+#qunit-header a:hover,
53
+#qunit-header a:focus {
54
+ color: #fff;
55
+}
56
+
57
+#qunit-banner {
58
+ height: 5px;
59
+}
60
+
61
+#qunit-testrunner-toolbar {
62
+ padding: 0.5em 0 0.5em 2em;
63
+ color: #5E740B;
64
+ background-color: #eee;
65
+}
66
+
67
+#qunit-userAgent {
68
+ padding: 0.5em 0 0.5em 2.5em;
69
+ background-color: #2b81af;
70
+ color: #fff;
71
+ text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
72
+}
73
+
74
+
75
+/** Tests: Pass/Fail */
76
+
77
+#qunit-tests {
78
+ list-style-position: inside;
79
+}
80
+
81
+#qunit-tests li {
82
+ padding: 0.4em 0.5em 0.4em 2.5em;
83
+ border-bottom: 1px solid #fff;
84
+ list-style-position: inside;
85
+}
86
+
87
+#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
88
+ display: none;
89
+}
90
+
91
+#qunit-tests li strong {
92
+ cursor: pointer;
93
+}
94
+
95
+#qunit-tests li a {
96
+ padding: 0.5em;
97
+ color: #c2ccd1;
98
+ text-decoration: none;
99
+}
100
+#qunit-tests li a:hover,
101
+#qunit-tests li a:focus {
102
+ color: #000;
103
+}
104
+
105
+#qunit-tests ol {
106
+ margin-top: 0.5em;
107
+ padding: 0.5em;
108
+
109
+ background-color: #fff;
110
+
111
+ border-radius: 15px;
112
+ -moz-border-radius: 15px;
113
+ -webkit-border-radius: 15px;
114
+
115
+ box-shadow: inset 0px 2px 13px #999;
116
+ -moz-box-shadow: inset 0px 2px 13px #999;
117
+ -webkit-box-shadow: inset 0px 2px 13px #999;
118
+}
119
+
120
+#qunit-tests table {
121
+ border-collapse: collapse;
122
+ margin-top: .2em;
123
+}
124
+
125
+#qunit-tests th {
126
+ text-align: right;
127
+ vertical-align: top;
128
+ padding: 0 .5em 0 0;
129
+}
130
+
131
+#qunit-tests td {
132
+ vertical-align: top;
133
+}
134
+
135
+#qunit-tests pre {
136
+ margin: 0;
137
+ white-space: pre-wrap;
138
+ word-wrap: break-word;
139
+}
140
+
141
+#qunit-tests del {
142
+ background-color: #e0f2be;
143
+ color: #374e0c;
144
+ text-decoration: none;
145
+}
146
+
147
+#qunit-tests ins {
148
+ background-color: #ffcaca;
149
+ color: #500;
150
+ text-decoration: none;
151
+}
152
+
153
+/*** Test Counts */
154
+
155
+#qunit-tests b.counts { color: black; }
156
+#qunit-tests b.passed { color: #5E740B; }
157
+#qunit-tests b.failed { color: #710909; }
158
+
159
+#qunit-tests li li {
160
+ margin: 0.5em;
161
+ padding: 0.4em 0.5em 0.4em 0.5em;
162
+ background-color: #fff;
163
+ border-bottom: none;
164
+ list-style-position: inside;
165
+}
166
+
167
+/*** Passing Styles */
168
+
169
+#qunit-tests li li.pass {
170
+ color: #5E740B;
171
+ background-color: #fff;
172
+ border-left: 26px solid #C6E746;
173
+}
174
+
175
+#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
176
+#qunit-tests .pass .test-name { color: #366097; }
177
+
178
+#qunit-tests .pass .test-actual,
179
+#qunit-tests .pass .test-expected { color: #999999; }
180
+
181
+#qunit-banner.qunit-pass { background-color: #C6E746; }
182
+
183
+/*** Failing Styles */
184
+
185
+#qunit-tests li li.fail {
186
+ color: #710909;
187
+ background-color: #fff;
188
+ border-left: 26px solid #EE5757;
189
+ white-space: pre;
190
+}
191
+
192
+#qunit-tests > li:last-child {
193
+ border-radius: 0 0 15px 15px;
194
+ -moz-border-radius: 0 0 15px 15px;
195
+ -webkit-border-bottom-right-radius: 15px;
196
+ -webkit-border-bottom-left-radius: 15px;
197
+}
198
+
199
+#qunit-tests .fail { color: #000000; background-color: #EE5757; }
200
+#qunit-tests .fail .test-name,
201
+#qunit-tests .fail .module-name { color: #000000; }
202
+
203
+#qunit-tests .fail .test-actual { color: #EE5757; }
204
+#qunit-tests .fail .test-expected { color: green; }
205
+
206
+#qunit-banner.qunit-fail { background-color: #EE5757; }
207
+
208
+
209
+/** Result */
210
+
211
+#qunit-testresult {
212
+ padding: 0.5em 0.5em 0.5em 2.5em;
213
+
214
+ color: #2b81af;
215
+ background-color: #D2E0E6;
216
+
217
+ border-bottom: 1px solid white;
218
+}
219
+
220
+/** Fixture */
221
+
222
+#qunit-fixture {
223
+ position: absolute;
224
+ top: -10000px;
225
+ left: -10000px;
226
+}
227
+
228
+/** Runoff */
229
+
230
+#qunit-fixture {
231
+ display:none;
232
+}
\ No newline at end of file
docs/docs/likebutton/js/tests/vendor/qunit.js
new
+1510
@@ -0,0 +1,1510 @@
1
+/**
2
+ * QUnit - A JavaScript Unit Testing Framework
3
+ *
4
+ * http://docs.jquery.com/QUnit
5
+ *
6
+ * Copyright (c) 2012 John Resig, Jörn Zaefferer
7
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
8
+ * or GPL (GPL-LICENSE.txt) licenses.
9
+ */
10
+
11
+(function(window) {
12
+
13
+var defined = {
14
+ setTimeout: typeof window.setTimeout !== "undefined",
15
+ sessionStorage: (function() {
16
+ try {
17
+ return !!sessionStorage.getItem;
18
+ } catch(e) {
19
+ return false;
20
+ }
21
+ })()
22
+};
23
+
24
+var testId = 0;
25
+
26
+var Test = function(name, testName, expected, testEnvironmentArg, async, callback) {
27
+ this.name = name;
28
+ this.testName = testName;
29
+ this.expected = expected;
30
+ this.testEnvironmentArg = testEnvironmentArg;
31
+ this.async = async;
32
+ this.callback = callback;
33
+ this.assertions = [];
34
+};
35
+Test.prototype = {
36
+ init: function() {
37
+ var tests = id("qunit-tests");
38
+ if (tests) {
39
+ var b = document.createElement("strong");
40
+ b.innerHTML = "Running " + this.name;
41
+ var li = document.createElement("li");
42
+ li.appendChild( b );
43
+ li.className = "running";
44
+ li.id = this.id = "test-output" + testId++;
45
+ tests.appendChild( li );
46
+ }
47
+ },
48
+ setup: function() {
49
+ if (this.module != config.previousModule) {
50
+ if ( config.previousModule ) {
51
+ QUnit.moduleDone( {
52
+ name: config.previousModule,
53
+ failed: config.moduleStats.bad,
54
+ passed: config.moduleStats.all - config.moduleStats.bad,
55
+ total: config.moduleStats.all
56
+ } );
57
+ }
58
+ config.previousModule = this.module;
59
+ config.moduleStats = { all: 0, bad: 0 };
60
+ QUnit.moduleStart( {
61
+ name: this.module
62
+ } );
63
+ }
64
+
65
+ config.current = this;
66
+ this.testEnvironment = extend({
67
+ setup: function() {},
68
+ teardown: function() {}
69
+ }, this.moduleTestEnvironment);
70
+ if (this.testEnvironmentArg) {
71
+ extend(this.testEnvironment, this.testEnvironmentArg);
72
+ }
73
+
74
+ QUnit.testStart( {
75
+ name: this.testName
76
+ } );
77
+
78
+ // allow utility functions to access the current test environment
79
+ // TODO why??
80
+ QUnit.current_testEnvironment = this.testEnvironment;
81
+
82
+ try {
83
+ if ( !config.pollution ) {
84
+ saveGlobal();
85
+ }
86
+
87
+ this.testEnvironment.setup.call(this.testEnvironment);
88
+ } catch(e) {
89
+ QUnit.ok( false, "Setup failed on " + this.testName + ": " + e.message );
90
+ }
91
+ },
92
+ run: function() {
93
+ if ( this.async ) {
94
+ QUnit.stop();
95
+ }
96
+
97
+ if ( config.notrycatch ) {
98
+ this.callback.call(this.testEnvironment);
99
+ return;
100
+ }
101
+ try {
102
+ this.callback.call(this.testEnvironment);
103
+ } catch(e) {
104
+ fail("Test " + this.testName + " died, exception and test follows", e, this.callback);
105
+ QUnit.ok( false, "Died on test #" + (this.assertions.length + 1) + ": " + e.message + " - " + QUnit.jsDump.parse(e) );
106
+ // else next test will carry the responsibility
107
+ saveGlobal();
108
+
109
+ // Restart the tests if they're blocking
110
+ if ( config.blocking ) {
111
+ start();
112
+ }
113
+ }
114
+ },
115
+ teardown: function() {
116
+ try {
117
+ this.testEnvironment.teardown.call(this.testEnvironment);
118
+ checkPollution();
119
+ } catch(e) {
120
+ QUnit.ok( false, "Teardown failed on " + this.testName + ": " + e.message );
121
+ }
122
+ },
123
+ finish: function() {
124
+ if ( this.expected && this.expected != this.assertions.length ) {
125
+ QUnit.ok( false, "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" );
126
+ }
127
+
128
+ var good = 0, bad = 0,
129
+ tests = id("qunit-tests");
130
+
131
+ config.stats.all += this.assertions.length;
132
+ config.moduleStats.all += this.assertions.length;
133
+
134
+ if ( tests ) {
135
+ var ol = document.createElement("ol");
136
+
137
+ for ( var i = 0; i < this.assertions.length; i++ ) {
138
+ var assertion = this.assertions[i];
139
+
140
+ var li = document.createElement("li");
141
+ li.className = assertion.result ? "pass" : "fail";
142
+ li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed");
143
+ ol.appendChild( li );
144
+
145
+ if ( assertion.result ) {
146
+ good++;
147
+ } else {
148
+ bad++;
149
+ config.stats.bad++;
150
+ config.moduleStats.bad++;
151
+ }
152
+ }
153
+
154
+ // store result when possible
155
+ if ( QUnit.config.reorder && defined.sessionStorage ) {
156
+ if (bad) {
157
+ sessionStorage.setItem("qunit-" + this.module + "-" + this.testName, bad);
158
+ } else {
159
+ sessionStorage.removeItem("qunit-" + this.module + "-" + this.testName);
160
+ }
161
+ }
162
+
163
+ if (bad == 0) {
164
+ ol.style.display = "none";
165
+ }
166
+
167
+ var b = document.createElement("strong");
168
+ b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
169
+
170
+ var a = document.createElement("a");
171
+ a.innerHTML = "Rerun";
172
+ a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
173
+
174
+ addEvent(b, "click", function() {
175
+ var next = b.nextSibling.nextSibling,
176
+ display = next.style.display;
177
+ next.style.display = display === "none" ? "block" : "none";
178
+ });
179
+
180
+ addEvent(b, "dblclick", function(e) {
181
+ var target = e && e.target ? e.target : window.event.srcElement;
182
+ if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
183
+ target = target.parentNode;
184
+ }
185
+ if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
186
+ window.location = QUnit.url({ filter: getText([target]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
187
+ }
188
+ });
189
+
190
+ var li = id(this.id);
191
+ li.className = bad ? "fail" : "pass";
192
+ li.removeChild( li.firstChild );
193
+ li.appendChild( b );
194
+ li.appendChild( a );
195
+ li.appendChild( ol );
196
+
197
+ } else {
198
+ for ( var i = 0; i < this.assertions.length; i++ ) {
199
+ if ( !this.assertions[i].result ) {
200
+ bad++;
201
+ config.stats.bad++;
202
+ config.moduleStats.bad++;
203
+ }
204
+ }
205
+ }
206
+
207
+ try {
208
+ QUnit.reset();
209
+ } catch(e) {
210
+ fail("reset() failed, following Test " + this.testName + ", exception and reset fn follows", e, QUnit.reset);
211
+ }
212
+
213
+ QUnit.testDone( {
214
+ name: this.testName,
215
+ failed: bad,
216
+ passed: this.assertions.length - bad,
217
+ total: this.assertions.length
218
+ } );
219
+ },
220
+
221
+ queue: function() {
222
+ var test = this;
223
+ synchronize(function() {
224
+ test.init();
225
+ });
226
+ function run() {
227
+ // each of these can by async
228
+ synchronize(function() {
229
+ test.setup();
230
+ });
231
+ synchronize(function() {
232
+ test.run();
233
+ });
234
+ synchronize(function() {
235
+ test.teardown();
236
+ });
237
+ synchronize(function() {
238
+ test.finish();
239
+ });
240
+ }
241
+ // defer when previous test run passed, if storage is available
242
+ var bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem("qunit-" + this.module + "-" + this.testName);
243
+ if (bad) {
244
+ run();
245
+ } else {
246
+ synchronize(run);
247
+ };
248
+ }
249
+
250
+};
251
+
252
+var QUnit = {
253
+
254
+ // call on start of module test to prepend name to all tests
255
+ module: function(name, testEnvironment) {
256
+ config.currentModule = name;
257
+ config.currentModuleTestEnviroment = testEnvironment;
258
+ },
259
+
260
+ asyncTest: function(testName, expected, callback) {
261
+ if ( arguments.length === 2 ) {
262
+ callback = expected;
263
+ expected = 0;
264
+ }
265
+
266
+ QUnit.test(testName, expected, callback, true);
267
+ },
268
+
269
+ test: function(testName, expected, callback, async) {
270
+ var name = '<span class="test-name">' + testName + '</span>', testEnvironmentArg;
271
+
272
+ if ( arguments.length === 2 ) {
273
+ callback = expected;
274
+ expected = null;
275
+ }
276
+ // is 2nd argument a testEnvironment?
277
+ if ( expected && typeof expected === 'object') {
278
+ testEnvironmentArg = expected;
279
+ expected = null;
280
+ }
281
+
282
+ if ( config.currentModule ) {
283
+ name = '<span class="module-name">' + config.currentModule + "</span>: " + name;
284
+ }
285
+
286
+ if ( !validTest(config.currentModule + ": " + testName) ) {
287
+ return;
288
+ }
289
+
290
+ var test = new Test(name, testName, expected, testEnvironmentArg, async, callback);
291
+ test.module = config.currentModule;
292
+ test.moduleTestEnvironment = config.currentModuleTestEnviroment;
293
+ test.queue();
294
+ },
295
+
296
+ /**
297
+ * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
298
+ */
299
+ expect: function(asserts) {
300
+ config.current.expected = asserts;
301
+ },
302
+
303
+ /**
304
+ * Asserts true.
305
+ * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
306
+ */
307
+ ok: function(a, msg) {
308
+ a = !!a;
309
+ var details = {
310
+ result: a,
311
+ message: msg
312
+ };
313
+ msg = escapeHtml(msg);
314
+ QUnit.log(details);
315
+ config.current.assertions.push({
316
+ result: a,
317
+ message: msg
318
+ });
319
+ },
320
+
321
+ /**
322
+ * Checks that the first two arguments are equal, with an optional message.
323
+ * Prints out both actual and expected values.
324
+ *
325
+ * Prefered to ok( actual == expected, message )
326
+ *
327
+ * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." );
328
+ *
329
+ * @param Object actual
330
+ * @param Object expected
331
+ * @param String message (optional)
332
+ */
333
+ equal: function(actual, expected, message) {
334
+ QUnit.push(expected == actual, actual, expected, message);
335
+ },
336
+
337
+ notEqual: function(actual, expected, message) {
338
+ QUnit.push(expected != actual, actual, expected, message);
339
+ },
340
+
341
+ deepEqual: function(actual, expected, message) {
342
+ QUnit.push(QUnit.equiv(actual, expected), actual, expected, message);
343
+ },
344
+
345
+ notDeepEqual: function(actual, expected, message) {
346
+ QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message);
347
+ },
348
+
349
+ strictEqual: function(actual, expected, message) {
350
+ QUnit.push(expected === actual, actual, expected, message);
351
+ },
352
+
353
+ notStrictEqual: function(actual, expected, message) {
354
+ QUnit.push(expected !== actual, actual, expected, message);
355
+ },
356
+
357
+ raises: function(block, expected, message) {
358
+ var actual, ok = false;
359
+
360
+ if (typeof expected === 'string') {
361
+ message = expected;
362
+ expected = null;
363
+ }
364
+
365
+ try {
366
+ block();
367
+ } catch (e) {
368
+ actual = e;
369
+ }
370
+
371
+ if (actual) {
372
+ // we don't want to validate thrown error
373
+ if (!expected) {
374
+ ok = true;
375
+ // expected is a regexp
376
+ } else if (QUnit.objectType(expected) === "regexp") {
377
+ ok = expected.test(actual);
378
+ // expected is a constructor
379
+ } else if (actual instanceof expected) {
380
+ ok = true;
381
+ // expected is a validation function which returns true is validation passed
382
+ } else if (expected.call({}, actual) === true) {
383
+ ok = true;
384
+ }
385
+ }
386
+
387
+ QUnit.ok(ok, message);
388
+ },
389
+
390
+ start: function() {
391
+ config.semaphore--;
392
+ if (config.semaphore > 0) {
393
+ // don't start until equal number of stop-calls
394
+ return;
395
+ }
396
+ if (config.semaphore < 0) {
397
+ // ignore if start is called more often then stop
398
+ config.semaphore = 0;
399
+ }
400
+ // A slight delay, to avoid any current callbacks
401
+ if ( defined.setTimeout ) {
402
+ window.setTimeout(function() {
403
+ if (config.semaphore > 0) {
404
+ return;
405
+ }
406
+ if ( config.timeout ) {
407
+ clearTimeout(config.timeout);
408
+ }
409
+
410
+ config.blocking = false;
411
+ process();
412
+ }, 13);
413
+ } else {
414
+ config.blocking = false;
415
+ process();
416
+ }
417
+ },
418
+
419
+ stop: function(timeout) {
420
+ config.semaphore++;
421
+ config.blocking = true;
422
+
423
+ if ( timeout && defined.setTimeout ) {
424
+ clearTimeout(config.timeout);
425
+ config.timeout = window.setTimeout(function() {
426
+ QUnit.ok( false, "Test timed out" );
427
+ QUnit.start();
428
+ }, timeout);
429
+ }
430
+ }
431
+};
432
+
433
+// Backwards compatibility, deprecated
434
+QUnit.equals = QUnit.equal;
435
+QUnit.same = QUnit.deepEqual;
436
+
437
+// Maintain internal state
438
+var config = {
439
+ // The queue of tests to run
440
+ queue: [],
441
+
442
+ // block until document ready
443
+ blocking: true,
444
+
445
+ // when enabled, show only failing tests
446
+ // gets persisted through sessionStorage and can be changed in UI via checkbox
447
+ hidepassed: false,
448
+
449
+ // by default, run previously failed tests first
450
+ // very useful in combination with "Hide passed tests" checked
451
+ reorder: true,
452
+
453
+ // by default, modify document.title when suite is done
454
+ altertitle: true,
455
+
456
+ urlConfig: ['noglobals', 'notrycatch']
457
+};
458
+
459
+// Load paramaters
460
+(function() {
461
+ var location = window.location || { search: "", protocol: "file:" },
462
+ params = location.search.slice( 1 ).split( "&" ),
463
+ length = params.length,
464
+ urlParams = {},
465
+ current;
466
+
467
+ if ( params[ 0 ] ) {
468
+ for ( var i = 0; i < length; i++ ) {
469
+ current = params[ i ].split( "=" );
470
+ current[ 0 ] = decodeURIComponent( current[ 0 ] );
471
+ // allow just a key to turn on a flag, e.g., test.html?noglobals
472
+ current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
473
+ urlParams[ current[ 0 ] ] = current[ 1 ];
474
+ }
475
+ }
476
+
477
+ QUnit.urlParams = urlParams;
478
+ config.filter = urlParams.filter;
479
+
480
+ // Figure out if we're running the tests from a server or not
481
+ QUnit.isLocal = !!(location.protocol === 'file:');
482
+})();
483
+
484
+// Expose the API as global variables, unless an 'exports'
485
+// object exists, in that case we assume we're in CommonJS
486
+if ( typeof exports === "undefined" || typeof require === "undefined" ) {
487
+ extend(window, QUnit);
488
+ window.QUnit = QUnit;
489
+} else {
490
+ extend(exports, QUnit);
491
+ exports.QUnit = QUnit;
492
+}
493
+
494
+// define these after exposing globals to keep them in these QUnit namespace only
495
+extend(QUnit, {
496
+ config: config,
497
+
498
+ // Initialize the configuration options
499
+ init: function() {
500
+ extend(config, {
501
+ stats: { all: 0, bad: 0 },
502
+ moduleStats: { all: 0, bad: 0 },
503
+ started: +new Date,
504
+ updateRate: 1000,
505
+ blocking: false,
506
+ autostart: true,
507
+ autorun: false,
508
+ filter: "",
509
+ queue: [],
510
+ semaphore: 0
511
+ });
512
+
513
+ var tests = id( "qunit-tests" ),
514
+ banner = id( "qunit-banner" ),
515
+ result = id( "qunit-testresult" );
516
+
517
+ if ( tests ) {
518
+ tests.innerHTML = "";
519
+ }
520
+
521
+ if ( banner ) {
522
+ banner.className = "";
523
+ }
524
+
525
+ if ( result ) {
526
+ result.parentNode.removeChild( result );
527
+ }
528
+
529
+ if ( tests ) {
530
+ result = document.createElement( "p" );
531
+ result.id = "qunit-testresult";
532
+ result.className = "result";
533
+ tests.parentNode.insertBefore( result, tests );
534
+ result.innerHTML = 'Running...<br/> ';
535
+ }
536
+ },
537
+
538
+ /**
539
+ * Resets the test setup. Useful for tests that modify the DOM.
540
+ *
541
+ * If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
542
+ */
543
+ reset: function() {
544
+ if ( window.jQuery ) {
545
+ jQuery( "#qunit-fixture" ).html( config.fixture );
546
+ } else {
547
+ var main = id( 'qunit-fixture' );
548
+ if ( main ) {
549
+ main.innerHTML = config.fixture;
550
+ }
551
+ }
552
+ },
553
+
554
+ /**
555
+ * Trigger an event on an element.
556
+ *
557
+ * @example triggerEvent( document.body, "click" );
558
+ *
559
+ * @param DOMElement elem
560
+ * @param String type
561
+ */
562
+ triggerEvent: function( elem, type, event ) {
563
+ if ( document.createEvent ) {
564
+ event = document.createEvent("MouseEvents");
565
+ event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
566
+ 0, 0, 0, 0, 0, false, false, false, false, 0, null);
567
+ elem.dispatchEvent( event );
568
+
569
+ } else if ( elem.fireEvent ) {
570
+ elem.fireEvent("on"+type);
571
+ }
572
+ },
573
+
574
+ // Safe object type checking
575
+ is: function( type, obj ) {
576
+ return QUnit.objectType( obj ) == type;
577
+ },
578
+
579
+ objectType: function( obj ) {
580
+ if (typeof obj === "undefined") {
581
+ return "undefined";
582
+
583
+ // consider: typeof null === object
584
+ }
585
+ if (obj === null) {
586
+ return "null";
587
+ }
588
+
589
+ var type = Object.prototype.toString.call( obj )
590
+ .match(/^\[object\s(.*)\]$/)[1] || '';
591
+
592
+ switch (type) {
593
+ case 'Number':
594
+ if (isNaN(obj)) {
595
+ return "nan";
596
+ } else {
597
+ return "number";
598
+ }
599
+ case 'String':
600
+ case 'Boolean':
601
+ case 'Array':
602
+ case 'Date':
603
+ case 'RegExp':
604
+ case 'Function':
605
+ return type.toLowerCase();
606
+ }
607
+ if (typeof obj === "object") {
608
+ return "object";
609
+ }
610
+ return undefined;
611
+ },
612
+
613
+ push: function(result, actual, expected, message) {
614
+ var details = {
615
+ result: result,
616
+ message: message,
617
+ actual: actual,
618
+ expected: expected
619
+ };
620
+
621
+ message = escapeHtml(message) || (result ? "okay" : "failed");
622
+ message = '<span class="test-message">' + message + "</span>";
623
+ expected = escapeHtml(QUnit.jsDump.parse(expected));
624
+ actual = escapeHtml(QUnit.jsDump.parse(actual));
625
+ var output = message + '<table><tr class="test-expected"><th>Expected: </th><td><pre>' + expected + '</pre></td></tr>';
626
+ if (actual != expected) {
627
+ output += '<tr class="test-actual"><th>Result: </th><td><pre>' + actual + '</pre></td></tr>';
628
+ output += '<tr class="test-diff"><th>Diff: </th><td><pre>' + QUnit.diff(expected, actual) +'</pre></td></tr>';
629
+ }
630
+ if (!result) {
631
+ var source = sourceFromStacktrace();
632
+ if (source) {
633
+ details.source = source;
634
+ output += '<tr class="test-source"><th>Source: </th><td><pre>' + escapeHtml(source) + '</pre></td></tr>';
635
+ }
636
+ }
637
+ output += "</table>";
638
+
639
+ QUnit.log(details);
640
+
641
+ config.current.assertions.push({
642
+ result: !!result,
643
+ message: output
644
+ });
645
+ },
646
+
647
+ url: function( params ) {
648
+ params = extend( extend( {}, QUnit.urlParams ), params );
649
+ var querystring = "?",
650
+ key;
651
+ for ( key in params ) {
652
+ querystring += encodeURIComponent( key ) + "=" +
653
+ encodeURIComponent( params[ key ] ) + "&";
654
+ }
655
+ return window.location.pathname + querystring.slice( 0, -1 );
656
+ },
657
+
658
+ extend: extend,
659
+ id: id,
660
+ addEvent: addEvent,
661
+
662
+ // Logging callbacks; all receive a single argument with the listed properties
663
+ // run test/logs.html for any related changes
664
+ begin: function() {},
665
+ // done: { failed, passed, total, runtime }
666
+ done: function() {},
667
+ // log: { result, actual, expected, message }
668
+ log: function() {},
669
+ // testStart: { name }
670
+ testStart: function() {},
671
+ // testDone: { name, failed, passed, total }
672
+ testDone: function() {},
673
+ // moduleStart: { name }
674
+ moduleStart: function() {},
675
+ // moduleDone: { name, failed, passed, total }
676
+ moduleDone: function() {}
677
+});
678
+
679
+if ( typeof document === "undefined" || document.readyState === "complete" ) {
680
+ config.autorun = true;
681
+}
682
+
683
+QUnit.load = function() {
684
+ QUnit.begin({});
685
+
686
+ // Initialize the config, saving the execution queue
687
+ var oldconfig = extend({}, config);
688
+ QUnit.init();
689
+ extend(config, oldconfig);
690
+
691
+ config.blocking = false;
692
+
693
+ var urlConfigHtml = '', len = config.urlConfig.length;
694
+ for ( var i = 0, val; i < len, val = config.urlConfig[i]; i++ ) {
695
+ config[val] = QUnit.urlParams[val];
696
+ urlConfigHtml += '<label><input name="' + val + '" type="checkbox"' + ( config[val] ? ' checked="checked"' : '' ) + '>' + val + '</label>';
697
+ }
698
+
699
+ var userAgent = id("qunit-userAgent");
700
+ if ( userAgent ) {
701
+ userAgent.innerHTML = navigator.userAgent;
702
+ }
703
+ var banner = id("qunit-header");
704
+ if ( banner ) {
705
+ banner.innerHTML = '<a href="' + QUnit.url({ filter: undefined }) + '"> ' + banner.innerHTML + '</a> ' + urlConfigHtml;
706
+ addEvent( banner, "change", function( event ) {
707
+ var params = {};
708
+ params[ event.target.name ] = event.target.checked ? true : undefined;
709
+ window.location = QUnit.url( params );
710
+ });
711
+ }
712
+
713
+ var toolbar = id("qunit-testrunner-toolbar");
714
+ if ( toolbar ) {
715
+ var filter = document.createElement("input");
716
+ filter.type = "checkbox";
717
+ filter.id = "qunit-filter-pass";
718
+ addEvent( filter, "click", function() {
719
+ var ol = document.getElementById("qunit-tests");
720
+ if ( filter.checked ) {
721
+ ol.className = ol.className + " hidepass";
722
+ } else {
723
+ var tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
724
+ ol.className = tmp.replace(/ hidepass /, " ");
725
+ }
726
+ if ( defined.sessionStorage ) {
727
+ if (filter.checked) {
728
+ sessionStorage.setItem("qunit-filter-passed-tests", "true");
729
+ } else {
730
+ sessionStorage.removeItem("qunit-filter-passed-tests");
731
+ }
732
+ }
733
+ });
734
+ if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) {
735
+ filter.checked = true;
736
+ var ol = document.getElementById("qunit-tests");
737
+ ol.className = ol.className + " hidepass";
738
+ }
739
+ toolbar.appendChild( filter );
740
+
741
+ var label = document.createElement("label");
742
+ label.setAttribute("for", "qunit-filter-pass");
743
+ label.innerHTML = "Hide passed tests";
744
+ toolbar.appendChild( label );
745
+ }
746
+
747
+ var main = id('qunit-fixture');
748
+ if ( main ) {
749
+ config.fixture = main.innerHTML;
750
+ }
751
+
752
+ if (config.autostart) {
753
+ QUnit.start();
754
+ }
755
+};
756
+
757
+addEvent(window, "load", QUnit.load);
758
+
759
+function done() {
760
+ config.autorun = true;
761
+
762
+ // Log the last module results
763
+ if ( config.currentModule ) {
764
+ QUnit.moduleDone( {
765
+ name: config.currentModule,
766
+ failed: config.moduleStats.bad,
767
+ passed: config.moduleStats.all - config.moduleStats.bad,
768
+ total: config.moduleStats.all
769
+ } );
770
+ }
771
+
772
+ var banner = id("qunit-banner"),
773
+ tests = id("qunit-tests"),
774
+ runtime = +new Date - config.started,
775
+ passed = config.stats.all - config.stats.bad,
776
+ html = [
777
+ 'Tests completed in ',
778
+ runtime,
779
+ ' milliseconds.<br/>',
780
+ '<span class="passed">',
781
+ passed,
782
+ '</span> tests of <span class="total">',
783
+ config.stats.all,
784
+ '</span> passed, <span class="failed">',
785
+ config.stats.bad,
786
+ '</span> failed.'
787
+ ].join('');
788
+
789
+ if ( banner ) {
790
+ banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass");
791
+ }
792
+
793
+ if ( tests ) {
794
+ id( "qunit-testresult" ).innerHTML = html;
795
+ }
796
+
797
+ if ( config.altertitle && typeof document !== "undefined" && document.title ) {
798
+ // show ✖ for good, ✔ for bad suite result in title
799
+ // use escape sequences in case file gets loaded with non-utf-8-charset
800
+ document.title = [
801
+ (config.stats.bad ? "\u2716" : "\u2714"),
802
+ document.title.replace(/^[\u2714\u2716] /i, "")
803
+ ].join(" ");
804
+ }
805
+
806
+ QUnit.done( {
807
+ failed: config.stats.bad,
808
+ passed: passed,
809
+ total: config.stats.all,
810
+ runtime: runtime
811
+ } );
812
+}
813
+
814
+function validTest( name ) {
815
+ var filter = config.filter,
816
+ run = false;
817
+
818
+ if ( !filter ) {
819
+ return true;
820
+ }
821
+
822
+ var not = filter.charAt( 0 ) === "!";
823
+ if ( not ) {
824
+ filter = filter.slice( 1 );
825
+ }
826
+
827
+ if ( name.indexOf( filter ) !== -1 ) {
828
+ return !not;
829
+ }
830
+
831
+ if ( not ) {
832
+ run = true;
833
+ }
834
+
835
+ return run;
836
+}
837
+
838
+// so far supports only Firefox, Chrome and Opera (buggy)
839
+// could be extended in the future to use something like https://github.com/csnover/TraceKit
840
+function sourceFromStacktrace() {
841
+ try {
842
+ throw new Error();
843
+ } catch ( e ) {
844
+ if (e.stacktrace) {
845
+ // Opera
846
+ return e.stacktrace.split("\n")[6];
847
+ } else if (e.stack) {
848
+ // Firefox, Chrome
849
+ return e.stack.split("\n")[4];
850
+ } else if (e.sourceURL) {
851
+ // Safari, PhantomJS
852
+ // TODO sourceURL points at the 'throw new Error' line above, useless
853
+ //return e.sourceURL + ":" + e.line;
854
+ }
855
+ }
856
+}
857
+
858
+function escapeHtml(s) {
859
+ if (!s) {
860
+ return "";
861
+ }
862
+ s = s + "";
863
+ return s.replace(/[\&"<>\\]/g, function(s) {
864
+ switch(s) {
865
+ case "&": return "&";
866
+ case "\\": return "\\\\";
867
+ case '"': return '\"';
868
+ case "<": return "<";
869
+ case ">": return ">";
870
+ default: return s;
871
+ }
872
+ });
873
+}
874
+
875
+function synchronize( callback ) {
876
+ config.queue.push( callback );
877
+
878
+ if ( config.autorun && !config.blocking ) {
879
+ process();
880
+ }
881
+}
882
+
883
+function process() {
884
+ var start = (new Date()).getTime();
885
+
886
+ while ( config.queue.length && !config.blocking ) {
887
+ if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) {
888
+ config.queue.shift()();
889
+ } else {
890
+ window.setTimeout( process, 13 );
891
+ break;
892
+ }
893
+ }
894
+ if (!config.blocking && !config.queue.length) {
895
+ done();
896
+ }
897
+}
898
+
899
+function saveGlobal() {
900
+ config.pollution = [];
901
+
902
+ if ( config.noglobals ) {
903
+ for ( var key in window ) {
904
+ config.pollution.push( key );
905
+ }
906
+ }
907
+}
908
+
909
+function checkPollution( name ) {
910
+ var old = config.pollution;
911
+ saveGlobal();
912
+
913
+ var newGlobals = diff( config.pollution, old );
914
+ if ( newGlobals.length > 0 ) {
915
+ ok( false, "Introduced global variable(s): " + newGlobals.join(", ") );
916
+ }
917
+
918
+ var deletedGlobals = diff( old, config.pollution );
919
+ if ( deletedGlobals.length > 0 ) {
920
+ ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") );
921
+ }
922
+}
923
+
924
+// returns a new Array with the elements that are in a but not in b
925
+function diff( a, b ) {
926
+ var result = a.slice();
927
+ for ( var i = 0; i < result.length; i++ ) {
928
+ for ( var j = 0; j < b.length; j++ ) {
929
+ if ( result[i] === b[j] ) {
930
+ result.splice(i, 1);
931
+ i--;
932
+ break;
933
+ }
934
+ }
935
+ }
936
+ return result;
937
+}
938
+
939
+function fail(message, exception, callback) {
940
+ if ( typeof console !== "undefined" && console.error && console.warn ) {
941
+ console.error(message);
942
+ console.error(exception);
943
+ console.warn(callback.toString());
944
+
945
+ } else if ( window.opera && opera.postError ) {
946
+ opera.postError(message, exception, callback.toString);
947
+ }
948
+}
949
+
950
+function extend(a, b) {
951
+ for ( var prop in b ) {
952
+ if ( b[prop] === undefined ) {
953
+ delete a[prop];
954
+ } else {
955
+ a[prop] = b[prop];
956
+ }
957
+ }
958
+
959
+ return a;
960
+}
961
+
962
+function addEvent(elem, type, fn) {
963
+ if ( elem.addEventListener ) {
964
+ elem.addEventListener( type, fn, false );
965
+ } else if ( elem.attachEvent ) {
966
+ elem.attachEvent( "on" + type, fn );
967
+ } else {
968
+ fn();
969
+ }
970
+}
971
+
972
+function id(name) {
973
+ return !!(typeof document !== "undefined" && document && document.getElementById) &&
974
+ document.getElementById( name );
975
+}
976
+
977
+// Test for equality any JavaScript type.
978
+// Discussions and reference: http://philrathe.com/articles/equiv
979
+// Test suites: http://philrathe.com/tests/equiv
980
+// Author: Philippe Rathé <prathe@gmail.com>
981
+QUnit.equiv = function () {
982
+
983
+ var innerEquiv; // the real equiv function
984
+ var callers = []; // stack to decide between skip/abort functions
985
+ var parents = []; // stack to avoiding loops from circular referencing
986
+
987
+ // Call the o related callback with the given arguments.
988
+ function bindCallbacks(o, callbacks, args) {
989
+ var prop = QUnit.objectType(o);
990
+ if (prop) {
991
+ if (QUnit.objectType(callbacks[prop]) === "function") {
992
+ return callbacks[prop].apply(callbacks, args);
993
+ } else {
994
+ return callbacks[prop]; // or undefined
995
+ }
996
+ }
997
+ }
998
+
999
+ var callbacks = function () {
1000
+
1001
+ // for string, boolean, number and null
1002
+ function useStrictEquality(b, a) {
1003
+ if (b instanceof a.constructor || a instanceof b.constructor) {
1004
+ // to catch short annotaion VS 'new' annotation of a
1005
+ // declaration
1006
+ // e.g. var i = 1;
1007
+ // var j = new Number(1);
1008
+ return a == b;
1009
+ } else {
1010
+ return a === b;
1011
+ }
1012
+ }
1013
+
1014
+ return {
1015
+ "string" : useStrictEquality,
1016
+ "boolean" : useStrictEquality,
1017
+ "number" : useStrictEquality,
1018
+ "null" : useStrictEquality,
1019
+ "undefined" : useStrictEquality,
1020
+
1021
+ "nan" : function(b) {
1022
+ return isNaN(b);
1023
+ },
1024
+
1025
+ "date" : function(b, a) {
1026
+ return QUnit.objectType(b) === "date"
1027
+ && a.valueOf() === b.valueOf();
1028
+ },
1029
+
1030
+ "regexp" : function(b, a) {
1031
+ return QUnit.objectType(b) === "regexp"
1032
+ && a.source === b.source && // the regex itself
1033
+ a.global === b.global && // and its modifers
1034
+ // (gmi) ...
1035
+ a.ignoreCase === b.ignoreCase
1036
+ && a.multiline === b.multiline;
1037
+ },
1038
+
1039
+ // - skip when the property is a method of an instance (OOP)
1040
+ // - abort otherwise,
1041
+ // initial === would have catch identical references anyway
1042
+ "function" : function() {
1043
+ var caller = callers[callers.length - 1];
1044
+ return caller !== Object && typeof caller !== "undefined";
1045
+ },
1046
+
1047
+ "array" : function(b, a) {
1048
+ var i, j, loop;
1049
+ var len;
1050
+
1051
+ // b could be an object literal here
1052
+ if (!(QUnit.objectType(b) === "array")) {
1053
+ return false;
1054
+ }
1055
+
1056
+ len = a.length;
1057
+ if (len !== b.length) { // safe and faster
1058
+ return false;
1059
+ }
1060
+
1061
+ // track reference to avoid circular references
1062
+ parents.push(a);
1063
+ for (i = 0; i < len; i++) {
1064
+ loop = false;
1065
+ for (j = 0; j < parents.length; j++) {
1066
+ if (parents[j] === a[i]) {
1067
+ loop = true;// dont rewalk array
1068
+ }
1069
+ }
1070
+ if (!loop && !innerEquiv(a[i], b[i])) {
1071
+ parents.pop();
1072
+ return false;
1073
+ }
1074
+ }
1075
+ parents.pop();
1076
+ return true;
1077
+ },
1078
+
1079
+ "object" : function(b, a) {
1080
+ var i, j, loop;
1081
+ var eq = true; // unless we can proove it
1082
+ var aProperties = [], bProperties = []; // collection of
1083
+ // strings
1084
+
1085
+ // comparing constructors is more strict than using
1086
+ // instanceof
1087
+ if (a.constructor !== b.constructor) {
1088
+ return false;
1089
+ }
1090
+
1091
+ // stack constructor before traversing properties
1092
+ callers.push(a.constructor);
1093
+ // track reference to avoid circular references
1094
+ parents.push(a);
1095
+
1096
+ for (i in a) { // be strict: don't ensures hasOwnProperty
1097
+ // and go deep
1098
+ loop = false;
1099
+ for (j = 0; j < parents.length; j++) {
1100
+ if (parents[j] === a[i])
1101
+ loop = true; // don't go down the same path
1102
+ // twice
1103
+ }
1104
+ aProperties.push(i); // collect a's properties
1105
+
1106
+ if (!loop && !innerEquiv(a[i], b[i])) {
1107
+ eq = false;
1108
+ break;
1109
+ }
1110
+ }
1111
+
1112
+ callers.pop(); // unstack, we are done
1113
+ parents.pop();
1114
+
1115
+ for (i in b) {
1116
+ bProperties.push(i); // collect b's properties
1117
+ }
1118
+
1119
+ // Ensures identical properties name
1120
+ return eq
1121
+ && innerEquiv(aProperties.sort(), bProperties
1122
+ .sort());
1123
+ }
1124
+ };
1125
+ }();
1126
+
1127
+ innerEquiv = function() { // can take multiple arguments
1128
+ var args = Array.prototype.slice.apply(arguments);
1129
+ if (args.length < 2) {
1130
+ return true; // end transition
1131
+ }
1132
+
1133
+ return (function(a, b) {
1134
+ if (a === b) {
1135
+ return true; // catch the most you can
1136
+ } else if (a === null || b === null || typeof a === "undefined"
1137
+ || typeof b === "undefined"
1138
+ || QUnit.objectType(a) !== QUnit.objectType(b)) {
1139
+ return false; // don't lose time with error prone cases
1140
+ } else {
1141
+ return bindCallbacks(a, callbacks, [ b, a ]);
1142
+ }
1143
+
1144
+ // apply transition with (1..n) arguments
1145
+ })(args[0], args[1])
1146
+ && arguments.callee.apply(this, args.splice(1,
1147
+ args.length - 1));
1148
+ };
1149
+
1150
+ return innerEquiv;
1151
+
1152
+}();
1153
+
1154
+/**
1155
+ * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
1156
+ * http://flesler.blogspot.com Licensed under BSD
1157
+ * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
1158
+ *
1159
+ * @projectDescription Advanced and extensible data dumping for Javascript.
1160
+ * @version 1.0.0
1161
+ * @author Ariel Flesler
1162
+ * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
1163
+ */
1164
+QUnit.jsDump = (function() {
1165
+ function quote( str ) {
1166
+ return '"' + str.toString().replace(/"/g, '\\"') + '"';
1167
+ };
1168
+ function literal( o ) {
1169
+ return o + '';
1170
+ };
1171
+ function join( pre, arr, post ) {
1172
+ var s = jsDump.separator(),
1173
+ base = jsDump.indent(),
1174
+ inner = jsDump.indent(1);
1175
+ if ( arr.join )
1176
+ arr = arr.join( ',' + s + inner );
1177
+ if ( !arr )
1178
+ return pre + post;
1179
+ return [ pre, inner + arr, base + post ].join(s);
1180
+ };
1181
+ function array( arr, stack ) {
1182
+ var i = arr.length, ret = Array(i);
1183
+ this.up();
1184
+ while ( i-- )
1185
+ ret[i] = this.parse( arr[i] , undefined , stack);
1186
+ this.down();
1187
+ return join( '[', ret, ']' );
1188
+ };
1189
+
1190
+ var reName = /^function (\w+)/;
1191
+
1192
+ var jsDump = {
1193
+ parse:function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
1194
+ stack = stack || [ ];
1195
+ var parser = this.parsers[ type || this.typeOf(obj) ];
1196
+ type = typeof parser;
1197
+ var inStack = inArray(obj, stack);
1198
+ if (inStack != -1) {
1199
+ return 'recursion('+(inStack - stack.length)+')';
1200
+ }
1201
+ //else
1202
+ if (type == 'function') {
1203
+ stack.push(obj);
1204
+ var res = parser.call( this, obj, stack );
1205
+ stack.pop();
1206
+ return res;
1207
+ }
1208
+ // else
1209
+ return (type == 'string') ? parser : this.parsers.error;
1210
+ },
1211
+ typeOf:function( obj ) {
1212
+ var type;
1213
+ if ( obj === null ) {
1214
+ type = "null";
1215
+ } else if (typeof obj === "undefined") {
1216
+ type = "undefined";
1217
+ } else if (QUnit.is("RegExp", obj)) {
1218
+ type = "regexp";
1219
+ } else if (QUnit.is("Date", obj)) {
1220
+ type = "date";
1221
+ } else if (QUnit.is("Function", obj)) {
1222
+ type = "function";
1223
+ } else if (typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined") {
1224
+ type = "window";
1225
+ } else if (obj.nodeType === 9) {
1226
+ type = "document";
1227
+ } else if (obj.nodeType) {
1228
+ type = "node";
1229
+ } else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) {
1230
+ type = "array";
1231
+ } else {
1232
+ type = typeof obj;
1233
+ }
1234
+ return type;
1235
+ },
1236
+ separator:function() {
1237
+ return this.multiline ? this.HTML ? '<br />' : '\n' : this.HTML ? ' ' : ' ';
1238
+ },
1239
+ indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
1240
+ if ( !this.multiline )
1241
+ return '';
1242
+ var chr = this.indentChar;
1243
+ if ( this.HTML )
1244
+ chr = chr.replace(/\t/g,' ').replace(/ /g,' ');
1245
+ return Array( this._depth_ + (extra||0) ).join(chr);
1246
+ },
1247
+ up:function( a ) {
1248
+ this._depth_ += a || 1;
1249
+ },
1250
+ down:function( a ) {
1251
+ this._depth_ -= a || 1;
1252
+ },
1253
+ setParser:function( name, parser ) {
1254
+ this.parsers[name] = parser;
1255
+ },
1256
+ // The next 3 are exposed so you can use them
1257
+ quote:quote,
1258
+ literal:literal,
1259
+ join:join,
1260
+ //
1261
+ _depth_: 1,
1262
+ // This is the list of parsers, to modify them, use jsDump.setParser
1263
+ parsers:{
1264
+ window: '[Window]',
1265
+ document: '[Document]',
1266
+ error:'[ERROR]', //when no parser is found, shouldn't happen
1267
+ unknown: '[Unknown]',
1268
+ 'null':'null',
1269
+ 'undefined':'undefined',
1270
+ 'function':function( fn ) {
1271
+ var ret = 'function',
1272
+ name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE
1273
+ if ( name )
1274
+ ret += ' ' + name;
1275
+ ret += '(';
1276
+
1277
+ ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join('');
1278
+ return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' );
1279
+ },
1280
+ array: array,
1281
+ nodelist: array,
1282
+ arguments: array,
1283
+ object:function( map, stack ) {
1284
+ var ret = [ ];
1285
+ QUnit.jsDump.up();
1286
+ for ( var key in map ) {
1287
+ var val = map[key];
1288
+ ret.push( QUnit.jsDump.parse(key,'key') + ': ' + QUnit.jsDump.parse(val, undefined, stack));
1289
+ }
1290
+ QUnit.jsDump.down();
1291
+ return join( '{', ret, '}' );
1292
+ },
1293
+ node:function( node ) {
1294
+ var open = QUnit.jsDump.HTML ? '<' : '<',
1295
+ close = QUnit.jsDump.HTML ? '>' : '>';
1296
+
1297
+ var tag = node.nodeName.toLowerCase(),
1298
+ ret = open + tag;
1299
+
1300
+ for ( var a in QUnit.jsDump.DOMAttrs ) {
1301
+ var val = node[QUnit.jsDump.DOMAttrs[a]];
1302
+ if ( val )
1303
+ ret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' );
1304
+ }
1305
+ return ret + close + open + '/' + tag + close;
1306
+ },
1307
+ functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function
1308
+ var l = fn.length;
1309
+ if ( !l ) return '';
1310
+
1311
+ var args = Array(l);
1312
+ while ( l-- )
1313
+ args[l] = String.fromCharCode(97+l);//97 is 'a'
1314
+ return ' ' + args.join(', ') + ' ';
1315
+ },
1316
+ key:quote, //object calls it internally, the key part of an item in a map
1317
+ functionCode:'[code]', //function calls it internally, it's the content of the function
1318
+ attribute:quote, //node calls it internally, it's an html attribute value
1319
+ string:quote,
1320
+ date:quote,
1321
+ regexp:literal, //regex
1322
+ number:literal,
1323
+ 'boolean':literal
1324
+ },
1325
+ DOMAttrs:{//attributes to dump from nodes, name=>realName
1326
+ id:'id',
1327
+ name:'name',
1328
+ 'class':'className'
1329
+ },
1330
+ HTML:false,//if true, entities are escaped ( <, >, \t, space and \n )
1331
+ indentChar:' ',//indentation unit
1332
+ multiline:true //if true, items in a collection, are separated by a \n, else just a space.
1333
+ };
1334
+
1335
+ return jsDump;
1336
+})();
1337
+
1338
+// from Sizzle.js
1339
+function getText( elems ) {
1340
+ var ret = "", elem;
1341
+
1342
+ for ( var i = 0; elems[i]; i++ ) {
1343
+ elem = elems[i];
1344
+
1345
+ // Get the text from text nodes and CDATA nodes
1346
+ if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
1347
+ ret += elem.nodeValue;
1348
+
1349
+ // Traverse everything else, except comment nodes
1350
+ } else if ( elem.nodeType !== 8 ) {
1351
+ ret += getText( elem.childNodes );
1352
+ }
1353
+ }
1354
+
1355
+ return ret;
1356
+};
1357
+
1358
+//from jquery.js
1359
+function inArray( elem, array ) {
1360
+ if ( array.indexOf ) {
1361
+ return array.indexOf( elem );
1362
+ }
1363
+
1364
+ for ( var i = 0, length = array.length; i < length; i++ ) {
1365
+ if ( array[ i ] === elem ) {
1366
+ return i;
1367
+ }
1368
+ }
1369
+
1370
+ return -1;
1371
+}
1372
+
1373
+/*
1374
+ * Javascript Diff Algorithm
1375
+ * By John Resig (http://ejohn.org/)
1376
+ * Modified by Chu Alan "sprite"
1377
+ *
1378
+ * Released under the MIT license.
1379
+ *
1380
+ * More Info:
1381
+ * http://ejohn.org/projects/javascript-diff-algorithm/
1382
+ *
1383
+ * Usage: QUnit.diff(expected, actual)
1384
+ *
1385
+ * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
1386
+ */
1387
+QUnit.diff = (function() {
1388
+ function diff(o, n) {
1389
+ var ns = {};
1390
+ var os = {};
1391
+
1392
+ for (var i = 0; i < n.length; i++) {
1393
+ if (ns[n[i]] == null)
1394
+ ns[n[i]] = {
1395
+ rows: [],
1396
+ o: null
1397
+ };
1398
+ ns[n[i]].rows.push(i);
1399
+ }
1400
+
1401
+ for (var i = 0; i < o.length; i++) {
1402
+ if (os[o[i]] == null)
1403
+ os[o[i]] = {
1404
+ rows: [],
1405
+ n: null
1406
+ };
1407
+ os[o[i]].rows.push(i);
1408
+ }
1409
+
1410
+ for (var i in ns) {
1411
+ if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {
1412
+ n[ns[i].rows[0]] = {
1413
+ text: n[ns[i].rows[0]],
1414
+ row: os[i].rows[0]
1415
+ };
1416
+ o[os[i].rows[0]] = {
1417
+ text: o[os[i].rows[0]],
1418
+ row: ns[i].rows[0]
1419
+ };
1420
+ }
1421
+ }
1422
+
1423
+ for (var i = 0; i < n.length - 1; i++) {
1424
+ if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null &&
1425
+ n[i + 1] == o[n[i].row + 1]) {
1426
+ n[i + 1] = {
1427
+ text: n[i + 1],
1428
+ row: n[i].row + 1
1429
+ };
1430
+ o[n[i].row + 1] = {
1431
+ text: o[n[i].row + 1],
1432
+ row: i + 1
1433
+ };
1434
+ }
1435
+ }
1436
+
1437
+ for (var i = n.length - 1; i > 0; i--) {
1438
+ if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&
1439
+ n[i - 1] == o[n[i].row - 1]) {
1440
+ n[i - 1] = {
1441
+ text: n[i - 1],
1442
+ row: n[i].row - 1
1443
+ };
1444
+ o[n[i].row - 1] = {
1445
+ text: o[n[i].row - 1],
1446
+ row: i - 1
1447
+ };
1448
+ }
1449
+ }
1450
+
1451
+ return {
1452
+ o: o,
1453
+ n: n
1454
+ };
1455
+ }
1456
+
1457
+ return function(o, n) {
1458
+ o = o.replace(/\s+$/, '');
1459
+ n = n.replace(/\s+$/, '');
1460
+ var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/));
1461
+
1462
+ var str = "";
1463
+
1464
+ var oSpace = o.match(/\s+/g);
1465
+ if (oSpace == null) {
1466
+ oSpace = [" "];
1467
+ }
1468
+ else {
1469
+ oSpace.push(" ");
1470
+ }
1471
+ var nSpace = n.match(/\s+/g);
1472
+ if (nSpace == null) {
1473
+ nSpace = [" "];
1474
+ }
1475
+ else {
1476
+ nSpace.push(" ");
1477
+ }
1478
+
1479
+ if (out.n.length == 0) {
1480
+ for (var i = 0; i < out.o.length; i++) {
1481
+ str += '<del>' + out.o[i] + oSpace[i] + "</del>";
1482
+ }
1483
+ }
1484
+ else {
1485
+ if (out.n[0].text == null) {
1486
+ for (n = 0; n < out.o.length && out.o[n].text == null; n++) {
1487
+ str += '<del>' + out.o[n] + oSpace[n] + "</del>";
1488
+ }
1489
+ }
1490
+
1491
+ for (var i = 0; i < out.n.length; i++) {
1492
+ if (out.n[i].text == null) {
1493
+ str += '<ins>' + out.n[i] + nSpace[i] + "</ins>";
1494
+ }
1495
+ else {
1496
+ var pre = "";
1497
+
1498
+ for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) {
1499
+ pre += '<del>' + out.o[n] + oSpace[n] + "</del>";
1500
+ }
1501
+ str += " " + out.n[i].text + nSpace[i] + pre;
1502
+ }
1503
+ }
1504
+ }
1505
+
1506
+ return str;
1507
+ };
1508
+})();
1509
+
1510
+})(this);
\ No newline at end of file
docs/docs/likebutton/oneclick/app.js
new
+24
@@ -0,0 +1,24 @@
1
+/**
2
+ * @jsx ReactDOM
3
+ */
4
+
5
+var React = require('React');
6
+
7
+var MyApp = React.createComponent({
8
+
9
+ showMessage: function() {
10
+ alert('hello react!');
11
+ },
12
+
13
+ render: function() {
14
+ return (
15
+ <div onClick={this.showMessage.bind(this)}>
16
+ Click Me
17
+ </div>
18
+ );
19
+ }
20
+});
21
+
22
+
23
+// Only needed once per app.
24
+React.renderComponent(<MyApp />, document.body);
docs/docs/likebutton/oneclick/index.html
new
+14
@@ -0,0 +1,14 @@
1
+<html>
2
+<head>
3
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8">
4
+ <title>React In-Browser Compilation</title>
5
+
6
+<script src="./oneClickReact.js" type="text/javascript" charset="utf-8"></script>
7
+<script src="./app.js" type="text/jsx" charset="utf-8"></script>
8
+
9
+</head>
10
+<body id="hello">
11
+ Open this page in Safari or Firefox.
12
+</body>
13
+
14
+</html>
docs/docs/likebutton/oneclick/oneClickReact.js
new
+2
@@ -0,0 +1,2 @@
1
+(function(root){function require(e){return require[e]}var JSXScript={};root.require=require,require.JSXScript=JSXScript,this.__DEV__=this.location&&this.location.hash.indexOf("__DEV__")!==-1,require["./node-haste/lib/parse/docblock"]=require["node-haste/lib/parse/docblock"]=function(){function i(e){var t=e.match(n);return t?t[0].replace(r,"")||"":""}function c(e){e=e.replace(s,"").replace(o,"").replace(u," ").replace(a,"$1");var t="";while(t!=e)t=e,e=e.replace(f,"\n$1 $2\n");e=e.trim();var n=[],r;while(r=l.exec(e))n.push([r[1],r[2]]);return n}function h(e){var t=c(e),n={};for(var r=0;r<t.length;r++)n[t[r][0]]=t[r][1];return n}var e={exports:{}},t=e.exports,n=/^\s*(\/\*\*(.|\n)*?\*\/)/,r=/^\s*/,s=/^\/\*\*?/,o=/\*\/$/,u=/[\t ]+/g,a=/(\n|^) *\*/g,f=/(?:^|\n) *(@[^\n]*?) *\n *([^@\n\s][^@\n]+?) *\n/g,l=/(?:^|\n) *@(\S+) *([^\n]*)/g;return t.extract=i,t.parse=c,t.parseAsObject=h,e.exports}(),require["./esprima-harmony/esprima"]=require["esprima-harmony/esprima"]=function(){function w(e,t){if(!e)throw new Error("ASSERT: "+t)}function E(e,t){return a.slice(e,t)}function S(e){return"0123456789".indexOf(e)>=0}function x(e){return"0123456789abcdefABCDEF".indexOf(e)>=0}function T(e){return"01234567".indexOf(e)>=0}function N(e){return e===" "||e===" "||e===""||e==="\f"||e===" "||e.charCodeAt(0)>=5760&&" ".indexOf(e)>=0}function C(e){return e==="\n"||e==="\r"||e==="\u2028"||e==="\u2029"}function k(e){return e==="$"||e==="_"||e==="\\"||e>="a"&&e<="z"||e>="A"&&e<="Z"||e.charCodeAt(0)>=128&&u.NonAsciiIdentifierStart.test(e)}function L(e){return e==="$"||e==="_"||e==="\\"||e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||e.charCodeAt(0)>=128&&u.NonAsciiIdentifierPart.test(e)}function A(e){return e==="$"||e==="_"||e>="a"&&e<="z"||e>="A"&&e<="Z"||e.charCodeAt(0)>=128&&u.NonAsciiIdentifierStart.test(e)}function O(e){return e==="$"||e==="_"||e==="-"||e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||e.charCodeAt(0)>=128&&u.NonAsciiIdentifierPart.test(e)}function M(e){switch(e){case"class":case"enum":case"export":case"extends":case"import":case"super":return!0}return!1}function _(e){switch(e){case"implements":case"interface":case"package":case"private":case"protected":case"public":case"static":case"yield":case"let":return!0}return!1}function D(e){return e==="eval"||e==="arguments"}function P(e){var t=!1;switch(e.length){case 2:t=e==="if"||e==="in"||e==="do";break;case 3:t=e==="var"||e==="for"||e==="new"||e==="try";break;case 4:t=e==="this"||e==="else"||e==="case"||e==="void"||e==="with";break;case 5:t=e==="while"||e==="break"||e==="catch"||e==="throw";break;case 6:t=e==="return"||e==="typeof"||e==="delete"||e==="switch";break;case 7:t=e==="default"||e==="finally";break;case 8:t=e==="function"||e==="continue"||e==="debugger";break;case 10:t=e==="instanceof"}if(t)return!0;switch(e){case"const":return!0;case"yield":case"let":return!0}return f&&_(e)?!0:M(e)}function H(){return a[h++]}function B(){var e,t,n;t=!1,n=!1;while(h<v){e=a[h];if(n)e=H(),C(e)&&(n=!1,e==="\r"&&a[h]==="\n"&&++h,++p,d=h);else if(t)C(e)?(e==="\r"&&a[h+1]==="\n"&&++h,++p,++h,d=h,h>=v&&et({},o.UnexpectedToken,"ILLEGAL")):(e=H(),h>=v&&et({},o.UnexpectedToken,"ILLEGAL"),e==="*"&&(e=a[h],e==="/"&&(++h,t=!1)));else if(e==="/"){e=a[h+1];if(e==="/")h+=2,n=!0;else{if(e!=="*")break;h+=2,t=!0,h>=v&&et({},o.UnexpectedToken,"ILLEGAL")}}else if(N(e))++h;else{if(!C(e))break;++h,e==="\r"&&a[h]==="\n"&&++h,++p,d=h}}}function j(e){var t,n,r,i=0;n=e==="u"?4:2;for(t=0;t<n;++t){if(!(h<v&&x(a[h])))return"";r=H(),i=i*16+"0123456789abcdef".indexOf(r.toLowerCase())}return String.fromCharCode(i)}function F(){var e,t,n,r;e=a[h],t=0,e==="}"&&et({},o.UnexpectedToken,"ILLEGAL");while(h<v){e=H();if(!x(e))break;t=t*16+"0123456789abcdef".indexOf(e.toLowerCase())}return(t>1114111||e!=="}")&&et({},o.UnexpectedToken,"ILLEGAL"),t<=65535?String.fromCharCode(t):(n=(t-65536>>10)+55296,r=(t-65536&1023)+56320,String.fromCharCode(n,r))}function I(){var e;while(h<v){e=a[h];if(N(e))++h;else{if(!C(e))break;e==="\r"&&a[h+1]==="\n"&&++h,++p,++h}}}function q(){var e,t,r="",i;e=a[h];if(!A(e))return;t=h;while(h<v){e=a[h];if(!O(e))break;r+=H()}if(e===":"){++h,i=r,r="";while(h<v){e=a[h];if(!O(e))break;r+=H()}}return{type:n.XJSIdentifier,value:r,namespace:i,lineNumber:p,lineStart:d,range:[t,h]}}function R(){var e,t,r,i;e=a[h];if(!k(e))return;t=h;if(e==="\\"){++h;if(a[h]!=="u")return;++h,i=h,e=j("u");if(e){if(e==="\\"||!k(e))return;r=e}else h=i,r="u"}else r=H();while(h<v){e=a[h];if(!L(e))break;if(e==="\\"){++h;if(a[h]!=="u")return;++h,i=h,e=j("u");if(e){if(e==="\\"||!L(e))return;r+=e}else h=i,r+="u"}else r+=H()}return r.length===1?{type:n.Identifier,value:r,lineNumber:p,lineStart:d,range:[t,h]}:P(r)?{type:n.Keyword,value:r,lineNumber:p,lineStart:d,range:[t,h]}:r==="null"?{type:n.NullLiteral,value:r,lineNumber:p,lineStart:d,range:[t,h]}:r==="true"||r==="false"?{type:n.BooleanLiteral,value:r,lineNumber:p,lineStart:d,range:[t,h]}:{type:n.Identifier,value:r,lineNumber:p,lineStart:d,range:[t,h]}}function U(){var e=h,t=a[h],r,i,s;if(t===";"||t==="{"||t==="}")return++h,{type:n.Punctuator,value:t,lineNumber:p,lineStart:d,range:[e,h]};if(t===","||t==="("||t===")")return++h,{type:n.Punctuator,value:t,lineNumber:p,lineStart:d,range:[e,h]};r=a[h+1];if(t==="."&&!S(r))return{type:n.Punctuator,value:H(),lineNumber:p,lineStart:d,range:[e,h]};i=a[h+2],s=a[h+3];if(t===">"&&r===">"&&i===">"&&s==="=")return h+=4,{type:n.Punctuator,value:">>>=",lineNumber:p,lineStart:d,range:[e,h]};if(t==="="&&r==="="&&i==="=")return h+=3,{type:n.Punctuator,value:"===",lineNumber:p,lineStart:d,range:[e,h]};if(t==="!"&&r==="="&&i==="=")return h+=3,{type:n.Punctuator,value:"!==",lineNumber:p,lineStart:d,range:[e,h]};if(t===">"&&r===">"&&i===">")return h+=3,{type:n.Punctuator,value:">>>",lineNumber:p,lineStart:d,range:[e,h]};if(t==="<"&&r==="<"&&i==="=")return h+=3,{type:n.Punctuator,value:"<<=",lineNumber:p,lineStart:d,range:[e,h]};if(t===">"&&r===">"&&i==="=")return h+=3,{type:n.Punctuator,value:">>=",lineNumber:p,lineStart:d,range:[e,h]};if(r==="="&&"<>=!+-*%&|^/".indexOf(t)>=0)return h+=2,{type:n.Punctuator,value:t+r,lineNumber:p,lineStart:d,range:[e,h]};if(t===r&&"+-<>&|".indexOf(t)>=0&&"+-<>&|".indexOf(r)>=0)return h+=2,{type:n.Punctuator,value:t+r,lineNumber:p,lineStart:d,range:[e,h]};if(t==="="&&r===">")return h+=2,{type:n.Punctuator,value:"=>",lineNumber:p,lineStart:d,range:[e,h]};if("[]<>+-*%&|^!~?:=/".indexOf(t)>=0)return{type:n.Punctuator,value:H(),lineNumber:p,lineStart:d,range:[e,h]}}function z(){var e,t,r,i;r=a[h],w(S(r)||r===".","Numeric literal must start with a decimal digit or a decimal point"),t=h,e="";if(r!=="."){e=H(),r=a[h];if(e==="0"){if(r==="x"||r==="X"){e+=H();while(h<v){r=a[h];if(!x(r))break;e+=H()}return e.length<=2&&et({},o.UnexpectedToken,"ILLEGAL"),h<v&&(r=a[h],k(r)&&et({},o.UnexpectedToken,"ILLEGAL")),{type:n.NumericLiteral,value:parseInt(e,16),lineNumber:p,lineStart:d,range:[t,h]}}if(r==="b"||r==="B"){H(),e="";while(h<v){r=a[h];if(r!=="0"&&r!=="1")break;e+=H()}return e.length===0&&et({},o.UnexpectedToken,"ILLEGAL"),h<v&&(r=a[h],(k(r)||S(r))&&et({},o.UnexpectedToken,"ILLEGAL")),{type:n.NumericLiteral,value:parseInt(e,2),lineNumber:p,lineStart:d,range:[t,h]}}if(r==="o"||r==="O"||T(r)){T(r)?(i=!0,e=H()):(i=!1,H(),e="");while(h<v){r=a[h];if(!T(r))break;e+=H()}return e.length===0&&et({},o.UnexpectedToken,"ILLEGAL"),h<v&&(r=a[h],(k(r)||S(r))&&et({},o.UnexpectedToken,"ILLEGAL")),{type:n.NumericLiteral,value:parseInt(e,8),octal:i,lineNumber:p,lineStart:d,range:[t,h]}}S(r)&&et({},o.UnexpectedToken,"ILLEGAL")}while(h<v){r=a[h];if(!S(r))break;e+=H()}}if(r==="."){e+=H();while(h<v){r=a[h];if(!S(r))break;e+=H()}}if(r==="e"||r==="E"){e+=H(),r=a[h];if(r==="+"||r==="-")e+=H();r=a[h];if(S(r)){e+=H();while(h<v){r=a[h];if(!S(r))break;e+=H()}}else r="character "+r,h>=v&&(r="<end>"),et({},o.UnexpectedToken,"ILLEGAL")}return h<v&&(r=a[h],k(r)&&et({},o.UnexpectedToken,"ILLEGAL")),{type:n.NumericLiteral,value:parseFloat(e),lineNumber:p,lineStart:d,range:[t,h]}}function W(){var e="",t,r,i,s,u,f,l=!1;t=a[h],w(t==="'"||t==='"',"String literal must starts with a quote"),r=h,++h;while(h<v){i=H();if(i===t){t="";break}if(i==="\\"){i=H();if(!C(i))switch(i){case"n":e+="\n";break;case"r":e+="\r";break;case"t":e+=" ";break;case"u":case"x":a[h]==="{"?(++h,e+=F()):(f=h,u=j(i),u?e+=u:(h=f,e+=i));break;case"b":e+="\b";break;case"f":e+="\f";break;case"v":e+="";break;default:T(i)?(s="01234567".indexOf(i),s!==0&&(l=!0),h<v&&T(a[h])&&(l=!0,s=s*8+"01234567".indexOf(H()),"0123".indexOf(i)>=0&&h<v&&T(a[h])&&(s=s*8+"01234567".indexOf(H()))),e+=String.fromCharCode(s)):e+=i}else++p,i==="\r"&&a[h]==="\n"&&++h}else{if(C(i))break;e+=i}}return t!==""&&et({},o.UnexpectedToken,"ILLEGAL"),{type:n.StringLiteral,value:e,octal:l,lineNumber:p,lineStart:d,range:[r,h]}}function X(){var e="",t,n,r,i,s,u=!1,f;m=null,B(),n=h,t=a[h],w(t==="/","Regular expression literal must start with a slash"),e=H();while(h<v){t=H(),e+=t;if(u)t==="]"&&(u=!1);else if(t==="\\")t=H(),C(t)&&et({},o.UnterminatedRegExp),e+=t;else{if(t==="/")break;t==="["?u=!0:C(t)&&et({},o.UnterminatedRegExp)}}e.length===1&&et({},o.UnterminatedRegExp),r=e.substr(1,e.length-2),i="";while(h<v){t=a[h];if(!L(t))break;++h;if(t==="\\"&&h<v){t=a[h];if(t==="u"){++h,f=h,t=j("u");if(t){i+=t,e+="\\u";for(;f<h;++f)e+=a[f]}else h=f,i+="u",e+="\\u"}else e+="\\"}else i+=t,e+=t}try{s=new RegExp(r,i)}catch(l){et({},o.InvalidRegExp)}return{literal:e,value:s,range:[n,h]}}function V(){var e,t="&",n=0;rt("&");while(h<v&&n++<10){e=H(),t+=e;if(e===";")break}return t[1]==="#"&&t[2]==="x"?String.fromCharCode(parseInt(t.substr(3),16)):t[1]==="#"?String.fromCharCode(parseInt(t.substr(3),10)):b[t.substr(1,t.length-2)]}function $(e){var t,r="",i;i=h;while(h<v){t=a[h];if(e.indexOf(t)!==-1)break;if(t==="&"){r+=V();continue}t=H(),C(t)&&++p,r+=t}return{type:n.XJSText,value:r,lineNumber:p,lineStart:d,range:[i,h]}}function J(e){return e.type===n.Identifier||e.type===n.Keyword||e.type===n.BooleanLiteral||e.type===n.NullLiteral}function K(){var e,t;B();if(h>=v)return{type:n.EOF,lineNumber:p,lineStart:d,range:[h,h]};t=U();if(typeof t!="undefined")return t;e=a[h];if(e==="'"||e==='"')return W();if(e==="."||S(e))return z();t=R();if(typeof t!="undefined")return t;et({},o.UnexpectedToken,"ILLEGAL")}function Q(){var e;return m?(h=m.range[1],p=m.lineNumber,d=m.lineStart,e=m,m=null,e):(m=null,K())}function G(){var e,t,n;return m!==null?m:(e=h,t=p,n=d,m=K(),h=e,p=t,d=n,m)}function Y(){var e,t,n,r,i;return e=typeof y.advance=="function"?y.advance:K,t=h,n=p,r=d,m===null&&(m=e()),h=m.range[1],p=m.lineNumber,d=m.lineStart,i=e(),h=t,p=n,d=r,i}function Z(){var e,t,n,r;return e=h,t=p,n=d,B(),r=p!==t,h=e,p=t,d=n,r}function et(e,t){var n,r=Array.prototype.slice.call(arguments,2),i=t.replace(/%(\d)/g,function(e,t){return r[t]||""});throw typeof e.lineNumber=="number"?(n=new Error("Line "+e.lineNumber+": "+i),n.index=e.range[0],n.lineNumber=e.lineNumber,n.column=e.range[0]-d+1):(n=new Error("Line "+p+": "+i),n.index=h,n.lineNumber=p,n.column=h-d+1),n}function tt(){try{et.apply(null,arguments)}catch(e){if(!y.errors)throw e;y.errors.push(e)}}function nt(e){e.type===n.EOF&&et(e,o.UnexpectedEOS),e.type===n.NumericLiteral&&et(e,o.UnexpectedNumber),e.type===n.StringLiteral&&et(e,o.UnexpectedString),e.type===n.Identifier&&et(e,o.UnexpectedIdentifier),e.type===n.Keyword&&(M(e.value)?et(e,o.UnexpectedReserved):f&&_(e.value)&&et(e,o.StrictReservedWord),et(e,o.UnexpectedToken,e.value)),et(e,o.UnexpectedToken,e.value)}function rt(e){var t=Q();(t.type!==n.Punctuator||t.value!==e)&&nt(t)}function it(e){var t=Q();(t.type!==n.Keyword||t.value!==e)&&nt(t)}function st(e){var t=G();return t.type===n.Punctuator&&t.value===e}function ot(e){var t=G();return t.type===n.Keyword&&t.value===e}function ut(e){var t=G();return t.type===n.Identifier&&t.value===e}function at(){var e=G(),t=e.value;return e.type!==n.Punctuator?!1:t==="="||t==="*="||t==="/="||t==="%="||t==="+="||t==="-="||t==="<<="||t===">>="||t===">>>="||t==="&="||t==="^="||t==="|="}function ft(){var e,t;if(a[h]===";"){Q();return}t=p,B();if(p!==t)return;if(st(";")){Q();return}e=G(),e.type!==n.EOF&&!st("}")&&nt(e);return}function lt(e){return e.type===i.Identifier||e.type===i.MemberExpression}function ct(e){return lt(e)||e.type===i.ObjectPattern||e.type===i.ArrayPattern}function ht(){var e=[],t;rt("[");while(!st("]"))st(",")?(Q(),e.push(t)):(e.push(zt()),st("]")||rt(","));return rt("]"),{type:i.ArrayExpression,elements:e}}function pt(e,t){var n,r,s;return n=f,r=l,l=t.generator,s=Nn(),t.name&&f&&D(e[0].name)&&et(t.name,o.StrictParamName),l&&!c&&et({},o.NoYieldInGenerator),f=n,l=r,{type:i.FunctionExpression,id:null,params:e,body:s,generator:t.generator}}function dt(e){var t,n,r,i,s,u;n=f,f=!0,i=[],rt("(");if(!st(")")){s={};while(h<v){t=G(),r=$t(),D(t.value)&&et(t,o.StrictParamName),Object.prototype.hasOwnProperty.call(s,t.value)&&et(t,o.StrictParamDupe),i.push(r),s[r.name]=!0;if(st(")"))break;rt(",")}}return rt(")"),u=pt(i,{generator:e.generator}),f=n,u}function vt(){var e=Q();return e.type===n.StringLiteral||e.type===n.NumericLiteral?(f&&e.octal&&et(e,o.StrictOctalLiteral),nr(e)):{type:i.Identifier,name:e.value}}function mt(){var e,t,r,s;return e=G(),e.type===n.Identifier?(r=vt(),e.value==="get"&&!st(":")&&!st("(")?(t=vt(),rt("("),rt(")"),{type:i.Property,key:t,value:pt([],{generator:!1}),kind:"get"}):e.value==="set"&&!st(":")&&!st("(")?(t=vt(),rt("("),e=G(),s=[$t()],rt(")"),{type:i.Property,key:t,value:pt(s,{generator:!1,name:e}),kind:"set"}):st(":")?(Q(),{type:i.Property,key:r,value:zt(),kind:"init"}):st("(")?{type:i.Property,key:r,value:dt({generator:!1}),kind:"init",method:!0}:{type:i.Property,key:r,value:r,kind:"init",shorthand:!0}):e.type===n.EOF||e.type===n.Punctuator?(st("*")||nt(e),Q(),r=vt(),st("(")||nt(Q()),{type:i.Property,key:r,value:dt({generator:!0}),kind:"init",method:!0}):(t=vt(),st(":")?(Q(),{type:i.Property,key:t,value:zt(),kind:"init"}):st("(")?{type:i.Property,key:t,value:dt({generator:!1}),kind:"init",method:!0}:{type:i.Property,key:t,value:t,kind:"init",shorthand:!0})}function gt(){var e=[],t,n,r,u={},a=String;rt("{");while(!st("}"))t=mt(),t.key.type===i.Identifier?n=t.key.name:n=a(t.key.value),r=t.kind==="init"?s.Data:t.kind==="get"?s.Get:s.Set,Object.prototype.hasOwnProperty.call(u,n)?(u[n]===s.Data?f&&r===s.Data?tt({},o.StrictDuplicateProperty):r!==s.Data&&et({},o.AccessorDataProperty):r===s.Data?et({},o.AccessorDataProperty):u[n]&r&&et({},o.AccessorGetSet),u[n]|=r):u[n]=r,e.push(t),st("}")||rt(",");return rt("}"),{type:i.ObjectExpression,properties:e}}function yt(){var e,t=G(),r=t.type;if(r===n.Identifier)return{type:i.Identifier,name:Q().value};if(r===n.StringLiteral||r===n.NumericLiteral)return f&&t.octal&&tt(t,o.StrictOctalLiteral),nr(Q());if(r===n.Keyword){if(ot("this"))return Q(),{type:i.ThisExpression};if(ot("function"))return Ln();if(ot("class"))return Dn();if(ot("super"))return Q(),{type:i.Identifier,name:"super"}}return r===n.BooleanLiteral?(Q(),t.value=t.value==="true",nr(t)):r===n.NullLiteral?(Q(),t.value=null,nr(t)):st("[")?ht():st("{")?gt():st("(")?(Q(),g.lastParenthesized=e=Wt(),g.parenthesizedCount+=1,rt(")"),e):st("/")||st("/=")?nr(X()):st("<")?Un():nt(Q())}function bt(){var e=[];rt("(");if(!st(")"))while(h<v){e.push(zt());if(st(")"))break;rt(",")}return rt(")"),e}function wt(){var e=Q();return J(e)||nt(e),{type:i.Identifier,name:e.value}}function Et(e){return{type:i.MemberExpression,computed:!1,object:e,property:wt()}}function St(e){var t,n;return rt("["),t=Wt(),n={type:i.MemberExpression,computed:!0,object:e,property:t},rt("]"),n}function xt(e){return{type:i.CallExpression,callee:e,arguments:bt()}}function Tt(){var e;return it("new"),e={type:i.NewExpression,callee:Ct(),arguments:[]},st("(")&&(e.arguments=bt()),e}function Nt(){var e,t;e=ot("new"),t=e?Tt():yt();while(h<v)if(st("."))Q(),t=Et(t);else if(st("["))t=St(t);else{if(!st("("))break;t=xt(t)}return t}function Ct(){var e,t;e=ot("new"),t=e?Tt():yt();while(h<v)if(st("."))Q(),t=Et(t);else{if(!st("["))break;t=St(t)}return t}function kt(){var e=Nt();return(st("++")||st("--"))&&!Z()&&(f&&e.type===i.Identifier&&D(e.name)&&et({},o.StrictLHSPostfix),lt(e)||et({},o.InvalidLHSInAssignment),e={type:i.UpdateExpression,operator:Q().value,argument:e,prefix:!1}),e}function Lt(){var e,t;return st("++")||st("--")?(e=Q(),t=Lt(),f&&t.type===i.Identifier&&D(t.name)&&et({},o.StrictLHSPrefix),lt(t)||et({},o.InvalidLHSInAssignment),t={type:i.UpdateExpression,operator:e.value,argument:t,prefix:!0},t):st("+")||st("-")||st("~")||st("!")?(t={type:i.UnaryExpression,operator:Q().value,argument:Lt()},t):ot("delete")||ot("void")||ot("typeof")?(t={type:i.UnaryExpression,operator:Q().value,argument:Lt()},f&&t.operator==="delete"&&t.argument.type===i.Identifier&&tt({},o.StrictDelete),t):kt()}function At(){var e=Lt();while(st("*")||st("/")||st("%"))e={type:i.BinaryExpression,operator:Q().value,left:e,right:Lt()};return e}function Ot(){var e=At();while(st("+")||st("-"))e={type:i.BinaryExpression,operator:Q().value,left:e,right:At()};return e}function Mt(){var e=Ot();while(st("<<")||st(">>")||st(">>>"))e={type:i.BinaryExpression,operator:Q().value,left:e,right:Ot()};return e}function _t(){var e,t;t=g.allowIn,g.allowIn=!0,e=Mt();while(st("<")||st(">")||st("<=")||st(">=")||t&&ot("in")||ot("instanceof"))e={type:i.BinaryExpression,operator:Q().value,left:e,right:Mt()};return g.allowIn=t,e}function Dt(){var e=_t();while(!Z()&&(ut("is")||ut("isnt"))||st("==")||st("!=")||st("===")||st("!=="))e={type:i.BinaryExpression,operator:Q().value,left:e,right:_t()};return e}function Pt(){var e=Dt();while(st("&"))Q(),e={type:i.BinaryExpression,operator:"&",left:e,right:Dt()};return e}function Ht(){var e=Pt();while(st("^"))Q(),e={type:i.BinaryExpression,operator:"^",left:e,right:Pt()};return e}function Bt(){var e=Ht();while(st("|"))Q(),e={type:i.BinaryExpression,operator:"|",left:e,right:Ht()};return e}function jt(){var e=Bt();while(st("&&"))Q(),e={type:i.LogicalExpression,operator:"&&",left:e,right:Bt()};return e}function Ft(){var e=jt();while(st("||"))Q(),e={type:i.LogicalExpression,operator:"||",left:e,right:jt()};return e}function It(){var e,t,n;return e=Ft(),st("?")&&(Q(),t=g.allowIn,g.allowIn=!0,n=zt(),g.allowIn=t,rt(":"),e={type:i.ConditionalExpression,test:e,consequent:n,alternate:zt()}),e}function qt(e){var t,n,r,s;if(e.type===i.ObjectExpression){e.type=i.ObjectPattern;for(t=0,n=e.properties.length;t<n;t+=1)r=e.properties[t],r.kind!=="init"&&et({},o.InvalidLHSInAssignment),qt(r.value)}else if(e.type===i.ArrayExpression){e.type=i.ArrayPattern;for(t=0,n=e.elements.length;t<n;t+=1)s=e.elements[t],s&&qt(s)}else e.type===i.Identifier?D(e.name)&&et({},o.InvalidLHSInAssignment):e.type!==i.MemberExpression&&e.type!==i.CallExpression&&e.type!==i.NewExpression&&et({},o.InvalidLHSInAssignment)}function Rt(e){var t,n,r,s;w(e.type===i.SequenceExpression),s={};for(t=0,n=e.expressions.length;t<n;t+=1){r=e.expressions[t];if(r.type!==i.Identifier)return null;D(r.name)&&et({},o.StrictParamName),Object.prototype.hasOwnProperty.call(s,r.name)&&et({},o.StrictParamDupe),s[r.name]=!0}return e.expressions}function Ut(e){var t,n,r;return rt("=>"),t=f,n=l,f=!0,l=!1,r=Nn(),f=t,l=n,{type:i.ArrowFunctionExpression,id:null,params:e,body:r}}function zt(){var e,t,r,s;if(ot("yield"))return An();r=g.parenthesizedCount;if(st("(")){t=Y();if(t.type===n.Punctuator&&t.value===")")return Q(),Q(),st("=>")||nt(Q()),Ut([])}e=It();if(st("=>"))if(e.type===i.Identifier){if(g.parenthesizedCount===r||g.parenthesizedCount===r+1)return D(e.name)&&et({},o.StrictParamName),Ut([e])}else if(e.type===i.SequenceExpression&&g.parenthesizedCount===r+1){s=Rt(e);if(s)return Ut(s)}return at()&&(f&&e.type===i.Identifier&&D(e.name)&&et({},o.StrictLHSAssignment),!st("=")||e.type!==i.ObjectExpression&&e.type!==i.ArrayExpression?lt(e)||et({},o.InvalidLHSInAssignment):qt(e),e={type:i.AssignmentExpression,operator:Q().value,left:e,right:zt()}),e}function Wt(){var e=zt();if(st(",")){e={type:i.SequenceExpression,expressions:[e]};while(h<v){if(!st(","))break;Q(),e.expressions.push(zt())}}return e}function Xt(){var e=[],t;while(h<v){if(st("}"))break;t=zn();if(typeof t=="undefined")break;e.push(t)}return e}function Vt(){var e;return rt("{"),e=Xt(),rt("}"),{type:i.BlockStatement,body:e}}function $t(){var e=Q();return e.type!==n.Identifier&&nt(e),{type:i.Identifier,name:e.value}}function Jt(e){var t=$t(),n=null;return f&&D(t.name)&&tt({},o.StrictVarName),e==="const"?(rt("="),n=zt()):st("=")&&(Q(),n=zt()),{type:i.VariableDeclarator,id:t,init:n}}function Kt(e){var t=[];while(h<v){t.push(Jt(e));if(!st(","))break;Q()}return t}function Qt(){var e;return it("var"),e=Kt(),ft(),{type:i.VariableDeclaration,declarations:e,kind:"var"}}function Gt(e){var t;return it(e),t=Kt(e),ft(),{type:i.VariableDeclaration,declarations:t,kind:e}}function Yt(){var e,t;e={type:i.Path,body:[]};for(;;){t=$t(),e.body.push(t);if(!st("."))break;Q()}return e}function Zt(){return rt("*"),{type:i.Glob}}function en(){var e,t,r;return t=Q(),t.value!=="module"&&nt(t),e=$t(),st("{")?{type:i.ModuleDeclaration,id:e,body:Jn()}:(rt("="),t=G(),t.type===n.StringLiteral?r={type:i.ModuleDeclaration,id:e,from:yt()}:r={type:i.ModuleDeclaration,id:e,from:Yt()},ft(),r)}function tn(){var e;return e={type:i.ExportSpecifier,id:$t(),from:null},st(":")&&(Q(),e.from=Yt()),e}function nn(){var e,t;if(st("{")){Q(),t=[];do t.push(tn());while(st(",")&&Q());return rt("}"),{type:i.ExportSpecifierSet,specifiers:t}}return st("*")?(e={type:i.ExportSpecifier,id:Zt(),from:null},ut("from")&&(Q(),e.from=Yt())):e={type:i.ExportSpecifier,id:$t(),from:null},e}function rn(){var e,t;it("export"),e=G();if(e.type===n.Keyword||e.type===n.Identifier&&e.value==="module"){switch(e.value){case"function":return{type:i.ExportDeclaration,declaration:kn()};case"module":return{type:i.ExportDeclaration,declaration:en()};case"let":case"const":return{type:i.ExportDeclaration,declaration:Gt(e.value)};case"var":return{type:i.ExportDeclaration,declaration:Tn()}}nt(Q())}t=[nn()];if(st(","))while(h<v){if(!st(","))break;Q(),t.push(nn())}return ft(),{type:i.ExportDeclaration,specifiers:t}}function sn(){var e,t;it("import");if(st("*"))e=[Zt()];else if(st("{")){Q(),e=[];do e.push(on());while(st(",")&&Q());rt("}")}else e=[$t()];return ut("from")||et({},o.NoFromAfterImport),Q(),G().type===n.StringLiteral?t=yt():t=Yt(),ft(),{type:i.ImportDeclaration,specifiers:e,from:t}}function on(){var e;return e={type:i.ImportSpecifier,id:$t(),from:null},st(":")&&(Q(),e.from=Yt()),e}function un(){return rt(";"),{type:i.EmptyStatement}}function an(){var e=Wt();return ft(),{type:i.ExpressionStatement,expression:e}}function fn(){var e,t,n;return it("if"),rt("("),e=Wt(),rt(")"),t=Tn(),ot("else")?(Q(),n=Tn()):n=null,{type:i.IfStatement,test:e,consequent:t,alternate:n}}function ln(){var e,t,n;return it("do"),n=g.inIteration,g.inIteration=!0,e=Tn(),g.inIteration=n,it("while"),rt("("),t=Wt(),rt(")"),st(";")&&Q(),{type:i.DoWhileStatement,body:e,test:t}}function cn(){var e,t,n;return it("while"),rt("("),e=Wt(),rt(")"),n=g.inIteration,g.inIteration=!0,t=Tn(),g.inIteration=n,{type:i.WhileStatement,test:e,body:t}}function hn(){var e=Q();return{type:i.VariableDeclaration,declarations:Kt(),kind:e.value}}function pn(){var e,t,n,r,s,u,a,f;e=t=n=null,it("for"),rt("(");if(st(";"))Q();else{if(ot("var")||ot("let")||ot("const")){g.allowIn=!1,e=hn(),g.allowIn=!0;if(e.declarations.length===1)if(ot("in")||ut("of")){a=G();if(a.value!=="in"&&e.kind==="var"||!e.declarations[0].init)Q(),r=e,s=Wt(),e=null}}else g.allowIn=!1,e=Wt(),g.allowIn=!0,ut("of")?(a=Q(),r=e,s=Wt(),e=null):ot("in")&&(ct(e)||et({},o.InvalidLHSInForIn),a=Q(),r=e,s=Wt(),e=null);typeof r=="undefined"&&rt(";")}return typeof r=="undefined"&&(st(";")||(t=Wt()),rt(";"),st(")")||(n=Wt())),rt(")"),f=g.inIteration,g.inIteration=!0,u=Tn(),g.inIteration=f,typeof r=="undefined"?{type:i.ForStatement,init:e,test:t,update:n,body:u}:a.value==="in"?{type:i.ForInStatement,left:r,right:s,body:u,each:!1}:{type:i.ForOfStatement,left:r,right:s,body:u}}function dn(){var e,t=null;return it("continue"),a[h]===";"?(Q(),g.inIteration||et({},o.IllegalContinue),{type:i.ContinueStatement,label:null}):Z()?(g.inIteration||et({},o.IllegalContinue),{type:i.ContinueStatement,label:null}):(e=G(),e.type===n.Identifier&&(t=$t(),Object.prototype.hasOwnProperty.call(g.labelSet,t.name)||et({},o.UnknownLabel,t.name)),ft(),t===null&&!g.inIteration&&et({},o.IllegalContinue),{type:i.ContinueStatement,label:t})}function vn(){var e,t=null;return it("break"),a[h]===";"?(Q(),!g.inIteration&&!g.inSwitch&&et({},o.IllegalBreak),{type:i.BreakStatement,label:null}):Z()?(!g.inIteration&&!g.inSwitch&&et({},o.IllegalBreak),{type:i.BreakStatement,label:null}):(e=G(),e.type===n.Identifier&&(t=$t(),Object.prototype.hasOwnProperty.call(g.labelSet,t.name)||et({},o.UnknownLabel,t.name)),ft(),t===null&&!g.inIteration&&!g.inSwitch&&et({},o.IllegalBreak),{type:i.BreakStatement,label:t})}function mn(){var e,t=null;return it("return"),g.inFunctionBody||tt({},o.IllegalReturn),a[h]===" "&&k(a[h+1])?(t=Wt(),ft(),{type:i.ReturnStatement,argument:t}):Z()?{type:i.ReturnStatement,argument:null}:(st(";")||(e=G(),!st("}")&&e.type!==n.EOF&&(t=Wt())),ft(),{type:i.ReturnStatement,argument:t})}function gn(){var e,t;return f&&tt({},o.StrictModeWith),it("with"),rt("("),e=Wt(),rt(")"),t=Tn(),{type:i.WithStatement,object:e,body:t}}function yn(){var e,t=[],n;ot("default")?(Q(),e=null):(it("case"),e=Wt()),rt(":");while(h<v){if(st("}")||ot("default")||ot("case"))break;n=zn();if(typeof n=="undefined")break;t.push(n)}return{type:i.SwitchCase,test:e,consequent:t}}function bn(){var e,t,n,r,s;it("switch"),rt("("),e=Wt(),rt(")"),rt("{");if(st("}"))return Q(),{type:i.SwitchStatement,discriminant:e};t=[],r=g.inSwitch,g.inSwitch=!0,s=!1;while(h<v){if(st("}"))break;n=yn(),n.test===null&&(s&&et({},o.MultipleDefaultsInSwitch),s=!0),t.push(n)}return g.inSwitch=r,rt("}"),{type:i.SwitchStatement,discriminant:e,cases:t}}function wn(){var e;return it("throw"),Z()&&et({},o.NewlineAfterThrow),e=Wt(),ft(),{type:i.ThrowStatement,argument:e}}function En(){var e;return it("catch"),rt("("),st(")")||(e=Wt(),f&&e.type===i.Identifier&&D(e.name)&&tt({},o.StrictCatchVariable)),rt(")"),{type:i.CatchClause,param:e,guard:null,body:Vt()}}function Sn(){var e,t=[],n=null;return it("try"),e=Vt(),ot("catch")&&t.push(En()),ot("finally")&&(Q(),n=Vt()),t.length===0&&!n&&et({},o.NoCatchOrFinally),{type:i.TryStatement,block:e,handlers:t,finalizer:n}}function xn(){return it("debugger"),ft(),{type:i.DebuggerStatement}}function Tn(){var e=G(),t,r;e.type===n.EOF&&nt(e);if(e.type===n.Punctuator)switch(e.value){case";":return un();case"{":return Vt();case"(":return an();default:}if(e.type===n.Keyword)switch(e.value){case"break":return vn();case"continue":return dn();case"debugger":return xn();case"do":return ln();case"for":return pn();case"function":return kn();case"class":return Pn();case"if":return fn();case"return":return mn();case"switch":return bn();case"throw":return wn();case"try":return Sn();case"var":return Qt();case"while":return cn();case"with":return gn();default:}return t=Wt(),t.type===i.Identifier&&st(":")?(Q(),Object.prototype.hasOwnProperty.call(g.labelSet,t.name)&&et({},o.Redeclaration,"Label",t.name),g.labelSet[t.name]=!0,r=Tn(),delete g.labelSet[t.name],{type:i.LabeledStatement,label:t,body:r}):(ft(),{type:i.ExpressionStatement,expression:t})}function Nn(){return st("{")?Cn():zt()}function Cn(){var e,t=[],r,s,u,a,l,c,p,d;rt("{");while(h<v){r=G();if(r.type!==n.StringLiteral)break;e=zn(),t.push(e);if(e.expression.type!==i.Literal)break;s=E(r.range[0]+1,r.range[1]-1),s==="use strict"?(f=!0,u&&et(u,o.StrictOctalLiteral)):!u&&r.octal&&(u=r)}a=g.labelSet,l=g.inIteration,c=g.inSwitch,p=g.inFunctionBody,d=g.parenthesizedCount,g.labelSet={},g.inIteration=!1,g.inSwitch=!1,g.inFunctionBody=!0,g.parenthesizedCount=0;while(h<v){if(st("}"))break;e=zn();if(typeof e=="undefined")break;t.push(e)}return rt("}"),g.labelSet=a,g.inIteration=l,g.inSwitch=c,g.inFunctionBody=p,g.parenthesizedCount=d,{type:i.BlockStatement,body:t}}function kn(){var e,t,n=[],r,s,u,a,p,d,m,g;it("function"),g=!1,st("*")&&(Q(),g=!0),s=G(),e=$t(),f?D(s.value)&&et(s,o.StrictFunctionName):D(s.value)?(u=s,a=o.StrictFunctionName):_(s.value)&&(u=s,a=o.StrictReservedWord),rt("(");if(!st(")")){m={};while(h<v){s=G(),t=$t(),f?(D(s.value)&&et(s,o.StrictParamName),Object.prototype.hasOwnProperty.call(m,s.value)&&et(s,o.StrictParamDupe)):u||(D(s.value)?(u=s,a=o.StrictParamName):_(s.value)?(u=s,a=o.StrictReservedWord):Object.prototype.hasOwnProperty.call(m,s.value)&&(u=s,a=o.StrictParamDupe)),n.push(t),m[t.name]=!0;if(st(")"))break;rt(",")}}return rt(")"),p=f,d=l,l=g,r=Cn(),f&&u&&et(u,a),l&&!c&&et({},o.NoYieldInGenerator),f=p,l=d,{type:i.FunctionDeclaration,id:e,params:n,body:r,generator:g}}function Ln(){var e,t=null,n,r,s,u=[],a,p,d,m,g;it("function"),g=!1,st("*")&&(Q(),g=!0),st("(")||(e=G(),t=$t(),f?D(e.value)&&et(e,o.StrictFunctionName):D(e.value)?(n=e,r=o.StrictFunctionName):_(e.value)&&(n=e,r=o.StrictReservedWord)),rt("(");if(!st(")")){m={};while(h<v){e=G(),s=$t(),f?(D(e.value)&&et(e,o.StrictParamName),Object.prototype.hasOwnProperty.call(m,e.value)&&et(e,o.StrictParamDupe)):n||(D(e.value)?(n=e,r=o.StrictParamName):_(e.value)?(n=e,r=o.StrictReservedWord):Object.prototype.hasOwnProperty.call(m,e.value)&&(n=e,r=o.StrictParamDupe)),u.push(s),m[s.name]=!0;if(st(")"))break;rt(",")}}return rt(")"),p=f,d=l,l=g,a=Cn(),f&&n&&et(n,r),l&&!c&&et({},o.NoYieldInGenerator),f=p,l=d,{type:i.FunctionExpression,id:t,params:u,body:a,generator:g}}function An(){var e,t,n;return it("yield"),l||tt({},o.IllegalYield),e=!1,st("*")&&(Q(),e=!0),n=l,l=!1,t=zt(),l=n,c=!0,{type:i.YieldExpression,argument:t,delegate:e}}function On(){var e,t,n;return st("*")?(Q(),{type:i.MethodDefinition,key:vt(),value:dt({generator:!0}),kind:""}):(e=G(),t=vt(),e.value==="get"&&!st("(")?(t=vt(),rt("("),rt(")"),{type:i.MethodDefinition,key:t,value:pt([],{generator:!1}),kind:"get"}):e.value==="set"&&!st("(")?(t=vt(),rt("("),e=G(),n=[$t()],rt(")"),{type:i.MethodDefinition,key:t,value:pt(n,{generator:!1,name:e}),kind:"set"}):{type:i.MethodDefinition,key:t,value:dt({generator:!1}),kind:""})}function Mn(){if(st(";")){Q();return}return On()}function _n(){var e,t=[];rt("{");while(h<v){if(st("}"))break;e=Mn(),typeof e!="undefined"&&t.push(e)}return rt("}"),{type:i.ClassBody,body:t}}function Dn(){var e,t,n,r;return it("class"),!ot("extends")&&!st("{")&&(e=$t()),ot("extends")&&(it("extends"),n=l,l=!1,r=zt(),l=n),t=_n(),{id:e,type:i.ClassExpression,body:t,superClass:r}}function Pn(){var e,t,n,r,s;return it("class"),e=G(),t=$t(),ot("extends")&&(it("extends"),r=l,l=!1,s=zt(),l=r),n=_n(),{id:t,type:i.ClassDeclaration,body:n,superClass:s}}function Hn(){var e=q();if(!e)return;return{type:i.XJSIdentifier,name:e.value,namespace:e.namespace}}function Bn(){var e=a[h],t;return e==="{"?jn():(e==='"'||e==="'"?(h++,t=nr($([e])),h++):et({},o.InvalidXJSAttributeValue),t)}function jn(){var e;return rt("{"),e=Wt(),rt("}"),{type:i.XJSExpression,value:e}}function Fn(){var e,t,n;t=Hn();if(!t)return;return I(),a[h]!=="="?{type:i.XJSAttribute,name:t}:(h++,I(),{type:i.XJSAttribute,name:t,value:Bn()})}function In(){var e,t;e=$(["<","{"]);if(e&&e.value)return nr(e);if(a[h]==="<"&&a[h+1]==="/")return;return a[h]==="{"?jn():Un()}function qn(){var e;return rt("<"),rt("/"),I(),e=Hn(),rt(">"),{type:i.XJSClosingElement,name:e}}function Rn(){var e,t,n,r=[],s=!1;rt("<"),t=Hn(),(!t||!t.name)&&et({},o.InvalidXJSTagName);while(h<v){I(),n=Fn();if(!n)break;r.push(n)}return I(),e=G(),e.value==="/"?(rt("/"),rt(">"),s=!0):rt(">"),{type:i.XJSOpeningElement,name:t,selfClosing:s,attributes:r}}function Un(){var e,t,n,r=[];e=Rn();if(!e.selfClosing){while(h<v){n=In();if(!n)break;r.push(n)}t=qn(),(t.name.namespace!==e.name.namespace||t.name.name!==e.name.name)&&et({},o.ExpectedXJSClosingTag,e.name.namespace?e.name.namespace+":"+e.name.name:e.name.name)}return{type:i.XJSElement,name:e.name,selfClosing:e.selfClosing,openingElement:e,closingElement:t,attributes:e.attributes,children:r}}function zn(){var e=G();if(e.type===n.Keyword)switch(e.value){case"const":case"let":return Gt(e.value);case"function":return kn();default:return Tn()}if(e.type!==n.EOF)return Tn()}function Wn(){var e=G(),t;if(e.type===n.Keyword)switch(e.value){case"export":return rn();case"import":return sn()}if(e.value==="module"&&e.type===n.Identifier){t=e.lineNumber,e=Y();if(e.type===n.Identifier&&e.lineNumber===t)return en()}return zn()}function Xn(){var e,t=[],r,s,u;while(h<v){r=G();if(r.type!==n.StringLiteral)break;e=Wn(),t.push(e);if(e.expression.type!==i.Literal)break;s=E(r.range[0]+1,r.range[1]-1),s==="use strict"?(f=!0,u&&et(u,o.StrictOctalLiteral)):!u&&r.octal&&(u=r)}while(h<v){e=Wn();if(typeof e=="undefined")break;t.push(e)}return t}function Vn(){return Wn()}function $n(){var e=[],t;while(h<v){if(st("}"))break;t=Vn();if(typeof t=="undefined")break;e.push(t)}return e}function Jn(){var e;return rt("{"),e=$n(),rt("}"),{type:i.BlockStatement,body:e}}function Kn(){var e;return f=!1,l=!1,c=!1,e={type:i.Program,body:Xn()},e}function Qn(e,t,n,r,i){w(typeof n=="number","Comment must have valid position");if(y.comments.length>0&&y.comments[y.comments.length-1].range[1]>n)return;y.comments.push({type:e,value:t,range:[n,r],loc:i})}function Gn(){var e,t,n,r,i,s;e="",i=!1,s=!1;while(h<v){t=a[h];if(s)t=H(),C(t)?(n.end={line:p,column:h-d-1},s=!1,Qn("Line",e,r,h-1,n),t==="\r"&&a[h]==="\n"&&++h,++p,d=h,e=""):h>=v?(s=!1,e+=t,n.end={line:p,column:v-d},Qn("Line",e,r,v,n)):e+=t;else if(i)C(t)?(t==="\r"&&a[h+1]==="\n"?(++h,e+="\r\n"):e+=t,++p,++h,d=h,h>=v&&et({},o.UnexpectedToken,"ILLEGAL")):(t=H(),h>=v&&et({},o.UnexpectedToken,"ILLEGAL"),e+=t,t==="*"&&(t=a[h],t==="/"&&(e=e.substr(0,e.length-1),i=!1,++h,n.end={line:p,column:h-d},Qn("Block",e,r,h,n),e="")));else if(t==="/"){t=a[h+1];if(t==="/")n={start:{line:p,column:h-d}},r=h,h+=2,s=!0,h>=v&&(n.end={line:p,column:h-d},s=!1,Qn("Line",e,r,h,n));else{if(t!=="*")break;r=h,h+=2,i=!0,n={start:{line:p,column:h-d-2}},h>=v&&et({},o.UnexpectedToken,"ILLEGAL")}}else if(N(t))++h;else{if(!C(t))break;++h,t==="\r"&&a[h]==="\n"&&++h,++p,d=h}}}function Yn(){var e,t,n,r=[];for(e=0;e<y.comments.length;++e)t=y.comments[e],n={type:t.type,value:t.value},y.range&&(n.range=t.range),y.loc&&(n.loc=t.loc),r.push(n);y.comments=r}function Zn(){var e,t,i,s,o;return B(),e=h,t={start:{line:p,column:h-d}},i=y.advance(),t.end={line:p,column:h-d},i.type!==n.EOF&&(s=[i.range[0],i.range[1]],o=E(i.range[0],i.range[1]),y.tokens.push({type:r[i.type],value:o,range:s,loc:t})),i}function er(){var e,t,n,r;return B(),e=h,t={start:{line:p,column:h-d}},n=y.scanRegExp(),t.end={line:p,column:h-d},y.tokens.length>0&&(r=y.tokens[y.tokens.length-1],r.range[0]===e&&r.type==="Punctuator"&&(r.value==="/"||r.value==="/=")&&y.tokens.pop()),y.tokens.push({type:"RegularExpression",value:n.literal,range:[e,h],loc:t}),n}function tr(){var e,t,n,r=[];for(e=0;e<y.tokens.length;++e)t=y.tokens[e],n={type:t.type,value:t.value},y.range&&(n.range=t.range),y.loc&&(n.loc=t.loc),r.push(n);y.tokens=r}function nr(e){return{type:i.Literal,value:e.value}}function rr(e){return{type:i.Literal,value:e.value,raw:E(e.range[0],e.range[1])}}function ir(e,t,n){return function(r){function s(e){return e.type===i.LogicalExpression||e.type===i.BinaryExpression}function o(n){s(n.left)&&o(n.left),s(n.right)&&o(n.right),e&&typeof n.range=="undefined"&&(n.range=[n.left.range[0],n.right.range[1]]),t&&typeof n.loc=="undefined"&&(n.loc={start:n.left.loc.start,end:n.right.loc.end})}return function(){var u,a,f;n||B(),a=[h,0],f={start:{line:p,column:h-d}},u=r.apply(null,arguments);if(typeof u!="undefined")return e&&(a[1]=h,u.range=a),t&&(f.end={line:p,column:h-d},u.loc=f),s(u)&&o(u),u.type===i.MemberExpression&&(typeof u.object.range!="undefined"&&(u.range[0]=u.object.range[0]),typeof u.object.loc!="undefined"&&(u.loc.start=u.object.loc.start)),u.type===i.CallExpression&&(typeof u.callee.range!="undefined"&&(u.range[0]=u.callee.range[0]),typeof u.callee.loc!="undefined"&&(u.loc.start=u.callee.loc.start)),u}}}function sr(){var e,t;y.comments&&(y.skipComment=B,B=Gn),y.raw&&(y.createLiteral=nr,nr=rr);if(y.range||y.loc)e=ir(y.range,y.loc),t=ir(y.range,y.loc,!0),y.parseAdditiveExpression=Ot,y.parseAssignmentExpression=zt,y.parseBitwiseANDExpression=Pt,y.parseBitwiseORExpression=Bt,y.parseBitwiseXORExpression=Ht,y.parseBlock=Vt,y.parseFunctionSourceElements=Cn,y.parseCallMember=xt,y.parseCatchClause=En,y.parseComputedMember=St,y.parseConditionalExpression=It,y.parseConstLetDeclaration=Gt,y.parseEqualityExpression=Dt,y.parseExportDeclaration=rn,y.parseExportSpecifier=nn,y.parseExportSpecifierSetProperty=tn,y.parseExpression=Wt,y.parseForVariableDeclaration=hn,y.parseFunctionDeclaration=kn,y.parseFunctionExpression=Ln,y.parseGlob=Zt,y.parseImportDeclaration=sn,y.parseImportSpecifier=on,y.parseLogicalANDExpression=jt,y.parseLogicalORExpression=Ft,y.parseMultiplicativeExpression=At,y.parseModuleDeclaration=en,y.parseModuleBlock=Jn,y.parseNewExpression=Tt,y.parseNonComputedMember=Et,y.parseNonComputedProperty=wt,y.parseObjectProperty=mt,y.parseObjectPropertyKey=vt,y.parsePath=Yt,y.parsePostfixExpression=kt,y.parsePrimaryExpression=yt,y.parseProgram=Kn,y.parsePropertyFunction=pt,y.parseRelationalExpression=_t,y.parseStatement=Tn,y.parseShiftExpression=Mt,y.parseSwitchCase=yn,y.parseUnaryExpression=Lt,y.parseVariableDeclaration=Jt,y.parseVariableIdentifier=$t,y.parseMethodDefinition=On,y.parseClassDeclaration=Pn,y.parseClassExpression=Dn,y.parseClassBody=_n,y.parseXJSIdentifier=Hn,y.parseXJSChild=In,y.parseXJSAttribute=Fn,y.parseXJSAttributeValue=Bn,y.parseXJSExpression=jn,y.parseXJSElement=Un,y.parseXJSClosingElement=qn,y.parseXJSOpeningElement=Rn,Ot=e(y.parseAdditiveExpression),zt=e(y.parseAssignmentExpression),Pt=e(y.parseBitwiseANDExpression),Bt=e(y.parseBitwiseORExpression),Ht=e(y.parseBitwiseXORExpression),Vt=e(y.parseBlock),Cn=e(y.parseFunctionSourceElements),xt=e(y.parseCallMember),En=e(y.parseCatchClause),St=e(y.parseComputedMember),It=e(y.parseConditionalExpression),Gt=e(y.parseConstLetDeclaration),rn=e(rn),nn=e(nn),tn=e(tn),Dt=e(y.parseEqualityExpression),Wt=e(y.parseExpression),hn=e(y.parseForVariableDeclaration),kn=e(y.parseFunctionDeclaration),Ln=e(y.parseFunctionExpression),Zt=e(y.parseGlob),sn=e(y.parseImportDeclaration),on=e(y.parseImportSpecifier),jt=e(y.parseLogicalANDExpression),Ft=e(y.parseLogicalORExpression),At=e(y.parseMultiplicativeExpression),en=e(y.parseModuleDeclaration),Jn=e(y.parseModuleBlock),Tt=e(y.parseNewExpression),Et=e(y.parseNonComputedMember),wt=e(y.parseNonComputedProperty),mt=e(y.parseObjectProperty),vt=e(y.parseObjectPropertyKey),Yt=e(y.parsePath),kt=e(y.parsePostfixExpression),yt=e(y.parsePrimaryExpression),Kn=e(y.parseProgram),pt=e(y.parsePropertyFunction),_t=e(y.parseRelationalExpression),Tn=e(y.parseStatement),Mt=e(y.parseShiftExpression),yn=e(y.parseSwitchCase),Lt=e(y.parseUnaryExpression),Jt=e(y.parseVariableDeclaration),$t=e(y.parseVariableIdentifier),On=e(y.parseMethodDefinition),Pn=e(y.parseClassDeclaration),Dn=e(y.parseClassExpression),_n=e(y.parseClassBody),Hn=e(Hn),In=t(In),Fn=e(Fn),Bn=e(Bn),jn=e(jn),Un=e(Un),qn=e(qn),Rn=e(Rn);typeof y.tokens!="undefined"&&(y.advance=K,y.scanRegExp=X,K=Zn,X=er)}function or(){typeof y.skipComment=="function"&&(B=y.skipComment),y.raw&&(nr=y.createLiteral);if(y.range||y.loc)Ot=y.parseAdditiveExpression,zt=y.parseAssignmentExpression,Pt=y.parseBitwiseANDExpression,Bt=y.parseBitwiseORExpression,Ht=y.parseBitwiseXORExpression,Vt=y.parseBlock,Cn=y.parseFunctionSourceElements,xt=y.parseCallMember,En=y.parseCatchClause,St=y.parseComputedMember,It=y.parseConditionalExpression,Gt=y.parseConstLetDeclaration,Dt=y.parseEqualityExpression,rn=y.parseExportDeclaration,nn=y.parseExportSpecifier,tn=y.parseExportSpecifierSetProperty,Wt=y.parseExpression,hn=y.parseForVariableDeclaration,kn=y.parseFunctionDeclaration,Ln=y.parseFunctionExpression,Zt=y.parseGlob,sn=y.parseImportDeclaration,on=y.parseImportSpecifier,jt=y.parseLogicalANDExpression,Ft=y.parseLogicalORExpression,At=y.parseMultiplicativeExpression,en=y.parseModuleDeclaration,Jn=y.parseModuleBlock,Tt=y.parseNewExpression,Et=y.parseNonComputedMember,wt=y.parseNonComputedProperty,mt=y.parseObjectProperty,vt=y.parseObjectPropertyKey,Yt=y.parsePath,kt=y.parsePostfixExpression,yt=y.parsePrimaryExpression,Kn=y.parseProgram,pt=y.parsePropertyFunction,_t=y.parseRelationalExpression,Tn=y.parseStatement,Mt=y.parseShiftExpression,yn=y.parseSwitchCase,Lt=y.parseUnaryExpression,Jt=y.parseVariableDeclaration,$t=y.parseVariableIdentifier,On=y.parseMethodDefinition,Pn=y.parseClassDeclaration,Dn=y.parseClassExpression,_n=y.parseClassBody,Hn=y.parseXJSIdentifier,In=y.parseXJSChild,Fn=y.parseXJSAttribute,Bn=y.parseXJSAttributeValue,jn=y.parseXJSExpression,Un=y.parseXJSElement,qn=y.parseXJSClosingElement,Rn=y.parseXJSOpeningElement;typeof y.scanRegExp=="function"&&(K=y.advance,X=y.scanRegExp)}function ur(e){var t=e.length,n=[],r;for(r=0;r<t;++r)n[r]=e.charAt(r);return n}function ar(e,t){var n,r;r=String,typeof e!="string"&&!(e instanceof String)&&(e=r(e)),a=e,h=0,p=a.length>0?1:0,d=0,v=a.length,m=null,g={allowIn:!0,labelSet:{},parenthesizedCount:0,lastParenthesized:null,inFunctionBody:!1,inIteration:!1,inSwitch:!1},y={},typeof t!="undefined"&&(y.range=typeof t.range=="boolean"&&t.range,y.loc=typeof t.loc=="boolean"&&t.loc,y.raw=typeof t.raw=="boolean"&&t.raw,typeof t.tokens=="boolean"&&t.tokens&&(y.tokens=[]),typeof t.comment=="boolean"&&t.comment&&(y.comments=[]),typeof t.tolerant=="boolean"&&t.tolerant&&(y.errors=[])),v>0&&typeof a[0]=="undefined"&&(e instanceof String&&(a=e.valueOf()),typeof a[0]=="undefined"&&(a=ur(e))),sr();try{n=Kn(),typeof y.comments!="undefined"&&(Yn(),n.comments=y.comments),typeof y.tokens!="undefined"&&(tr(),n.tokens=y.tokens),typeof y.errors!="undefined"&&(n.errors=y.errors)}catch(i){throw i}finally{or(),y={}}return n}var e={exports:{}},t=e.exports,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y;n={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8,XJSIdentifier:9,XJSText:10},r={},r[n.BooleanLiteral]="Boolean",r[n.EOF]="<end>",r[n.Identifier]="Identifier",r[n.Keyword]="Keyword",r[n.NullLiteral]="Null",r[n.NumericLiteral]="Numeric",r[n.Punctuator]="Punctuator",r[n.StringLiteral]="String",r[n.XJSIdentifier]="XJSIdentifier",r[n.XJSText]="XJSText",i={ArrayExpression:"ArrayExpression",ArrayPattern:"ArrayPattern",ArrowFunctionExpression:"ArrowFunctionExpression",AssignmentExpression:"AssignmentExpression",BinaryExpression:"BinaryExpression",BlockStatement:"BlockStatement",BreakStatement:"BreakStatement",CallExpression:"CallExpression",CatchClause:"CatchClause",ClassBody:"ClassBody",ClassDeclaration:"ClassDeclaration",ClassExpression:"ClassExpression",MethodDefinition:"MethodDefinition",ClassHeritage:"ClassHeritage",ConditionalExpression:"ConditionalExpression",ContinueStatement:"ContinueStatement",DebuggerStatement:"DebuggerStatement",DoWhileStatement:"DoWhileStatement",EmptyStatement:"EmptyStatement",ExportDeclaration:"ExportDeclaration",ExportSpecifier:"ExportSpecifier",ExportSpecifierSet:"ExportSpecifierSet",ExpressionStatement:"ExpressionStatement",ForInStatement:"ForInStatement",ForOfStatement:"ForOfStatement",ForStatement:"ForStatement",FunctionDeclaration:"FunctionDeclaration",FunctionExpression:"FunctionExpression",Glob:"Glob",Identifier:"Identifier",IfStatement:"IfStatement",ImportDeclaration:"ImportDeclaration",ImportSpecifier:"ImportSpecifier",LabeledStatement:"LabeledStatement",Literal:"Literal",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ModuleDeclaration:"ModuleDeclaration",NewExpression:"NewExpression",ObjectExpression:"ObjectExpression",ObjectPattern:"ObjectPattern",Path:"Path",Program:"Program",Property:"Property",ReturnStatement:"ReturnStatement",SequenceExpression:"SequenceExpression",SwitchCase:"SwitchCase",SwitchStatement:"SwitchStatement",ThisExpression:"ThisExpression",ThrowStatement:"ThrowStatement",TryStatement:"TryStatement",UnaryExpression:"UnaryExpression",UpdateExpression:"UpdateExpression",VariableDeclaration:"VariableDeclaration",VariableDeclarator:"VariableDeclarator",WhileStatement:"WhileStatement",WithStatement:"WithStatement",YieldExpression:"YieldExpression",XJSIdentifier:"XJSIdentifier",XJSExpression:"XJSExpression",XJSElement:"XJSElement",XJSClosingElement:"XJSClosingElement",XJSOpeningElement:"XJSOpeningElement",XJSAttribute:"XJSAttribute",XJSText:"XJSText"},s={Data:1,Get:2,Set:4},o={UnexpectedToken:"Unexpected token %0",UnexpectedNumber:"Unexpected number",UnexpectedString:"Unexpected string",UnexpectedIdentifier:"Unexpected identifier",UnexpectedReserved:"Unexpected reserved word",UnexpectedEOS:"Unexpected end of input",NewlineAfterThrow:"Illegal newline after throw",InvalidRegExp:"Invalid regular expression",UnterminatedRegExp:"Invalid regular expression: missing /",InvalidLHSInAssignment:"Invalid left-hand side in assignment",InvalidLHSInForIn:"Invalid left-hand side in for-in",MultipleDefaultsInSwitch:"More than one default clause in switch statement",NoCatchOrFinally:"Missing catch or finally after try",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared",IllegalContinue:"Illegal continue statement",IllegalBreak:"Illegal break statement",IllegalReturn:"Illegal return statement",IllegalYield:"Illegal yield expression",StrictModeWith:"Strict mode code may not include a with statement",StrictCatchVariable:"Catch variable may not be eval or arguments in strict mode",StrictVarName:"Variable name may not be eval or arguments in strict mode",StrictParamName:"Parameter name eval or arguments is not allowed in strict mode",StrictParamDupe:"Strict mode function may not have duplicate parameter names",StrictFunctionName:"Function name may not be eval or arguments in strict mode",StrictOctalLiteral:"Octal literals are not allowed in strict mode.",StrictDelete:"Delete of an unqualified identifier in strict mode.",StrictDuplicateProperty:"Duplicate data property in object literal not allowed in strict mode",AccessorDataProperty:"Object literal may not have data and accessor property with the same name",AccessorGetSet:"Object literal may not have multiple get/set accessors with the same name",StrictLHSAssignment:"Assignment to eval or arguments is not allowed in strict mode",StrictLHSPostfix:"Postfix increment/decrement may not have eval or arguments operand in strict mode",StrictLHSPrefix:"Prefix increment/decrement may not have eval or arguments operand in strict mode",StrictReservedWord:"Use of future reserved word in strict mode",NoFromAfterImport:"Missing from after import",NoYieldInGenerator:"Missing yield in generator",InvalidXJSTagName:"XJS tag name can not be empty",InvalidXJSAttributeValue:"XJS value should be either an expression or a quoted XJS text",ExpectedXJSClosingTag:"Expected corresponding XJS closing tag for %0"},u={NonAsciiIdentifierStart:new RegExp("[ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠࢢ-ࢬऄ-हऽॐक़-ॡॱ-ॷॹ-ॿঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-ళవ-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛰᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤜᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々-〇〡-〩〱-〵〸-〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚗꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꪀ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ]"),NonAsciiIdentifierPart:new RegExp("[ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮ̀-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁ҃-҇Ҋ-ԧԱ-Ֆՙա-և֑-ׇֽֿׁׂׅׄא-תװ-ײؐ-ؚؠ-٩ٮ-ۓە-ۜ۟-۪ۨ-ۼۿܐ-݊ݍ-ޱ߀-ߵߺࠀ-࠭ࡀ-࡛ࢠࢢ-ࢬࣤ-ࣾऀ-ॣ०-९ॱ-ॷॹ-ॿঁ-ঃঅ-ঌএঐও-নপ-রলশ-হ়-ৄেৈো-ৎৗড়ঢ়য়-ৣ০-ৱਁ-ਃਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹ਼ਾ-ੂੇੈੋ-੍ੑਖ਼-ੜਫ਼੦-ੵઁ-ઃઅ-ઍએ-ઑઓ-નપ-રલળવ-હ઼-ૅે-ૉો-્ૐૠ-ૣ૦-૯ଁ-ଃଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହ଼-ୄେୈୋ-୍ୖୗଡ଼ଢ଼ୟ-ୣ୦-୯ୱஂஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹா-ூெ-ைொ-்ௐௗ௦-௯ఁ-ఃఅ-ఌఎ-ఐఒ-నప-ళవ-హఽ-ౄె-ైొ-్ౕౖౘౙౠ-ౣ౦-౯ಂಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹ಼-ೄೆ-ೈೊ-್ೕೖೞೠ-ೣ೦-೯ೱೲംഃഅ-ഌഎ-ഐഒ-ഺഽ-ൄെ-ൈൊ-ൎൗൠ-ൣ൦-൯ൺ-ൿංඃඅ-ඖක-නඳ-රලව-ෆ්ා-ුූෘ-ෟෲෳก-ฺเ-๎๐-๙ກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ູົ-ຽເ-ໄໆ່-ໍ໐-໙ໜ-ໟༀ༘༙༠-༩༹༵༷༾-ཇཉ-ཬཱ-྄྆-ྗྙ-ྼ࿆က-၉ၐ-ႝႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ፝-፟ᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛰᜀ-ᜌᜎ-᜔ᜠ-᜴ᝀ-ᝓᝠ-ᝬᝮ-ᝰᝲᝳក-៓ៗៜ៝០-៩᠋-᠍᠐-᠙ᠠ-ᡷᢀ-ᢪᢰ-ᣵᤀ-ᤜᤠ-ᤫᤰ-᤻᥆-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉ᧐-᧙ᨀ-ᨛᨠ-ᩞ᩠-᩿᩼-᪉᪐-᪙ᪧᬀ-ᭋ᭐-᭙᭫-᭳ᮀ-᯳ᰀ-᰷᱀-᱉ᱍ-ᱽ᳐-᳔᳒-ᳶᴀ-ᷦ᷼-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ‿⁀⁔ⁱⁿₐ-ₜ⃐-⃥⃜⃡-⃰ℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ⵿-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⷠ-ⷿⸯ々-〇〡-〯〱-〵〸-〼ぁ-ゖ゙゚ゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘫꙀ-꙯ꙴ-꙽ꙿ-ꚗꚟ-꛱ꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠧꡀ-ꡳꢀ-꣄꣐-꣙꣠-ꣷꣻ꤀-꤭ꤰ-꥓ꥠ-ꥼꦀ-꧀ꧏ-꧙ꨀ-ꨶꩀ-ꩍ꩐-꩙ꩠ-ꩶꩺꩻꪀ-ꫂꫛ-ꫝꫠ-ꫯꫲ-꫶ꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯪ꯬꯭꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻ︀-️︠-︦︳︴﹍-﹏ﹰ-ﹴﹶ-ﻼ0-9A-Z_a-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ]")};var b={quot:'"',amp:"&",apos:"'",lt:"<",gt:">",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",Agrave:"À",Aacute:"Á",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Å",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"Ì",Iacute:"Í",Icirc:"Î",Iuml:"Ï",ETH:"Ð",Ntilde:"Ñ",Ograve:"Ò",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",times:"×",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ü",Yacute:"Ý",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"å",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",divide:"÷",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",OElig:"Œ",oelig:"œ",Scaron:"Š",scaron:"š",Yuml:"Ÿ",fnof:"ƒ",circ:"ˆ",tilde:"˜",Alpha:"Α",Beta:"Β",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Μ",Nu:"Ν",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Υ",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"π",rho:"ρ",sigmaf:"ς",sigma:"σ",tau:"τ",upsilon:"υ",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"ϑ",upsih:"ϒ",piv:"ϖ",ensp:" ",emsp:" ",thinsp:" ",zwnj:"",zwj:"",lrm:"",rlm:"",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"”",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",frasl:"⁄",euro:"€",image:"ℑ",weierp:"℘",real:"ℜ",trade:"™",alefsym:"ℵ",larr:"←",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lArr:"⇐",uArr:"⇑",rArr:"⇒",dArr:"⇓",hArr:"⇔",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"∏",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"∝",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪","int":"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"⋅",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",lang:"〈",rang:"〉",loz:"◊",spades:"♠",clubs:"♣",hearts:"♥",diams:"♦"};return typeof "esprima"[0]=="undefined"&&(E=function(t,n){return a.slice(t,n).join("")}),t.version="1.0.0-dev-harmony",t.parse=ar,t.Syntax=function(){var e,t={};typeof Object.create=="function"&&(t=Object.create(null));for(e in i)i.hasOwnProperty(e)&&(t[e]=i[e]);return typeof Object.freeze=="function"&&Object.freeze(t),t}(),console.log("running esprima"),e.exports}(),require["./utils"]=require.utils=function(){function n(e){return{superVar:"",scopeName:"",g:{position:0,buffer:"",indentBy:0,source:e,tagNamespace:undefined,tagNamespaceUsed:!1,isBolt:undefined}}}function r(e){return{superVar:e.superVar,scopeName:e.scopeName,g:{position:e.g.position,buffer:e.g.buffer,indentBy:e.g.indentBy,source:e.g.source,tagNamespace:e.g.tagNamespace,tagNamespaceUsed:e.g.tagNamespaceUsed,isBolt:e.g.isBolt}}}function i(e,t){return{g:e.g,superVar:t.superVar||e.superVar,scopeName:t.scopeName||e.scopeName}}function s(e,t){if(e<t.g.position)return;t.g.buffer+=o(t.g.source.substring(t.g.position,e),t),t.g.position=e}function o(e,t){for(var n=0;n<-t.g.indentBy;n++)e=e.replace(/(^|\n)( {2}|\t)/g,"$1");return e}function u(e,t){var n=e;e-=1;while(e>0&&t.g.source[e]!="\n")t.g.source[e].match(/[ \t]/)||(n=e),e--;return t.g.source.substring(e+1,n)}var e={exports:{}},t=e.exports;return t.catchup=s,t.updateIndent=o,t.indentBefore=u,t.updateState=i,t.cloneState=r,t.createState=n,e.exports}(),require["./xjs"]=require.xjs=function(){function i(e,t,r,i,s){n(e.range[0],r);var o=e.value.trim();if(o){r.g.buffer+=e.value.match(/^\s*/)[0],i&&(r.g.buffer+=i);var u=o.split("\n"),a=u.length;u.forEach(function(e,t){var n=t===a-1,i=e.trim();i===""?r.g.buffer+=e:r.g.buffer+=e.match(/^\s*/)[0]+JSON.stringify(i+(n?"":" "))+(n?"":"+")+e.match(/\s*$/)[0],n||(r.g.buffer+="\n")})}else i&&(r.g.buffer+=i),r.g.buffer+='""';s&&(r.g.buffer+=s),t||(r.g.buffer+=","),r.g.buffer+=e.value.match(/\s*$/)[0],r.g.position=e.range[1]}function s(e,t,r,i,s){return n(t.range[0],s),s.g.position=t.range[0]+1,e(t.value,i,s),n(t.range[1]-1,s),s.g.position=t.range[1],r||(s.g.buffer=s.g.buffer.replace(/(\s*)$/,",$1")),!1}function o(e){return/^[a-z_$][a-z\d_$]*$/i.test(e)?e:"'"+e+"'"}var e={exports:{}},t=e.exports;"use strict";var n=require("./utils").catchup,r={a:!0,abbr:!0,address:!0,applet:!0,area:!0,article:!0,aside:!0,audio:!0,b:!0,base:!0,bdi:!0,bdo:!0,blockquote:!0,body:!0,br:!0,button:!0,canvas:!0,caption:!0,cite:!0,code:!0,col:!0,colgroup:!0,command:!0,data:!0,datalist:!0,dd:!0,del:!0,details:!0,dfn:!0,dialog:!0,div:!0,dl:!0,dt:!0,em:!0,embed:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,g:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,head:!0,header:!0,hgroup:!0,hr:!0,html:!0,i:!0,iframe:!0,img:!0,input:!0,ins:!0,kbd:!0,keygen:!0,label:!0,legend:!0,li:!0,line:!0,link:!0,map:!0,mark:!0,marquee:!0,menu:!0,meta:!0,meter:!0,nav:!0,noscript:!0,object:!0,ol:!0,optgroup:!0,option:!0,output:!0,p:!0,param:!0,pre:!0,progress:!0,q:!0,rp:!0,rt:!0,ruby:!0,s:!0,samp:!0,script:!0,section:!0,select:!0,small:!0,source:!0,span:!0,strong:!0,style:!0,sub:!0,summary:!0,sup:!0,svg:!0,table:!0,tbody:!0,td:!0,textarea:!0,tfoot:!0,th:!0,thead:!0,time:!0,title:!0,tr:!0,track:!0,u:!0,ul:!0,"var":!0,video:!0,wbr:!0};return t.knownTags=r,t.renderXJSExpression=s,t.renderXJSLiteral=i,t.quoteAttrName=o,e.exports}(),require["./react"]=require.react=function(){function c(e,t,a,c){r(t.openingElement.range[0],c);if(t.name.namespace)throw new Error("Namespace tags are not supported. ReactJSX is not XML.");var h=i[t.name.name];if(h&&!c.g.tagNamespaceUsed){if(!c.g.tagNamespace)throw new Error("Tag namespace is used but no namespace is specified. Use @jsx namespaceName in your docBlock");c.g.tagNamespaceUsed=!0,c.g.buffer="var JSX=require('"+c.g.tagNamespace+"');"+c.g.buffer}c.g.buffer+=(h?"JSX.":"")+t.name.name+"({",c.g.position=t.name.range[1];var p=t.children.filter(function(e){return e.type!==n.Literal||!!e.value.match(/\S/)});return t.attributes.forEach(function(i,h){r(i.range[0],c);if(i.name.namespace)throw new Error("Namespace attributes are not supported. ReactJSX is not XML.");var d=f[i.name.name]||i.name.name,v=p.length===0&&h===t.attributes.length-1;c.g.buffer+=u(d),c.g.buffer+=":",i.value?l[i.name.name]?(c.g.position=i.value.range[0],c.g.buffer+=l[i.name.name](i),c.g.position=i.value.range[1],v||(c.g.buffer+=",")):i.value.type===n.Literal?(c.g.position=i.value.range[0],o(i.value,v,c)):(c.g.position=i.value.range[0],s(e,i.value,v,a,c)):(c.g.buffer+="true",c.g.position=i.name.range[1],v||(c.g.buffer+=",")),r(i.range[1],c)}),t.selfClosing||(r(t.openingElement.range[1]-1,c),c.g.position=t.openingElement.range[1]),p.length>0&&(p.length===1&&h?c.g.buffer+="children:":c.g.buffer+="children:[",t.children.forEach(function(t,i){if(t.type===n.Literal&&!t.value.match(/\S/))return;r(t.range[0],c);var u=t===p[p.length-1];t.type===n.Literal?o(t,u,c):t.type===n.XJSExpression?s(e,t,u,a,c):(e(t,a,c),u||(c.g.buffer=c.g.buffer.replace(/(\s*)$/,",$1"))),r(t.range[1],c)})),t.selfClosing?(r(t.openingElement.range[1]-2,c),c.g.position=t.openingElement.range[1]):(r(t.closingElement.range[0],c),c.g.position=t.closingElement.range[1]),p.length>0&&(p.length>1||!h)&&(c.g.buffer+="]"),c.g.buffer+="})",!1}var e={exports:{}},t=e.exports;"use strict";var n=require("./esprima-harmony/esprima").Syntax,r=require("./utils").catchup,i=require("./xjs").knownTags,s=require("./xjs").renderXJSExpression,o=require("./xjs").renderXJSLiteral,u=require("./xjs").quoteAttrName,a="JSX.",f={"class":"className",cx:"className"},l={cx:function(e){if(e.value.type!==n.Literal)throw new Error("cx only accepts a string literal");var t=e.value.value.split(/\s+/g);return"cx("+t.map(JSON.stringify).join(",")+")"}};return c.test=function(e,t,r){if(e.type!==n.XJSElement)return!1;if(r.g.tagNamespace===undefined){var i=require("node-haste/lib/parse/docblock");r.g.tagNamespace=i.parseAsObject(i.extract(r.g.source)).jsx}return!!r.g.tagNamespace},t.visitReactTag=c,e.exports}(),require["./transform"]=require.transform=function(){function u(e,t,n){var r,i;if(f(u,e,t,n)===!1)return;t.unshift(e);for(r in e)e.hasOwnProperty(r)&&(i=e[r],typeof i=="object"&&i!==null&&u(i,t,n));t.shift()}function f(e,t,n,r){for(var i=0;i<a.length;i++)if(a[i].test(t,n,r))return a[i](e,t,n,r)}function l(e,t){t&&t.benchmark&&(a=[o]);var r=n.parse(e,{comment:!0,loc:!0,range:!0}),f=i(e);return u(r,[],f),s(e.length,f),f.g.buffer}var e={exports:{}},t=e.exports;"use strict";var n=require("esprima-harmony/esprima"),r=n.Syntax,i=require("./utils").createState,s=require("./utils").catchup,o=require("./react").visitReactTag,a=[o];return t.transform=l,e.exports}(),require["./browser"]=require.browser=function(){var module={exports:{}},exports=module.exports;return function(){var runScripts,JSX=require("./transform"),docblock=require("node-haste/lib/parse/docblock");exports.eval=function(code){return eval(JSX.transform(code))};var run=exports.run=function(e,t){var n=docblock.parseAsObject(docblock.extract(e)).providesModule;window.startTime=Date.now();var r=JSX.transform(e,t);Function("require","module","exports",r)(require,module,exports),window.endTime=Date.now(),console.log("Loading Module:",n),require[n]=module.exports};if(typeof window=="undefined"||window===null)return;var load=exports.load=function(e,t){var n;return n=window.ActiveXObject?new window.ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest,n.open("GET",e,!0),"overrideMimeType"in n&&n.overrideMimeType("text/plain"),n.onreadystatechange=function(){var r;if(n.readyState===4){if((r=n.status)!==0&&r!==200)throw new Error("Could not load "+e);run(n.responseText);if(t)return t()}},n.send(null)};runScripts=function(){var e,t,n,r,i,s;s=document.getElementsByTagName("script"),e=function(){var e,t,n;n=[];for(e=0,t=s.length;e<t;e++)i=s[e],i.type==="text/jsx"&&n.push(i);return n}(),n=0,r=e.length,t=function(n){var r;r=e[n];if((r!=null?r.type:void 0)==="text/jsx")return r.src?load(r.src,t):(run(r.innerHTML),t())};for(var o=0;o<e.length;o++)t(o);return null},window.addEventListener?addEventListener("DOMContentLoaded",runScripts,!1):attachEvent("onload",runScripts)}.call(this),module.exports}(),typeof define=="function"&&define.amd?define(function(){return JSXScript}):root.JSXScript=JSXScript})(this)
2
+require["./throwIf"]=require.throwIf=function(){var e={exports:{}},t=e.exports,n=function(e,t){if(e)throw new Error(t)};return e.exports=n,e.exports}(),require["./keyMirror"]=require.keyMirror=function(){var e={exports:{}},t=e.exports,n=function(e){var t={},n;if(!e)return e;for(n in e){if(!e.hasOwnProperty(n))continue;t[n]=n}return t};return e.exports=n,e.exports}(),require["./ReactErrors"]=require.ReactErrors=function(){var e={exports:{}},t=e.exports,n=require("keyMirror"),r=require("throwIf"),i=n({CANT_IN_WORKER:null,UNRECOGNIZE_STYLE:null,CLASS_SPEC:null,CONTROL_WITHOUT_BACKING_DOM:null,NO_RENDER_NODE:null,USING_CHILD_TWICE:null,INVALID_STATE:null,ON_DOM_READY_MISMATCH:null,INVALID_COMPONENT:null,RUNAWAY_TREE:null,ESCAPE_TYPE:null,MAIN_THREAD_RENDER:null,INVALID_HIERARCHY:null,INVALID_ID:null,INVALID_CB_ID:null});return __DEV__&&(i={CANT_IN_WORKER:"Operation not supported in worker",UNRECOGNIZE_STYLE:"Encountered unrecognized style attribute:",CLASS_SPEC:"Class does not implement required functions! Implement the 'render' function.",CONTROL_WITHOUT_BACKING_DOM:"Trying to control a native dom element without a backing id",NO_RENDER_NODE:"You must render to a particular node or an id that represents a DOM node that is actually in the document.",USING_CHILD_TWICE:"Cannot reuse child twice - for performance reasons. Make a factory function if it makes your code more readable.",INVALID_STATE:"Your state object must be an object literal and not an array/terminal.",ON_DOM_READY_MISMATCH:"Something went wrong with recording or playing onDomReady callbacks. If you are rendering something via instance.genMarkupImpl and you did not begin the process with ReactEvent.beginEnqueueing() and end the process with notifyAll(), then you are an author of code that bridges React and nonReact - yet you are not doing necessary accounting work. If you do not know what those two methods are, or are just writing standard comopnents, then there may be a bug in React. See ReactErrors for more info.",INVALID_COMPONENT:"Currently, all composite component render() functions must return a valid React component. You are likely returning null/undefined or an array from render(). Returning arrays/nulls/strings is a desired feature that will eventually be supported, but not at the moment.",RUNAWAY_TREE:"Traversing the logical id space of the React component hierarchy has produced what appears to be a non-terminating loop. This may be because the id space is not correctly formed. This is a bug",ESCAPE_TYPE:"The React core has attempted to escape content that is of a mysterious type (object etc) Escaping only works on numbers and strings",MAIN_THREAD_RENDER:"At some point you enabled web workers using ReactWorker.init() and later on tried to render in the main thread.",INVALID_HIERARCHY:"An error has occured in the React event system. The core has made false assumptions about the DOM structure. Please report this bug immediately - it is not the fault of the application, it is the fault of the framework.",INVALID_ID:"Framework has made invalid assumptions about nature of component ID id space - please report immediately.",INVALID_CB_ID:"ReactWorker has attempted to lookup a callback by ID and has not found an entry. This is likely a problem with the framework. Please report immediately."}),i.throwIf=r,e.exports=i,e.exports}(),require["./DOMProperties"]=require.DOMProperties=function(){var e={exports:{}},t=e.exports,n=require("keyMirror"),r=n({nodeText:null,nodeInnerHTML:null,nodeStyleCSSText:null,nodeStyleSet:null,nodeProperty:null,nodePropertyNonIdempotent:null,nodeAttribute:null}),i=n({standardPropertyName:null,hyphenateName:null,renderAsClass:null,renderInnerHTML:null,inlineStyle:null}),s={accessStrategy:r.nodeAttribute},o={accessStrategy:r.nodePropertyNonIdempotent},u={content:{accessStrategy:r.nodeText},dangerouslySetInnerHtml:{accessStrategy:r.nodeInnerHTML,markupStrategy:i.inlineInnerHTML},cssText:{accessStrategy:r.nodeStyleCSSText,markupStrategy:i.inlineStyle},styleSet:{accessStrategy:r.nodeStyleSet,markupStrategy:i.inlineStyle},className:{accessStrategy:r.nodeProperty,markupStrategy:i.renderAsClass},data:s,margin:s,dir:s,width:s,height:s,alt:s,src:s,value:o,checked:o,selected:o,href:s,placeholder:s,title:s,target:s,name:s,type:s,rel:s,ajaxify:s,allowfullscreen:s,allowscriptaccessStrategy:s,wmode:s,x1:s,x2:s,y1:s,y2:s,transform:s,"stroke-width":s,"stroke-linecap":s,stroke:s,tabIndex:s,scrollTop:s,scrollLeft:s,htmlFor:s,contentEditable:s},a={textDecoration:!0,zoom:!0,fillOpacity:!0,fontWeight:!0,opacity:!0,orphans:!0,zIndex:!0,outline:!0},f={AccessStrategies:r,MarkupStrategies:i,DOMPropertyConfig:u,CSSNumbers:a,customAttrRegexp:/^(data|aria)-[a-z_][a-z\d_.\-]*$/};return e.exports=f,e.exports}(),require["./EventConstants"]=require.EventConstants=function(){var e={exports:{}},t=e.exports,n=require("keyMirror"),r=n({bubbled:null,captured:null}),i=n({topMouseMove:null,topMouseOver:null,topMouseOut:null,topMouseUp:null,topMouseDown:null,topClick:null,topDoubleClick:null,topTouchStart:null,topTouchEnd:null,topTouchMove:null,topTouchCancel:null,topKeyUp:null,topKeyPress:null,topKeyDown:null,topFocus:null,topBlur:null,topMouseWheel:null,topScroll:null,topChange:null}),s={topLevelTypes:i,PropagationPhases:r};return e.exports=s,e.exports}(),require["./DOMStyleProperties"]=require.DOMStyleProperties=function(){var e={exports:{}},t=e.exports,n=require("DOMProperties"),r=n.MarkupStrategies,i={markupStrategy:r.hyphenateName},s={display:i,position:i,top:i,left:i,right:i,bottom:i,width:i,backgroundImage:i,backgroundColor:i,padding:i,paddingLeft:i,paddingRight:i,paddingBottom:i,paddingTop:i,margin:i,marginLeft:i,marginRight:i,marginTop:i,marginBottom:i,border:i},o=function(){return s},u={getDOMStylePropertyConfig:o};return e.exports=u,e.exports}(),require["./CallbackRegistry"]=require.CallbackRegistry=function(){var e={exports:{}},t=e.exports,n={},r={putListener:function(e,t,r){var i=n[t]||(n[t]={});i[e]=r},getListener:function(e,t){var r=n[t];return r&&r[e]},deleteListener:function(e,t){var r=n[t];r&&delete r[e]},listenerBank:n};return e.exports=r,e.exports}(),require["./ReactInputSelection"]=require.ReactInputSelection=function(){var e={exports:{}},t=e.exports,n={hasSelectionCapabilities:function(e){return e&&(e.nodeName==="INPUT"&&e.type==="text"||e.nodeName==="TEXTAREA")},getSelectionInformation:function(){var e=document.activeElement;return{focusedElem:e,selectionRange:n.hasSelectionCapabilities(e)?n.getSelection(e):null}},restoreSelection:function(e){var t=document.activeElement,r=e.focusedElem,i=e.selectionRange;t!==r&&document.getElementById(r.id)&&(n.hasSelectionCapabilities(r)&&n.setSelection(r,i),r.focus())},getSelection:function(e){if(!document.selection)return{start:e.selectionStart,end:e.selectionEnd};var t=document.selection.createRange();if(t.parentElement()!==e)return{start:0,end:0};var n=e.value.length;if(e.nodeName==="INPUT")return{start:-t.moveStart("character",-n),end:-t.moveEnd("character",-n)};var r=t.duplicate();r.moveToElementText(e),r.setEndPoint("StartToEnd",t);var i=n-r.text.length;return r.setEndPoint("StartToStart",t),{start:n-r.text.length,end:i}},setSelection:function(e,t){var n=t.start,r=t.end;typeof r=="undefined"&&(r=n);if(document.selection){if(e.tagName==="TEXTAREA"){var i=(e.value.slice(0,n).match(/\r/g)||[]).length,s=(e.value.slice(n,r).match(/\r/g)||[]).length;n-=i,r-=i+s}var o=e.createTextRange();o.collapse(!0),o.moveStart("character",n),o.moveEnd("character",r-n),o.select()}else e.selectionStart=n,e.selectionEnd=Math.min(r,e.value.length),e.focus()}};return e.exports=n,e.exports}(),require["./DOMMetrics"]=require.DOMMetrics=function(){function n(e,t){while(t&&t.parentNode!==t){if(t===e)return!0;t=t.parentNode}return!1}function r(e){var t=document.body.parentNode;return n(t,e)}var e={exports:{}},t=e.exports,i={metricsForID:function(e){return i.metricsForElement(document.getElementById(e))},metricsForElement:function(e){if(!e)return;var t=document.documentElement;if(!r(e))return{x:0,y:0,width:e.offsetWidth||0,height:e.offsetHeight||0};var n=e.getBoundingClientRect(),i=Math.round(n.left)-t.clientLeft,s=Math.round(n.top)-t.clientTop;return{x:i,y:s,width:e.offsetWidth||0,height:e.offsetHeight||0}}};return e.exports=i,e.exports}(),require["./dangerouslyInsertMarkupAt"]=require.dangerouslyInsertMarkupAt=function(){function n(e,t,n){return n?n.nextSibling?e.insertBefore(t,n.nextSibling):e.appendChild(t):e.insertBefore(t,e.firstChild)}function r(e,t,r){var i,s=t.length;for(var o=0;o<s;o++)i=n(e,t[0],i||r);return i}function i(e,t,n){if(!t)return 0;var i=document.createElement(e?e.tagName:"div");i.innerHTML=t;var s=i.childNodes,o=s.length,u=n?e.childNodes[n-1]:null;return r(e,s,u),o}var e={exports:{}},t=e.exports;return e.exports=i,e.exports}(),require["./getDOMNodeID"]=require.getDOMNodeID=function(){function n(e){if(e.getAttributeNode){var t=e.getAttributeNode("id");return t&&t.value||""}return e.id||""}var e={exports:{}},t=e.exports;return e.exports=n,e.exports}(),require["./insertNodeAt"]=require.insertNodeAt=function(){function n(e,t,n){var r=e.childNodes,i=e.childNodes[n];return i===t?t:(t.parentNode&&t.parentNode.removeChild(t),n>=r.length?e.appendChild(t):e.insertBefore(t,r[n]),t)}var e={exports:{}},t=e.exports;return e.exports=n,e.exports}(),require["./styleValue"]=require.styleValue=function(){var e={exports:{}},t=e.exports,n=require("DOMProperties"),r=require("escapeTextForBrowser"),i=n.CSSNumbers,s=function(e,t){return isNaN(t)?t!==0&&!t?"":t:i[e]?t:r(t)+"px"};return e.exports=s,e.exports}(),require["./mergeHelpers"]=require.mergeHelpers=function(){var e={exports:{}},t=e.exports,n=require("keyMirror"),r=require("throwIf"),i=36,s=n({MERGE_ARRAY_FAIL:null,MERGE_CORE_FAILURE:null,MERGE_TYPE_USAGE_FAILURE:null,MERGE_DEEP_MAX_LEVELS:null,MERGE_DEEP_NO_ARR_STRATEGY:null});__DEV__&&(s={MERGE_ARRAY_FAIL:"Unsupported type passed to a merge function. You may have passed a structure that contains an array and the merge function does not know how to merge arrays. ",MERGE_CORE_FAILURE:"Critical assumptions about the merge functions have been violated. This is the fault of the merge functions themselves, not necessarily the callers.",MERGE_TYPE_USAGE_FAILURE:"Calling merge function with invalid types. You may call merge functions (non-array non-terminal) OR (null/undefined) arguments. mergeInto functions have the same requirements but with an added restriction that the first parameter must not be null/undefined.",MERGE_DEEP_MAX_LEVELS:"Maximum deep merge depth exceeded. You may attempting to merge circular structures in an unsupported way.",MERGE_DEEP_NO_ARR_STRATEGY:"You must provide an array strategy to deep merge functions to instruct the deep merge how to resolve merging two arrays."});var o=function(e){return typeof e!="object"||e===null},u={MAX_MERGE_DEPTH:i,isTerminal:o,normalizeMergeArg:function(e){return e===undefined||e===null?{}:e},checkMergeArrayArgs:function(e,t){r(!Array.isArray(e)||!Array.isArray(t),s.MERGE_CORE_FAILURE)},checkMergeObjectArgs:function(e,t){var n=o(e)||o(t)||Array.isArray(e)||Array.isArray(t);r(n,s.MERGE_CORE_FAILURE)},checkMergeLevel:function(e){r(e>=i,s.MERGE_DEEP_MAX_LEVELS)},checkArrayStrategy:function(e){r(e!==undefined&&!(e in u.ArrayStrategies),s.MERGE_DEEP_NO_ARR_STRATEGY)},ArrayStrategies:n({Clobber:!0,IndexByIndex:!0}),ERRORS:s};return e.exports=u,e.exports}(),require["./mergeDeep"]=require.mergeDeep=function(){var e={exports:{}},t=e.exports,n=require("mergeHelpers"),r=require("mergeDeepInto"),i=n.checkMergeLevel,s=n.checkArrayStrategy,o=n.checkMergeObjectArgs,u=n.isTerminal,a=n.normalizeMergeArg,f=function(e,t,n){var i=a(e),u=a(t);o(i,u),s(n);var f={};return r(f,i,n),r(f,u,n),f};return e.exports=f,e.exports}(),require["./merge"]=require.merge=function(){var e={exports:{}},t=e.exports,n=require("mergeHelpers"),r=n.checkMergeObjectArgs,i=n.normalizeMergeArg,s=function(e,t){var n=i(e),s=i(t);r(n,s);var o={};for(var u in n)n.hasOwnProperty(u)&&(o[u]=n[u]);for(var a in s)s.hasOwnProperty(a)&&(o[a]=s[a]);return o};return e.exports=s,e.exports}(),require["./mergeDeepInto"]=require.mergeDeepInto=function(){var e={exports:{}},t=e.exports,n=require("keyMirror"),r=require("mergeHelpers"),i=require("throwIf"),s=r.ArrayStrategies,o=r.checkArrayStrategy,u=r.checkMergeArrayArgs,a=r.checkMergeLevel,f=r.checkMergeObjectArgs,l=r.isTerminal,c=r.normalizeMergeArg,h=n({RUN_TIME_ARRAY_MERGE_FAIL:null});__DEV__&&(h={RUN_TIME_ARRAY_MERGE_FAIL:"The caller has not supplied an ArrayStrategy. This is supported as long as the data structures being merged do not contain two Arrays that must be merged together, which is exactly what has just happened. Change the call site to supply an Array merge resolver."});var p=function(e,t,n,r){f(e,t),a(r);var i=t?Object.keys(t):[];for(var s=0;s<i.length;s++){var o=i[s];v(e,t,o,n,r)}},d=function(e,t,n,r){u(e,t),a(r);var i=Math.max(e.length,t.length);for(var s=0;s<i;s++)v(e,t,s,n,r)},v=function(e,t,n,o,u){var a=t[n],f=t.hasOwnProperty(n),c=f&&l(a),h=f&&Array.isArray(a),v=f&&!h&&!h,m=e[n],g=e.hasOwnProperty(n),y=g&&l(m),b=g&&Array.isArray(m),w=g&&!b&&!b;y?c?e[n]=a:h?(e[n]=[],d(e[n],a,o,u+1)):v?(e[n]={},p(e[n],a,o,u+1)):f||(e[n]=m):b?c?e[n]=a:h?(i(!s[o],r.ERRORS.RUN_TIME_ARRAY_MERGE_FAIL),o===s.Clobber&&(m.length=0),d(m,a,o,u+1)):v?(e[n]={},p(e[n],a,o,u+1)):!f:w?c?e[n]=a:h?(e[n]=[],d(e[n],a,o,u+1)):v?p(m,a,o,u+1):!f:g||(c?e[n]=a:h?(e[n]=[],d(e[n],a,o,u+1)):v?(e[n]={},p(e[n],a,o,u+1)):!f)},m=function(e,t,n){var r=c(t);o(n),p(e,r,n,0)};return e.exports=m,e.exports}(),require["./mergeInto"]=require.mergeInto=function(){var e={exports:{}},t=e.exports,n=require("mergeHelpers"),r=n.checkMergeObjectArgs,i=n.normalizeMergeArg,s=function(e,t){var n=i(t),s;r(e,n);for(s in n){if(!n.hasOwnProperty(s))continue;e[s]=n[s]}};return e.exports=s,e.exports}(),require["./mixInto"]=require.mixInto=function(){var e={exports:{}},t=e.exports,n=function(e,t){var n;for(n in t){if(!t.hasOwnProperty(n))continue;e.prototype[n]=t[n]}};return e.exports=n,e.exports}(),require["./Accumulation"]=require.Accumulation=function(){function i(e,t){var i=e==null,s=t===null;__DEV__&&n(s,r);if(s)return e;if(i)return t;var o=Array.isArray(e),u=Array.isArray(t);return o?e.concat(t):u?[e].concat(t):[e,t]}var e={exports:{}},t=e.exports,n=require("throwIf"),r="INVALID_ACCUM_ARGS";__DEV__&&(r="accumulate requires non empty (non-null, defined) next values. All arrays accumulated must not contain any empty items.");var s=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)},o={accumulate:i,forEachItem:s};return e.exports=o,e.exports}(),require["./ImmutableObject"]=require.ImmutableObject=function(){function p(e,t){u(e,t);var n={},r=Object.keys(e);for(var i=0;i<r.length;i++){var s=r[i];t.hasOwnProperty(s)?a(e[s])||a(t[s])?n[s]=t[s]:n[s]=p(e[s],t[s]):n[s]=e[s]}var o=Object.keys(t);for(i=0;i<o.length;i++){var f=o[i];if(e.hasOwnProperty(f))continue;n[f]=t[f]}return e instanceof l||t instanceof l?new l(n):n}var e={exports:{}},t=e.exports,n=require("keyMirror"),r=require("merge"),i=require("mergeInto"),s=require("mergeHelpers"),o=require("throwIf"),u=s.checkMergeObjectArgs,a=s.isTerminal,f,l;if(__DEV__){f={INVALID_MAP_SET_ARG:"You have attempted to set fields on an object that is not an instance of ImmutableObject"},l=function(e){i(this,e),h(this,e)};var c=function(e){return typeof e=="object"&&!(e instanceof l)&&e!==null},h=function(e){var t;Object.freeze(e);for(t in e){var n=e[t];e.hasOwnProperty(t)&&c(n)&&h(n)}};l.set=function(e,t){o(!(e instanceof l),f.INVALID_MAP_SET_ARG);var n=r(e,t);return new l(n)}}else f=n({INVALID_MAP_SET_ARG:null}),l=function(e){i(this,e)},l.set=function(e,t){o(!(e instanceof l),f.INVALID_MAP_SET_ARG);var n=new l(e);return i(n,t),n};return l.setField=function(e,t,n){var r={};return r[t]=n,l.set(e,r)},l.setDeep=function(e,t){return o(!(e instanceof l),f.INVALID_MAP_SET_ARG),p(e,t)},e.exports=l,e.exports}(),require["./PooledClass"]=require.PooledClass=function(){var e={exports:{}},t=e.exports,n=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},r=function(e,t,n,r,i){var s=this;if(s.instancePool.length){var o=s.instancePool.pop();return s.call(o,e,t,n,r,i),o}return new s(e,t,n,r,i)},i=10,s=n,o=function(e,t){var n=e;return n.instancePool=[],n.pooled=t||s,n.poolSize||(n.poolSize=i),n.release=function(e){e.destructor&&e.destructor(e),n.instancePool.length<n.poolSize&&n.instancePool.push(e)},n},u={addPoolingTo:o,oneArgumentPooler:n,fiveArgumentPooler:r};return e.exports=u,e.exports}(),require["./TouchEventUtils"]=require.TouchEventUtils=function(){var e={exports:{}},t=e.exports,n={extractSingleTouch:function(e){var t=e.touches,n=e.changedTouches,r=t&&t.length>0,i=n&&n.length>0;return!r&&i?n[0]:r?t[0]:e},elementUnderTouch:function(e){var t=n.extractSingleTouch(e);return document.elementFromPoint(t.pageX,t.pageY)}};return e.exports=n,e.exports}(),require["./assertQueueLengths"]=require.assertQueueLengths=function(){var e={exports:{}},t=e.exports,n=require("throwIf"),r="WRONG_LEN";__DEV__&&(r="Parallel queues have mismatched lengths. This is the fault of the framework. Please report immediately.");var i=-1,s=function(e){var t;for(var s=0;s<e.length;s++){var o=e[s];if(s===0)t=o?o.length:i;else{var u=t===i&&o||t!==o.length;n(u,r)}}};return e.exports=s,e.exports}(),require["./bindNoArgs"]=require.bindNoArgs=function(){var e={exports:{}},t=e.exports,n=function(e,t){return e?function(){return e.call(t)}:null};return e.exports=n,e.exports}(),require["./curryOnly"]=require.curryOnly=function(){var e={exports:{}},t=e.exports,n=function(e,t,n){return e?function(){return e.call(n,t)}:null};return e.exports=n,e.exports}(),require["./eachKeyVal"]=require.eachKeyVal=function(){function n(e,t,n){if(!e||!t)return;var r=Object.keys(e),i;for(i=0;i<r.length;i++)t.call(n,r[i],e[r[i]],e,i)}var e={exports:{}},t=e.exports;return e.exports=n,e.exports}(),require["./escapeTextForBrowser"]=require.escapeTextForBrowser=function(){function r(e){return{"&":"&",">":">","<":"<",'"':""","'":"'","/":"/"}[e]}var e={exports:{}},t=e.exports,n=require("ReactErrors"),i=function(e){return n.throwIf((!e||!e.indexOf)&&isNaN(e),n.ESCAPE_TYPE),(""+e).replace(/[&><"'\/]/g,r)};return e.exports=i,e.exports}(),require["./ge"]=require.ge=function(){var e={exports:{}},t=e.exports,n=document.getElementById;return e.exports=n,e.exports}(),require["./keyOf"]=require.keyOf=function(){var e={exports:{}},t=e.exports,n=function(e){var t;for(t in e){if(!e.hasOwnProperty(t))continue;return t}return null};return e.exports=n,e.exports}(),require["./keys"]=require.keys=function(){var e={exports:{}},t=e.exports,n=function(e){var t=[],n;for(n in e)e.hasOwnProperty(n)&&t.push(n);return t};return e.exports=n,e.exports}(),require["./mapReuse"]=require.mapReuse=function(){var e={exports:{}},t=e.exports,n=function(e,t,n,r){var i=e?e:[];for(var s=0;s<t.length;s++)i[s]=r?n.call(r,t[s]):n(t[s]);return i.length=t.length,i};return e.exports=n,e.exports}(),require["./mixin"]=require.mixin=function(){var e={exports:{}},t=e.exports,n=function(e,t){var n;for(n in t){if(!t.hasOwnProperty(n))continue;e.prototype[n]=t[n]}};return e.exports=n,e.exports}(),require["./objMap"]=require.objMap=function(){var e={exports:{}},t=e.exports,n=function(e,t,n){var r,i=0,s={};if(!e)return e;for(r in e){if(!e.hasOwnProperty(r))continue;s[r]=t.call(n,e[r],r,i++)}return s};return e.exports=n,e.exports}(),require["./objMapKeyVal"]=require.objMapKeyVal=function(){var e={exports:{}},t=e.exports,n=function(e,t,n){var r,i=0,s={};if(!e)return e;for(r in e){if(!e.hasOwnProperty(r))continue;s[r]=t.call(n,r,e[r],i++)}return s};return e.exports=n,e.exports}(),require["./renderClassSet"]=require.renderClassSet=function(){function n(e,t){var r="",i;if(Array.isArray(e))for(var s=0;s<e.length;s++)r+=n(e[s],t),t=t||!!r;else for(i in e)e[i]&&(t&&(r+=" "),r+=i,t=!0);return r}var e={exports:{}},t=e.exports;return e.exports=n,e.exports}(),require["./AbstractEvent"]=require.AbstractEvent=function(){function a(e,t,n,r,i){this.type=e,this.abstractTargetID=t||"",this.originatingTopLevelEventType=n,this.nativeEvent=r,this.data=i,this.target=r&&r.target,this._dispatchListeners=null,this._dispatchIDs=null}var e={exports:{}},t=e.exports,n=require("BrowserEnv"),r=require("PooledClass"),i=require("TouchEventUtils"),s=require("throwIf"),o;__DEV__&&(o="You may only clone instances of AbstractEvent for persistent references. Check yourself.");var u=20;return a.poolSize=u,a.prototype.destructor=function(){this.target=null,this._dispatchListeners=null,this._dispatchIDs=null},r.addPoolingTo(a,r.fiveArgumentPooler),a.prototype.preventDefault=function(){a.preventDefaultOnNativeEvent(this.nativeEvent)},a.preventDefaultOnNativeEvent=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},a.normalizeScrollDataFromTarget=function(e){return{scrollTop:e.scrollTop,scrollLeft:e.scrollLeft,clientWidth:e.clientWidth,clientHeight:e.clientHeight,scrollHeight:e.scrollHeight,scrollWidth:e.scrollWidth}},a.normalizeMouseWheelData=function(e){var t=0,n=0,r=0;return e.wheelDelta&&(t=e.wheelDelta/120),e.detail&&(t=-e.detail/3),r=t,e.axis!==undefined&&e.axis===e.HORIZONTAL_AXIS&&(r=0,n=-t),e.wheelDeltaY!==undefined&&(r=e.wheelDeltaY/120),e.wheelDeltaX!==undefined&&(n=-e.wheelDeltaX/120),{delta:t,deltaX:n,deltaY:r}},a.isNativeClickEventRightClick=function(e){return e.which?e.which===3:e.button?e.button===2:!1},a.normalizePointerData=function(e){return{globalX:a.eventPageX(e),globalY:a.eventPageY(e),rightMouseButton:a.isNativeClickEventRightClick(e)}},a.normalizeDragEventData=function(e,t,n,r,i){return{globalX:t,globalY:n,startX:r,startY:i}},a.eventPageY=function(e){var t=i.extractSingleTouch(e);return t?t.pageY:typeof e.pageY!="undefined"?e.pageY:e.clientY+n.currentPageScrollTop},a.eventPageX=function(e){var t=i.extractSingleTouch(e);return t?t.pageX:typeof e.pageX!="undefined"?e.pageX:e.clientX+n.currentPageScrollLeft},a.persistentCloneOf=function(e){return __DEV__&&s(!(e instanceof a),o),new a(e.type,e.abstractTargetID,e.originatingTopLevelEventType,e.nativeEvent,e.data,e.target)},e.exports=a,e.exports}(),require["./ReactInstanceHandles"]=require.ReactInstanceHandles=function(){function l(e,t){return e.charAt(t)===s||t===e.length}function c(e){var t=e===""||e.charAt(0)===s&&e.charAt(e.length-1)!==s;i(!t,n.INVALID_ID)}var e={exports:{}},t=e.exports,n=require("ReactErrors"),r=require("getDOMNodeID"),i=require("throwIf"),s=".",o=s.length,u=this,a=100,f,h=function(e){var t=r(e);return t&&t.charAt(0)===s},p=function(e){var t=e;while(t&&t.parentNode!==t&&!h(t))t=t.parentNode;return t||u},d=function(e,t){var n=e.firstChild;while(n){if(t==n.id)return n;if(t.indexOf(n.id)===0)return d(n,t);n=n.nextSibling}},v=function(e,t){var n=0,r=Math.min(e.length,t.length);if(e===""||t==="")return"";for(var i=0;i<=r;i++)if(l(e,i)&&l(t,i))n=i;else if(e.charAt(i)!==t.charAt(i))break;var s=e.substr(0,n);return __DEV__&&c(s),s};__DEV__&&(f=function(e,t){var r=v(e,t);i(r!==e,n.INVALID_HIERARCHY),c(e),c(t)});var m=function(e){return".reactRoot["+e+"]"},g=function(e){var t=/\.reactRoot\[[^\]]+\]/.exec(e);return t&&t[0]},y=function(e){if(!e||!e.length)return"";var t=e.lastIndexOf(".");return e.substr(0,t)},b=function(e,t){__DEV__&&f(e,t);if(e===t)return e;var r=e.length+o;for(var s=r;s<=t.length;s++)if(l(t,s))return t.substr(0,s);i(!0,n.INVALID_ID)},w=function(e,t,r,s,o,u){e=e||"",t=t||"";if(__DEV__&&e===t)throw new Error(n.INVALID_ID);var f=v(e,t),l=f===t,c=f===e,h=e,p=!1,d=0;if(l)while(!p)(d!==0||!o)&&(h!==t||!u)&&r(h,!0,s),p=h===t,h=y(h),i(d++>a,n.RUNAWAY_TREE);else if(c)while(!p)(d!==0||!o)&&(h!==t||!u)&&r(h,!1,s),p=h===t,h=b(h,t),i(d++>a,n.RUNAWAY_TREE)},E=function(e,t,n){e&&(w("",e,t,n,!0,!1),w(e,"",t,n,!1,!0))},S=function(e,t,n,r,i){var s=v(e,t);s!==e&&w(e,s,n,r,!1,!0),s!==t&&w(s,t,n,i,!0,!1)},x={separator:s,getFirstReactDOM:p,findComponentRoot:d,getFirstCommonAncestorID:v,getReactRootID:m,getReactRootIDFromNodeID:g,traverseEnterLeave:S,traverseTwoPhase:E,nextDescendantID:b};return e.exports=x,e.exports}(),require["./EventPluginUtils"]=require.EventPluginUtils=function(){function u(e){return e===o.topMouseUp||e===o.topTouchEnd||e===o.topTouchCancel}function a(e){return e===o.topMouseMove||e===o.topTouchMove}function f(e){return e===o.topMouseDown||e===o.topTouchStart}function l(e,t){var n=r.eventPageX(t),i=r.eventPageY(t);e.pageX=n,e.pageY=i}function c(e,t){var n=r.eventPageX(t),i=r.eventPageY(t);return Math.pow(Math.pow(n-e.pageX,2)+Math.pow(i-e.pageY,2),.5)}function p(e,t){var n=e._dispatchListeners,r=e._dispatchIDs;__DEV__&&h(e);if(Array.isArray(n)){var i;for(i=0;i<n.length;i++)t(e,n[i],r[i])}else n&&t(e,n,r)}function d(e,t,n){t(e,n)}function v(e){p(e,d),e._dispatchListeners=null,e._dispatchIDs=null}function m(e){var t=e._dispatchListeners,n=e._dispatchIDs;__DEV__&&h(e);if(Array.isArray(t)){var r;for(r=0;r<t.length;r++)if(t[r](e,n[r]))return n[r]}else if(t&&t(e,n))return n;return null}function g(e){__DEV__&&h(e);var t=e._dispatchListeners,n=e._dispatchIDs;s(Array.isArray(t),i.DISPATCH_IDS_MISSING);var r=t?t(e,n):null;return e._dispatchListeners=null,e._dispatchIDs=null,r}function y(e){return!!e._dispatchListeners}var e={exports:{}},t=e.exports,n=require("EventConstants"),r=require("AbstractEvent"),i=require("ReactErrors"),s=require("throwIf"),o=n.topLevelTypes,h;__DEV__&&(h=function(e){var t=e._dispatchListeners,n=e._dispatchIDs,r=Array.isArray(t),o=Array.isArray(n),u=o?n.length:n?1:0,a=r?t.length:t?1:0;s(o!==r,i.DISPATCH_IDS_MISSING),s(u!==a,i.DISPATCH_IDS_MISSING)});var b={isEndish:u,isMoveish:a,isStartish:f,storePageCoordsIn:l,eventDistance:c,executeDispatchesInOrder:v,executeDispatchesInOrderStopAtTrue:m,executeDirectDispatch:g,hasDispatches:y,forEachEventDispatch:p};return e.exports=b,e.exports}(),require["./EventPropagators"]=require.EventPropagators=function(){function p(e){f=e,l=e.traverseTwoPhase,c=e.traverseEnterLeave}function d(e,t,n){var r=t.type.phasedRegistrationNames[n];return u(e,r)}function v(e,t,n){if(__DEV__){if(!e)throw new Error("Dispatching id must not be null");h()}var r=t?a.bubbled:a.captured,i=d(e,n,r);i&&(n._dispatchListeners=s(n._dispatchListeners,i),n._dispatchIDs=s(n._dispatchIDs,e))}function m(e){if(e&&e.type.phasedRegistrationNames){var t=e.abstractTargetID;l(t,v,e)}}function g(e,t,n){if(n&&n.type.registrationName){var r=u(e,n.type.registrationName);r&&(n._dispatchListeners=s(n._dispatchListeners,r),n._dispatchIDs=s(n._dispatchIDs,e))}}function y(e){e&&e.type.registrationName&&g(e.abstractTargetID,null,e)}function b(e){__DEV__&&h(),o(e,m)}function w(e,t,n,r){__DEV__&&h(),c(n,r,g,e,t)}function E(e){__DEV__&&h(),o(e,y)}var e={exports:{}},t=e.exports,n=require("Accumulation"),r=require("CallbackRegistry"),i=require("EventConstants"),s=n.accumulate,o=n.forEachItem,u=r.getListener,a=i.PropagationPhases,f=null,l=null,c=null,h;__DEV__&&(h=function(){if(!f||!l||!c)throw new Error("InstanceHandleModule not injected before use!")});var S={accumulateTwoPhaseDispatches:b,accumulateDirectDispatches:E,accumulateEnterLeaveDispatches:w,injectInstanceHandleModule:p};return e.exports=S,e.exports}(),require["./EnterLeaveEventPlugin"]=require.EnterLeaveEventPlugin=function(){var e={exports:{}},t=e.exports,n=require("EventPropagators"),r=require("AbstractEvent"),i=require("EventConstants"),s=require("ReactInstanceHandles"),o=require("getDOMNodeID"),u=require("keyOf"),a=i.topLevelTypes,f=s.getFirstReactDOM,l={mouseEnter:{registrationName:u({onMouseEnter:null})},mouseLeave:{registrationName:u({onMouseLeave:null})}},c=this,h=function(e,t,i,s){if(e===a.topMouseOver&&(t.relatedTarget||t.fromElement))return;if(e!==a.topMouseOut&&e!==a.topMouseOver)return null;var u=e===a.topMouseOut?f(t.relatedTarget||t.toElement):s,h=e===a.topMouseOut?s:c;if(h===u)return;var p=h?o(h):"",d=u?o(u):"",v=r.pooled(l.mouseLeave,p,e,t),m=r.pooled(l.mouseEnter,d,e,t);return n.accumulateEnterLeaveDispatches(v,m,p,d),[m,v]},p={abstractEventTypes:l,extractAbstractEvents:h};return e.exports=p,e.exports}(),require["./ResponderEventPlugin"]=require.ResponderEventPlugin=function(){function g(e){return a(e)||f(e)}var e={exports:{}},t=e.exports,n=require("AbstractEvent"),r=require("Accumulation"),i=require("EventPluginUtils"),s=require("EventPropagators"),o=require("keyOf"),u=r.accumulate,a=i.isStartish,f=i.isMoveish,l=i.isEndish,c=i.executeDirectDispatch,h=i.hasDispatches,p=i.executeDispatchesInOrderStopAtTrue,d=null,v={startShouldSetResponder:{phasedRegistrationNames:{bubbled:o({onStartShouldSetResponder:null}),captured:o({onStartShouldSetResponderCapture:null})}},moveShouldSetResponder:{phasedRegistrationNames:{bubbled:o({onMoveShouldSetResponder:null}),captured:o({onMoveShouldSetResponderCapture:null})}},responderMove:{registrationName:o({onResponderMove:null})},responderRelease:{registrationName:o({onResponderRelease:null})},responderTerminationRequest:{registrationName:o({onResponderTerminationRequest:null})},responderGrant:{registrationName:o({onResponderGrant:null})},responderTerminate:{registrationName:o({onResponderTerminate:null})}},m=function(e,t,r){var i,o=a(e)?v.startShouldSetResponder:v.moveShouldSetResponder,f=d||r,l=n.pooled(o,f,e,t,n.normalizePointerData(t));s.accumulateTwoPhaseDispatches(l);var m=p(l);n.release(l),!m&&a(e)&&(m=r);if(!m||m===d)return null;var g,y=n.pooled(v.responderGrant,m);s.accumulateDirectDispatches(y);if(d){i=v.responderTerminationRequest;var b=n.pooled(i,d);s.accumulateDirectDispatches(b);var w=!h(b)||c(b);n.release(b);if(w){var E=v.responderTerminate,S=n.pooled(E,d);s.accumulateDirectDispatches(S),g=u(g,[y,S]),d=m}}else g=u(g,y),d=m;return g},y=function(e,t,r,i){var o;if(g(e)){var c=m(e,t,r,i);c&&(o=u(o,c))}var h=f(e)?v.responderMove:l(e)?v.responderRelease:a(e)?v.responderStart:null;if(h){var p=n.normalizePointerData(t),y=n.pooled(h,d,e,t,p);s.accumulateDirectDispatches(y),o=u(o,y)}return h===v.responderRelease&&(d=null),o},b={abstractEventTypes:v,extractAbstractEvents:y};return e.exports=b,e.exports}(),require["./SimpleEventPlugin"]=require.SimpleEventPlugin=function(){var e={exports:{}},t=e.exports,n=require("AbstractEvent"),r=require("EventConstants"),i=require("EventPropagators"),s=require("keyOf"),o=r.topLevelTypes,u={abstractEventTypes:{mouseDown:{phasedRegistrationNames:{bubbled:s({onMouseDown:!0}),captured:s({onMouseDownCapture:!0})}},mouseUp:{phasedRegistrationNames:{bubbled:s({onMouseUp:!0}),captured:s({onMouseUpCapture:!0})}},doubleClick:{phasedRegistrationNames:{bubbled:s({onDoubleClick:!0}),captured:s({onDoubleClickCapture:!0})}},click:{phasedRegistrationNames:{bubbled:s({onClick:!0}),captured:s({onClickCapture:!0})}},mouseWheel:{phasedRegistrationNames:{bubbled:s({onMouseWheel:!0}),captured:s({onMouseWheelCapture:!0})}},touchStart:{phasedRegistrationNames:{bubbled:s({onTouchStart:!0}),captured:s({onTouchStartCapture:!0})}},touchEnd:{phasedRegistrationNames:{bubbled:s({onTouchEnd:!0}),captured:s({onTouchEndCapture:!0})}},touchCancel:{phasedRegistrationNames:{bubbled:s({onTouchCancel:!0}),captured:s({onTouchCancelCapture:!0})}},touchMove:{phasedRegistrationNames:{bubbled:s({onTouchMove:!0}),captured:s({onTouchMoveCapture:!0})}},keyUp:{phasedRegistrationNames:{bubbled:s({onKeyUp:!0}),captured:s({onKeyUpCapture:!0})}},keyPress:{phasedRegistrationNames:{bubbled:s({onKeyPress:!0}),captured:s({onKeyPressCapture:!0})}},keyDown:{phasedRegistrationNames:{bubbled:s({onKeyDown:!0}),captured:s({onKeyDownCapture:!0})}},focus:{phasedRegistrationNames:{bubbled:s({onFocus:!0}),captured:s({onFocusCapture:!0})}},blur:{phasedRegistrationNames:{bubbled:s({onBlur:!0}),captured:s({onBlurCapture:!0})}},scroll:{phasedRegistrationNames:{bubbled:s({onScroll:!0}),captured:s({onScrollCapture:!0})}},change:{phasedRegistrationNames:{bubbled:s({onChange:!0}),captured:s({onChangeCapture:!0})}}},extractAbstractEvents:function(e,t,r,s){var a,f=u.topLevelTypesToAbstract[e];if(!f)return null;switch(e){case o.topMouseWheel:a=n.normalizeMouseWheelData(t);break;case o.topScroll:a=n.normalizeScrollDataFromTarget(s);break;case o.topClick:case o.topDoubleClick:case o.topChange:case o.topMouseDown:case o.topMouseUp:case o.topTouchMove:case o.topTouchStart:case o.topTouchEnd:a=n.normalizePointerData(t);break;default:a=null}var l=n.pooled(f,r,e,t,a);return i.accumulateTwoPhaseDispatches(l),l}};return u.topLevelTypesToAbstract={topMouseDown:u.abstractEventTypes.mouseDown,topMouseUp:u.abstractEventTypes.mouseUp,topClick:u.abstractEventTypes.click,topDoubleClick:u.abstractEventTypes.doubleClick,topMouseWheel:u.abstractEventTypes.mouseWheel,topTouchStart:u.abstractEventTypes.touchStart,topTouchEnd:u.abstractEventTypes.touchEnd,topTouchMove:u.abstractEventTypes.touchMove,topTouchCancel:u.abstractEventTypes.touchCancel,topKeyUp:u.abstractEventTypes.keyUp,topKeyPress:u.abstractEventTypes.keyPress,topKeyDown:u.abstractEventTypes.keyDown,topFocus:u.abstractEventTypes.focus,topBlur:u.abstractEventTypes.blur,topScroll:u.abstractEventTypes.scroll,topChange:u.abstractEventTypes.change},e.exports=u,e.exports}(),require["./TapEventPlugin"]=require.TapEventPlugin=function(){var e={exports:{}},t=e.exports,n=require("EventPluginUtils"),r=require("AbstractEvent"),i=require("EventPropagators"),s=require("keyOf"),o=n.isStartish,u=n.isEndish,a=n.storePageCoordsIn,f=n.eventDistance,l=10,c={x:null,y:null},h={touchTap:{phasedRegistrationNames:{bubbled:s({onTouchTap:null}),captured:s({onTouchTapCapture:null})}}},p=function(e,t,n,s){if(!o(e)&&!u(e))return;var p,d=f(c,t);if(u(e)&&d<l){var v=h.touchTap,m=n;p=r.pooled(v,m,e,t)}return o(e)?a(c,t):u(e)&&(c.x=0,c.y=0),i.accumulateTwoPhaseDispatches(p),p},d={tapMoveThreshold:l,startCoords:c,abstractEventTypes:h,extractAbstractEvents:p};return e.exports=d,e.exports}(),require["./ReactOwner"]=require.ReactOwner=function(){var e={exports:{}},t=e.exports,n={attachRef:function(e,t){var n=this.refs||(this.refs={});n[e]=t},detachRef:function(e){delete this.refs[e]}};return e.exports=n,e.exports}(),require["./WorkerEnvironment"]=require.WorkerEnvironment=function(){var e={exports:{}},t=e.exports,n=typeof window=="undefined",r=n||typeof Worker!="undefined",i=n?"Worker":"Main",s={supportsWorkers:r,isInWorker:n,threadName:i};return e.exports=s,e.exports}(),require["./ReactBrowserUtils"]=require.ReactBrowserUtils=function(){var e={exports:{}},t=e.exports,n=require("WorkerEnvironment"),r;n.isInWorker||(r=document.createElement("div"));var i={supportsEvent:function(e,t){if(n.isInWorker)return!1;var i=document.createElement("div"),s="on"+e,o=s in i,u=!!r.addEventListener;return o||(i.setAttribute||(i=document.createElement("div")),i.setAttribute&&i.removeAttribute&&(i.setAttribute(s,""),o=typeof i[s]=="function",typeof i[s]!="undefined"&&(i[s]=undefined),i.removeAttribute(s))),i=null,(t&&u||!t)&&o}};return e.exports=i,e.exports}(),require["./ReactWorker"]=require.ReactWorker=function(){var e={exports:{}},t=e.exports,n=require("ReactErrors"),r=require("WorkerEnvironment"),i=require("keyOf"),s=require("keyMirror"),o=require("throwIf"),u=require("assertQueueLengths"),a={},f={},l,c,h;__DEV__&&(l="You have attempted to create a remote module and have listed the incorrect module name",c="The ReactWorker queue is already reserved. There can only be one process that has the right to use the queue at any point in time",h="You have used the queue in an incorrect way. Either you have not requested exclusive use of the queue, or you have but you are trying flush the queue without providing proof that you have reserved it.");var p=s({one:null,many:null}),d=p.one,v=p.many,m=0,g=1,y=2,b=3,w=4,E=5,S=[],x=function(e,t,n,r,i,s){S[m]=e,S[g]=t,S[y]=n,S[b]=r,S[w]=i,S[E]=s},T=1,N=[],C=[],k=[],L=[],A=function(){N.length=0,C.length=0,k.length=0,L.length=0},O=function(e,t,n,r){return N.push(e),C.push(t),k.push(n),L.push(r)-1},M=i({_log:null}),_=i({_handleRepliesByID:null}),D=i({_handleReplyForID:null}),P=function(e,t){var n=e?"id"+T++:null;return a[n]=e,f[n]=t,n},H=function(){return!r.supportsWorkers||!tt.workersEnabled||tt.workersEnabled&&r.isInWorker},B=function(e,t){try{var r=a[e],i=f[e];__DEV__&&o(!r,n.INVALID_CB_ID),r.call(i,t)}catch(s){throw s}finally{a[e]=null,f[e]=null}},j=function(e){for(var t in e)e.hasOwnProperty(t)&&B(t,e[t])},F=require,I=function(e,t,n){return F(e)[t].apply(null,n)},q=function(e){var t,n=e[w],r=e[g],i=e[y],s=e[b];try{t=I(r,i,s)}catch(o){throw o}finally{n&&tt._callInOther("ReactWorker",tt,D,[n,t])}},R=function(e){var t=e[g],n=e[y],r=e[b],i=e[w],s=!1,o;try{u([t,n,r,i]);for(var a=0;a<t.length;a++){var f=I(t[a],n[a],r[a]);i[a]&&(s=!0,(o||(o={}))[i[a]]=f)}}catch(l){o||(o={});for(var c=0;c<t.length;c++)i[c]&&!(i[c]in o[c])&&(s=!0,o[c]=undefined);throw l}finally{s&&tt._callInOther("ReactWorker",tt,_,[o])}},U=function(e){var t=e[m],n=e[E],r=t===d?q:R;if(n){var i=F(n);i.perform(r,null,e)}else r(e)},z=function(e){U(e.data)},W=function(e,t,n,r,i){var s=I(e,t,n);r&&r.call(i,s)},X=function(e){var t=!r.supportsWorkers||r.isInWorker||tt.workersEnabled;if(t)return;tt._worker=new Worker(e),tt._worker.onmessage=z,tt.workersEnabled=!0},V=function(e,t,n,r,i,s){__DEV__&&o(t!==F(e),l);if(H())W(e,n,r,i,s);else{var u=i&&P(i,s);x(d,e,n,r,u),tt._worker.postMessage(S)}},$=function(e,t,n,i,s,u){__DEV__&&o(t!==F(e),l);if(r.isInWorker){var a=s&&P(s,u);x(d,e,n,i,a),self.postMessage(S)}else W(e,n,i,s,u)},J=function(){__DEV__&&o(tt._reservedToken,c);var e=Math.random();return tt._reservedToken=e},K=function(e,t,n){if(__DEV__){o(e!==tt._reservedToken,h);var i=t||n;o(i&&t!==F(n))}r.supportsWorkers&&tt.workersEnabled?r.isInWorker?(x(v,N,C,k,L,n),self.postMessage(S)):(x(v,N,C,k,L,n),tt._worker.postMessage(S)):(x(v,N,C,k,L,n),U(S)),A(),tt._reservedToken=null},Q=function(e,t,n,r,i,s){__DEV__&&o(t!==F(e),l);var u=i&&P(i,s);return O(e,n,r,u)},G=function(e,t,n,r,i,s){__DEV__&&o(t!==F(e),l);var u=i&&P(i,s);O(e,n,r,u)},Y=r.isInWorker?$:V,Z=function(){var e=JSON.stringify(Array.prototype.slice.call(arguments)),t=[e];tt.callInMain("ReactWorker",tt,M,t)},et=function(e){console.log(e)};r.isInWorker&&(self.onmessage=z);var tt={_worker:null,_callInOther:Y,_handleRepliesByID:j,_handleReplyForID:B,_log:et,reserveQueue:J,flushQueues:K,init:X,callInWorker:V,callInMain:$,enqueueCallInWorker:Q,enqueueCallInMain:G,log:Z,workersEnabled:r.isInWorker};return e.exports=tt,e.exports}(),require["./ReactEnv"]=require.ReactEnv=function(){var e={exports:{}},t=e.exports,n=require("ReactBrowserUtils"),r=require("BrowserScroll"),i={currentPageScrollLeft:0,currentPageScrollTop:0,browserInfo:null,refreshAuthoritativeScrollValues:function(){i.currentPageScrollLeft=r.getPageScrollLeft(),i.currentPageScrollTop=r.getPageScrollTop()},ensureBrowserDetected:function(){i.browserInfo=n.browserDetection()}};return e.exports=i,e.exports}(),require["./ReactOnDOMReady"]=require.ReactOnDOMReady=function(){var e={exports:{}},t=e.exports,n=require("ReactErrors"),r=null,i={enqueue:function(e,t){n.throwIf(!r,n.ON_DOM_READY_MISMATCH),r.push({instance:e,callback:t})},beginEnqueueing:function(){n.throwIf(r,n.ON_DOM_READY_MISMATCH),r=[]},notifyAll:function(){var e=r,t=e.length;n.throwIf(!e,n.ON_DOM_READY_MISMATCH),r=null;for(var i=0;i<t;i+=1){var s=e[i].instance,o=e[i].callback;o.call(s,s.getDOMNode())}e.length=0}};return e.exports=i,e.exports}(),require["./SerializedTarget"]=require.SerializedTarget=function(){var e={exports:{}},t=e.exports,n=require("PooledClass"),r=function(e){this.id=e.id,this.value=e.value};return n.addPoolingTo(r),e.exports=r,e.exports}(),require["./SerializedNativeEvent"]=require.SerializedNativeEvent=function(){var e={exports:{}},t=e.exports,n=require("PooledClass"),r=require("SerializedTarget"),i=require("mapReuse"),s=function(e){this.pageX=e.pageX,this.pageY=e.pageY};n.addPoolingTo(s);var o=function(e){var t=e.touches,n=e.changedTouches,o=e.target;this.keyCode=e.keyCode,this.shiftKey=e.shiftKey,this.touches=t?i(this.touches,t,s.pooled,s):null,this.changedTouches=n?i(this.changedTouches,n,s.pooled,s):null,this.target=o?r.pooled(o):o,this.pageY=e.pageY,this.pageX=e.pageX,this.clientY=e.clientY,this.clientX=e.clientX,this.timeStamp=e.timeStamp};return o.prototype.destructor=function(){this.touches&&(this.touches.forEach(s.release),this.touches.length=0),this.changedTouches&&(this.changedTouches.forEach(s.release),this.changedTouches.length=0),this.target&&(r.release(this.target),this.target=null)},n.addPoolingTo(o),e.exports=o,e.exports}(),require["./Portal"]=require.Portal=function(){var e={exports:{}},t=e.exports,n=require("ReactWorker"),r=require("objMap"),i=Array.prototype.slice,s=function(e,t,s){var o=e?n.enqueueCallInWorker:n.enqueueCallInMain,u=e?n.callInWorker:n.callInMain;return r(s,function(e,n){return typeof e!="function"?null:function(){var e=i.call(arguments);return{enqueue:function(r,i){o(t,s,n,e,r,i)},invoke:function(r,i){u(t,s,n,e,r,i)}}}})},o={toMainModule:s.bind(null,!1),toWorkerModule:s.bind(null,!0)};return e.exports=o,e.exports}(),require["./EventListener"]=require.EventListener=function(){var e={exports:{}},t=e.exports,n={listen:function(e,t,n){e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent&&e.attachEvent("on"+t,n)},capture:function(e,t,n){if(__DEV__&&!e.addEventListener)throw new Error("Add event listener not supported");e.addEventListener&&e.addEventListener(t,n,!0)}};return e.exports=n,e.exports}(),require["./DOMEventUtils"]=require.DOMEventUtils=function(){var e={exports:{}},t=e.exports,n=require("EventListener"),r=function(e){var t=e||window.event,n="target"in t,r=t.target||t.srcElement||window,i=r.nodeType===3?r.parentNode:r;if(!n||t.target!==i)t.target=i},i=function(e){return function(t){r(t);var n=t;e(n)}},s={listenOn:function(e,t,r){n.listen(e,t,i(r))},captureOn:function(e,t,r){n.capture(e,t,i(r))}};return e.exports=s,e.exports}(),require["./ContentAccessor"]=require.ContentAccessor=function(){var e={exports:{}},t=e.exports,n=require("WorkerEnvironment"),r=require("throwIf"),i="CONTENT_IN_WORKER";__DEV__&&(i="No worker thread code should ever need to know the exact content accessor key. This is likely a failure of the framework.");var s={getContentAccessor:function(){r(n.isInWorker,i);var e=document.createElement("div").innerText!==undefined?"innerText":"textContent";return e}};return e.exports=s,e.exports}(),require["./DOMOperations"]=require.DOMOperations=function(){var e={exports:{}},t=e.exports,n=require("ContentAccessor"),r=require("DOMProperties"),i=require("WorkerEnvironment"),s=require("dangerouslyInsertMarkupAt"),o=require("insertNodeAt"),u=require("objMapKeyVal"),a=r.DOMPropertyConfig,f=r.AccessStrategies,l=r.customAttrRegexp,c={},h={},p="UNKNOWN_PROPERTY";__DEV__&&(p="Encountered DOM property not listed in `DOMProperties`");var d=u(a,function(e){return a[e].accessStrategy}),v=i.isInWorker?"NA":n.getContentAccessor(),m=function(e,t,n){var r=d[t],i=c[e]||(c[e]=document.getElementById(e));if(r===f.nodeText)i[v]=n;else if(r===f.nodeInnerHTML)i.innerHTML=(n&&n.__html||"").replace(/^ /g," ");else if(r===f.nodeStyleSet){var s=h[e]||(h[e]=i.style);for(var o in n)n.hasOwnProperty(o)&&(s[o]=n[o])}else if(r===f.nodeStyleCSSText){var u=h[e]||(h[e]=i.style);u.cssText=n}else if(r===f.nodeProperty)i[t]=n;else if(r===f.nodePropertyNonIdempotent)i[t]!==n&&(i[t]=n);else if(r===f.nodeAttribute)i.setAttribute(t,n);else if(l.test(t))i.setAttribute(t,n);else if(__DEV__)throw new Error(p+":"+t)},g=function(e,t){for(var n in t){if(!t.hasOwnProperty(n))continue;m(e,n,t[n])}},y=function(e,t,n){var r=d[t],i=c[e]||(c[e]=document.getElementById(e));if(r===f.nodeText)return i[v];if(r===f.nodeInnerHTML)return"";if(r===f.nodeStyleSet){var s=h[e]||(h[e]=i.style);for(var o in n)n.hasOwnProperty(o)&&(n[o]=s[o]);return n}if(r===f.nodeStyleCSSText){var u=h[e]||(h[e]=i.style);return u.cssText}if(r===f.nodeProperty)return i[t];if(r===f.nodePropertyNonIdempotent)return i[t];if(r===f.nodeAttribute)return i.getAttribute(t);if(l.test(t))return i.getAttribute(t);if(__DEV__)throw new Error(p+":"+t)},b=function(e,t){var n={};for(var r in t)if(t.hasOwnProperty(r)){var i=y(e,r,t[r]);n[r]=i}return n},w=function(e,t,n){var r=c[e]||(c[e]=document.getElementById(e));s(r,t,n)},E=function(e){var t=c[e]||c[e=document.getElementById(e)];t.parentNode.removeChild(t)},S=function(e,t,n){var r=c[e]||(c[e]=document.getElementById(e)),i=c[t]||(c[t]=document.getElementById(t));o(r,i,n)},x=function(){},T={updateProperty:m,updateProperties:g,readProperty:y,readProperties:b,dangerouslyInsertMarkupAtByID:w,removeNodeByID:E,moveNodeByID:S,releaseReferencesByID:x};return e.exports=T,e.exports}(),require["./BrowserEnv"]=require.BrowserEnv=function(){var e={exports:{}},t=e.exports,n={currentScrollLeft:0,currentScrollTop:0,browserInfo:null,refreshAuthoritativeScrollValues:function(){n.currentScrollLeft=document.body.scrollLeft+document.documentElement.scrollLeft,n.currentScrollTop=document.body.scrollTop+document.documentElement.scrollTop}};return e.exports=n,e.exports}(),require["./Transaction"]=require.Transaction=function(){var e={exports:{}},t=e.exports,n=require("ReactErrors"),r=require("mixInto"),i="DUAL_TRANSACTION",s="MISSING_TRANSACTION";__DEV__&&(i="Cannot initialize transaction when there is already an outstanding transaction. Common causes of this are trying to render a component when you are already rendering a component or attempting a state transition while in a render function. Another possibility is that you are rendering new content (or state transitioning) in an onDomReady callback. If this is not the case, please report the issue immediately.",s="Cannot close transaction when there is none open.");var o=function(e){this.transactionWrappers=e,this.wrapperInitData=new Array(e.length),this._isInTransaction=!1,this._timingMetrics={methodInvocationTime:0,wrapperInitTimes:[],wrapperCloseTimes:[]}};return r(o,{isInTransaction:function(){return!!this._isInTransaction},perform:function(e,t,r){n.throwIf(this.isInTransaction(),i),this.initializeAll();var s=Date.now();try{return e.call(t,r)}catch(o){throw o}finally{var u=Date.now();this.methodInvocationTime+=u-s,this.closeAll()}},initializeAll:function(){this._isInTransaction=!0;var e=this.transactionWrappers;for(var t=0;t<e.length;t++){var n=e[t],r=Date.now();this.wrapperInitData[t]=n.initialize?n.initialize():null;var i=Date.now(),s=this._timingMetrics.wrapperInitTimes,o=s[t];s[t]=(o||0)+(i-r)}},closeAll:function(){n.throwIf(!this.isInTransaction(),s);try{var e=this.transactionWrappers;for(var t=0;t<e.length;t++){var r=e[t],i=Date.now();r.close&&r.close(this.wrapperInitData[t]);var o=Date.now(),u=this._timingMetrics.wrapperCloseTimes,a=u[t];u[t]=(a||0)+(o-i)}}catch(f){throw f}finally{this._isInTransaction=!1}}}),e.exports=o,e.exports}(),require["./ReactEventConstants"]=require.ReactEventConstants=function(){var e={exports:{}},t=e.exports,n={onScroll:1,onTouchTap:2,onTouchEnd:3,onTouchMove:4,onTouchStart:5,onTouchDrag:6,onTouchDragDone:7,onClick:8,onDragDone:9,onDrag:10,onMouseWheel:11,onKeyUp:12,onKeyDown:13,onKeyPress:14,onFocus:15,onBlur:16,onMouseIn:17,onMouseOut:18,onMouseDown:19,onMouseUp:20,onChange:21},r={mouseMove:{},mouseIn:{},mouseDown:{abstractEquivalent:n.onMouseDown},mouseUp:{abstractEquivalent:n.onMouseUp},mouseOut:{},click:{abstractEquivalent:n.onClick},mouseWheel:{abstractEquivalent:n.onMouseWheel},touchStart:{abstractEquivalent:n.onTouchStart},touchEnd:{abstractEquivalent:n.onTouchEnd},touchMove:{abstractEquivalent:n.onTouchMove},touchCancel:{},keyUp:{abstractEquivalent:n.onKeyUp},keyPress:{abstractEquivalent:n.onKeyPress},keyDown:{abstractEquivalent:n.onKeyDown},focus:{abstractEquivalent:n.onFocus},blur:{abstractEquivalent:n.onBlur},scroll:{abstractEquivalent:n.onScroll},change:{abstractEquivalent:n.onChange}},i={registrationTypes:n,topLevelEvents:r};return e.exports=i,e.exports}(),require["./EventPluginHub"]=require.EventPluginHub=function(){function g(e){var t,n=e.phasedRegistrationNames;if(n)for(t in n){if(!n.hasOwnProperty(t))continue;__DEV__&&u(p[n[t]],c),p[n[t]]=!0,d.push(n[t])}else e.registrationName&&(p[e.registrationName]=!0,d.push(e.registrationName))}var e={exports:{}},t=e.exports,n=require("AbstractEvent"),r=require("Accumulation"),i=require("CallbackRegistry"),s=require("EventPluginUtils"),o=require("EventPropagators"),u=require("throwIf"),a=r.accumulate,f=i.deleteListener,l=r.forEachItem,c="DOUBLE_REGISTER",h="DOUBLE_ENQUEUE";__DEV__&&(c="You've included an event plugin that extracts an event type with the exact same or identity as an event that had previosly been injected - or, one of the registration names used by an plugin has already been used.",h="During the processing of events, more events were enqueued. This is strange and should not happen. Please report immediately. ");var p={},d=[],v=[],m=[],y=function(e){m.push(e);var t;for(t in e.abstractEventTypes){if(!e.abstractEventTypes.hasOwnProperty(t))continue;var n=e.abstractEventTypes[t];g(n)}},b=function(e){var t;for(t=0;t<d.length;t++)f(e,d[t])},w=function(e,t,n,r){var i,s;for(s=0;s<m.length;s++){var o=m[s].extractAbstractEvents(e,t,n,r);o&&(i=a(i,o))}return i},E=function(e){e&&(v=a(v,e))},S=function(e){e&&(s.executeDispatchesInOrder(e),n.release(e))},x=function(){var e=v;v=null,l(e,S),__DEV__&&u(v,h)},T={registrationNames:p,registrationNamesArr:d,injectEventPlugin:y,putListener:i.putListener,getListener:i.getListener,deleteAllListeners:b,extractAbstractEvents:w,enqueueAbstractEvents:E,processAbstractEventQueue:x,injectInstanceHandleModule:o.injectInstanceHandleModule};return e.exports=T,e.exports}(),require["./ReactEvent"]=require.ReactEvent=function(){function S(e){return function(t){if(E){var n=u.getFirstReactDOM(t.target),r=d(n),i=l.pooled(t),s=c.pooled(n),o=[e,i,r,s];a.callInWorker("ReactEvent",B,"_handleTopLevel",o),t.preventDefault(),t.returnValue=!1,l.release(i),c.release(s)}}}function x(e,t,n){y(n,t,S(e))}function T(e,t,n){b(n,t,S(e))}function N(){y(window,"scroll",function(e){e.target===window&&n.refreshAuthoritativeScrollValues()})}function C(){y(window,"resize",function(e){e.target===window&&n.refreshAuthoritativeScrollValues()})}function k(e,t){N(),C(),x(g.topMouseOver,"mouseover",e),x(g.topMouseDown,"mousedown",e),x(g.topMouseUp,"mouseup",e),x(g.topMouseOut,"mouseout",e),x(g.topClick,"click",e),x(g.topDoubleClick,"dblclick",e),x(g.topMouseWheel,"mousewheel",e),t&&(x(g.topTouchStart,"touchstart",e),x(g.topTouchEnd,"touchend",e),x(g.topTouchMove,"touchmove",e),x(g.topTouchCancel,"touchcancel",e)),x(g.topKeyUp,"keyup",e),x(g.topKeyPress,"keypress",e),x(g.topKeyDown,"keydown",e),x(g.topChange,"change",e),x(g.topMouseWheel,"DOMMouseScroll",e),x(g.topScroll,"scroll",e),o.supportsEvent("focusin")?(x(g.topFocus,"focusin",e),x(g.topBlur,"focusout",e)):o.supportsEvent("focus",!0)&&(T(g.topFocus,"focus",e),T(g.topBlur,"blur",e))}function L(e,t,n,r){var i=s.extractAbstractEvents(e,t,n,r);s.enqueueAbstractEvents(i),s.processAbstractEventQueue()}function _(e){var t=e?O:M;a.callInMain("ReactEvent",B,A,t)}function D(e){E=!!e}function P(){return E}function H(e,t){w[e.id]||(k(e,t),w[e.id]=!0)}var e={exports:{}},t=e.exports,n=require("BrowserEnv"),r=require("DOMEventUtils"),i=require("EventConstants"),s=require("EventPluginHub"),o=require("ReactBrowserUtils"),u=require("ReactInstanceHandles"),a=require("ReactWorker"),f=require("ResponderEventPlugin"),l=require("SerializedNativeEvent"),c=require("SerializedTarget"),h=require("EnterLeaveEventPlugin"),p=require("SimpleEventPlugin"),d=require("getDOMNodeID"),v=require("keyOf"),m=s.registrationNames,g=i.topLevelTypes,y=r.listenOn,b=r.captureOn;s.injectEventPlugin(p),s.injectEventPlugin(h),s.injectEventPlugin(f),s.injectInstanceHandleModule(u);var w={},E=!0,A=v({_setEnabled:null}),O=[!0],M=[!1],B={_handleTopLevel:L,setEnabled:_,_setEnabled:D,isEnabled:P,ensureListening:H,registrationNames:m,putListener:s.putListener,getListener:s.getListener,deleteAllListeners:s.deleteAllListeners};return __DEV__&&(B._makeTopLevelCallback=S),e.exports=B,e.exports}(),require["./reactDOMMutationTransaction"]=require.reactDOMMutationTransaction=function(){var e={exports:{}},t=e.exports,n=require("ReactEvent"),r=require("ReactInputSelection"),i=require("Transaction"),s=new i([{initialize:r.getSelectionInformation,close:r.restoreSelection},{initialize:n.setEnabled.bind(n,!1),close:n.setEnabled.bind(n,!0)}]);return e.exports=s,e.exports}(),require["./reactUpdateTransaction"]=require.reactUpdateTransaction=function(){var e={exports:{}},t=e.exports,n=require("ReactOnDOMReady"),r=require("ReactWorker"),i=require("Transaction"),s=require("reactDOMMutationTransaction"),o=new i([{initialize:function(){var e=r.reserveQueue();return e},close:function(e){r.flushQueues(e,s,"reactDOMMutationTransaction")}},{initialize:n.beginEnqueueing,close:n.notifyAll}]);return e.exports=o,e.exports}(),require["./ReactDOMPropertyMarkup"]=require.ReactDOMPropertyMarkup=function(){var e={exports:{}},t=e.exports,n=require("DOMProperties"),r=require("escapeTextForBrowser"),i=require("eachKeyVal"),s=n.DOMPropertyConfig,o=n.MarkupStrategies,u={},a={},f=function(e){return"-"+e.toLowerCase()},l=function(e){return e.replace(/[A-Z]/g,f)},c=function(e,t,n,s){i(s,function(i,s){var u;s&&s.markupStrategy===o.hyphenateName?u=l(i):u=i,e[i]=t+r(u)+n})},h=c.bind(null,a,";",":"),p=c.bind(null,u," ","='");p(s);var d={DOMStylePropertyMarkupPieces:a,DOMPropertyMarkupPieces:u,loadDOMStylePropertyConfig:h};return e.exports=d,e.exports}(),require["./ReactMount"]=require.ReactMount=function(){var e={exports:{}},t=e.exports,n=require("DOMStyleProperties"),r=require("Portal"),i=require("ReactDOMPropertyMarkup"),s=require("ReactErrors"),o=require("ReactEvent"),u=require("ReactInstanceHandles"),a=require("ReactWorker"),f=require("WorkerEnvironment"),l=0,c=r.toMainModule("DOMStyleProperties",n),h=n.getDOMStylePropertyConfig(),p={instanceByReactRootId:{},containersByReactRootId:{},totalInstantiationTime:0,totalInjectionTime:0,useTouchEvents:!1,renderingEnginePrepared:!1,scrollMonitor:function(e,t){return t()},prepareRenderingEngine:function(e){p.renderingEnginePrepared||(i.loadDOMStylePropertyConfig(e),p.renderingEnginePrepared=!0)},prepareTopLevelEvents:function(e){e||(e=document.documentElement),o.ensureListening(e,p.useTouchEvents)},renderComponent:function(e,t){return s.throwIf(!t,s.NO_RENDER_NODE),p.prepareTopLevelEvents(document),p.prepareRenderingEngine(h),p.renderMarkupIntoNode(e,t),e},forkAndRenderComponentIntoID:function(e,t,n){if(f.supportsWorkers)if(f.isInWorker){var r=function(n){p.prepareRenderingEngine(n),p.renderMarkupIntoID(e,t)};c.getDOMStylePropertyConfig().invoke(r)}else a.init(n),p.prepareTopLevelEvents(document);else p.prepareRenderingEngine(h),p.prepareTopLevelEvents(document),p.renderMarkupIntoID(e,t)},constructAndRenderComponent:function(e,t,n){p.renderComponent(e(t),n)},renderMarkupIntoNode:function(e,t){var n=this.registerContainer(t);p.instanceByReactRootId[n]=e,e.genMarkupIntoContainer(n,t)},renderMarkupIntoID:function(e,t){var n=u.separator+t;p.instanceByReactRootId[n]=e,e.genMarkupIntoID(n,t)},registerContainer:function(e){var t=e.firstChild&&e.firstChild.id,n=t&&u.getReactRootIDFromNodeID(t)||u.getReactRootID(l++);return p.containersByReactRootId[n]=e,n},destroyAndReleaseReactRootNode:function(e){var t=p.getInstanceHeldByContainer(e),n=e.firstChild&&e.firstChild.id;t.destroy(),delete p.instanceByReactRootId[n],delete p.containersByReactRootId[n],e.innerHTML=""},getInstanceHeldByContainer:function(e){var t=p.instanceByReactRootId[e.firstChild&&e.firstChild.id];return t},findReactContainerForId:function(e){return p.containersByReactRootId[u.getReactRootIDFromNodeID(e)]},renderOrUpdateComponent:function(e,t){var n=p.getInstanceHeldByContainer(t);if(n){var r=n.setAllProps.bind(n,e.props);return p.scrollMonitor(t,r),n}return p.renderComponent(e,t)}};return e.exports=p,e.exports}(),require["./ReactComponent"]=require.ReactComponent=function(){var e={exports:{}},t=e.exports,n=require("ReactErrors"),r=require("ReactInstanceHandles"),i=require("ReactMount"),s=require("RemoteDOMOperations"),o=require("WorkerEnvironment"),u=require("reactUpdateTransaction"),a=require("throwIf"),f=require("merge"),l={currentlyConstructingOwner:null,isValidComponent:function(e){return e&&typeof e.genMarkupIntoContainer=="function"&&typeof e.setAllPropsImpl=="function"},validateReactComponentInstance:function(e){n.throwIf(!l.isValidComponent(e),n.INVALID_COMPONENT)},ReactComponentMixin:{getDOMNode:function(){a(o.isInWorker,n.CANT_IN_WORKER);var e=this.rootDomNode;if(!e){e=document.getElementById(this._rootDomId);if(!e){var t=i.findReactContainerForId(this._rootDomId);e=r.findComponentRoot(t,this._rootDomId)}}return this.rootDomNode=e},getNode:function(){},captureOwnerAtConstruction:function(){var e=this.props;e.ref&&(e.owner=l.currentlyConstructingOwner)},attachOwnersRefsOnRender:function(){var e=this.props;e.ref&&e.owner.attachRef(e.ref,this)},detachOwnersRefs:function(){var e=this.props;e.ref&&e.owner.refs[e.ref]===this&&e.owner.detachRef(e.ref)},destroyComponent:function(){this.detachOwnersRefs(),this.isDestroyed=!0},detachFromDom:function(){var e=this.getDOMNode();e.parentNode.removeChild(e)},initializeComponent:function(e){this._rootDomId=e,this.attachOwnersRefsOnRender()},genMarkupImpl:null,setProps:function(e){this.setAllProps(f(this.props,e))},setAllProps:function(e){u.perform(this.setAllPropsImpl,this,e)},setAllPropsImpl:function(e){var t=this.props,r=this.rootDomId;n.throwIf(r,n.CONTROL_WITHOUT_BACKING_DOM);if(e.owner===t.owner&&e.ref===t.ref)return;this.detachOwnersRefs(),e.ref&&e.owner.attachRef(e.ref,this)},genMarkupIntoContainer:function(e,t){var n=this.genMarkupIntoContainerImpl.bind(this,e,t);u.perform(n)},genMarkupIntoID:function(e,t){var n=this.genMarkupIntoIDImpl.bind(this,e,t);u.perform(n)},genMarkupIntoIDImpl:function(e,t){var n=Date.now(),r=this.genMarkupImpl(e);i.totalInstantiationTime+=Date.now()-n,s.updateProperties(t,{dangerouslySetInnerHtml:{__html:r}}).invoke()},genMarkupIntoContainerImpl:function(e,t){var n=Date.now(),r=this.genMarkupImpl(e);i.totalInstantiationTime+=Date.now()-n;var s=Date.now(),o=t.nextSibling,u=t.parentNode;u?(u.removeChild(t),t.innerHTML=r,o?u.insertBefore(t,o):u.appendChild(t)):t.innerHTML=r,i.totalInjectionTime+=Date.now()-s}}};return e.exports=l,e.exports}(),require["./ReactCompositeComponent"]=require.ReactCompositeComponent=function(){var e={exports:{}},t=e.exports,n=require("ReactComponent"),r=require("ReactErrors"),i=require("ReactOnDOMReady"),s=require("ReactOwner"),o=require("RemoteDOMOperations"),u=require("merge"),a=require("mergeHelpers"),f=require("mixInto"),l=require("reactUpdateTransaction"),c=require("throwIf"),h=a.isTerminal,p=n.ReactComponentMixin;if(__DEV__)function d(e){return!Array.isArray(e)&&!h(e)}var v,m;__DEV__&&(v="Processing updates outside of transaction. Did you add a new setTimeout somewhere that could have caused this? It is likely a bug in the framework. Please report the problem. ",m="Enqueueing an update while a component is rendering. It appears that some component's render() function has side effects.");var g={render:null,setAllPropsImpl:function(e){p.setAllPropsImpl.call(this,e),this.updateCompositeUI(e)},processUpdateQueue:function(){var e=this.updateQueue;if(!e||e.length===0)return;__DEV__&&c(!l.isInTransaction(),v);var t=this.props,n=this.state,r=!1;for(var i=0;i<e.length;i++){var s=e[i];r=r||!s.isSilent,s.allProps?t=s.allProps:s.props&&(t=t?u(t,s.props):s.props),s.allState?n=s.allState:s.state&&(n=n?u(n,s.state):s.state),n&&(this.state=n),t&&p.setAllPropsImpl.call(this,t),r&&this.updateCompositeUI(t)}for(var o=0;o<e.length;o++){var a=e[o];a.onComplete&&a.onComplete.call(a.onCompleteScope)}e.length=0},processUpdateQueueEnsureTransaction:function(){l.isInTransaction()?this.processUpdateQueue():l.perform(this.processUpdateQueue,this)},enqueueUpdates:function(e){if(__DEV__){var t=!!n.currentlyConstructingOwner;c(t,m)}this.updateQueue||(this.updateQueue=[]),Array.isArray(e)?this.updateQueue.push.apply(this.updateQueue,e):e&&this.updateQueue.push(e),this.processUpdateQueueEnsureTransaction()},updateState:function(e){this.enqueueUpdates({state:e})},updateAllState:function(e){this.enqueueUpdates({allState:e})},initializeCompositeComponent:function(){this.updateQueue=null,this.getInitialState&&(this.state=this.getInitialState(),__DEV__&&r.throwIf(!d(this.state),r.INVALID_STATE)),this.onDomReady&&i.enqueue(this,this.onDomReady)},genMarkupImpl:function(e){this.initializeComponent(e),this.initializeCompositeComponent(e),n.currentlyConstructingOwner=this;var t=this.getAllRenderResults(),r=this.handleGenMarkupResults(t);return n.currentlyConstructingOwner=null,n.validateReactComponentInstance(r),this.renderedChild=r,r.genMarkupImpl(e)},getAllRenderResults:function(){return this.render()},handleGenMarkupResults:function(e){return e},destroy:function(){this.destroyComponent(),this.destructor&&this.destructor(),this.renderedChild.destroy(),this.renderedChild=null,this.refs&&(this.refs=null),this.updateQueue&&(this.updateQueue=null),this.props&&(this.props=null)},onDomReady:null,createStateUpdater:function(e){var t=this;return e?function(){t.updateState(e)}:e},stateUpdater:function(e){var t=this;return e?typeof e=="function"?function(){t.updateState(e.apply(t,arguments))}:function(){t.updateState(e)}:e},reconcileResults:function(e){return e},updateCompositeUI:function(e){this.props=e,n.currentlyConstructingOwner=this;var t=this.getAllRenderResults();n.currentlyConstructingOwner=null;var r=this.reconcileResults(t);n.validateReactComponentInstance(r);if(!r.props.isStatic){var i=this.renderedChild;if(i.constructor===r.constructor)i.setAllPropsImpl(r.props);else{var s=r.genMarkupImpl(this._rootDomId);i.destroy();var u=i._rootDomId;o.removeNodeByID(u).enqueue(),o.dangerouslyInsertMarkupAtByID(u,s,0).enqueue(),this.renderedChild=r}}},reconcile:function(){l.perform(this.updateCompositeUI,this,this.props)}},y={createComponentConstructor:function(e){var t=e.mixins,i=function(e){this.props=e||{},this.captureOwnerAtConstruction()};f(i,n.ReactComponentMixin),f(i,g),f(i,s);if(t)for(var o=0;o<t.length;o++)f(i,t[o]);return f(i,e),r.throwIf(!i.prototype.render,r.CLASS_SPEC),i},createComponent:function(e){var t=y.createComponentConstructor(e),n=function(e){return new t(e)};return n.componentConstructor=t,n.originalSpec=e,n},ReactCompositeComponentMixin:g};return e.exports=y,e.exports}(),require["./ReactDOMUtils"]=require.ReactDOMUtils=function(){function u(e){var t="";for(var n in e){if(!e.hasOwnProperty(n))continue;__DEV__&&s(!o[n],r.UNRECOGNIZE_STYLE+n);var u=e[n];u!==undefined&&(t+=o[n],t+=i(n,u))}return t}var e={exports:{}},t=e.exports,n=require("ReactDOMPropertyMarkup"),r=require("ReactErrors"),i=require("styleValue"),s=require("throwIf"),o=n.DOMStylePropertyMarkupPieces,a={serializeInlineStyle:u};return e.exports=a,e.exports}(),require["./ReactDOMGeneration"]=require.ReactDOMGeneration=function(){var e={exports:{}},t=e.exports,n=require("DOMProperties"),r=require("ReactDOMPropertyMarkup"),i=require("ReactPosInfo"),s=require("ReactDOMUtils"),o=require("ReactEvent"),u=require("escapeTextForBrowser"),a=require("keyOf"),f=require("merge"),l=o.registrationNames,c=r.DOMPropertyMarkupPieces,h=n.DOMPropertyConfig,p=n.customAttrRegexp,d=o.putListener,v=require("renderer-renderClassSet"),m=s.serializeInlineStyle,g=a({content:null}),y=a({dangerouslySetInnerHtml:null}),b=a({classSet:null}),w=a({className:null}),E=a({style:null}),S=a({posInfo:null}),x={genMarkupImplDOMGeneration:function(){var e=this.props,t="",n,r=null,s=null,o=null;for(var a in e){if(!e.hasOwnProperty(a))continue;var x=e[a];if(x===null||typeof x=="undefined")continue;a===b?r=u(v(x)):a===g?s=u(x):a===y?s=x&&x.__html&&x.__html!=null?x.__html:"":a===w?o=u(x):a===E||a===S?n||(S in e?n=E in e?f(i.normalize(e.posInfo),e.style):i.normalize(e.posInfo):n=e.style):h[a]?t+=c[a]+u(x)+"'":l[a]?d(this._rootDomId,a,x):p.test(a)&&(t+=" "+a+"='"+u(x)+"'")}if(r||o){var T=r?o?r+" "+o:r:o;t+=' class="'+T+'"'}return n&&(t+=' style="',t+=u(m(n)),t+='"'),t+=' id="'+this._rootDomId+'">',s&&(t+=s),t}},T={ReactNativeComponentGenerationMixin:x};return e.exports=T,e.exports}(),require["./ReactDOMMutation"]=require.ReactDOMMutation=function(){var e={exports:{}},t=e.exports,n=require("DOMProperties"),r=require("ReactDOMUtils"),i=require("ReactEvent"),s=require("ReactPosInfo"),o=require("RemoteDOMOperations"),u=require("keyOf"),a=r.styleValue,f=n.customAttrRegexp,l=n.DOMPropertyConfig,c=i.registrationNames,h=i.putListener,p=require("renderer-renderClassSet"),d=u({styleSet:null}),v=u({className:null}),m=u({content:null}),g=u({dangerouslySetInnerHtml:null}),y=u({classSet:null}),b=u({style:null}),w=u({posInfo:null}),E={setAllPropsImplDOMMutation:function(e){var t=this.props,n=!1,r=null,i=null,u=null,E;for(var S in e){var x=e[S],T=t[S];if(!e.hasOwnProperty(S)||x===T)continue;if(S===y)r=e.classSet,JSON.stringify(T)!==JSON.stringify(x)&&(n=!0);else if(S===v)i=e.className,T!==x&&(n=!0);else if(S===b||S===w){if(u)continue;var N=t.style,C=e.style,k=s.inferStyleUpdates(e.posInfo,t.posInfo);for(var L in C){if(!C.hasOwnProperty(L))continue;if(N[L]!==C[L]){var A=a(L,C[L]);(k||(k={}))[L]=A}}k&&(E=this._rootDomId,o.updateProperty(E,d,k).enqueue()),u=!0}else if(S===g){var O=t[S],M=x,_=O&&O.__html,D=M&&M.__html;_!==D&&(E=this._rootDomId,o.updateProperty(E,S,x).enqueue())}else l[S]||S===m?(E=this._rootDomId,o.updateProperty(E,S,x).enqueue()):c[S]?h(this._rootDomId,S,x):f.test(S)&&(E=this._rootDomId,o.updateProperty(E,S,x).enqueue())}if(n){var P=r?p(r):null,H=P?i?P+" "+i:P:i;o.updateProperty(this._rootDomId,v,H).enqueue()}}},S={ReactNativeComponentMutationMixin:E};return e.exports=S,e.exports}(),require["./ReactDocumentOperations"]=require.ReactDocumentOperations=function(){var e={exports:{}},t=e.exports,n=require("ReactInstanceHandles"),r=require("getDOMNodeID"),i={reactRootIDFromPoint:function(e,t){var i=document.elementFromPoint(e,t),s=n.getFirstReactDOM(i);return r(s)}};return e.exports=i,e.exports}(),require["./ReactPosInfo"]=require.ReactPosInfo=function(){var e={exports:{}},t=e.exports,n=require("styleValue"),r=require("keyOf"),i={},s=r({left:null}),o=r({right:null}),u=r({top:null}),a=r({bottom:null}),f=r({height:null}),l=r({width:null}),c={normalize:function(e){return c.inferStyleUpdates(e,null)},inferStyleUpdates:function(e,t){var r=e||i,c=t||i;if(r||c){var h,p=r.l,d=r.t,v=r.r,m=r.b,g=r.w,y=r.h;p!==c.l&&((h||(h={})).left=n(s,p)),d!==c.t&&((h||(h={})).top=n(u,d)),v!==c.r&&((h||(h={})).right=n(o,v)),m!==c.b&&((h||(h={})).bottom=n(a,m)),g!==c.w&&((h||(h={})).width=n(l,g)),y!==c.h&&((h||(h={})).height=n(f,y)),e&&!t&&((h||(h={})).position="absolute")}}};return e.exports=c,e.exports}(),require["./ReactTextComponent"]=require.ReactTextComponent=function(){var e={exports:{}},t=e.exports,n=require("ReactComponent"),r=require("RemoteDOMOperations"),i=require("escapeTextForBrowser"),s=require("keyOf"),o=require("mixInto"),u=s({content:null}),a=function(e){this.props=e};return o(a,n.ReactComponentMixin),a.prototype.setAllPropsImpl=function(e){if(e!==this.props){var t=this._rootDomId;r.updateProperty(t,u,e).enqueue(),this.props=e}},a.prototype.destroy=function(){},a.prototype.genMarkupImpl=function(e){return this._rootDomId=e,'<span id="'+e+'">'+i(this.props)+"</span>"},e.exports=a,e.exports}(),require["./ReactUtils"]=require.ReactUtils=function(){var e={exports:{}},t=e.exports,n=require("bindNoArgs"),r=require("curryOnly"),i=require("keyMirror"),s=require("keyOf"),o=require("reactKeys"),u=require("merge"),a=require("mergeDeep"),f=require("mergeDeepInto"),l=require("mergeHelpers"),c=require("mergeInto"),h=require("mixInto"),p=require("objMapKeyVal");return t.bindNoArgs=n,t.curryOnly=r,t.keyMirror=i,t.keyOf=s,t.keys=o,t.merge=u,t.mergeDeep=a,t.mergeInto=c,t.mixInto=h,t.objMapKeyVal=p,e.exports}(),require["./RemoteDOMOperations"]=require.RemoteDOMOperations=function(){var e={exports:{}},t=e.exports,n=require("DOMOperations"),r=require("Portal"),i=r.toMainModule("DOMOperations",n);return e.exports=i,e.exports}(),require["./ReactMultiChild"]=require.ReactMultiChild=function(){function i(e,t){return e&&t&&e.constructor===t.constructor}function s(e,t){return e&&!t||e&&t&&e.constructor!==t.constructor}var e={exports:{}},t=e.exports,n=require("ReactComponent"),r=require("RemoteDOMOperations"),o=function(e,t,n,r){t!==n&&((r||(r={}))[e._rootDomId]=n)},u={enqueueMarkupAt:function(e,t){r.dangerouslyInsertMarkupAtByID(this._rootDomId,e,t).enqueue()},enqueueMove:function(e,t){r.moveNodeByID(this._rootDomId,e,t).enqueue()},enqueueRemoveChildByName:function(e,t){n.isValidComponent(t)&&(t.destroy(),r.removeNodeByID(t._rootDomId).enqueue(),delete this.renderedChildren[e])},destroyMultiChild:function(){var e=this.renderedChildren;for(var t in e)e.hasOwnProperty(t)&&e[t]&&e[t].destroy();this.renderedChildren=null},genMarkupImplMultiChild:function(e){var t="",n=0;for(var r in e){var i=e[r];e.hasOwnProperty(r)&&i&&(i.domIndex=n,t+=e[r].genMarkupImpl(this._rootDomId+"."+r),n++)}return this.renderedChildren=e,t},setAllPropsImplMultiChild:function(e){if(!e&&!this.renderedChildren)return;e&&!this.renderedChildren?this.renderedChildren={}:!e&&this.renderedChildren&&(e={});var t=this._rootDomId+".",n=null,r=0,u=0,a=0,f=null;for(var l in e){if(!e.hasOwnProperty(l))continue;var c=this.renderedChildren[l],h=e[l];if(i(c,h)){a+=r,n&&(this.enqueueMarkupAt(n,u-r),n=null),r=0,h.props.isStatic||c.setAllPropsImpl(h.props);var p=c.domIndex+a;f=o(c,p,u,f),c.domIndex=u}else{c&&(this.enqueueRemoveChildByName(l,c),a--);if(h){this.renderedChildren[l]=h;var d=h.genMarkupImpl(t+l);n=n?n+d:d,r++,h.domIndex=u}}u++}n&&this.enqueueMarkupAt(n,u-r);for(var v in this.renderedChildren){if(!this.renderedChildren.hasOwnProperty(v))continue;var m=this.renderedChildren[v];s(m,e[v])&&this.enqueueRemoveChildByName(v,m)}for(var g in f)f.hasOwnProperty(g)&&this.enqueueMove(g,f[g])}},a={ReactMultiChildMixin:u};return e.exports=a,e.exports}(),require["./flattenChildren"]=require.flattenChildren=function(){function s(e){if(e===null||e===undefined)return e;var t={};return i(t,e,""),t}var e={exports:{}},t=e.exports,n=require("ReactTextComponent"),r="0",i=function(e,t,s){var o,u;if(Array.isArray(t))for(o=0;o<t.length;o++)i(e,t[o],s+"["+o+"]");else{var a=s==="",f=a?r:s;if(!t&&t!==0)e[f]=null;else if(t.genMarkupIntoContainer)e[f]=t;else{var l=typeof t;if(l==="string"||l==="number")e[f]=new n(t);else if(l==="object")for(u in t)t.hasOwnProperty(u)&&i(e,t[u],s+"{"+u+"}")}}};return e.exports=s,e.exports}(),require["./ReactDOM"]=require.ReactDOM=function(){function v(e,t){var n="<"+e+" ",r=t?"":"</"+e+">",i=function(e){this.props=e,this.captureOwnerAtConstruction()},h={setAllPropsImpl:function(e){s.throwIf(!this._rootDomId,s.CONTROL_WITHOUT_BACKING_DOM),d.setAllPropsImpl.call(this,e),this.setAllPropsImplDOMMutation(e),this.setAllPropsImplMultiChild(l(e.children)),this.props=e},genMarkupImpl:function(e){this.initializeComponent(e);var t=n+this.genMarkupImplDOMGeneration()+this.genMarkupImplMultiChild(l(this.props.children))+r;return t},destroy:function(){this.destroyComponent(),this.destroyMultiChild(),o.deleteAllListeners(this._rootDomId)}};c(i,d),c(i,h),c(i,a),c(i,f),c(i,u.ReactMultiChildMixin),i.prototype.tagName=e.toUpperCase();var p=function(e){return new i(e)};return p}var e={exports:{}},t=e.exports,n=require("ReactComponent"),r=require("ReactDOMGeneration"),i=require("ReactDOMMutation"),s=require("ReactErrors"),o=require("ReactEvent"),u=require("ReactMultiChild"),a=r.ReactNativeComponentGenerationMixin,f=i.ReactNativeComponentMutationMixin,l=require("flattenChildren"),c=require("mixInto"),h=require("objMapKeyVal"),p=require("throwIf"),d=n.ReactComponentMixin,m=h({a:!1,abbr:!1,address:!1,audio:!1,b:!1,body:!1,br:!0,button:!1,code:!1,col:!0,colgroup:!1,dd:!1,div:!1,section:!1,dl:!1,dt:!1,em:!1,embed:!0,fieldset:!1,form:!1,g:!1,h1:!1,h2:!1,h3:!1,h4:!1,h5:!1,h6:!1,header:!1,hr:!0,i:!1,iframe:!1,img:!0,input:!1,label:!1,legend:!1,li:!1,line:!1,object:!1,ol:!1,optgroup:!1,option:!1,p:!1,param:!0,pre:!1,select:!1,small:!1,span:!1,strong:!1,svg:!1,table:!1,tbody:!1,td:!1,textarea:!1,tfoot:!1,th:!1,thead:!1,time:!1,title:!1,tr:!1,ul:!1,video:!1,wbr:!1},v);if(__DEV__){var g={OPTION_CHILDREN:'To ensure that <option> elements contain only text, <option> components will only accept a "content" property and will not accept children'},y=m.option;m.option=function(e){return p(e.children,g.OPTION_CHILDREN),y(e)}}return e.exports=m,e.exports}(),require["./React"]=require.React=function(){var e={exports:{}},t=e.exports,n=require("ReactCompositeComponent"),r=require("ReactMount"),i={initializeTouchEvents:function(e){r.useTouchEvents=e},createComponent:n.createComponent,constructAndRenderComponent:r.constructAndRenderComponent,renderComponent:r.renderComponent,renderOrUpdateComponent:r.renderOrUpdateComponent,destroyAndReleaseReactRootNode:r.destroyAndReleaseReactRootNode,forkAndRenderComponentIntoID:r.forkAndRenderComponentIntoID};return e.exports=i,e.exports}()
docs/docs/refactor/build.py
deleted
-63
@@ -1,63 +0,0 @@
1
-import glob
2
-import os
3
-
4
-def build_header(id, title, prev, next):
5
- prevtext = nexttext = ''
6
- if prev:
7
- prevtext = 'prev: ' + prev + '\n'
8
- if next:
9
- nexttext = 'next: ' + next + '\n'
10
- return '''---
11
-id: %s
12
-title: %s
13
-layout: docs
14
-%s%s---''' % (id, title, prevtext, nexttext)
15
-
16
-def sanitize(content):
17
- title,content = content.split('\n', 1)
18
- title = title[2:].strip()
19
- return title,content.replace('# ', '## ').strip()
20
-
21
-def get_dest(filename):
22
- return os.path.join(os.path.dirname(filename), '..', os.path.basename(filename))
23
-
24
-def relative_html(filename):
25
- if not filename:
26
- return None
27
- return os.path.splitext(os.path.basename(filename))[0] + '.html'
28
-
29
-def generate_nav_item(filename, title):
30
- basename = os.path.splitext(os.path.basename(filename))[0]
31
- return ' <li><a href="/react/docs/%s.html"{%% if page.id == \'%s\' %%} class="active"{%% endif %%}>%s</a></li>\n' % (basename, basename, title)
32
-
33
-def main():
34
- docs = [None] + glob.glob(os.path.join(os.path.dirname(os.path.abspath(__file__)), '*.md'))[:-1] + [None]
35
- nav = '''
36
-<div class="nav-docs">
37
- <div class="nav-docs-section">
38
- <h3>React documentation</h3>
39
- <ul>
40
-%s
41
- </ul>
42
- </div>
43
-</div>'''
44
- items = ''
45
- for i in xrange(1, len(docs) - 1):
46
- prev = relative_html(docs[i - 1])
47
- next = relative_html(docs[i + 1])
48
- with open(docs[i], 'r') as src, open(get_dest(docs[i]), 'w') as dest:
49
- title,content = sanitize(src.read())
50
- header = build_header(
51
- os.path.splitext(os.path.basename(docs[i]))[0],
52
- title,
53
- prev,
54
- next
55
- )
56
- dest.write(header + '\n' + content)
57
- if docs[i].count('.') == 1:
58
- items += generate_nav_item(docs[i], title)
59
- with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..', '_includes', 'nav_docs.html'), 'w') as f:
60
- f.write(nav % items)
61
-
62
-if __name__ == '__main__':
63
- main()