inkstream 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +93 -0
  4. data/_config.yml +122 -0
  5. data/_includes/button.html +4 -0
  6. data/_includes/icon.html +1 -0
  7. data/_includes/nav-default.html +23 -0
  8. data/_includes/nav-header.html +25 -0
  9. data/_includes/post-list.html +59 -0
  10. data/_includes/post-meta.html +0 -0
  11. data/_includes/post-pagination.html +29 -0
  12. data/_includes/promo-section.html +12 -0
  13. data/_includes/site-before-end.html +1 -0
  14. data/_includes/site-before-start.html +1 -0
  15. data/_includes/site-favicons.html +7 -0
  16. data/_includes/site-fonts.html +13 -0
  17. data/_includes/site-footer-default.html +17 -0
  18. data/_includes/site-footer.html +12 -0
  19. data/_includes/site-header.html +46 -0
  20. data/_includes/site-styles.html +6 -0
  21. data/_layouts/blog.html +24 -0
  22. data/_layouts/default.html +62 -0
  23. data/_layouts/page.html +35 -0
  24. data/_layouts/post.html +201 -0
  25. data/assets/css/styles.css +11167 -0
  26. data/assets/images/about-me.jpg +0 -0
  27. data/assets/images/blog/blog-post-banner.jpg +0 -0
  28. data/assets/images/blog/blog-post-thumb-1.jpg +0 -0
  29. data/assets/images/blog/blog-post-thumb-10.jpg +0 -0
  30. data/assets/images/blog/blog-post-thumb-11.jpg +0 -0
  31. data/assets/images/blog/blog-post-thumb-12.jpg +0 -0
  32. data/assets/images/blog/blog-post-thumb-2.jpg +0 -0
  33. data/assets/images/blog/blog-post-thumb-3.jpg +0 -0
  34. data/assets/images/blog/blog-post-thumb-4.jpg +0 -0
  35. data/assets/images/blog/blog-post-thumb-5.jpg +0 -0
  36. data/assets/images/blog/blog-post-thumb-6.jpg +0 -0
  37. data/assets/images/blog/blog-post-thumb-7.jpg +0 -0
  38. data/assets/images/blog/blog-post-thumb-8.jpg +0 -0
  39. data/assets/images/blog/blog-post-thumb-9.jpg +0 -0
  40. data/assets/images/posts/default-post-img.jpg +0 -0
  41. data/assets/images/posts/text-syntax.jpg +0 -0
  42. data/assets/images/posts/welcome.jpg +0 -0
  43. data/assets/images/profile.png +0 -0
  44. data/assets/images/promo-banner.jpg +0 -0
  45. data/assets/js/blog.js +9 -0
  46. data/assets/js/demo/style-switcher.js +45 -0
  47. data/assets/plugins/bootstrap/js/bootstrap.min.js +7 -0
  48. data/assets/plugins/jquery-3.3.1.min.js +2 -0
  49. data/assets/plugins/popper.min.js +5 -0
  50. data/assets/scss/bootstrap/js/dist/alert.js +199 -0
  51. data/assets/scss/bootstrap/js/dist/alert.js.map +1 -0
  52. data/assets/scss/bootstrap/js/dist/button.js +187 -0
  53. data/assets/scss/bootstrap/js/dist/button.js.map +1 -0
  54. data/assets/scss/bootstrap/js/dist/carousel.js +668 -0
  55. data/assets/scss/bootstrap/js/dist/carousel.js.map +1 -0
  56. data/assets/scss/bootstrap/js/dist/collapse.js +428 -0
  57. data/assets/scss/bootstrap/js/dist/collapse.js.map +1 -0
  58. data/assets/scss/bootstrap/js/dist/dropdown.js +595 -0
  59. data/assets/scss/bootstrap/js/dist/dropdown.js.map +1 -0
  60. data/assets/scss/bootstrap/js/dist/index.js +23 -0
  61. data/assets/scss/bootstrap/js/dist/index.js.map +1 -0
  62. data/assets/scss/bootstrap/js/dist/modal.js +650 -0
  63. data/assets/scss/bootstrap/js/dist/modal.js.map +1 -0
  64. data/assets/scss/bootstrap/js/dist/popover.js +261 -0
  65. data/assets/scss/bootstrap/js/dist/popover.js.map +1 -0
  66. data/assets/scss/bootstrap/js/dist/scrollspy.js +375 -0
  67. data/assets/scss/bootstrap/js/dist/scrollspy.js.map +1 -0
  68. data/assets/scss/bootstrap/js/dist/tab.js +269 -0
  69. data/assets/scss/bootstrap/js/dist/tab.js.map +1 -0
  70. data/assets/scss/bootstrap/js/dist/toast.js +283 -0
  71. data/assets/scss/bootstrap/js/dist/toast.js.map +1 -0
  72. data/assets/scss/bootstrap/js/dist/tooltip.js +760 -0
  73. data/assets/scss/bootstrap/js/dist/tooltip.js.map +1 -0
  74. data/assets/scss/bootstrap/js/dist/util.js +172 -0
  75. data/assets/scss/bootstrap/js/dist/util.js.map +1 -0
  76. data/assets/scss/bootstrap/js/src/alert.js +179 -0
  77. data/assets/scss/bootstrap/js/src/button.js +171 -0
  78. data/assets/scss/bootstrap/js/src/carousel.js +606 -0
  79. data/assets/scss/bootstrap/js/src/collapse.js +402 -0
  80. data/assets/scss/bootstrap/js/src/dropdown.js +545 -0
  81. data/assets/scss/bootstrap/js/src/index.js +52 -0
  82. data/assets/scss/bootstrap/js/src/modal.js +594 -0
  83. data/assets/scss/bootstrap/js/src/popover.js +184 -0
  84. data/assets/scss/bootstrap/js/src/scrollspy.js +326 -0
  85. data/assets/scss/bootstrap/js/src/tab.js +260 -0
  86. data/assets/scss/bootstrap/js/src/toast.js +227 -0
  87. data/assets/scss/bootstrap/js/src/tooltip.js +752 -0
  88. data/assets/scss/bootstrap/js/src/util.js +177 -0
  89. data/assets/scss/bootstrap/js/tests/README.md +69 -0
  90. data/assets/scss/bootstrap/js/tests/browsers.js +82 -0
  91. data/assets/scss/bootstrap/js/tests/index.html +133 -0
  92. data/assets/scss/bootstrap/js/tests/integration/bundle.js +8 -0
  93. data/assets/scss/bootstrap/js/tests/integration/index.html +66 -0
  94. data/assets/scss/bootstrap/js/tests/integration/rollup.bundle.js +20 -0
  95. data/assets/scss/bootstrap/js/tests/karma.conf.js +143 -0
  96. data/assets/scss/bootstrap/js/tests/unit/.eslintrc.json +40 -0
  97. data/assets/scss/bootstrap/js/tests/unit/alert.js +123 -0
  98. data/assets/scss/bootstrap/js/tests/unit/button.js +222 -0
  99. data/assets/scss/bootstrap/js/tests/unit/carousel.js +1333 -0
  100. data/assets/scss/bootstrap/js/tests/unit/collapse.js +892 -0
  101. data/assets/scss/bootstrap/js/tests/unit/dropdown.js +1419 -0
  102. data/assets/scss/bootstrap/js/tests/unit/modal.js +815 -0
  103. data/assets/scss/bootstrap/js/tests/unit/popover.js +471 -0
  104. data/assets/scss/bootstrap/js/tests/unit/scrollspy.js +728 -0
  105. data/assets/scss/bootstrap/js/tests/unit/tab.js +518 -0
  106. data/assets/scss/bootstrap/js/tests/unit/toast.js +259 -0
  107. data/assets/scss/bootstrap/js/tests/unit/tooltip.js +1109 -0
  108. data/assets/scss/bootstrap/js/tests/unit/util.js +163 -0
  109. data/assets/scss/bootstrap/js/tests/visual/alert.html +58 -0
  110. data/assets/scss/bootstrap/js/tests/visual/button.html +51 -0
  111. data/assets/scss/bootstrap/js/tests/visual/carousel.html +66 -0
  112. data/assets/scss/bootstrap/js/tests/visual/collapse.html +78 -0
  113. data/assets/scss/bootstrap/js/tests/visual/dropdown.html +212 -0
  114. data/assets/scss/bootstrap/js/tests/visual/modal.html +268 -0
  115. data/assets/scss/bootstrap/js/tests/visual/popover.html +46 -0
  116. data/assets/scss/bootstrap/js/tests/visual/scrollspy.html +95 -0
  117. data/assets/scss/bootstrap/js/tests/visual/tab.html +234 -0
  118. data/assets/scss/bootstrap/js/tests/visual/toast.html +72 -0
  119. data/assets/scss/bootstrap/js/tests/visual/tooltip.html +106 -0
  120. data/assets/scss/bootstrap/scss/_alert.scss +51 -0
  121. data/assets/scss/bootstrap/scss/_badge.scss +54 -0
  122. data/assets/scss/bootstrap/scss/_breadcrumb.scss +41 -0
  123. data/assets/scss/bootstrap/scss/_button-group.scss +163 -0
  124. data/assets/scss/bootstrap/scss/_buttons.scss +137 -0
  125. data/assets/scss/bootstrap/scss/_card.scss +289 -0
  126. data/assets/scss/bootstrap/scss/_carousel.scss +197 -0
  127. data/assets/scss/bootstrap/scss/_close.scss +41 -0
  128. data/assets/scss/bootstrap/scss/_code.scss +48 -0
  129. data/assets/scss/bootstrap/scss/_custom-forms.scss +507 -0
  130. data/assets/scss/bootstrap/scss/_dropdown.scss +191 -0
  131. data/assets/scss/bootstrap/scss/_forms.scss +330 -0
  132. data/assets/scss/bootstrap/scss/_functions.scss +86 -0
  133. data/assets/scss/bootstrap/scss/_grid.scss +52 -0
  134. data/assets/scss/bootstrap/scss/_images.scss +42 -0
  135. data/assets/scss/bootstrap/scss/_input-group.scss +193 -0
  136. data/assets/scss/bootstrap/scss/_jumbotron.scss +17 -0
  137. data/assets/scss/bootstrap/scss/_list-group.scss +149 -0
  138. data/assets/scss/bootstrap/scss/_media.scss +8 -0
  139. data/assets/scss/bootstrap/scss/_mixins.scss +47 -0
  140. data/assets/scss/bootstrap/scss/_modal.scss +229 -0
  141. data/assets/scss/bootstrap/scss/_nav.scss +120 -0
  142. data/assets/scss/bootstrap/scss/_navbar.scss +294 -0
  143. data/assets/scss/bootstrap/scss/_pagination.scss +73 -0
  144. data/assets/scss/bootstrap/scss/_popover.scss +171 -0
  145. data/assets/scss/bootstrap/scss/_print.scss +141 -0
  146. data/assets/scss/bootstrap/scss/_progress.scss +43 -0
  147. data/assets/scss/bootstrap/scss/_reboot.scss +483 -0
  148. data/assets/scss/bootstrap/scss/_root.scss +19 -0
  149. data/assets/scss/bootstrap/scss/_spinners.scss +55 -0
  150. data/assets/scss/bootstrap/scss/_tables.scss +185 -0
  151. data/assets/scss/bootstrap/scss/_toasts.scss +44 -0
  152. data/assets/scss/bootstrap/scss/_tooltip.scss +115 -0
  153. data/assets/scss/bootstrap/scss/_transitions.scss +20 -0
  154. data/assets/scss/bootstrap/scss/_type.scss +125 -0
  155. data/assets/scss/bootstrap/scss/_utilities.scss +17 -0
  156. data/assets/scss/bootstrap/scss/_variables.scss +1123 -0
  157. data/assets/scss/bootstrap/scss/bootstrap-grid.scss +29 -0
  158. data/assets/scss/bootstrap/scss/bootstrap-reboot.scss +12 -0
  159. data/assets/scss/bootstrap/scss/bootstrap.scss +44 -0
  160. data/assets/scss/bootstrap/scss/mixins/_alert.scss +13 -0
  161. data/assets/scss/bootstrap/scss/mixins/_background-variant.scss +21 -0
  162. data/assets/scss/bootstrap/scss/mixins/_badge.scss +17 -0
  163. data/assets/scss/bootstrap/scss/mixins/_border-radius.scss +63 -0
  164. data/assets/scss/bootstrap/scss/mixins/_box-shadow.scss +20 -0
  165. data/assets/scss/bootstrap/scss/mixins/_breakpoints.scss +123 -0
  166. data/assets/scss/bootstrap/scss/mixins/_buttons.scss +107 -0
  167. data/assets/scss/bootstrap/scss/mixins/_caret.scss +62 -0
  168. data/assets/scss/bootstrap/scss/mixins/_clearfix.scss +7 -0
  169. data/assets/scss/bootstrap/scss/mixins/_deprecate.scss +10 -0
  170. data/assets/scss/bootstrap/scss/mixins/_float.scss +14 -0
  171. data/assets/scss/bootstrap/scss/mixins/_forms.scss +192 -0
  172. data/assets/scss/bootstrap/scss/mixins/_gradients.scss +45 -0
  173. data/assets/scss/bootstrap/scss/mixins/_grid-framework.scss +66 -0
  174. data/assets/scss/bootstrap/scss/mixins/_grid.scss +51 -0
  175. data/assets/scss/bootstrap/scss/mixins/_hover.scss +37 -0
  176. data/assets/scss/bootstrap/scss/mixins/_image.scss +36 -0
  177. data/assets/scss/bootstrap/scss/mixins/_list-group.scss +21 -0
  178. data/assets/scss/bootstrap/scss/mixins/_lists.scss +7 -0
  179. data/assets/scss/bootstrap/scss/mixins/_nav-divider.scss +10 -0
  180. data/assets/scss/bootstrap/scss/mixins/_pagination.scss +22 -0
  181. data/assets/scss/bootstrap/scss/mixins/_reset-text.scss +17 -0
  182. data/assets/scss/bootstrap/scss/mixins/_resize.scss +6 -0
  183. data/assets/scss/bootstrap/scss/mixins/_screen-reader.scss +33 -0
  184. data/assets/scss/bootstrap/scss/mixins/_size.scss +7 -0
  185. data/assets/scss/bootstrap/scss/mixins/_table-row.scss +39 -0
  186. data/assets/scss/bootstrap/scss/mixins/_text-emphasis.scss +16 -0
  187. data/assets/scss/bootstrap/scss/mixins/_text-hide.scss +11 -0
  188. data/assets/scss/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  189. data/assets/scss/bootstrap/scss/mixins/_transition.scss +16 -0
  190. data/assets/scss/bootstrap/scss/mixins/_visibility.scss +8 -0
  191. data/assets/scss/bootstrap/scss/utilities/_align.scss +8 -0
  192. data/assets/scss/bootstrap/scss/utilities/_background.scss +19 -0
  193. data/assets/scss/bootstrap/scss/utilities/_borders.scss +75 -0
  194. data/assets/scss/bootstrap/scss/utilities/_clearfix.scss +3 -0
  195. data/assets/scss/bootstrap/scss/utilities/_display.scss +26 -0
  196. data/assets/scss/bootstrap/scss/utilities/_embed.scss +39 -0
  197. data/assets/scss/bootstrap/scss/utilities/_flex.scss +51 -0
  198. data/assets/scss/bootstrap/scss/utilities/_float.scss +11 -0
  199. data/assets/scss/bootstrap/scss/utilities/_overflow.scss +5 -0
  200. data/assets/scss/bootstrap/scss/utilities/_position.scss +32 -0
  201. data/assets/scss/bootstrap/scss/utilities/_screenreaders.scss +11 -0
  202. data/assets/scss/bootstrap/scss/utilities/_shadows.scss +6 -0
  203. data/assets/scss/bootstrap/scss/utilities/_sizing.scss +20 -0
  204. data/assets/scss/bootstrap/scss/utilities/_spacing.scss +73 -0
  205. data/assets/scss/bootstrap/scss/utilities/_stretched-link.scss +19 -0
  206. data/assets/scss/bootstrap/scss/utilities/_text.scss +72 -0
  207. data/assets/scss/bootstrap/scss/utilities/_visibility.scss +13 -0
  208. data/assets/scss/bootstrap/scss/vendor/_rfs.scss +212 -0
  209. data/assets/scss/theme/_about.scss +28 -0
  210. data/assets/scss/theme/_base.scss +207 -0
  211. data/assets/scss/theme/_blog.scss +140 -0
  212. data/assets/scss/theme/_demo.scss +153 -0
  213. data/assets/scss/theme/_mixins.scss +34 -0
  214. data/assets/scss/theme/_responsive.scss +88 -0
  215. data/assets/scss/theme/styles.scss +14 -0
  216. data/assets/scss/theme-8.scss +41 -0
  217. data/assets/styles.scss +6 -0
  218. metadata +219 -3
