aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Otto <[email protected]>2011-09-10 22:31:55 -0700
committerMark Otto <[email protected]>2011-09-10 22:31:55 -0700
commit3755ee158f947bdb1d44b86faa9537ac9f3cbbc5 (patch)
tree9c3e0d0b59c07068f2c210eab1262f2d664ab77d
parent40693f261838136499b11c728e5389815e3ee322 (diff)
parent709789d16dccc9c812b62e8d22c61d7f4748e9e2 (diff)
downloadbootstrap-3755ee158f947bdb1d44b86faa9537ac9f3cbbc5.tar.xz
bootstrap-3755ee158f947bdb1d44b86faa9537ac9f3cbbc5.zip
Merge branch '1.3-wip' of github.com:twitter/bootstrap into 1.3-wip
-rw-r--r--docs/assets/js/application-scrollspy.js39
-rw-r--r--docs/assets/js/application.js6
-rw-r--r--docs/index.html8
-rw-r--r--docs/javascript.html42
-rw-r--r--js/bootstrap-alerts.js20
-rw-r--r--js/bootstrap-dropdown.js31
-rw-r--r--js/bootstrap-modal.js23
-rw-r--r--js/bootstrap-popover.js27
-rw-r--r--js/bootstrap-scrollspy.js88
-rw-r--r--js/bootstrap-tabs.js20
-rw-r--r--js/bootstrap-twipsy.js21
-rw-r--r--js/tests/unit/bootstrap-modal.js68
-rw-r--r--js/tests/unit/bootstrap-scrollspy.js31
13 files changed, 352 insertions, 72 deletions
diff --git a/docs/assets/js/application-scrollspy.js b/docs/assets/js/application-scrollspy.js
deleted file mode 100644
index 1f0b7cebe..000000000
--- a/docs/assets/js/application-scrollspy.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// scroll spy logic
-// ================
-$(function () {
-
- var activeTarget,
- position = {},
- $window = $(window),
- nav = $('body > .topbar li a'),
- targets = nav.map(function () {
- return $(this).attr('href');
- }),
- offsets = $.map(targets, function (id) {
- return $(id).offset().top;
- });
-
- function setButton(id) {
- nav.parent("li").removeClass('active');
- $(nav[$.inArray(id, targets)]).parent("li").addClass('active');
- }
-
- function processScroll(e) {
- var scrollTop = $window.scrollTop() + 10, i;
- for (i = offsets.length; i--;) {
- if (activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1])) {
- activeTarget = targets[i];
- setButton(activeTarget);
- }
- }
- }
-
- nav.click(function () {
- processScroll();
- });
-
- processScroll();
-
- $window.scroll(processScroll);
-
-}) \ No newline at end of file
diff --git a/docs/assets/js/application.js b/docs/assets/js/application.js
index 86eefa89d..d1c6751ea 100644
--- a/docs/assets/js/application.js
+++ b/docs/assets/js/application.js
@@ -6,6 +6,12 @@ $(document).ready(function(){
$('body').dropdown() // catch any dropdowns on the page
+ // Scrollspy
+ // =========
+
+ $('body > .topbar').scrollSpy()
+
+
// table sort example
// ==================
diff --git a/docs/index.html b/docs/index.html
index 4764edfb5..e19059d24 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -23,8 +23,8 @@
<script>$(function () { prettyPrint() })</script>
<script src="../js/bootstrap-dropdown.js"></script>
<script src="../js/bootstrap-twipsy.js"></script>
+ <script src="../js/bootstrap-scrollspy.js"></script>
<script src="assets/js/application.js"></script>
- <script src="assets/js/application-scrollspy.js"></script>
<!-- Le fav and touch icons -->
<link rel="shortcut icon" href="images/favicon.ico">
@@ -1592,6 +1592,10 @@ Lorem ipsum dolar sit amet illo error <a href="#" title="below">ipsum</a> verita
<td>This plugin is for adding dropdown interaction to the bootstrap topbar or tabbed navigations.</td>
</tr>
<tr>
+ <td><a href="./javascript.html#scrollspy">bootstrap-scrollspy.js</a></td>
+ <td>The ScrollSpy plugin is for adding an auto updating nav based on scroll position to the bootstrap topbar.</td>
+ </tr>
+ <tr>
<td><a href="./javascript.html#tabs">bootstrap-tabs.js</a></td>
<td>This plugin adds quick, dynamic tab and pill functionality for cycling through local content.</td>
</tr>
@@ -1786,4 +1790,4 @@ Lorem ipsum dolar sit amet illo error <a href="#" title="below">ipsum</a> verita
</footer>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/docs/javascript.html b/docs/javascript.html
index 10acbbf5b..b830e7d64 100644
--- a/docs/javascript.html
+++ b/docs/javascript.html
@@ -15,12 +15,12 @@
<script src="http://code.jquery.com/jquery-1.5.2.min.js"></script>
<script src="assets/js/google-code-prettify/prettify.js"></script>
<script>$(function () { prettyPrint() })</script>
- <script src="assets/js/application-scrollspy.js"></script>
<script src="../js/bootstrap-modal.js"></script>
<script src="../js/bootstrap-alerts.js"></script>
<script src="../js/bootstrap-twipsy.js"></script>
<script src="../js/bootstrap-popover.js"></script>
<script src="../js/bootstrap-dropdown.js"></script>
+ <script src="../js/bootstrap-scrollspy.js"></script>
<script src="../js/bootstrap-tabs.js"></script>
<!-- Le styles -->
@@ -47,6 +47,7 @@
<li><a href="#overview">Overview</a></li>
<li><a href="#modal">Modals</a></li>
<li><a href="#dropdown">Dropdown</a></li>
+ <li><a href="#scrollspy">ScrollSpy</a></li>
<li><a href="#tabs">Tabs</a></li>
<li><a href="#twipsy">Twipsy</a></li>
<li><a href="#popover">Popover</a></li>
@@ -167,7 +168,7 @@ $('#modal-content')
<section id="dropdown">
<div class="page-header">
- <h1>Drop Down <small>bootstrap-dropdown.js</small></h1>
+ <h1>Dropdown <small>bootstrap-dropdown.js</small></h1>
</div>
<div class="row">
<div class="span4 columns">
@@ -228,6 +229,43 @@ $('#modal-content')
</div>
</section>
+ <!-- ScrollSpy
+ ================================================== -->
+
+ <section id="scrollspy">
+ <div class="page-header">
+ <h1>ScrollSpy <small>bootstrap-scrollspy.js</small></h1>
+ </div>
+ <div class="row">
+ <div class="span4 columns">
+ <p>This plugin is for adding the scrollspy (auto updating nav) interaction to the bootstrap topbar.</p>
+ <a href="../js/bootstrap-scrollspy.js" target="_blank" class="btn primary">Download</a>
+ </div>
+ <div class="span12 columns">
+ <h2>Using boostrap-scrollspy.js</h2>
+ <pre class="prettyprint linenums">$('#topbar').dropdown()</pre>
+ <h3>Method</h3>
+ <h4>$().scrollspy</h4>
+ <p>
+ Auto activates navigation buttons by users scroll position.
+ </p>
+ <pre class="prettyprint linenums">$('body > .topbar').scrollSpy()</pre>
+ <p>
+ <strong>Note:</strong> Topbar anchor tags must have resolvable id targets like <code>&lt;a href="#home"&gt;home&lt;/a&gt;</code>.
+ </p>
+ <h3>Events</h3>
+ <h4>scrollspy:refresh</h4>
+ <p>The scrollspy caches nav buttons and anchor locations. If you need to update the cache (because you have dynamic content) just trigger the <code>scrollspy:refresh</code> event.</p>
+ <pre class="prettyprint linenums">$('body > .topbar').trigger('scrollspy:refresh')</pre>
+ <h3>Demo</h3>
+ <p>Peep the topbar navigation homie!</p>
+ <script>$(function () {
+ $('body > .topbar').scrollSpy()
+ })</script>
+ </div>
+ </div>
+ </section>
+
<!-- Tabs
================================================== -->
diff --git a/js/bootstrap-alerts.js b/js/bootstrap-alerts.js
index 4c9c9394d..dbce13466 100644
--- a/js/bootstrap-alerts.js
+++ b/js/bootstrap-alerts.js
@@ -1,3 +1,23 @@
+/* ==========================================================
+ * bootstrap-alerts.js
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
+ * ==========================================================
+ * 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( $ ){
/* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
diff --git a/js/bootstrap-dropdown.js b/js/bootstrap-dropdown.js
index fe73e7994..8be8f13c0 100644
--- a/js/bootstrap-dropdown.js
+++ b/js/bootstrap-dropdown.js
@@ -1,7 +1,24 @@
-(function( $ ){
+/* ============================================================
+ * bootstrap-dropdown.js
+ * http://twitter.github.com/bootstrap/javascript.html#dropdown
+ * ============================================================
+ * 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.
+ * ============================================================ */
+
- /* DROPDOWN PLUGIN DEFINITION
- * ========================== */
+(function( $ ){
var selector = 'a.menu, .dropdown-toggle'
@@ -13,11 +30,17 @@
$('body').bind("click", clearMenus)
})
+ /* DROPDOWN PLUGIN DEFINITION
+ * ========================== */
+
$.fn.dropdown = function ( options ) {
return this.each(function () {
$(this).delegate(selector, 'click', function (e) {
+ var li = $(this).parent('li')
+ , isActive = li.hasClass('open')
+
clearMenus()
- $(this).parent('li').toggleClass('open')
+ !isActive && li.toggleClass('open')
return false
})
})
diff --git a/js/bootstrap-modal.js b/js/bootstrap-modal.js
index a7ab252eb..8b21c192d 100644
--- a/js/bootstrap-modal.js
+++ b/js/bootstrap-modal.js
@@ -1,3 +1,23 @@
+/* =========================================================
+ * bootstrap-modal.js
+ * http://twitter.github.com/bootstrap/javascript.html#modal
+ * =========================================================
+ * 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( $ ){
/* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
@@ -59,6 +79,7 @@
this.isShown = true
_.escape.call(this)
+
_.backdrop.call(this, function () {
that.$element
.appendTo(document.body)
@@ -133,6 +154,8 @@
$.support.transition && this.$element.hasClass('fade')?
this.$backdrop.one(transitionEnd, removeElement) :
removeElement()
+ } else {
+ callback()
}
}
diff --git a/js/bootstrap-popover.js b/js/bootstrap-popover.js
index 5928fe8ca..4995fe5d8 100644
--- a/js/bootstrap-popover.js
+++ b/js/bootstrap-popover.js
@@ -1,10 +1,24 @@
- /* EXTENDS BOOTSTRAP-TWIPSY.js
- =========================== */
+/* ===========================================================
+ * bootstrap-popover.js
+ * http://twitter.github.com/bootstrap/javascript.html#popover
+ * ===========================================================
+ * 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( $ ) {
- /* POPOVER PUBLIC CLASS DEFINITION
- * ============================== */
+(function( $ ) {
var Popover = function ( element, options ) {
this.$element = $(element)
@@ -12,6 +26,9 @@
this.enabled = true
}
+ /* NOTE: POPOVER EXTENDS BOOTSTRAP-TWIPSY.js
+ ========================================= */
+
Popover.prototype = $.extend({}, $.fn.twipsy.Twipsy.prototype, {
setContent: function () {
diff --git a/js/bootstrap-scrollspy.js b/js/bootstrap-scrollspy.js
new file mode 100644
index 000000000..2cf487c50
--- /dev/null
+++ b/js/bootstrap-scrollspy.js
@@ -0,0 +1,88 @@
+/* =============================================================
+ * bootstrap-scrollspy.js
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
+ * =============================================================
+ * 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 $window = $(window)
+
+ function ScrollSpy( topbar ) {
+ var processScroll = $.proxy(this.processScroll, this)
+ this.$topbar = $(topbar)
+ this.setup()
+ this.$topbar
+ .delegate('li > a', 'click', processScroll)
+ .bind('topbar:refresh', $.proxy(this.setup, this))
+ $window.scroll(processScroll)
+ this.processScroll()
+ }
+
+ ScrollSpy.prototype = {
+
+ setup: function () {
+ this.targets = this.$topbar.find('li > a').map(function () {
+ var href = $(this).attr('href')
+ return /^#\w/.test(href) && $(href).length ? href : null
+ })
+
+ this.offsets = $.map(this.targets, function (id) {
+ return $(id).offset().top
+ })
+ }
+
+ , processScroll: function () {
+ var scrollTop = $window.scrollTop() + 10
+ , offsets = this.offsets
+ , targets = this.targets
+ , activeTarget = this.activeTarget
+ , i
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activateButton( targets[i] )
+ }
+ }
+
+ , activateButton: function (target) {
+ this.activeTarget = target
+
+ this.$topbar
+ .find('.active')
+ .removeClass('active')
+
+ this.$topbar
+ .find('a[href=' + target + ']')
+ .parent('li')
+ .addClass('active')
+ }
+
+ }
+
+ /* SCROLLSPY PLUGIN DEFINITION
+ * =========================== */
+
+ $.fn.scrollSpy = function() {
+ return this.each(function () {
+ new ScrollSpy(this)
+ })
+ }
+
+}( jQuery || ender ) \ No newline at end of file
diff --git a/js/bootstrap-tabs.js b/js/bootstrap-tabs.js
index 029ccc65c..aaa73644d 100644
--- a/js/bootstrap-tabs.js
+++ b/js/bootstrap-tabs.js
@@ -1,3 +1,23 @@
+/* ========================================================
+ * bootstrap-tabs.js
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
+ * ========================================================
+ * 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( $ ){
function activate ( element, container ) {
diff --git a/js/bootstrap-twipsy.js b/js/bootstrap-twipsy.js
index ac2f56241..a227af4d2 100644
--- a/js/bootstrap-twipsy.js
+++ b/js/bootstrap-twipsy.js
@@ -1,4 +1,23 @@
-/* Adapted from the original jQuery.tipsy by Jason Frame */
+/* ==========================================================
+ * bootstrap-twipsy.js
+ * http://twitter.github.com/bootstrap/javascript.html#twipsy
+ * Adapted from the original jQuery.tipsy by Jason Frame
+ * ==========================================================
+ * 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( $ ) {
diff --git a/js/tests/unit/bootstrap-modal.js b/js/tests/unit/bootstrap-modal.js
index cfdf4064d..513d28780 100644
--- a/js/tests/unit/bootstrap-modal.js
+++ b/js/tests/unit/bootstrap-modal.js
@@ -17,40 +17,70 @@ $(function () {
})
test("should insert into dom when modal:show event is called", function () {
+ stop()
$.support.transition = false
var div = $("<div id='modal-test'></div>")
- div.modal().trigger("modal:show")
- ok($('#modal-test').length, 'modal insterted into dom')
- div.remove()
+ div
+ .modal()
+ .trigger("modal:show")
+ .bind("modal:shown", function () {
+ ok($('#modal-test').length, 'modal insterted into dom')
+ start()
+ div.remove()
+ })
})
- test("should remove from dom when close is called", function () {
+ test("should remove from dom when modal:hide is called", function () {
+ stop()
$.support.transition = false
var div = $("<div id='modal-test'></div>")
- div.modal().trigger("modal:show")
- ok($('#modal-test').length, 'modal insterted into dom')
- div.trigger("modal:hide")
- ok(!$('#modal-test').length, 'modal removed from dom')
- div.remove()
+ div
+ .modal()
+ .trigger("modal:show")
+ .bind("modal:shown", function () {
+ ok($('#modal-test').length, 'modal insterted into dom')
+ div.trigger("modal:hide")
+ })
+ .bind("modal:hidden", function() {
+ ok(!$('#modal-test').length, 'modal removed from dom')
+ start()
+ div.remove()
+ })
})
test("should toggle when toggle is called", function () {
+ stop()
$.support.transition = false
var div = $("<div id='modal-test'></div>")
- div.modal().trigger("modal:toggle")
- ok($('#modal-test').length, 'modal insterted into dom')
- div.trigger("modal:toggle")
- ok(!$('#modal-test').length, 'modal removed from dom')
- div.remove()
+ div
+ .modal()
+ .trigger("modal:toggle")
+ .bind("modal:shown", function () {
+ ok($('#modal-test').length, 'modal insterted into dom')
+ div.trigger("modal:toggle")
+ })
+ .bind("modal:hidden", function() {
+ ok(!$('#modal-test').length, 'modal removed from dom')
+ start()
+ div.remove()
+ })
})
test("should remove from dom when click .close", function () {
+ stop()
$.support.transition = false
var div = $("<div id='modal-test'><span class='close'></span></div>")
- div.modal().trigger("modal:toggle")
- ok($('#modal-test').length, 'modal insterted into dom')
- div.find('.close').click()
- ok(!$('#modal-test').length, 'modal removed from dom')
- div.remove()
+ div
+ .modal()
+ .trigger("modal:toggle")
+ .bind("modal:shown", function () {
+ ok($('#modal-test').length, 'modal insterted into dom')
+ div.find('.close').click()
+ })
+ .bind("modal:hidden", function() {
+ ok(!$('#modal-test').length, 'modal removed from dom')
+ start()
+ div.remove()
+ })
})
}) \ No newline at end of file
diff --git a/js/tests/unit/bootstrap-scrollspy.js b/js/tests/unit/bootstrap-scrollspy.js
new file mode 100644
index 000000000..b9b309062
--- /dev/null
+++ b/js/tests/unit/bootstrap-scrollspy.js
@@ -0,0 +1,31 @@
+$(function () {
+
+ module("bootstrap-scrollspy")
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).scrollspy, 'scrollspy method is defined')
+ })
+
+ test("should return element", function () {
+ ok($(document.body).scrollspy()[0] == document.body, 'document.body returned')
+ })
+
+ test("should switch active class on scroll", function () {
+ var sectionHTML = '<div id="masthead"></div>'
+ , $section = $(sectionHTML).append('#qunit-runoff')
+ , topbarHTML ='<div class="topbar">'
+ + '<div class="topbar-inner">'
+ + '<div class="container">'
+ + '<h3><a href="#">Bootstrap</a></h3>'
+ + '<ul class="nav">'
+ + '<li><a href="#masthead">Overview</a></li>'
+ + '</ul>'
+ + '</div>'
+ + '</div>'
+ + '</div>'
+ , $topbar = $(topbarHTML).topbar()
+
+ ok(topbar.find('.active', true)
+ })
+
+}) \ No newline at end of file