Commit cbb291b8 authored by Mark Otto's avatar Mark Otto
Browse files

Merge branch '2.0-wip' of github.com:twitter/bootstrap into 2.0-wip

Conflicts:
	bootstrap.css
	bootstrap.min.css
parents b36df463 08d0aff1
Showing with 1324 additions and 493 deletions
+1324 -493
.DS_Store .DS_Store
\ No newline at end of file js/min
\ No newline at end of file
VERSION=1.2.0 VERSION=2.0.0
DATE=$(shell DATE) DATE=$(shell DATE)
BOOTSTRAP = ./bootstrap.css BOOTSTRAP = ./bootstrap.css
BOOTSTRAP_MIN = ./bootstrap.min.css BOOTSTRAP_MIN = ./bootstrap.min.css
BOOTSTRAP_LESS = ./lib/bootstrap.less BOOTSTRAP_LESS = ./lib/bootstrap.less
LESS_COMPESSOR ?= `which lessc` LESS_COMPESSOR ?= `which lessc`
UGLIFY_JS ?= `which uglifyjs`
WATCHR ?= `which watchr` WATCHR ?= `which watchr`
build: build:
...@@ -18,6 +19,24 @@ build: ...@@ -18,6 +19,24 @@ build:
echo "You can install it by running: npm install less -g"; \ echo "You can install it by running: npm install less -g"; \
fi fi
uglify:
@@if test ! -z ${UGLIFY_JS}; then \
mkdir -p js/min; \
uglifyjs -o js/min/bootstrap-accordion.js js/bootstrap-accordion.js;\
uglifyjs -o js/min/bootstrap-alerts.js js/bootstrap-alerts.js;\
uglifyjs -o js/min/bootstrap-buttons.js js/bootstrap-buttons.js;\
uglifyjs -o js/min/bootstrap-dropdown.js js/bootstrap-dropdown.js;\
uglifyjs -o js/min/bootstrap-modal.js js/bootstrap-modal.js;\
uglifyjs -o js/min/bootstrap-popover.js js/bootstrap-popover.js;\
uglifyjs -o js/min/bootstrap-scrollspy.js js/bootstrap-scrollspy.js;\
uglifyjs -o js/min/bootstrap-tabs.js js/bootstrap-tabs.js;\
uglifyjs -o js/min/bootstrap-transitions.js js/bootstrap-transitions.js;\
uglifyjs -o js/min/bootstrap-twipsy.js js/bootstrap-twipsy.js;\
else \
echo "You must have the UGLIFYJS minifier installed in order to minify Bootstrap's js."; \
echo "You can install it by running: npm install uglify-js -g"; \
fi
watch: watch:
@@if test ! -z ${WATCHR}; then \ @@if test ! -z ${WATCHR}; then \
echo "Watching less files..."; \ echo "Watching less files..."; \
......
...@@ -18,7 +18,7 @@ Here's what the LESS version looks like: ...@@ -18,7 +18,7 @@ Here's what the LESS version looks like:
<script src="less.js" type="text/javascript"></script> <script src="less.js" type="text/javascript"></script>
``` ```
Or if you prefer, the standard css way: Or if you prefer, the standard CSS way:
``` html ``` html
<link rel="stylesheet" type="text/css" href="bootstrap.css"> <link rel="stylesheet" type="text/css" href="bootstrap.css">
...@@ -72,7 +72,7 @@ http://groups.google.com/group/twitter-bootstrap ...@@ -72,7 +72,7 @@ http://groups.google.com/group/twitter-bootstrap
Developers Developers
---------- ----------
We have included a makefile with convenience methods for working with the bootstrap library. We have included a makefile with convenience methods for working with the Bootstrap library.
+ **build** - `make build` + **build** - `make build`
This will run the less compiler on the bootstrap lib and generate a bootstrap.css and bootstrap.min.css file. This will run the less compiler on the bootstrap lib and generate a bootstrap.css and bootstrap.min.css file.
......
/*! /*!
* Bootstrap v1.2.0 * Bootstrap v2.0.0
* *
* Copyright 2011 Twitter, Inc * Copyright 2011 Twitter, Inc
* Licensed under the Apache License v2.0 * Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Designed and built with all the love in the world @twitter by @mdo and @fat. * Designed and built with all the love in the world @twitter by @mdo and @fat.
* Date: Tue Nov 29 22:34:51 PST 2011 * Date: Tue Nov 29 22:35:45 PST 2011
*/ */
/* Reset.less
* Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc).
* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
html, body { html, body {
margin: 0; margin: 0;
padding: 0; padding: 0;
...@@ -170,16 +167,6 @@ textarea { ...@@ -170,16 +167,6 @@ textarea {
overflow: auto; overflow: auto;
vertical-align: top; vertical-align: top;
} }
/* Variables.less
* Variables to customize the look and feel of Bootstrap
* ----------------------------------------------------- */
/* Mixins.less
* Snippets of reusable CSS to develop faster and keep code readable
* ----------------------------------------------------------------- */
/*
* Scaffolding
* Basic and global styles for generating a grid system, structural layout, and page templates
* ------------------------------------------------------------------------------------------- */
body { body {
margin: 0; margin: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
...@@ -344,9 +331,6 @@ a:hover { ...@@ -344,9 +331,6 @@ a:hover {
.offset11 { .offset11 {
margin-left: 900px; margin-left: 900px;
} }
/* Typography.less
* Headings, body text, lists, code, and more for a versatile and durable typography system
* ---------------------------------------------------------------------------------------- */
p { p {
margin-bottom: 9px; margin-bottom: 9px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
...@@ -534,9 +518,6 @@ pre code { ...@@ -534,9 +518,6 @@ pre code {
padding: 0; padding: 0;
background-color: transparent; background-color: transparent;
} }
/* Forms.less
* Base styles for various input types, form layouts, and states
* ------------------------------------------------------------- */
form { form {
margin-bottom: 18px; margin-bottom: 18px;
} }
...@@ -676,7 +657,7 @@ select.span2, ...@@ -676,7 +657,7 @@ select.span2,
.uneditable-input.span2 { .uneditable-input.span2 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 150px; width: 130px;
margin-left: 0; margin-left: 0;
} }
input.span3, input.span3,
...@@ -685,7 +666,7 @@ select.span3, ...@@ -685,7 +666,7 @@ select.span3,
.uneditable-input.span3 { .uneditable-input.span3 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 250px; width: 210px;
margin-left: 0; margin-left: 0;
} }
input.span4, input.span4,
...@@ -694,7 +675,7 @@ select.span4, ...@@ -694,7 +675,7 @@ select.span4,
.uneditable-input.span4 { .uneditable-input.span4 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 350px; width: 290px;
margin-left: 0; margin-left: 0;
} }
input.span5, input.span5,
...@@ -703,7 +684,7 @@ select.span5, ...@@ -703,7 +684,7 @@ select.span5,
.uneditable-input.span5 { .uneditable-input.span5 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 450px; width: 370px;
margin-left: 0; margin-left: 0;
} }
input.span6, input.span6,
...@@ -712,7 +693,7 @@ select.span6, ...@@ -712,7 +693,7 @@ select.span6,
.uneditable-input.span6 { .uneditable-input.span6 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 550px; width: 450px;
margin-left: 0; margin-left: 0;
} }
input.span7, input.span7,
...@@ -721,7 +702,7 @@ select.span7, ...@@ -721,7 +702,7 @@ select.span7,
.uneditable-input.span7 { .uneditable-input.span7 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 650px; width: 530px;
margin-left: 0; margin-left: 0;
} }
input.span8, input.span8,
...@@ -730,7 +711,7 @@ select.span8, ...@@ -730,7 +711,7 @@ select.span8,
.uneditable-input.span8 { .uneditable-input.span8 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 750px; width: 610px;
margin-left: 0; margin-left: 0;
} }
input.span9, input.span9,
...@@ -739,7 +720,7 @@ select.span9, ...@@ -739,7 +720,7 @@ select.span9,
.uneditable-input.span9 { .uneditable-input.span9 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 850px; width: 690px;
margin-left: 0; margin-left: 0;
} }
input.span10, input.span10,
...@@ -748,7 +729,7 @@ select.span10, ...@@ -748,7 +729,7 @@ select.span10,
.uneditable-input.span10 { .uneditable-input.span10 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 950px; width: 770px;
margin-left: 0; margin-left: 0;
} }
input.span11, input.span11,
...@@ -757,7 +738,7 @@ select.span11, ...@@ -757,7 +738,7 @@ select.span11,
.uneditable-input.span11 { .uneditable-input.span11 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 1050px; width: 850px;
margin-left: 0; margin-left: 0;
} }
input.span12, input.span12,
...@@ -766,7 +747,7 @@ select.span12, ...@@ -766,7 +747,7 @@ select.span12,
.uneditable-input.span12 { .uneditable-input.span12 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 1150px; width: 930px;
margin-left: 0; margin-left: 0;
} }
input.span13, input.span13,
...@@ -775,7 +756,7 @@ select.span13, ...@@ -775,7 +756,7 @@ select.span13,
.uneditable-input.span13 { .uneditable-input.span13 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 1250px; width: 1010px;
margin-left: 0; margin-left: 0;
} }
input.span14, input.span14,
...@@ -784,7 +765,7 @@ select.span14, ...@@ -784,7 +765,7 @@ select.span14,
.uneditable-input.span14 { .uneditable-input.span14 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 1350px; width: 1090px;
margin-left: 0; margin-left: 0;
} }
input.span15, input.span15,
...@@ -793,7 +774,7 @@ select.span15, ...@@ -793,7 +774,7 @@ select.span15,
.uneditable-input.span15 { .uneditable-input.span15 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 1450px; width: 1170px;
margin-left: 0; margin-left: 0;
} }
input.span16, input.span16,
...@@ -802,7 +783,7 @@ select.span16, ...@@ -802,7 +783,7 @@ select.span16,
.uneditable-input.span16 { .uneditable-input.span16 {
display: inline-block; display: inline-block;
float: none; float: none;
width: 1550px; width: 1250px;
margin-left: 0; margin-left: 0;
} }
input[disabled], input[disabled],
...@@ -999,10 +980,6 @@ form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-app ...@@ -999,10 +980,6 @@ form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-app
.horizontal-form .form-actions { .horizontal-form .form-actions {
padding-left: 150px; padding-left: 150px;
} }
/*
* Tables.less
* Tables for, you guessed it, tabular data
* ---------------------------------------- */
table { table {
width: 100%; width: 100%;
margin-bottom: 18px; margin-bottom: 18px;
...@@ -1193,9 +1170,7 @@ table { ...@@ -1193,9 +1170,7 @@ table {
.headerSortDown.purple { .headerSortDown.purple {
background-color: lighten(@purple, 40%); background-color: lighten(@purple, 40%);
} }
}*//* Patterns.less }*/
* Repeatable UI elements outside the base styles provided from the scaffolding
* ---------------------------------------------------------------------------- */
.navbar { .navbar {
height: 40px; height: 40px;
overflow: visible; overflow: visible;
...@@ -1638,7 +1613,7 @@ footer { ...@@ -1638,7 +1613,7 @@ footer {
border-color: #0064cd #0064cd #003f81; border-color: #0064cd #0064cd #003f81;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
} }
.btn:active { .btn.active, .btn:active {
-webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
...@@ -1874,6 +1849,19 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { ...@@ -1874,6 +1849,19 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
.fade.in { .fade.in {
opacity: 1; opacity: 1;
} }
.collapse {
-webkit-transition: height 0.35s ease;
-moz-transition: height 0.35s ease;
-ms-transition: height 0.35s ease;
-o-transition: height 0.35s ease;
transition: height 0.35s ease;
position: relative;
overflow: hidden;
height: 0;
}
.collapse.in {
height: auto;
}
.label { .label {
padding: 1px 3px 2px; padding: 1px 3px 2px;
font-size: 9.75px; font-size: 9.75px;
...@@ -2264,11 +2252,11 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { ...@@ -2264,11 +2252,11 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
visibility: visible; visibility: visible;
padding: 5px; padding: 5px;
font-size: 11px; font-size: 11px;
filter: alpha(opacity=80); filter: alpha(opacity=0);
-moz-opacity: 0.8; -moz-opacity: 0;
opacity: 0.8; opacity: 0;
} }
.twipsy.fade.in { .twipsy.in {
filter: alpha(opacity=80); filter: alpha(opacity=80);
-moz-opacity: 0.8; -moz-opacity: 0.8;
opacity: 0.8; opacity: 0.8;
...@@ -2439,9 +2427,6 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { ...@@ -2439,9 +2427,6 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
-moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
} }
/* Responsive.less
* For phone and tablet devices
* ------------------------------------------------------------- */
@media (max-width: 480px) { @media (max-width: 480px) {
.container { .container {
width: auto; width: auto;
......
...@@ -111,21 +111,21 @@ input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shado ...@@ -111,21 +111,21 @@ input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shado
.input-xlarge{width:270px;} .input-xlarge{width:270px;}
.input-xxlarge{width:530px;} .input-xxlarge{width:530px;}
input.span1,textarea.span1,select.span1,.uneditable-input.span1{display:inline-block;float:none;width:50px;margin-left:0;} input.span1,textarea.span1,select.span1,.uneditable-input.span1{display:inline-block;float:none;width:50px;margin-left:0;}
input.span2,textarea.span2,select.span2,.uneditable-input.span2{display:inline-block;float:none;width:150px;margin-left:0;} input.span2,textarea.span2,select.span2,.uneditable-input.span2{display:inline-block;float:none;width:130px;margin-left:0;}
input.span3,textarea.span3,select.span3,.uneditable-input.span3{display:inline-block;float:none;width:250px;margin-left:0;} input.span3,textarea.span3,select.span3,.uneditable-input.span3{display:inline-block;float:none;width:210px;margin-left:0;}
input.span4,textarea.span4,select.span4,.uneditable-input.span4{display:inline-block;float:none;width:350px;margin-left:0;} input.span4,textarea.span4,select.span4,.uneditable-input.span4{display:inline-block;float:none;width:290px;margin-left:0;}
input.span5,textarea.span5,select.span5,.uneditable-input.span5{display:inline-block;float:none;width:450px;margin-left:0;} input.span5,textarea.span5,select.span5,.uneditable-input.span5{display:inline-block;float:none;width:370px;margin-left:0;}
input.span6,textarea.span6,select.span6,.uneditable-input.span6{display:inline-block;float:none;width:550px;margin-left:0;} input.span6,textarea.span6,select.span6,.uneditable-input.span6{display:inline-block;float:none;width:450px;margin-left:0;}
input.span7,textarea.span7,select.span7,.uneditable-input.span7{display:inline-block;float:none;width:650px;margin-left:0;} input.span7,textarea.span7,select.span7,.uneditable-input.span7{display:inline-block;float:none;width:530px;margin-left:0;}
input.span8,textarea.span8,select.span8,.uneditable-input.span8{display:inline-block;float:none;width:750px;margin-left:0;} input.span8,textarea.span8,select.span8,.uneditable-input.span8{display:inline-block;float:none;width:610px;margin-left:0;}
input.span9,textarea.span9,select.span9,.uneditable-input.span9{display:inline-block;float:none;width:850px;margin-left:0;} input.span9,textarea.span9,select.span9,.uneditable-input.span9{display:inline-block;float:none;width:690px;margin-left:0;}
input.span10,textarea.span10,select.span10,.uneditable-input.span10{display:inline-block;float:none;width:950px;margin-left:0;} input.span10,textarea.span10,select.span10,.uneditable-input.span10{display:inline-block;float:none;width:770px;margin-left:0;}
input.span11,textarea.span11,select.span11,.uneditable-input.span11{display:inline-block;float:none;width:1050px;margin-left:0;} input.span11,textarea.span11,select.span11,.uneditable-input.span11{display:inline-block;float:none;width:850px;margin-left:0;}
input.span12,textarea.span12,select.span12,.uneditable-input.span12{display:inline-block;float:none;width:1150px;margin-left:0;} input.span12,textarea.span12,select.span12,.uneditable-input.span12{display:inline-block;float:none;width:930px;margin-left:0;}
input.span13,textarea.span13,select.span13,.uneditable-input.span13{display:inline-block;float:none;width:1250px;margin-left:0;} input.span13,textarea.span13,select.span13,.uneditable-input.span13{display:inline-block;float:none;width:1010px;margin-left:0;}
input.span14,textarea.span14,select.span14,.uneditable-input.span14{display:inline-block;float:none;width:1350px;margin-left:0;} input.span14,textarea.span14,select.span14,.uneditable-input.span14{display:inline-block;float:none;width:1090px;margin-left:0;}
input.span15,textarea.span15,select.span15,.uneditable-input.span15{display:inline-block;float:none;width:1450px;margin-left:0;} input.span15,textarea.span15,select.span15,.uneditable-input.span15{display:inline-block;float:none;width:1170px;margin-left:0;}
input.span16,textarea.span16,select.span16,.uneditable-input.span16{display:inline-block;float:none;width:1550px;margin-left:0;} input.span16,textarea.span16,select.span16,.uneditable-input.span16{display:inline-block;float:none;width:1250px;margin-left:0;}
input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
form .clearfix.error>label,form .clearfix.error .help-block,form .clearfix.error .help-inline{color:#b94a48;} form .clearfix.error>label,form .clearfix.error .help-block,form .clearfix.error .help-inline{color:#b94a48;}
form .clearfix.error input,form .clearfix.error textarea{color:#b94a48;border-color:#ee5f5b;}form .clearfix.error input:focus,form .clearfix.error textarea:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} form .clearfix.error input,form .clearfix.error textarea{color:#b94a48;border-color:#ee5f5b;}form .clearfix.error input:focus,form .clearfix.error textarea:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
...@@ -214,7 +214,7 @@ footer{padding-top:17px;margin-top:17px;border-top:1px solid #eee;} ...@@ -214,7 +214,7 @@ footer{padding-top:17px;margin-top:17px;border-top:1px solid #eee;}
.btn{display:inline-block;padding:5px 14px 6px;font-size:13px;line-height:normal;color:#333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#e6e6e6;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{color:#333;text-decoration:none;background-position:0 -15px;} .btn{display:inline-block;padding:5px 14px 6px;font-size:13px;line-height:normal;color:#333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#e6e6e6;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{color:#333;text-decoration:none;background-position:0 -15px;}
.btn:focus{outline:1px dotted #666;} .btn:focus{outline:1px dotted #666;}
.btn.primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0064cd;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} .btn.primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0064cd;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
.btn:active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);} .btn.active,.btn:active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);}
.btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
.btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
.btn.large{padding:9px 14px 9px;font-size:15px;line-height:normal;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} .btn.large{padding:9px 14px 9px;font-size:15px;line-height:normal;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
...@@ -245,6 +245,7 @@ button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0; ...@@ -245,6 +245,7 @@ button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;
.alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;} .alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;}
.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} .fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;}
.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#bfbfbf;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.label.important{background-color:#c43c35;} .label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#bfbfbf;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.label.important{background-color:#c43c35;}
.label.warning{background-color:#f89406;} .label.warning{background-color:#f89406;}
.label.success{background-color:#46a546;} .label.success{background-color:#46a546;}
...@@ -296,7 +297,7 @@ button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0; ...@@ -296,7 +297,7 @@ button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;
.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;}.modal-footer:before,.modal-footer:after{display:table;*display:inline;content:"";zoom:1;} .modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;}.modal-footer:before,.modal-footer:after{display:table;*display:inline;content:"";zoom:1;}
.modal-footer:after{clear:both;} .modal-footer:after{clear:both;}
.modal-footer .btn{float:right;margin-left:5px;} .modal-footer .btn{float:right;margin-left:5px;}
.twipsy{position:absolute;z-index:1000;display:block;visibility:visible;padding:5px;font-size:11px;filter:alpha(opacity=80);-moz-opacity:0.8;opacity:0.8;}.twipsy.fade.in{filter:alpha(opacity=80);-moz-opacity:0.8;opacity:0.8;} .twipsy{position:absolute;z-index:1000;display:block;visibility:visible;padding:5px;font-size:11px;filter:alpha(opacity=0);-moz-opacity:0;opacity:0;}.twipsy.in{filter:alpha(opacity=80);-moz-opacity:0.8;opacity:0.8;}
.twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} .twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
.twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} .twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
.twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} .twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
......
...@@ -330,6 +330,13 @@ body > .navbar-fixed .brand:hover { ...@@ -330,6 +330,13 @@ body > .navbar-fixed .brand:hover {
margin-left: 10px; margin-left: 10px;
} }
/* scrollspy docs */
.scrollspy-example {
overflow: auto;
height: 200px;
position: relative;
}
/* Popover docs /* Popover docs
-------------------------------------------------- */ -------------------------------------------------- */
...@@ -492,3 +499,19 @@ h2 + table { ...@@ -492,3 +499,19 @@ h2 + table {
} }
} }
#accordion dt a{
display:block;
padding: 9px 15px;
line-height: 1;
background-color: whiteSmoke;
border: 1px solid #EEE;
border-top-color: #fff;
}
#accordion dt:first-child a {
border-top-color:#eee;
}
#accordion dd p {
padding: 10px;
}
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
<li><a href="./scaffolding.html">Scaffolding</a></li> <li><a href="./scaffolding.html">Scaffolding</a></li>
<li class="active"><a href="./base-css.html">Base CSS</a></li> <li class="active"><a href="./base-css.html">Base CSS</a></li>
<li><a href="./components.html">Components</a></li> <li><a href="./components.html">Components</a></li>
<li><a href="./javascript.html">Javascript</a></li> <li><a href="./javascript.html">Javascript plugins</a></li>
<li><a href="./less.html">Using LESS</a></li> <li><a href="./less.html">Using LESS</a></li>
</ul> </ul>
</div> </div>
......
This diff is collapsed.
## 2.0 BOOTSTRAP JS PHILOSOPHY
These are the high-level design rules which guide the development of Bootstrap's JS plugins.
---
### DATA-ATTRIBUTE API
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.
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:
$('body').unbind('.data-api')
To target a specific plugin, just include the plugins name as a namespace along with the data-api namespace like this:
$('body').unbind('.alert.data-api')
---
### PROGRAMATIC API
We also believe you should be able to use all plugins provided by Bootstrap purely through the JS API.
All public APIs should be a single, chainable method, and return the collection acted upon.
$(".btn.danger").button("toggle").addClass("fat")
All methods should accept an optional options object, a string which targets a particular method, or null which initiates the default behavior:
$("#myModal").modal() // initialized with defaults
---
### PLUGIN OPTIONS
Options should be sparse and add universal value. We should pick the right defaults.
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`.
$.fn.modal.defaults = { … }
An options definition should take the following form:
*noun*: *adjective* - describes or modifies a quality of an instance
examples:
backdrop: true
keyboard: false
placement: 'above'
---
### PLUGIN EVENTS
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.
show | shown
hide | hidden
---
### DATA ATTRIBUTES
Data attributes should take the following form:
- data-*(verb)* - defines main interaction
- data-target || href^=# - defined on controller element (if element interacts with an element other than self)
- data-*(noun)* - defines options for element invocation
examples:
// control other targets
data-toggle="modal" data-target="#foo"
data-toggle="collapse" data-target="#foo" data-parent="#foo"
// defined on element they control
data-spy="scroll"
data-dismiss="modal"
data-dismiss="alert"
data-toggle="dropdown"
data-toggle="button"
data-toggle="buttons-checkbox"
data-toggle="buttons-radio"
\ No newline at end of file
/* =============================================================
* bootstrap-accordion.js v2.0.0
* http://twitter.github.com/bootstrap/javascript.html#accordion
* =============================================================
* Copyright 2011 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
(function( $ ){
var Accordion = function ( element, options ) {}
Accordion.prototype = {}
/* ALERT PLUGIN DEFINITION
* ======================= */
$.fn.accordion = function ( options ) {
if ( options === true ) {
return this.data('accordion')
}
return this.each(function () {
new Accordion(this, options)
})
}
})( window.jQuery || window.ender )
\ No newline at end of file
/* ========================================================== /* ==========================================================
* bootstrap-alerts.js v2.0.0 * bootstrap-alert.js v2.0.0
* http://twitter.github.com/bootstrap/javascript.html#alerts * http://twitter.github.com/bootstrap/javascript.html#alerts
* ========================================================== * ==========================================================
* Copyright 2011 Twitter, Inc. * Copyright 2011 Twitter, Inc.
...@@ -17,32 +17,60 @@ ...@@ -17,32 +17,60 @@
* limitations under the License. * limitations under the License.
* ========================================================== */ * ========================================================== */
(function( $ ){
!function( $ ){
"use strict"
/* ALERT CLASS DEFINITION /* ALERT CLASS DEFINITION
* ====================== */ * ====================== */
function close(e) { var dismiss = '[data-dismiss="alert"]'
var $element = $(this).parent('.alert-message') , Alert = function ( el ) {
$(el).delegate(dismiss, 'click', this.close)
}
Alert.prototype = {
close: function ( e ) {
var $element = $(this)
$element = $element.hasClass('alert-message') ? $element : $element.parent()
e && e.preventDefault()
$element.removeClass('in')
e && e.preventDefault() function removeElement() {
$element.removeClass('in') $element.remove()
}
function removeElement () { $.support.transition && $element.hasClass('fade') ?
$element.remove() $element.bind($.support.transition.end, removeElement) :
removeElement()
} }
$.support.transition && $element.hasClass('fade') ?
$element.bind($.support.transition.end, removeElement) :
removeElement()
} }
/* ALERT PLUGIN DEFINITION /* ALERT PLUGIN DEFINITION
* ======================= */ * ======================= */
$.fn.alert = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('alert')
if (!data) $this.data('alert', (data = new Alert(this)))
if (typeof option == 'string') data[option].call($this)
})
}
$.fn.alert.Alert = Alert
/* ALERT DATA-API
* ============== */
$(function () { $(function () {
$('body').delegate('[data-alert-dismiss]', 'click', close) $('body').delegate(dismiss, 'click.alert.data-api', Alert.prototype.close)
}) })
})( window.jQuery || window.ender ) }( window.jQuery || window.ender )
\ No newline at end of file \ No newline at end of file
/* ============================================================
* bootstrap-buttons.js v2.0.0
* http://twitter.github.com/bootstrap/javascript.html#buttons
* ============================================================
* Copyright 2011 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function( $ ){
"use strict"
/* BUTTON PUBLIC CLASS DEFINITION
* ============================== */
var Button = function (element, options) {
this.$element = $(element)
this.settings = $.extend({}, $.fn.button.defaults, options)
}
Button.prototype = {
setState: function (state) {
var d = 'disabled'
, $el = this.$element
, data = $el.data()
, val = $el.is('input') ? 'val' : 'html'
state = state + 'Text'
data.resetText || $el.data('resetText', $el[val]())
$el[val](data[state] || this.settings[state])
// push to event loop to allow forms to submit
setTimeout(function () {
state == 'loadingText' ?
$el.addClass(d).attr(d, d) :
$el.removeClass(d).removeAttr(d)
}, 0)
}
, toggle: function () {
var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
$parent && $parent
.find('.active')
.removeClass('active')
this.$element.toggleClass('active')
}
}
/* BUTTON PLUGIN DEFINITION
* ======================== */
$.fn.button = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('button')
, options = typeof option == 'object' && option
if (!data) $this.data('button', (data = new Button(this, options)))
if (option == 'toggle') data.toggle()
else if (option) data.setState(option)
})
}
$.fn.button.defaults = {
loadingText: 'loading...'
}
$.fn.button.Button = Button
/* BUTTON DATA-API
* =============== */
$(function () {
$('body').delegate('[data-toggle^=button]', 'click.button.data-api', function (e) {
$(e.srcElement).button('toggle')
})
})
}( window.jQuery || window.ender )
\ No newline at end of file
/* =============================================================
* bootstrap-collapsible.js v2.0.0
* http://twitter.github.com/bootstrap/javascript.html#collapsible
* =============================================================
* Copyright 2011 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
(function( $ ){
"use strict"
var Collapse = function ( element, options ) {
this.$element = $(element)
this.settings = $.extend({}, $.fn.collapse.defaults, options)
if (this.settings["parent"]) {
this.$parent = $(this.settings["parent"])
}
this.settings.toggle && this.toggle()
}
Collapse.prototype = {
dimension: function () {
var hasWidth = this.$element.hasClass('width')
return hasWidth ? 'width' : 'height'
}
, show: function () {
var dimension = this.dimension()
, scroll = $.camelCase(['scroll', dimension].join('-'))
, actives = this.$parent && this.$parent.find('.in')
, hasData
if (actives && actives.length) {
hasData = actives.data('collapse')
actives.collapse('hide')
hasData || actives.data('collapse', null)
}
this.$element[dimension](0)
this.transition('addClass', 'show', 'shown')
this.$element[dimension](this.$element[0][scroll])
}
, hide: function () {
var dimension = this.dimension()
this.reset(this.$element[dimension]())
this.transition('removeClass', 'hide', 'hidden')
this.$element[dimension](0)
}
, reset: function ( size ) {
var dimension = this.dimension()
this.$element
.removeClass('collapse')
[dimension](size || '')
[0].offsetWidth
this.$element.addClass('collapse')
}
, transition: function ( method, startEvent, completeEvent ) {
var that = this
, complete = function () {
if (startEvent == 'show') that.reset()
that.$element.trigger(completeEvent)
}
this.$element
.trigger(startEvent)
[method]('in')
$.support.transition && this.$element.hasClass('collapse') ?
this.$element.one($.support.transition.end, complete) :
complete()
}
, toggle: function () {
this[this.$element.hasClass('in') ? 'hide' : 'show']()
}
}
/* COLLAPSIBLE PLUGIN DEFINITION
* ============================== */
$.fn.collapse = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('collapse')
, options = typeof option == 'object' && option
if (!data) $this.data('collapse', (data = new Collapse(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.collapse.defaults = {
toggle: true
}
$.fn.collapse.Collapse = Collapse
/* COLLAPSIBLE DATA-API
* ==================== */
$(function () {
$('body').delegate('[data-toggle=collapse]', 'click.collapse.data-api', function ( e ) {
var $this = $(this)
, target = $this.attr('data-target') || $this.attr('href')
, option = $(target).data('collapse') ? 'toggle' : $this.data()
e.preventDefault()
$(target).collapse(option)
})
})
})( window.jQuery || window.ender )
\ No newline at end of file
...@@ -18,25 +18,56 @@ ...@@ -18,25 +18,56 @@
* ============================================================ */ * ============================================================ */
(function( $ ){ !function( $ ){
/* APPLY TO STANDARD DROPDOWN ELEMENTS "use strict"
* =================================== */
var selector = '[data-dropdown]'
function clearMenus() { /* DROPDOWN CLASS DEFINITION
$(selector).parent('li').removeClass('open') * ========================= */
}
$(function () { var toggle = '[data-toggle="dropdown"]'
$('html').bind("click", clearMenus) , Dropdown = function ( element ) {
$('body').delegate(selector, 'click', function (e) { $(element).bind('click', this.toggle)
}
Dropdown.prototype = {
toggle: function ( e ) {
var li = $(this).parent('li') var li = $(this).parent('li')
, isActive = li.hasClass('open') , isActive = li.hasClass('open')
clearMenus() clearMenus()
!isActive && li.toggleClass('open') !isActive && li.toggleClass('open')
return false return false
}
}
function clearMenus() {
$(toggle).parent('li').removeClass('open')
}
/* DROPDOWN PLUGIN DEFINITION
* ========================== */
$.fn.dropdown = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('dropdown')
if (!data) $this.data('dropdown', (data = new Dropdown(this)))
if (typeof option == 'string') data[option].call($this)
}) })
}
/* APPLY TO STANDARD DROPDOWN ELEMENTS
* =================================== */
$(function () {
$('html').bind('click.dropdown.data-api', clearMenus)
$('body').delegate(toggle, 'click.dropdown.data-api', Dropdown.prototype.toggle)
}) })
})( window.jQuery || window.ender ) }( window.jQuery || window.ender )
\ No newline at end of file \ No newline at end of file
...@@ -20,19 +20,16 @@ ...@@ -20,19 +20,16 @@
!function( $ ){ !function( $ ){
/* MODAL PUBLIC CLASS DEFINITION "use strict"
* ============================= */
/* MODAL CLASS DEFINITION
* ====================== */
var Modal = function ( content, options ) { var Modal = function ( content, options ) {
this.settings = $.extend({}, $.fn.modal.defaults, options) this.settings = $.extend({}, $.fn.modal.defaults, options)
this.$element = $(content) this.$element = $(content)
.delegate('[data-modal-dismiss]', 'click', $.proxy(this.hide, this)) .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
this.settings.show && this.show()
if ( this.settings.show ) {
this.show()
}
return this
} }
Modal.prototype = { Modal.prototype = {
...@@ -43,21 +40,37 @@ ...@@ -43,21 +40,37 @@
, show: function () { , show: function () {
var that = this var that = this
if (this.isShown) return
this.isShown = true this.isShown = true
this.$element.trigger('show') this.$element.trigger('show')
escape.call(this) escape.call(this)
backdrop.call(this) backdrop.call(this, function () {
var transition = $.support.transition && that.$element.hasClass('fade')
return this that.$element
.appendTo(document.body)
.show()
if (transition) {
that.$element[0].offsetWidth // force reflow
}
that.$element.addClass('in')
transition ?
that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
that.$element.trigger('shown')
})
} }
, hide: function (e) { , hide: function ( e ) {
e && e.preventDefault() e && e.preventDefault()
if ( !this.isShown ) { if (!this.isShown) return
return this
}
var that = this var that = this
this.isShown = false this.isShown = false
...@@ -68,19 +81,9 @@ ...@@ -68,19 +81,9 @@
.trigger('hide') .trigger('hide')
.removeClass('in') .removeClass('in')
function removeElement () {
that.$element
.hide()
.trigger('hidden')
backdrop.call(that)
}
$.support.transition && this.$element.hasClass('fade') ? $.support.transition && this.$element.hasClass('fade') ?
this.$element.one($.support.transition.end, removeElement) : hideWithTransition.call(this) :
removeElement() hideModal.call(this)
return this
} }
} }
...@@ -89,24 +92,42 @@ ...@@ -89,24 +92,42 @@
/* MODAL PRIVATE METHODS /* MODAL PRIVATE METHODS
* ===================== */ * ===================== */
function backdrop () { function hideWithTransition() {
var that = this
, timeout = setTimeout(function () {
that.$element.unbind($.support.transition.end)
hideModal.call(that)
}, 500)
this.$element.one($.support.transition.end, function () {
clearTimeout(timeout)
hideModal.call(that)
})
}
function hideModal (that) {
this.$element
.hide()
.trigger('hidden')
backdrop.call(this)
}
function backdrop ( callback ) {
var that = this var that = this
, animate = this.$element.hasClass('fade') ? 'fade' : '' , animate = this.$element.hasClass('fade') ? 'fade' : ''
, callback = $.proxy(show, this)
if ( this.isShown && this.settings.backdrop ) { if (this.isShown && this.settings.backdrop) {
var doAnimate = $.support.transition && animate var doAnimate = $.support.transition && animate
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
.appendTo(document.body) .appendTo(document.body)
if ( this.settings.backdrop != 'static' ) { if (this.settings.backdrop != 'static') {
this.$backdrop.click($.proxy(this.hide, this)) this.$backdrop.click($.proxy(this.hide, this))
} }
if ( doAnimate ) { if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
this.$backdrop[0].offsetWidth // force reflow
}
this.$backdrop.addClass('in') this.$backdrop.addClass('in')
...@@ -114,52 +135,31 @@ ...@@ -114,52 +135,31 @@
this.$backdrop.one($.support.transition.end, callback) : this.$backdrop.one($.support.transition.end, callback) :
callback() callback()
} else if ( !this.isShown && this.$backdrop ) { } else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in') this.$backdrop.removeClass('in')
function removeElement() {
that.$backdrop.remove()
that.$backdrop = null
}
$.support.transition && this.$element.hasClass('fade')? $.support.transition && this.$element.hasClass('fade')?
this.$backdrop.one($.support.transition.end, removeElement) : this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
removeElement() removeBackdrop.call(this)
} else if ( callback ) {
callback()
}
}
function show() {
var transition = $.support.transition && that.$element.hasClass('fade')
, that = this
this.$element } else if (callback) {
.appendTo(document.body) callback()
.show()
if (transition) {
this.$element[0].offsetWidth // force reflow
} }
}
this.$element function removeBackdrop() {
.addClass('in') this.$backdrop.remove()
this.$backdrop = null
transition ?
this.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
this.$element.trigger('shown')
} }
function escape() { function escape() {
var that = this var that = this
if ( this.isShown && this.settings.keyboard ) { if (this.isShown && this.settings.keyboard) {
$(document).bind('keyup.modal', function ( e ) { $(document).bind('keyup.dismiss.modal', function ( e ) {
if ( e.which == 27 ) { e.which == 27 && that.hide()
that.hide()
}
}) })
} else if ( !this.isShown ) { } else if (!this.isShown) {
$(document).unbind('keyup.modal') $(document).unbind('keyup.dismiss.modal')
} }
} }
...@@ -167,53 +167,36 @@ ...@@ -167,53 +167,36 @@
/* MODAL PLUGIN DEFINITION /* MODAL PLUGIN DEFINITION
* ======================= */ * ======================= */
$.fn.modal = function ( options ) { $.fn.modal = function ( option ) {
var modal = this.data('modal') return this.each(function () {
var $this = $(this)
if (!modal) { , data = $this.data('modal')
, options = typeof option == 'object' && option
if (typeof options == 'string') { if (!data) $this.data('modal', (data = new Modal(this, options)))
options = { if (typeof option == 'string') data[option]()
show: /show|toggle/.test(options) })
}
}
return this.each(function () {
$(this).data('modal', new Modal(this, options))
})
}
if ( options === true ) {
return modal
}
if ( typeof options == 'string' ) {
modal[options]()
} else if ( modal ) {
modal.toggle()
}
return this
} }
$.fn.modal.Modal = Modal
$.fn.modal.defaults = { $.fn.modal.defaults = {
backdrop: false backdrop: true
, keyboard: false , keyboard: true
, show: false , show: true
} }
$.fn.modal.Modal = Modal
/* MODAL DATA-IMPLEMENTATION /* MODAL DATA-API
* ========================= */ * ============== */
$(function () { $(document).ready(function () {
$('body').delegate('[data-controls-modal]', 'click', function (e) { $('body').delegate('[data-toggle="modal"]', 'click.modal.data-api', function ( e ) {
var $this = $(this)
, target = $this.attr('data-target') || $this.attr('href')
, option = $(target).data('modal') ? 'toggle' : $this.data()
e.preventDefault() e.preventDefault()
var $this = $(this).data('show', true) $(target).modal(option)
$('#' + $this.attr('data-controls-modal')).modal( $this.data() )
}) })
}) })
}( window.jQuery || window.ender ); }( window.jQuery || window.ender )
\ No newline at end of file \ No newline at end of file
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
!function( $ ) { !function( $ ) {
"use strict"
var Popover = function ( element, options ) { var Popover = function ( element, options ) {
this.$element = $(element) this.$element = $(element)
this.options = options this.options = options
...@@ -34,34 +36,44 @@ ...@@ -34,34 +36,44 @@
setContent: function () { setContent: function () {
var $tip = this.tip() var $tip = this.tip()
$tip.find('.title')[this.options.html ? 'html' : 'text'](this.getTitle()) , title = this.getTitle()
$tip.find('.content p')[this.options.html ? 'html' : 'text'](this.getContent()) , content = this.getContent()
$tip.find('.title')[ $.type(title) == 'object' ? 'append' : 'html' ](title)
$tip.find('.content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content)
$tip[0].className = 'popover' $tip[0].className = 'popover'
} }
, hasContent: function () {
return this.getTitle() || this.getContent()
}
, getContent: function () { , getContent: function () {
var content var content
, $e = this.$element , $e = this.$element
, o = this.options , o = this.options
if (typeof this.options.content == 'string') { if (typeof this.options.content == 'string') {
content = $e.attr(o.content) content = $e.attr(this.options.content)
} else if (typeof this.options.content == 'function') { } else if (typeof this.options.content == 'function') {
content = this.options.content.call(this.$element[0]) content = this.options.content.call(this.$element[0])
} }
return content return content
} }
, tip: function() { , tip: function() {
if (!this.$tip) { if (!this.$tip) {
this.$tip = $('<div class="popover" />') this.$tip = $('<div class="popover" />')
.html('<div class="arrow"></div><div class="inner"><h3 class="title"></h3><div class="content"><p></p></div></div>') .html(this.options.template)
} }
return this.$tip return this.$tip
} }
}) })
/* POPOVER PLUGIN DEFINITION /* POPOVER PLUGIN DEFINITION
* ======================= */ * ======================= */
...@@ -71,6 +83,12 @@ ...@@ -71,6 +83,12 @@
return this return this
} }
$.fn.popover.defaults = $.extend({} , $.fn.twipsy.defaults, { content: 'data-content', placement: 'right'}) $.fn.popover.defaults = $.extend({} , $.fn.twipsy.defaults, {
placement: 'right'
, content: 'data-content'
, template: '<div class="arrow"></div><div class="inner"><h3 class="title"></h3><div class="content"><p></p></div></div>'
})
$.fn.twipsy.rejectAttrOptions.push( 'content' )
}( window.jQuery || window.ender ); }( window.jQuery || window.ender )
\ No newline at end of file \ No newline at end of file
...@@ -17,36 +17,43 @@ ...@@ -17,36 +17,43 @@
* limitations under the License. * limitations under the License.
* ============================================================== */ * ============================================================== */
!function ( $ ) { !function ( $ ) {
var $window = $(window) "use strict"
/* SCROLLSPY CLASS DEFINITION
* ========================== */
function ScrollSpy() { function ScrollSpy( element ) {
var process = $.proxy(this.process, this) var process = $.proxy(this.process, this)
this.$topbar = $('body')
this.selector = '[data-scrollspy] li > a' this.$scrollElement = $(element).bind('scroll.scroll.data-api', process)
this.selector = (this.$scrollElement.attr('data-target')
|| this.$scrollElement.attr('href')
|| '') + ' .nav li > a'
this.$body = $('body').delegate(this.selector, 'click.scroll.data-api', process)
this.refresh() this.refresh()
this.$topbar.delegate(this.selector, 'click', process)
$window.scroll(process)
this.process() this.process()
} }
ScrollSpy.prototype = { ScrollSpy.prototype = {
refresh: function () { refresh: function () {
this.targets = this.$topbar.find(this.selector).map(function () { this.targets = this.$body
var href = $(this).attr('href') .find(this.selector)
return /^#\w/.test(href) && $(href).length ? href : null .map(function () {
}) var href = $(this).attr('href')
return /^#\w/.test(href) && $(href).length ? href : null
})
this.offsets = $.map(this.targets, function (id) { this.offsets = $.map(this.targets, function (id) {
return $(id).offset().top return $(id).position().top
}) })
} }
, process: function () { , process: function () {
var scrollTop = $window.scrollTop() + 10 var scrollTop = this.$scrollElement.scrollTop() + 10
, offsets = this.offsets , offsets = this.offsets
, targets = this.targets , targets = this.targets
, activeTarget = this.activeTarget , activeTarget = this.activeTarget
...@@ -65,11 +72,11 @@ ...@@ -65,11 +72,11 @@
this.activeTarget = target this.activeTarget = target
this.$topbar this.$body
.find(this.selector).parent('.active') .find(this.selector).parent('.active')
.removeClass('active') .removeClass('active')
active = this.$topbar active = this.$body
.find(this.selector + '[href="' + target + '"]') .find(this.selector + '[href="' + target + '"]')
.parent('li') .parent('li')
.addClass('active') .addClass('active')
...@@ -77,13 +84,29 @@ ...@@ -77,13 +84,29 @@
if ( active.parent('.dropdown-menu') ) { if ( active.parent('.dropdown-menu') ) {
active.closest('li.dropdown').addClass('active') active.closest('li.dropdown').addClass('active')
} }
} }
} }
$(function () {
new ScrollSpy() /* SCROLLSPY PLUGIN DEFINITION
}) * =========================== */
$.fn.scrollspy = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('scrollspy')
if (!data) $this.data('scrollspy', (data = new ScrollSpy(this)))
if (typeof option == 'string') data[option]()
})
}
$.fn.scrollspy.ScrollSpy = ScrollSpy
/* SCROLLSPY DATA-API
* ============== */
$(function () { $('[data-spy="scroll"]').scrollspy() })
}( window.jQuery || window.ender ) }( window.jQuery || window.ender )
\ No newline at end of file
...@@ -20,52 +20,83 @@ ...@@ -20,52 +20,83 @@
!function( $ ){ !function( $ ){
function activate ( element, container ) { "use strict"
container
.find('> .active')
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
element.addClass('active') /* TAB CLASS DEFINITION
* ==================== */
if ( element.parent('.dropdown-menu') ) { var Tab = function ( element ) {
element.closest('li.dropdown').addClass('active') this.element = $(element)
}
} }
function tab( e ) { Tab.prototype = {
var $this = $(this)
, $ul = $this.closest('ul:not(.dropdown-menu)')
, href = $this.attr('href')
, previous
if ( /^#\w+/.test(href) ) { show: function () {
e.preventDefault() var $this = this.element
, $ul = $this.closest('ul:not(.dropdown-menu)')
, href = $this.attr('data-target') || $this.attr('href')
, previous
, $href
if ( $this.parent('li').hasClass('active') ) { if ( $this.parent('li').hasClass('active') ) return
return
}
previous = $ul.find('.active a').last()[0] previous = $ul.find('.active a').last()[0]
$this.trigger({
type: 'show'
, relatedTarget: previous
})
$href = $(href) $href = $(href)
activate($this.parent('li'), $ul) this.activate($this.parent('li'), $ul)
activate($href, $href.parent()) this.activate($href, $href.parent())
$this.trigger({ $this.trigger({
type: 'change' type: 'shown'
, relatedTarget: previous , relatedTarget: previous
}) })
} }
, activate: function ( element, container ) {
container
.find('> .active')
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
element.addClass('active')
if ( element.parent('.dropdown-menu') ) {
element.closest('li.dropdown').addClass('active')
}
}
} }
/* TABS/PILLS PLUGIN DEFINITION /* TAB PLUGIN DEFINITION
* ============================ */ * ===================== */
$.fn.tab = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tab')
if (!data) $this.data('tab', (data = new Tab(this)))
if (typeof option == 'string') data[option]()
})
}
$(function () { $.fn.tab.Tab = Tab
$('body').delegate('ul[data-tabs] > li > a, ul[data-pills] > li > a', 'click', tab)
/* TAB DATA-API
* ============ */
$(document).ready(function () {
$('body').delegate('[data-toggle="tab"], [data-toggle="pill"]', 'click.tab.data-api', function (e) {
e.preventDefault()
$(this).tab('show')
})
}) })
}( window.jQuery || window.ender ); }( window.jQuery || window.ender )
\ No newline at end of file \ No newline at end of file
...@@ -38,7 +38,7 @@ $(function () { ...@@ -38,7 +38,7 @@ $(function () {
transitionEnd = "oTransitionEnd" transitionEnd = "oTransitionEnd"
} }
return transitionEnd return transitionEnd
})() }())
} }
})() })()
......
...@@ -18,9 +18,10 @@ ...@@ -18,9 +18,10 @@
* limitations under the License. * limitations under the License.
* ========================================================== */ * ========================================================== */
!function( $ ) { !function( $ ) {
"use strict"
/* TWIPSY PUBLIC CLASS DEFINITION /* TWIPSY PUBLIC CLASS DEFINITION
* ============================== */ * ============================== */
...@@ -41,7 +42,7 @@ ...@@ -41,7 +42,7 @@
, $tip , $tip
, tp , tp
if (this.getTitle() && this.enabled) { if (this.hasContent() && this.enabled) {
$tip = this.tip() $tip = this.tip()
this.setContent() this.setContent()
...@@ -61,7 +62,8 @@ ...@@ -61,7 +62,8 @@
actualWidth = $tip[0].offsetWidth actualWidth = $tip[0].offsetWidth
actualHeight = $tip[0].offsetHeight actualHeight = $tip[0].offsetHeight
placement = _.maybeCall(this.options.placement, this.$element[0])
placement = maybeCall(this.options.placement, this, [ $tip[0], this.$element[0] ])
switch (placement) { switch (placement) {
case 'below': case 'below':
...@@ -87,7 +89,7 @@ ...@@ -87,7 +89,7 @@
, setContent: function () { , setContent: function () {
var $tip = this.tip() var $tip = this.tip()
$tip.find('.twipsy-inner')[this.options.html ? 'html' : 'text'](this.getTitle()) $tip.find('.twipsy-inner').html(this.getTitle())
$tip[0].className = 'twipsy' $tip[0].className = 'twipsy'
} }
...@@ -102,7 +104,7 @@ ...@@ -102,7 +104,7 @@
} }
$.support.transition && this.$tip.hasClass('fade') ? $.support.transition && this.$tip.hasClass('fade') ?
$tip.bind($.support.transition.end, removeElement) : $tip.bind( $.support.transition.end, removeElement) :
removeElement() removeElement()
} }
...@@ -113,6 +115,10 @@ ...@@ -113,6 +115,10 @@
} }
} }
, hasContent: function () {
return this.getTitle()
}
, getTitle: function() { , getTitle: function() {
var title var title
, $e = this.$element , $e = this.$element
...@@ -128,14 +134,11 @@ ...@@ -128,14 +134,11 @@
title = ('' + title).replace(/(^\s*|\s*$)/, "") title = ('' + title).replace(/(^\s*|\s*$)/, "")
return title || o.fallback return title
} }
, tip: function() { , tip: function() {
if (!this.$tip) { return this.$tip = this.$tip || $('<div class="twipsy" />').html(this.options.template)
this.$tip = $('<div class="twipsy" />').html('<div class="twipsy-arrow"></div><div class="twipsy-inner"></div>')
}
return this.$tip
} }
, validate: function() { , validate: function() {
...@@ -158,21 +161,20 @@ ...@@ -158,21 +161,20 @@
this.enabled = !this.enabled this.enabled = !this.enabled
} }
, toggle: function () {
this[this.tip().hasClass('in') ? 'hide' : 'show']()
}
} }
/* TWIPSY PRIVATE METHODS /* TWIPSY PRIVATE METHODS
* ====================== */ * ====================== */
var _ = { function maybeCall ( thing, ctx, args ) {
return typeof thing == 'function' ? thing.apply(ctx, args) : thing
maybeCall: function ( thing, ctx ) {
return (typeof thing == 'function') ? (thing.call(ctx)) : thing
}
} }
/* TWIPSY PLUGIN DEFINITION /* TWIPSY PLUGIN DEFINITION
* ======================== */ * ======================== */
...@@ -187,18 +189,22 @@ ...@@ -187,18 +189,22 @@
, eventIn , eventIn
, eventOut , eventOut
if (options === true) { if (typeof options == 'string') {
return this.data(name) return this.each(function (){
} else if (typeof options == 'string') { twipsy = $.data(this, name)
twipsy = this.data(name) if (twipsy) twipsy[options]()
if (twipsy) { })
twipsy[options]()
}
return this
} }
options = $.extend({}, $.fn[name].defaults, options) options = $.extend({}, $.fn[name].defaults, options)
if (options.delay && typeof options.delay == 'number') {
options.delay = {
show: options.delay
, hide: options.delay
}
}
function get(ele) { function get(ele) {
var twipsy = $.data(ele, name) var twipsy = $.data(ele, name)
...@@ -214,7 +220,7 @@ ...@@ -214,7 +220,7 @@
var twipsy = get(this) var twipsy = get(this)
twipsy.hoverState = 'in' twipsy.hoverState = 'in'
if (options.delayIn == 0) { if (!options.delay || !options.delay.show) {
twipsy.show() twipsy.show()
} else { } else {
twipsy.fixTitle() twipsy.fixTitle()
...@@ -222,21 +228,21 @@ ...@@ -222,21 +228,21 @@
if (twipsy.hoverState == 'in') { if (twipsy.hoverState == 'in') {
twipsy.show() twipsy.show()
} }
}, options.delayIn) }, options.delay.show)
} }
} }
function leave() { function leave() {
var twipsy = get(this) var twipsy = get(this)
twipsy.hoverState = 'out' twipsy.hoverState = 'out'
if (options.delayOut == 0) { if (!options.delay || !options.delay.hide) {
twipsy.hide() twipsy.hide()
} else { } else {
setTimeout(function() { setTimeout(function() {
if (twipsy.hoverState == 'out') { if (twipsy.hoverState == 'out') {
twipsy.hide() twipsy.hide()
} }
}, options.delayOut) }, options.delay.hide)
} }
} }
...@@ -260,19 +266,27 @@ ...@@ -260,19 +266,27 @@
$.fn.twipsy.defaults = { $.fn.twipsy.defaults = {
animate: true animate: true
, delayIn: 0 , delay: 0
, delayOut: 0
, fallback: ''
, placement: 'above' , placement: 'above'
, html: false
, live: false , live: false
, offset: 0 , offset: 0
, title: 'title'
, trigger: 'hover' , trigger: 'hover'
, title: 'title'
, template: '<div class="twipsy-arrow"></div><div class="twipsy-inner"></div>'
} }
$.fn.twipsy.rejectAttrOptions = [ 'title' ]
$.fn.twipsy.elementOptions = function(ele, options) { $.fn.twipsy.elementOptions = function(ele, options) {
return $.metadata ? $.extend({}, options, $(ele).metadata()) : options var data = $(ele).data()
, rejects = $.fn.twipsy.rejectAttrOptions
, i = rejects.length
while (i--) {
delete data[rejects[i]]
}
return $.extend({}, options, data)
} }
}( window.jQuery || window.ender ); }( window.jQuery || window.ender )
\ No newline at end of file \ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment