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,518 @@
1
+ $(function () {
2
+ 'use strict'
3
+
4
+ QUnit.module('tabs plugin')
5
+
6
+ QUnit.test('should be defined on jquery object', function (assert) {
7
+ assert.expect(1)
8
+ assert.ok($(document.body).tab, 'tabs method is defined')
9
+ })
10
+
11
+ QUnit.module('tabs', {
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.bootstrapTab = $.fn.tab.noConflict()
15
+ },
16
+ afterEach: function () {
17
+ $.fn.tab = $.fn.bootstrapTab
18
+ delete $.fn.bootstrapTab
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.tab, 'undefined', 'tab 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/>')
31
+ $el.bootstrapTab()
32
+ try {
33
+ $el.bootstrapTab('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/>')
42
+ var $tab = $el.bootstrapTab()
43
+ assert.ok($tab instanceof $, 'returns jquery collection')
44
+ assert.strictEqual($tab[0], $el[0], 'collection contains element')
45
+ })
46
+
47
+ QUnit.test('should activate element by tab id', function (assert) {
48
+ assert.expect(2)
49
+ var tabsHTML = '<ul class="nav">' +
50
+ '<li><a href="#home">Home</a></li>' +
51
+ '<li><a href="#profile">Profile</a></li>' +
52
+ '</ul>'
53
+
54
+ $('<ul><li id="home"/><li id="profile"/></ul>').appendTo('#qunit-fixture')
55
+
56
+ $(tabsHTML).find('li:last-child a').bootstrapTab('show')
57
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
58
+
59
+ $(tabsHTML).find('li:first-child a').bootstrapTab('show')
60
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
61
+ })
62
+
63
+ QUnit.test('should activate element by tab id', function (assert) {
64
+ assert.expect(2)
65
+ var pillsHTML = '<ul class="nav nav-pills">' +
66
+ '<li><a href="#home">Home</a></li>' +
67
+ '<li><a href="#profile">Profile</a></li>' +
68
+ '</ul>'
69
+
70
+ $('<ul><li id="home"/><li id="profile"/></ul>').appendTo('#qunit-fixture')
71
+
72
+ $(pillsHTML).find('li:last-child a').bootstrapTab('show')
73
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
74
+
75
+ $(pillsHTML).find('li:first-child a').bootstrapTab('show')
76
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
77
+ })
78
+
79
+ QUnit.test('should activate element by tab id in ordered list', function (assert) {
80
+ assert.expect(2)
81
+ var pillsHTML = '<ol class="nav nav-pills">' +
82
+ '<li><a href="#home">Home</a></li>' +
83
+ '<li><a href="#profile">Profile</a></li>' +
84
+ '</ol>'
85
+
86
+ $('<ol><li id="home"/><li id="profile"/></ol>').appendTo('#qunit-fixture')
87
+
88
+ $(pillsHTML).find('li:last-child a').bootstrapTab('show')
89
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
90
+
91
+ $(pillsHTML).find('li:first-child a').bootstrapTab('show')
92
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
93
+ })
94
+
95
+ QUnit.test('should activate element by tab id in nav list', function (assert) {
96
+ assert.expect(2)
97
+ var tabsHTML = '<nav class="nav">' +
98
+ '<a href="#home">Home</a>' +
99
+ '<a href="#profile">Profile</a>' +
100
+ '</nav>'
101
+
102
+ $('<nav><div id="home"></div><div id="profile"></div></nav>').appendTo('#qunit-fixture')
103
+
104
+ $(tabsHTML).find('a:last-child').bootstrapTab('show')
105
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
106
+
107
+ $(tabsHTML).find('a:first-child').bootstrapTab('show')
108
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
109
+ })
110
+
111
+ QUnit.test('should activate element by tab id in list group', function (assert) {
112
+ assert.expect(2)
113
+ var tabsHTML = '<div class="list-group">' +
114
+ '<a href="#home">Home</a>' +
115
+ '<a href="#profile">Profile</a>' +
116
+ '</div>'
117
+
118
+ $('<nav><div id="home"></div><div id="profile"></div></nav>').appendTo('#qunit-fixture')
119
+
120
+ $(tabsHTML).find('a:last-child').bootstrapTab('show')
121
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
122
+
123
+ $(tabsHTML).find('a:first-child').bootstrapTab('show')
124
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
125
+ })
126
+
127
+ QUnit.test('should not fire shown when show is prevented', function (assert) {
128
+ assert.expect(1)
129
+ var done = assert.async()
130
+
131
+ $('<div class="nav"/>')
132
+ .on('show.bs.tab', function (e) {
133
+ e.preventDefault()
134
+ assert.ok(true, 'show event fired')
135
+ done()
136
+ })
137
+ .on('shown.bs.tab', function () {
138
+ assert.ok(false, 'shown event fired')
139
+ })
140
+ .bootstrapTab('show')
141
+ })
142
+
143
+ QUnit.test('should not fire shown when tab is already active', function (assert) {
144
+ assert.expect(0)
145
+ var tabsHTML = '<ul class="nav nav-tabs" role="tablist">' +
146
+ '<li class="nav-item"><a href="#home" class="nav-link active" role="tab">Home</a></li>' +
147
+ '<li class="nav-item"><a href="#profile" class="nav-link" role="tab">Profile</a></li>' +
148
+ '</ul>' +
149
+ '<div class="tab-content">' +
150
+ '<div class="tab-pane active" id="home" role="tabpanel"></div>' +
151
+ '<div class="tab-pane" id="profile" role="tabpanel"></div>' +
152
+ '</div>'
153
+
154
+ $(tabsHTML)
155
+ .find('a.active')
156
+ .on('shown.bs.tab', function () {
157
+ assert.ok(true, 'shown event fired')
158
+ })
159
+ .bootstrapTab('show')
160
+ })
161
+
162
+ QUnit.test('should not fire shown when tab is disabled', function (assert) {
163
+ assert.expect(0)
164
+ var tabsHTML = '<ul class="nav nav-tabs" role="tablist">' +
165
+ '<li class="nav-item"><a href="#home" class="nav-link active" role="tab">Home</a></li>' +
166
+ '<li class="nav-item"><a href="#profile" class="nav-link disabled" role="tab">Profile</a></li>' +
167
+ '</ul>' +
168
+ '<div class="tab-content">' +
169
+ '<div class="tab-pane active" id="home" role="tabpanel"></div>' +
170
+ '<div class="tab-pane" id="profile" role="tabpanel"></div>' +
171
+ '</div>'
172
+
173
+ $(tabsHTML)
174
+ .find('a.disabled')
175
+ .on('shown.bs.tab', function () {
176
+ assert.ok(true, 'shown event fired')
177
+ })
178
+ .bootstrapTab('show')
179
+ })
180
+
181
+ QUnit.test('show and shown events should reference correct relatedTarget', function (assert) {
182
+ assert.expect(2)
183
+ var done = assert.async()
184
+
185
+ var dropHTML =
186
+ '<ul class="drop nav">' +
187
+ ' <li class="dropdown"><a data-toggle="dropdown" href="#">1</a>' +
188
+ ' <ul class="dropdown-menu nav">' +
189
+ ' <li><a href="#a1-1" data-toggle="tab">1-1</a></li>' +
190
+ ' <li><a href="#a1-2" data-toggle="tab">1-2</a></li>' +
191
+ ' </ul>' +
192
+ ' </li>' +
193
+ '</ul>'
194
+
195
+ $(dropHTML)
196
+ .find('ul > li:first-child a')
197
+ .bootstrapTab('show')
198
+ .end()
199
+ .find('ul > li:last-child a')
200
+ .on('show.bs.tab', function (e) {
201
+ assert.strictEqual(e.relatedTarget.hash, '#a1-1', 'references correct element as relatedTarget')
202
+ })
203
+ .on('shown.bs.tab', function (e) {
204
+ assert.strictEqual(e.relatedTarget.hash, '#a1-1', 'references correct element as relatedTarget')
205
+ done()
206
+ })
207
+ .bootstrapTab('show')
208
+ })
209
+
210
+ QUnit.test('should fire hide and hidden events', function (assert) {
211
+ assert.expect(2)
212
+ var done = assert.async()
213
+
214
+ var tabsHTML = '<ul class="nav">' +
215
+ '<li><a href="#home">Home</a></li>' +
216
+ '<li><a href="#profile">Profile</a></li>' +
217
+ '</ul>'
218
+
219
+ $(tabsHTML)
220
+ .find('li:first-child a')
221
+ .on('hide.bs.tab', function () {
222
+ assert.ok(true, 'hide event fired')
223
+ })
224
+ .bootstrapTab('show')
225
+ .end()
226
+ .find('li:last-child a')
227
+ .bootstrapTab('show')
228
+
229
+ $(tabsHTML)
230
+ .find('li:first-child a')
231
+ .on('hidden.bs.tab', function () {
232
+ assert.ok(true, 'hidden event fired')
233
+ done()
234
+ })
235
+ .bootstrapTab('show')
236
+ .end()
237
+ .find('li:last-child a')
238
+ .bootstrapTab('show')
239
+ })
240
+
241
+ QUnit.test('should not fire hidden when hide is prevented', function (assert) {
242
+ assert.expect(1)
243
+ var done = assert.async()
244
+
245
+ var tabsHTML = '<ul class="nav">' +
246
+ '<li><a href="#home">Home</a></li>' +
247
+ '<li><a href="#profile">Profile</a></li>' +
248
+ '</ul>'
249
+
250
+ $(tabsHTML)
251
+ .find('li:first-child a')
252
+ .on('hide.bs.tab', function (e) {
253
+ e.preventDefault()
254
+ assert.ok(true, 'hide event fired')
255
+ done()
256
+ })
257
+ .on('hidden.bs.tab', function () {
258
+ assert.ok(false, 'hidden event fired')
259
+ })
260
+ .bootstrapTab('show')
261
+ .end()
262
+ .find('li:last-child a')
263
+ .bootstrapTab('show')
264
+ })
265
+
266
+ QUnit.test('hide and hidden events contain correct relatedTarget', function (assert) {
267
+ assert.expect(2)
268
+ var done = assert.async()
269
+
270
+ var tabsHTML = '<ul class="nav">' +
271
+ '<li><a href="#home">Home</a></li>' +
272
+ '<li><a href="#profile">Profile</a></li>' +
273
+ '</ul>'
274
+
275
+ $(tabsHTML)
276
+ .find('li:first-child a')
277
+ .on('hide.bs.tab', function (e) {
278
+ assert.strictEqual(e.relatedTarget.hash, '#profile', 'references correct element as relatedTarget')
279
+ })
280
+ .on('hidden.bs.tab', function (e) {
281
+ assert.strictEqual(e.relatedTarget.hash, '#profile', 'references correct element as relatedTarget')
282
+ done()
283
+ })
284
+ .bootstrapTab('show')
285
+ .end()
286
+ .find('li:last-child a')
287
+ .bootstrapTab('show')
288
+ })
289
+
290
+ QUnit.test('selected tab should have aria-selected', function (assert) {
291
+ assert.expect(8)
292
+ var tabsHTML = '<ul class="nav nav-tabs">' +
293
+ '<li><a class="nav-item active" href="#home" toggle="tab" aria-selected="true">Home</a></li>' +
294
+ '<li><a class="nav-item" href="#profile" toggle="tab" aria-selected="false">Profile</a></li>' +
295
+ '</ul>'
296
+ var $tabs = $(tabsHTML).appendTo('#qunit-fixture')
297
+
298
+ $tabs.find('li:first-child a').bootstrapTab('show')
299
+ assert.strictEqual($tabs.find('.active').attr('aria-selected'), 'true', 'shown tab has aria-selected = true')
300
+ assert.strictEqual($tabs.find('a:not(.active)').attr('aria-selected'), 'false', 'hidden tab has aria-selected = false')
301
+
302
+ $tabs.find('li:last-child a').trigger('click')
303
+ assert.strictEqual($tabs.find('.active').attr('aria-selected'), 'true', 'after click, shown tab has aria-selected = true')
304
+ assert.strictEqual($tabs.find('a:not(.active)').attr('aria-selected'), 'false', 'after click, hidden tab has aria-selected = false')
305
+
306
+ $tabs.find('li:first-child a').bootstrapTab('show')
307
+ assert.strictEqual($tabs.find('.active').attr('aria-selected'), 'true', 'shown tab has aria-selected = true')
308
+ assert.strictEqual($tabs.find('a:not(.active)').attr('aria-selected'), 'false', 'hidden tab has aria-selected = false')
309
+
310
+ $tabs.find('li:first-child a').trigger('click')
311
+ assert.strictEqual($tabs.find('.active').attr('aria-selected'), 'true', 'after second show event, shown tab still has aria-selected = true')
312
+ assert.strictEqual($tabs.find('a:not(.active)').attr('aria-selected'), 'false', 'after second show event, hidden tab has aria-selected = false')
313
+ })
314
+
315
+ QUnit.test('selected tab should deactivate previous selected tab', function (assert) {
316
+ assert.expect(2)
317
+ var tabsHTML = '<ul class="nav nav-tabs">' +
318
+ '<li class="nav-item"><a class="nav-link active" href="#home" data-toggle="tab">Home</a></li>' +
319
+ '<li class="nav-item"><a class="nav-link" href="#profile" data-toggle="tab">Profile</a></li>' +
320
+ '</ul>'
321
+ var $tabs = $(tabsHTML).appendTo('#qunit-fixture')
322
+
323
+ $tabs.find('li:last-child a').trigger('click')
324
+ assert.notOk($tabs.find('li:first-child a').hasClass('active'))
325
+ assert.ok($tabs.find('li:last-child a').hasClass('active'))
326
+ })
327
+
328
+ QUnit.test('selected tab should deactivate previous selected link in dropdown', function (assert) {
329
+ assert.expect(3)
330
+ var tabsHTML = '<ul class="nav nav-tabs">' +
331
+ '<li class="nav-item"><a class="nav-link" href="#home" data-toggle="tab">Home</a></li>' +
332
+ '<li class="nav-item"><a class="nav-link" href="#profile" data-toggle="tab">Profile</a></li>' +
333
+ '<li class="nav-item dropdown"><a class="nav-link dropdown-toggle active" data-toggle="dropdown" href="#">Dropdown</a>' +
334
+ '<div class="dropdown-menu">' +
335
+ '<a class="dropdown-item active" href="#dropdown1" id="dropdown1-tab" data-toggle="tab">@fat</a>' +
336
+ '<a class="dropdown-item" href="#dropdown2" id="dropdown2-tab" data-toggle="tab">@mdo</a>' +
337
+ '</div>' +
338
+ '</li>' +
339
+ '</ul>'
340
+ var $tabs = $(tabsHTML).appendTo('#qunit-fixture')
341
+
342
+ $tabs.find('li:first-child a').trigger('click')
343
+ assert.ok($tabs.find('li:first-child a').hasClass('active'))
344
+ assert.notOk($tabs.find('li:last-child a').hasClass('active'))
345
+ assert.notOk($tabs.find('li:last-child .dropdown-menu a:first-child').hasClass('active'))
346
+ })
347
+
348
+ QUnit.test('Nested tabs', function (assert) {
349
+ assert.expect(2)
350
+ var done = assert.async()
351
+ var tabsHTML =
352
+ '<nav class="nav nav-tabs" role="tablist">' +
353
+ ' <a id="tab1" href="#x-tab1" class="nav-item nav-link" data-toggle="tab" role="tab" aria-controls="x-tab1">Tab 1</a>' +
354
+ ' <a href="#x-tab2" class="nav-item nav-link active" data-toggle="tab" role="tab" aria-controls="x-tab2" aria-selected="true">Tab 2</a>' +
355
+ ' <a href="#x-tab3" class="nav-item nav-link" data-toggle="tab" role="tab" aria-controls="x-tab3">Tab 3</a>' +
356
+ '</nav>' +
357
+ '<div class="tab-content">' +
358
+ ' <div class="tab-pane" id="x-tab1" role="tabpanel">' +
359
+ ' <nav class="nav nav-tabs" role="tablist">' +
360
+ ' <a href="#nested-tab1" class="nav-item nav-link active" data-toggle="tab" role="tab" aria-controls="x-tab1" aria-selected="true">Nested Tab 1</a>' +
361
+ ' <a id="tabNested2" href="#nested-tab2" class="nav-item nav-link" data-toggle="tab" role="tab" aria-controls="x-profile">Nested Tab2</a>' +
362
+ ' </nav>' +
363
+ ' <div class="tab-content">' +
364
+ ' <div class="tab-pane active" id="nested-tab1" role="tabpanel">Nested Tab1 Content</div>' +
365
+ ' <div class="tab-pane" id="nested-tab2" role="tabpanel">Nested Tab2 Content</div>' +
366
+ ' </div>' +
367
+ ' </div>' +
368
+ ' <div class="tab-pane active" id="x-tab2" role="tabpanel">Tab2 Content</div>' +
369
+ ' <div class="tab-pane" id="x-tab3" role="tabpanel">Tab3 Content</div>' +
370
+ '</div>'
371
+
372
+ $(tabsHTML).appendTo('#qunit-fixture')
373
+
374
+ $('#tabNested2').on('shown.bs.tab', function () {
375
+ assert.ok($('#x-tab1').hasClass('active'))
376
+ done()
377
+ })
378
+
379
+ $('#tab1').on('shown.bs.tab', function () {
380
+ assert.ok($('#x-tab1').hasClass('active'))
381
+ $('#tabNested2').trigger($.Event('click'))
382
+ })
383
+ .trigger($.Event('click'))
384
+ })
385
+
386
+ QUnit.test('should not remove fade class if no active pane is present', function (assert) {
387
+ assert.expect(6)
388
+ var done = assert.async()
389
+ var tabsHTML = '<ul class="nav nav-tabs" role="tablist">' +
390
+ '<li class="nav-item"><a id="tab-home" href="#home" class="nav-link" data-toggle="tab" role="tab">Home</a></li>' +
391
+ '<li class="nav-item"><a id="tab-profile" href="#profile" class="nav-link" data-toggle="tab" role="tab">Profile</a></li>' +
392
+ '</ul>' +
393
+ '<div class="tab-content">' +
394
+ '<div class="tab-pane fade" id="home" role="tabpanel"></div>' +
395
+ '<div class="tab-pane fade" id="profile" role="tabpanel"></div>' +
396
+ '</div>'
397
+
398
+ $(tabsHTML).appendTo('#qunit-fixture')
399
+ $('#tab-profile')
400
+ .on('shown.bs.tab', function () {
401
+ assert.ok($('#profile').hasClass('fade'))
402
+ assert.ok($('#profile').hasClass('show'))
403
+
404
+ $('#tab-home')
405
+ .on('shown.bs.tab', function () {
406
+ assert.ok($('#profile').hasClass('fade'))
407
+ assert.notOk($('#profile').hasClass('show'))
408
+ assert.ok($('#home').hasClass('fade'))
409
+ assert.ok($('#home').hasClass('show'))
410
+
411
+ done()
412
+ })
413
+ .trigger($.Event('click'))
414
+ })
415
+ .trigger($.Event('click'))
416
+ })
417
+
418
+ QUnit.test('should handle removed tabs', function (assert) {
419
+ assert.expect(1)
420
+ var done = assert.async()
421
+
422
+ var html = [
423
+ '<ul class="nav nav-tabs" role="tablist">',
424
+ ' <li class="nav-item">',
425
+ ' <a class="nav-link nav-tab" href="#profile" role="tab" data-toggle="tab">',
426
+ ' <button class="close"><span aria-hidden="true">&times;</span></button>',
427
+ ' </a>',
428
+ ' </li>',
429
+ ' <li class="nav-item">',
430
+ ' <a id="secondNav" class="nav-link nav-tab" href="#buzz" role="tab" data-toggle="tab">',
431
+ ' <button class="close"><span aria-hidden="true">&times;</span></button>',
432
+ ' </a>',
433
+ ' </li>',
434
+ ' <li class="nav-item">',
435
+ ' <a class="nav-link nav-tab" href="#references" role="tab" data-toggle="tab">',
436
+ ' <button id="btnClose" class="close"><span aria-hidden="true">&times;</span></button>',
437
+ ' </a>',
438
+ ' </li>',
439
+ '</ul>',
440
+ '<div class="tab-content">',
441
+ ' <div role="tabpanel" class="tab-pane fade show active" id="profile">test 1</div>',
442
+ ' <div role="tabpanel" class="tab-pane fade" id="buzz">test 2</div>',
443
+ ' <div role="tabpanel" class="tab-pane fade" id="references">test 3</div>',
444
+ '</div>'
445
+ ].join('')
446
+
447
+ $(html).appendTo('#qunit-fixture')
448
+
449
+ $('#secondNav').on('shown.bs.tab', function () {
450
+ assert.strictEqual($('.nav-tab').length, 2)
451
+ done()
452
+ })
453
+
454
+ $('#btnClose').one('click', function () {
455
+ var tabId = $(this).parents('a').attr('href')
456
+ $(this).parents('li').remove()
457
+ $(tabId).remove()
458
+ $('.nav-tabs a:last').bootstrapTab('show')
459
+ })
460
+ .trigger($.Event('click'))
461
+ })
462
+
463
+ QUnit.test('should not add show class to tab panes if there is no `.fade` class', function (assert) {
464
+ assert.expect(1)
465
+ var done = assert.async()
466
+
467
+ var html = [
468
+ '<ul class="nav nav-tabs" role="tablist">',
469
+ ' <li class="nav-item">',
470
+ ' <a class="nav-link nav-tab" href="#home" role="tab" data-toggle="tab">Home</a>',
471
+ ' </li>',
472
+ ' <li class="nav-item">',
473
+ ' <a id="secondNav" class="nav-link nav-tab" href="#profile" role="tab" data-toggle="tab">Profile</a>',
474
+ ' </li>',
475
+ '</ul>',
476
+ '<div class="tab-content">',
477
+ ' <div role="tabpanel" class="tab-pane" id="home">test 1</div>',
478
+ ' <div role="tabpanel" class="tab-pane" id="profile">test 2</div>',
479
+ '</div>'
480
+ ].join('')
481
+
482
+ $(html).appendTo('#qunit-fixture')
483
+
484
+ $('#secondNav').on('shown.bs.tab', function () {
485
+ assert.strictEqual($('.show').length, 0)
486
+ done()
487
+ })
488
+ .trigger($.Event('click'))
489
+ })
490
+
491
+ QUnit.test('should add show class to tab panes if there is a `.fade` class', function (assert) {
492
+ assert.expect(1)
493
+ var done = assert.async()
494
+
495
+ var html = [
496
+ '<ul class="nav nav-tabs" role="tablist">',
497
+ ' <li class="nav-item">',
498
+ ' <a class="nav-link nav-tab" href="#home" role="tab" data-toggle="tab">Home</a>',
499
+ ' </li>',
500
+ ' <li class="nav-item">',
501
+ ' <a id="secondNav" class="nav-link nav-tab" href="#profile" role="tab" data-toggle="tab">Profile</a>',
502
+ ' </li>',
503
+ '</ul>',
504
+ '<div class="tab-content">',
505
+ ' <div role="tabpanel" class="tab-pane fade" id="home">test 1</div>',
506
+ ' <div role="tabpanel" class="tab-pane fade" id="profile">test 2</div>',
507
+ '</div>'
508
+ ].join('')
509
+
510
+ $(html).appendTo('#qunit-fixture')
511
+
512
+ $('#secondNav').on('shown.bs.tab', function () {
513
+ assert.strictEqual($('.show').length, 1)
514
+ done()
515
+ })
516
+ .trigger($.Event('click'))
517
+ })
518
+ })