@@ -0,0 +1,728 @@
1
+ $(function () {
2
+ 'use strict'
3
+
4
+ QUnit.module('scrollspy plugin')
5
+
6
+ QUnit.test('should be defined on jquery object', function (assert) {
7
+ assert.expect(1)
8
+ assert.ok($(document.body).scrollspy, 'scrollspy method is defined')
9
+ })
10
+
11
+ QUnit.module('scrollspy', {
12
+ beforeEach: function () {
13
+ // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
14
+ $.fn.bootstrapScrollspy = $.fn.scrollspy.noConflict()
15
+ },
16
+ afterEach: function () {
17
+ $.fn.scrollspy = $.fn.bootstrapScrollspy
18
+ delete $.fn.bootstrapScrollspy
19
+ $('#qunit-fixture').html('')
20
+ }
21
+ })
22
+
23
+ QUnit.test('should provide no conflict', function (assert) {
24
+ assert.expect(1)
25
+ assert.strictEqual(typeof $.fn.scrollspy, 'undefined', 'scrollspy was set back to undefined (org value)')
26
+ })
27
+
28
+ QUnit.test('should throw explicit error on undefined method', function (assert) {
29
+ assert.expect(1)
30
+ var $el = $('<div/>').appendTo('#qunit-fixture')
31
+ $el.bootstrapScrollspy()
32
+ try {
33
+ $el.bootstrapScrollspy('noMethod')
34
+ } catch (err) {
35
+ assert.strictEqual(err.message, 'No method named "noMethod"')
36
+ }
37
+ })
38
+
39
+ QUnit.test('should return jquery collection containing the element', function (assert) {
40
+ assert.expect(2)
41
+ var $el = $('<div/>').appendTo('#qunit-fixture')
42
+ var $scrollspy = $el.bootstrapScrollspy()
43
+ assert.ok($scrollspy instanceof $, 'returns jquery collection')
44
+ assert.strictEqual($scrollspy[0], $el[0], 'collection contains element')
45
+ })
46
+
47
+ QUnit.test('should only switch "active" class on current target', function (assert) {
48
+ assert.expect(1)
49
+ var done = assert.async()
50
+
51
+ var sectionHTML = '<div id="root" class="active">' +
52
+ '<div class="topbar">' +
53
+ '<div class="topbar-inner">' +
54
+ '<div class="container" id="ss-target">' +
55
+ '<ul class="nav">' +
56
+ '<li class="nav-item"><a href="#masthead">Overview</a></li>' +
57
+ '<li class="nav-item"><a href="#detail">Detail</a></li>' +
58
+ '</ul>' +
59
+ '</div>' +
60
+ '</div>' +
61
+ '</div>' +
62
+ '<div id="scrollspy-example" style="height: 100px; overflow: auto;">' +
63
+ '<div style="height: 200px;">' +
64
+ '<h4 id="masthead">Overview</h4>' +
65
+ '<p style="height: 200px">' +
66
+ 'Ad leggings keytar, brunch id art party dolor labore.' +
67
+ '</p>' +
68
+ '</div>' +
69
+ '<div style="height: 200px;">' +
70
+ '<h4 id="detail">Detail</h4>' +
71
+ '<p style="height: 200px">' +
72
+ 'Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard.' +
73
+ '</p>' +
74
+ '</div>' +
75
+ '</div>' +
76
+ '</div>'
77
+ var $section = $(sectionHTML).appendTo('#qunit-fixture')
78
+
79
+ var $scrollspy = $section
80
+ .show()
81
+ .find('#scrollspy-example')
82
+ .bootstrapScrollspy({
83
+ target: '#ss-target'
84
+ })
85
+
86
+ $scrollspy.one('scroll', function () {
87
+ assert.ok($section.hasClass('active'), '"active" class still on root node')
88
+ done()
89
+ })
90
+
91
+ $scrollspy.scrollTop(350)
92
+ })
93
+
94
+ QUnit.test('should only switch "active" class on current target specified w element', function (assert) {
95
+ assert.expect(1)
96
+ var done = assert.async()
97
+
98
+ var sectionHTML = '<div id="root" class="active">' +
99
+ '<div class="topbar">' +
100
+ '<div class="topbar-inner">' +
101
+ '<div class="container" id="ss-target">' +
102
+ '<ul class="nav">' +
103
+ '<li class="nav-item"><a href="#masthead">Overview</a></li>' +
104
+ '<li class="nav-item"><a href="#detail">Detail</a></li>' +
105
+ '</ul>' +
106
+ '</div>' +
107
+ '</div>' +
108
+ '</div>' +
109
+ '<div id="scrollspy-example" style="height: 100px; overflow: auto;">' +
110
+ '<div style="height: 200px;">' +
111
+ '<h4 id="masthead">Overview</h4>' +
112
+ '<p style="height: 200px">' +
113
+ 'Ad leggings keytar, brunch id art party dolor labore.' +
114
+ '</p>' +
115
+ '</div>' +
116
+ '<div style="height: 200px;">' +
117
+ '<h4 id="detail">Detail</h4>' +
118
+ '<p style="height: 200px">' +
119
+ 'Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard.' +
120
+ '</p>' +
121
+ '</div>' +
122
+ '</div>' +
123
+ '</div>'
124
+ var $section = $(sectionHTML).appendTo('#qunit-fixture')
125
+
126
+ var $scrollspy = $section
127
+ .show()
128
+ .find('#scrollspy-example')
129
+ .bootstrapScrollspy({
130
+ target: document.getElementById('#ss-target')
131
+ })
132
+
133
+ $scrollspy.one('scroll', function () {
134
+ assert.ok($section.hasClass('active'), '"active" class still on root node')
135
+ done()
136
+ })
137
+
138
+ $scrollspy.scrollTop(350)
139
+ })
140
+
141
+ QUnit.test('should correctly select middle navigation option when large offset is used', function (assert) {
142
+ assert.expect(3)
143
+ var done = assert.async()
144
+
145
+ var sectionHTML = '<div id="header" style="height: 500px;"></div>' +
146
+ '<nav id="navigation" class="navbar">' +
147
+ '<ul class="navbar-nav">' +
148
+ '<li class="nav-item active"><a class="nav-link" id="one-link" href="#one">One</a></li>' +
149
+ '<li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>' +
150
+ '<li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>' +
151
+ '</ul>' +
152
+ '</nav>' +
153
+ '<div id="content" style="height: 200px; overflow-y: auto;">' +
154
+ '<div id="one" style="height: 500px;"></div>' +
155
+ '<div id="two" style="height: 300px;"></div>' +
156
+ '<div id="three" style="height: 10px;"></div>' +
157
+ '</div>'
158
+ var $section = $(sectionHTML).appendTo('#qunit-fixture')
159
+ var $scrollspy = $section
160
+ .show()
161
+ .filter('#content')
162
+
163
+ $scrollspy.bootstrapScrollspy({
164
+ target: '#navigation',
165
+ offset: $scrollspy.position().top
166
+ })
167
+
168
+ $scrollspy.one('scroll', function () {
169
+ assert.ok(!$section.find('#one-link').hasClass('active'), '"active" class removed from first section')
170
+ assert.ok($section.find('#two-link').hasClass('active'), '"active" class on middle section')
171
+ assert.ok(!$section.find('#three-link').hasClass('active'), '"active" class not on last section')
172
+ done()
173
+ })
174
+
175
+ $scrollspy.scrollTop(550)
176
+ })
177
+
178
+ QUnit.test('should add the active class to the correct element', function (assert) {
179
+ assert.expect(2)
180
+ var navbarHtml =
181
+ '<nav class="navbar">' +
182
+ '<ul class="nav">' +
183
+ '<li class="nav-item"><a class="nav-link" id="a-1" href="#div-1">div 1</a></li>' +
184
+ '<li class="nav-item"><a class="nav-link" id="a-2" href="#div-2">div 2</a></li>' +
185
+ '</ul>' +
186
+ '</nav>'
187
+ var contentHtml =
188
+ '<div class="content" style="overflow: auto; height: 50px">' +
189
+ '<div id="div-1" style="height: 100px; padding: 0; margin: 0">div 1</div>' +
190
+ '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>' +
191
+ '</div>'
192
+
193
+ $(navbarHtml).appendTo('#qunit-fixture')
194
+ var $content = $(contentHtml)
195
+ .appendTo('#qunit-fixture')
196
+ .bootstrapScrollspy({
197
+ offset: 0,
198
+ target: '.navbar'
199
+ })
200
+
201
+ var done = assert.async()
202
+ var testElementIsActiveAfterScroll = function (element, target) {
203
+ var deferred = $.Deferred()
204
+ var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
205
+ $content.one('scroll', function () {
206
+ assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
207
+ deferred.resolve()
208
+ })
209
+ $content.scrollTop(scrollHeight)
210
+ return deferred.promise()
211
+ }
212
+
213
+ $.when(testElementIsActiveAfterScroll('#a-1', '#div-1'))
214
+ .then(function () {
215
+ return testElementIsActiveAfterScroll('#a-2', '#div-2')
216
+ })
217
+ .then(function () {
218
+ done()
219
+ })
220
+ })
221
+
222
+ QUnit.test('should add the active class to the correct element (nav markup)', function (assert) {
223
+ assert.expect(2)
224
+ var navbarHtml =
225
+ '<nav class="navbar">' +
226
+ '<nav class="nav">' +
227
+ '<a class="nav-link" id="a-1" href="#div-1">div 1</a>' +
228
+ '<a class="nav-link" id="a-2" href="#div-2">div 2</a>' +
229
+ '</nav>' +
230
+ '</nav>'
231
+ var contentHtml =
232
+ '<div class="content" style="overflow: auto; height: 50px">' +
233
+ '<div id="div-1" style="height: 100px; padding: 0; margin: 0">div 1</div>' +
234
+ '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>' +
235
+ '</div>'
236
+
237
+ $(navbarHtml).appendTo('#qunit-fixture')
238
+ var $content = $(contentHtml)
239
+ .appendTo('#qunit-fixture')
240
+ .bootstrapScrollspy({
241
+ offset: 0,
242
+ target: '.navbar'
243
+ })
244
+
245
+ var done = assert.async()
246
+ var testElementIsActiveAfterScroll = function (element, target) {
247
+ var deferred = $.Deferred()
248
+ var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
249
+ $content.one('scroll', function () {
250
+ assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
251
+ deferred.resolve()
252
+ })
253
+ $content.scrollTop(scrollHeight)
254
+ return deferred.promise()
255
+ }
256
+
257
+ $.when(testElementIsActiveAfterScroll('#a-1', '#div-1'))
258
+ .then(function () {
259
+ return testElementIsActiveAfterScroll('#a-2', '#div-2')
260
+ })
261
+ .then(function () {
262
+ done()
263
+ })
264
+ })
265
+
266
+ QUnit.test('should add the active class to the correct element (list-group markup)', function (assert) {
267
+ assert.expect(2)
268
+ var navbarHtml =
269
+ '<nav class="navbar">' +
270
+ '<div class="list-group">' +
271
+ '<a class="list-group-item" id="a-1" href="#div-1">div 1</a>' +
272
+ '<a class="list-group-item" id="a-2" href="#div-2">div 2</a>' +
273
+ '</div>' +
274
+ '</nav>'
275
+ var contentHtml =
276
+ '<div class="content" style="overflow: auto; height: 50px">' +
277
+ '<div id="div-1" style="height: 100px; padding: 0; margin: 0">div 1</div>' +
278
+ '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>' +
279
+ '</div>'
280
+
281
+ $(navbarHtml).appendTo('#qunit-fixture')
282
+ var $content = $(contentHtml)
283
+ .appendTo('#qunit-fixture')
284
+ .bootstrapScrollspy({
285
+ offset: 0,
286
+ target: '.navbar'
287
+ })
288
+
289
+ var done = assert.async()
290
+ var testElementIsActiveAfterScroll = function (element, target) {
291
+ var deferred = $.Deferred()
292
+ var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
293
+ $content.one('scroll', function () {
294
+ assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
295
+ deferred.resolve()
296
+ })
297
+ $content.scrollTop(scrollHeight)
298
+ return deferred.promise()
299
+ }
300
+
301
+ $.when(testElementIsActiveAfterScroll('#a-1', '#div-1'))
302
+ .then(function () {
303
+ return testElementIsActiveAfterScroll('#a-2', '#div-2')
304
+ })
305
+ .then(function () {
306
+ done()
307
+ })
308
+ })
309
+
310
+ QUnit.test('should add the active class correctly when there are nested elements at 0 scroll offset', function (assert) {
311
+ assert.expect(6)
312
+ var times = 0
313
+ var done = assert.async()
314
+ var navbarHtml = '<nav id="navigation" class="navbar">' +
315
+ '<ul class="nav">' +
316
+ '<li class="nav-item"><a id="a-1" class="nav-link" href="#div-1">div 1</a>' +
317
+ '<ul class="nav">' +
318
+ '<li class="nav-item"><a id="a-2" class="nav-link" href="#div-2">div 2</a></li>' +
319
+ '</ul>' +
320
+ '</li>' +
321
+ '</ul>' +
322
+ '</nav>'
323
+
324
+ var contentHtml = '<div class="content" style="position: absolute; top: 0px; overflow: auto; height: 50px">' +
325
+ '<div id="div-1" style="padding: 0; margin: 0">' +
326
+ '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>' +
327
+ '</div>' +
328
+ '</div>'
329
+
330
+ $(navbarHtml).appendTo('#qunit-fixture')
331
+
332
+ var $content = $(contentHtml)
333
+ .appendTo('#qunit-fixture')
334
+ .bootstrapScrollspy({
335
+ offset: 0,
336
+ target: '#navigation'
337
+ })
338
+
339
+ function testActiveElements() {
340
+ if (++times > 3) {
341
+ return done()
342
+ }
343
+
344
+ $content.one('scroll', function () {
345
+ assert.ok($('#a-1').hasClass('active'), 'nav item for outer element has "active" class')
346
+ assert.ok($('#a-2').hasClass('active'), 'nav item for inner element has "active" class')
347
+ testActiveElements()
348
+ })
349
+
350
+ $content.scrollTop($content.scrollTop() + 10)
351
+ }
352
+
353
+ testActiveElements()
354
+ })
355
+
356
+ QUnit.test('should add the active class correctly when there are nested elements (nav markup)', function (assert) {
357
+ assert.expect(6)
358
+ var times = 0
359
+ var done = assert.async()
360
+ var navbarHtml = '<nav id="navigation" class="navbar">' +
361
+ '<nav class="nav">' +
362
+ '<a id="a-1" class="nav-link" href="#div-1">div 1</a>' +
363
+ '<nav class="nav">' +
364
+ '<a id="a-2" class="nav-link" href="#div-2">div 2</a>' +
365
+ '</nav>' +
366
+ '</nav>' +
367
+ '</nav>'
368
+
369
+ var contentHtml = '<div class="content" style="position: absolute; top: 0px; overflow: auto; height: 50px">' +
370
+ '<div id="div-1" style="padding: 0; margin: 0">' +
371
+ '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>' +
372
+ '</div>' +
373
+ '</div>'
374
+
375
+ $(navbarHtml).appendTo('#qunit-fixture')
376
+
377
+ var $content = $(contentHtml)
378
+ .appendTo('#qunit-fixture')
379
+ .bootstrapScrollspy({
380
+ offset: 0,
381
+ target: '#navigation'
382
+ })
383
+
384
+ function testActiveElements() {
385
+ if (++times > 3) {
386
+ return done()
387
+ }
388
+
389
+ $content.one('scroll', function () {
390
+ assert.ok($('#a-1').hasClass('active'), 'nav item for outer element has "active" class')
391
+ assert.ok($('#a-2').hasClass('active'), 'nav item for inner element has "active" class')
392
+ testActiveElements()
393
+ })
394
+
395
+ $content.scrollTop($content.scrollTop() + 10)
396
+ }
397
+
398
+ testActiveElements()
399
+ })
400
+
401
+ QUnit.test('should add the active class correctly when there are nested elements (nav nav-item markup)', function (assert) {
402
+ assert.expect(6)
403
+ var times = 0
404
+ var done = assert.async()
405
+ var navbarHtml = '<nav id="navigation" class="navbar">' +
406
+ '<ul class="nav">' +
407
+ '<li class="nav-item"><a id="a-1" class="nav-link" href="#div-1">div 1</a></li>' +
408
+ '<ul class="nav">' +
409
+ '<li class="nav-item"><a id="a-2" class="nav-link" href="#div-2">div 2</a></li>' +
410
+ '</ul>' +
411
+ '</ul>' +
412
+ '</nav>'
413
+
414
+ var contentHtml = '<div class="content" style="position: absolute; top: 0px; overflow: auto; height: 50px">' +
415
+ '<div id="div-1" style="padding: 0; margin: 0">' +
416
+ '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>' +
417
+ '</div>' +
418
+ '</div>'
419
+
420
+ $(navbarHtml).appendTo('#qunit-fixture')
421
+
422
+ var $content = $(contentHtml)
423
+ .appendTo('#qunit-fixture')
424
+ .bootstrapScrollspy({
425
+ offset: 0,
426
+ target: '#navigation'
427
+ })
428
+
429
+ function testActiveElements() {
430
+ if (++times > 3) {
431
+ return done()
432
+ }
433
+
434
+ $content.one('scroll', function () {
435
+ assert.ok($('#a-1').hasClass('active'), 'nav item for outer element has "active" class')
436
+ assert.ok($('#a-2').hasClass('active'), 'nav item for inner element has "active" class')
437
+ testActiveElements()
438
+ })
439
+
440
+ $content.scrollTop($content.scrollTop() + 10)
441
+ }
442
+
443
+ testActiveElements()
444
+ })
445
+
446
+ QUnit.test('should add the active class correctly when there are nested elements (list-group markup)', function (assert) {
447
+ assert.expect(6)
448
+ var times = 0
449
+ var done = assert.async()
450
+ var navbarHtml = '<nav id="navigation" class="navbar">' +
451
+ '<div class="list-group">' +
452
+ '<a id="a-1" class="list-group-item" href="#div-1">div 1</a>' +
453
+ '<div class="list-group">' +
454
+ '<a id="a-2" class="list-group-item" href="#div-2">div 2</a>' +
455
+ '</div>' +
456
+ '</div>' +
457
+ '</nav>'
458
+
459
+ var contentHtml = '<div class="content" style="position: absolute; top: 0px; overflow: auto; height: 50px">' +
460
+ '<div id="div-1" style="padding: 0; margin: 0">' +
461
+ '<div id="div-2" style="height: 200px; padding: 0; margin: 0">div 2</div>' +
462
+ '</div>' +
463
+ '</div>'
464
+
465
+ $(navbarHtml).appendTo('#qunit-fixture')
466
+
467
+ var $content = $(contentHtml)
468
+ .appendTo('#qunit-fixture')
469
+ .bootstrapScrollspy({
470
+ offset: 0,
471
+ target: '#navigation'
472
+ })
473
+
474
+ function testActiveElements() {
475
+ if (++times > 3) {
476
+ return done()
477
+ }
478
+
479
+ $content.one('scroll', function () {
480
+ assert.ok($('#a-1').hasClass('active'), 'nav item for outer element has "active" class')
481
+ assert.ok($('#a-2').hasClass('active'), 'nav item for inner element has "active" class')
482
+ testActiveElements()
483
+ })
484
+
485
+ $content.scrollTop($content.scrollTop() + 10)
486
+ }
487
+
488
+ testActiveElements()
489
+ })
490
+
491
+ QUnit.test('should clear selection if above the first section', function (assert) {
492
+ assert.expect(3)
493
+ var done = assert.async()
494
+
495
+ var sectionHTML = '<div id="header" style="height: 500px;"></div>' +
496
+ '<nav id="navigation" class="navbar">' +
497
+ '<ul class="navbar-nav">' +
498
+ '<li class="nav-item"><a id="one-link" class="nav-link active" href="#one">One</a></li>' +
499
+ '<li class="nav-item"><a id="two-link" class="nav-link" href="#two">Two</a></li>' +
500
+ '<li class="nav-item"><a id="three-link" class="nav-link" href="#three">Three</a></li>' +
501
+ '</ul>' +
502
+ '</nav>'
503
+ $(sectionHTML).appendTo('#qunit-fixture')
504
+
505
+ var scrollspyHTML = '<div id="content" style="height: 200px; overflow-y: auto;">' +
506
+ '<div id="spacer" style="height: 100px;"/>' +
507
+ '<div id="one" style="height: 100px;"/>' +
508
+ '<div id="two" style="height: 100px;"/>' +
509
+ '<div id="three" style="height: 100px;"/>' +
510
+ '<div id="spacer" style="height: 100px;"/>' +
511
+ '</div>'
512
+ var $scrollspy = $(scrollspyHTML).appendTo('#qunit-fixture')
513
+
514
+ $scrollspy
515
+ .bootstrapScrollspy({
516
+ target: '#navigation',
517
+ offset: $scrollspy.position().top
518
+ })
519
+ .one('scroll', function () {
520
+ assert.strictEqual($('.active').length, 1, '"active" class on only one element present')
521
+ assert.strictEqual($('.active').is('#two-link'), true, '"active" class on second section')
522
+ $scrollspy
523
+ .one('scroll', function () {
524
+ assert.strictEqual($('.active').length, 0, 'selection cleared')
525
+ done()
526
+ })
527
+ .scrollTop(0)
528
+ })
529
+ .scrollTop(201)
530
+ })
531
+
532
+ QUnit.test('should NOT clear selection if above the first section and first section is at the top', function (assert) {
533
+ assert.expect(4)
534
+ var done = assert.async()
535
+
536
+ var sectionHTML = '<div id="header" style="height: 500px;"></div>' +
537
+ '<nav id="navigation" class="navbar">' +
538
+ '<ul class="navbar-nav">' +
539
+ '<li class="nav-item"><a id="one-link" class="nav-link active" href="#one">One</a></li>' +
540
+ '<li class="nav-item"><a id="two-link" class="nav-link" href="#two">Two</a></li>' +
541
+ '<li class="nav-item"><a id="three-link" class="nav-link" href="#three">Three</a></li>' +
542
+ '</ul>' +
543
+ '</nav>'
544
+ $(sectionHTML).appendTo('#qunit-fixture')
545
+
546
+ var negativeHeight = -10
547
+ var startOfSectionTwo = 101
548
+
549
+ var scrollspyHTML = '<div id="content" style="height: 200px; overflow-y: auto;">' +
550
+ '<div id="one" style="height: 100px;"/>' +
551
+ '<div id="two" style="height: 100px;"/>' +
552
+ '<div id="three" style="height: 100px;"/>' +
553
+ '<div id="spacer" style="height: 100px;"/>' +
554
+ '</div>'
555
+ var $scrollspy = $(scrollspyHTML).appendTo('#qunit-fixture')
556
+
557
+ $scrollspy
558
+ .bootstrapScrollspy({
559
+ target: '#navigation',
560
+ offset: $scrollspy.position().top
561
+ })
562
+ .one('scroll', function () {
563
+ assert.strictEqual($('.active').length, 1, '"active" class on only one element present')
564
+ assert.strictEqual($('.active').is('#two-link'), true, '"active" class on second section')
565
+ $scrollspy
566
+ .one('scroll', function () {
567
+ assert.strictEqual($('.active').length, 1, '"active" class on only one element present')
568
+ assert.strictEqual($('.active').is('#one-link'), true, '"active" class on first section')
569
+ done()
570
+ })
571
+ .scrollTop(negativeHeight)
572
+ })
573
+ .scrollTop(startOfSectionTwo)
574
+ })
575
+
576
+ QUnit.test('should correctly select navigation element on backward scrolling when each target section height is 100%', function (assert) {
577
+ assert.expect(5)
578
+ var navbarHtml =
579
+ '<nav class="navbar">' +
580
+ '<ul class="nav">' +
581
+ '<li class="nav-item"><a id="li-100-1" class="nav-link" href="#div-100-1">div 1</a></li>' +
582
+ '<li class="nav-item"><a id="li-100-2" class="nav-link" href="#div-100-2">div 2</a></li>' +
583
+ '<li class="nav-item"><a id="li-100-3" class="nav-link" href="#div-100-3">div 3</a></li>' +
584
+ '<li class="nav-item"><a id="li-100-4" class="nav-link" href="#div-100-4">div 4</a></li>' +
585
+ '<li class="nav-item"><a id="li-100-5" class="nav-link" href="#div-100-5">div 5</a></li>' +
586
+ '</ul>' +
587
+ '</nav>'
588
+ var contentHtml =
589
+ '<div class="content" style="position: relative; overflow: auto; height: 100px">' +
590
+ '<div id="div-100-1" style="position: relative; height: 100%; padding: 0; margin: 0">div 1</div>' +
591
+ '<div id="div-100-2" style="position: relative; height: 100%; padding: 0; margin: 0">div 2</div>' +
592
+ '<div id="div-100-3" style="position: relative; height: 100%; padding: 0; margin: 0">div 3</div>' +
593
+ '<div id="div-100-4" style="position: relative; height: 100%; padding: 0; margin: 0">div 4</div>' +
594
+ '<div id="div-100-5" style="position: relative; height: 100%; padding: 0; margin: 0">div 5</div>' +
595
+ '</div>'
596
+
597
+ $(navbarHtml).appendTo('#qunit-fixture')
598
+ var $content = $(contentHtml)
599
+ .appendTo('#qunit-fixture')
600
+ .bootstrapScrollspy({
601
+ offset: 0,
602
+ target: '.navbar'
603
+ })
604
+
605
+ var testElementIsActiveAfterScroll = function (element, target) {
606
+ var deferred = $.Deferred()
607
+ var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
608
+ $content.one('scroll', function () {
609
+ assert.ok($(element).hasClass('active'), 'target:' + target + ', element: ' + element)
610
+ deferred.resolve()
611
+ })
612
+ $content.scrollTop(scrollHeight)
613
+ return deferred.promise()
614
+ }
615
+
616
+ var done = assert.async()
617
+ $.when(testElementIsActiveAfterScroll('#li-100-5', '#div-100-5'))
618
+ .then(function () {
619
+ return testElementIsActiveAfterScroll('#li-100-4', '#div-100-4')
620
+ })
621
+ .then(function () {
622
+ return testElementIsActiveAfterScroll('#li-100-3', '#div-100-3')
623
+ })
624
+ .then(function () {
625
+ return testElementIsActiveAfterScroll('#li-100-2', '#div-100-2')
626
+ })
627
+ .then(function () {
628
+ return testElementIsActiveAfterScroll('#li-100-1', '#div-100-1')
629
+ })
630
+ .then(function () {
631
+ done()
632
+ })
633
+ })
634
+
635
+ QUnit.test('should allow passed in option offset method: offset', function (assert) {
636
+ assert.expect(4)
637
+
638
+ var testOffsetMethod = function (type) {
639
+ var $navbar = $(
640
+ '<nav class="navbar"' + (type === 'data' ? ' id="navbar-offset-method-menu"' : '') + '>' +
641
+ '<ul class="nav">' +
642
+ '<li class="nav-item"><a id="li-' + type + 'm-1" class="nav-link" href="#div-' + type + 'm-1">div 1</a></li>' +
643
+ '<li class="nav-item"><a id="li-' + type + 'm-2" class="nav-link" href="#div-' + type + 'm-2">div 2</a></li>' +
644
+ '<li class="nav-item"><a id="li-' + type + 'm-3" class="nav-link" href="#div-' + type + 'm-3">div 3</a></li>' +
645
+ '</ul>' +
646
+ '</nav>'
647
+ )
648
+ var $content = $(
649
+ '<div class="content"' + (type === 'data' ? ' data-spy="scroll" data-target="#navbar-offset-method-menu" data-offset="0" data-method="offset"' : '') + ' style="position: relative; overflow: auto; height: 100px">' +
650
+ '<div id="div-' + type + 'm-1" style="position: relative; height: 200px; padding: 0; margin: 0">div 1</div>' +
651
+ '<div id="div-' + type + 'm-2" style="position: relative; height: 150px; padding: 0; margin: 0">div 2</div>' +
652
+ '<div id="div-' + type + 'm-3" style="position: relative; height: 250px; padding: 0; margin: 0">div 3</div>' +
653
+ '</div>'
654
+ )
655
+
656
+ $navbar.appendTo('#qunit-fixture')
657
+ $content.appendTo('#qunit-fixture')
658
+
659
+ if (type === 'js') {
660
+ $content.bootstrapScrollspy({
661
+ target: '.navbar',
662
+ offset: 0,
663
+ method: 'offset'
664
+ })
665
+ } else if (type === 'data') {
666
+ $(window).trigger('load')
667
+ }
668
+
669
+ var $target = $('#div-' + type + 'm-2')
670
+ var scrollspy = $content.data('bs.scrollspy')
671
+
672
+ assert.ok(scrollspy._offsets[1] === $target.offset().top, 'offset method with ' + type + ' option')
673
+ assert.ok(scrollspy._offsets[1] !== $target.position().top, 'position method with ' + type + ' option')
674
+ $navbar.remove()
675
+ $content.remove()
676
+ }
677
+
678
+ testOffsetMethod('js')
679
+ testOffsetMethod('data')
680
+ })
681
+
682
+ QUnit.test('should allow passed in option offset method: position', function (assert) {
683
+ assert.expect(4)
684
+
685
+ var testOffsetMethod = function (type) {
686
+ var $navbar = $(
687
+ '<nav class="navbar"' + (type === 'data' ? ' id="navbar-offset-method-menu"' : '') + '>' +
688
+ '<ul class="nav">' +
689
+ '<li class="nav-item"><a class="nav-link" id="li-' + type + 'm-1" href="#div-' + type + 'm-1">div 1</a></li>' +
690
+ '<li class="nav-item"><a class="nav-link" id="li-' + type + 'm-2" href="#div-' + type + 'm-2">div 2</a></li>' +
691
+ '<li class="nav-item"><a class="nav-link" id="li-' + type + 'm-3" href="#div-' + type + 'm-3">div 3</a></li>' +
692
+ '</ul>' +
693
+ '</nav>'
694
+ )
695
+ var $content = $(
696
+ '<div class="content"' + (type === 'data' ? ' data-spy="scroll" data-target="#navbar-offset-method-menu" data-offset="0" data-method="position"' : '') + ' style="position: relative; overflow: auto; height: 100px">' +
697
+ '<div id="div-' + type + 'm-1" style="position: relative; height: 200px; padding: 0; margin: 0">div 1</div>' +
698
+ '<div id="div-' + type + 'm-2" style="position: relative; height: 150px; padding: 0; margin: 0">div 2</div>' +
699
+ '<div id="div-' + type + 'm-3" style="position: relative; height: 250px; padding: 0; margin: 0">div 3</div>' +
700
+ '</div>'
701
+ )
702
+
703
+ $navbar.appendTo('#qunit-fixture')
704
+ $content.appendTo('#qunit-fixture')
705
+
706
+ if (type === 'js') {
707
+ $content.bootstrapScrollspy({
708
+ target: '.navbar',
709
+ offset: 0,
710
+ method: 'position'
711
+ })
712
+ } else if (type === 'data') {
713
+ $(window).trigger('load')
714
+ }
715
+
716
+ var $target = $('#div-' + type + 'm-2')
717
+ var scrollspy = $content.data('bs.scrollspy')
718
+
719
+ assert.ok(scrollspy._offsets[1] !== $target.offset().top, 'offset method with ' + type + ' option')
720
+ assert.ok(scrollspy._offsets[1] === $target.position().top, 'position method with ' + type + ' option')
721
+ $navbar.remove()
722
+ $content.remove()
723
+ }
724
+
725
+ testOffsetMethod('js')
726
+ testOffsetMethod('data')
727
+ })
728
+ })