inkstream 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +95 -0
  4. data/_config.yml +131 -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 +12 -0
  16. data/_includes/site-fonts.html +13 -0
  17. data/_includes/site-footer-default.html +17 -0
  18. data/_includes/site-footer.html +23 -0
  19. data/_includes/site-header.html +66 -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/favicon/android-chrome-192x192.png +0 -0
  27. data/assets/favicon/android-chrome-512x512.png +0 -0
  28. data/assets/favicon/apple-touch-icon.png +0 -0
  29. data/assets/favicon/browserconfig.xml +9 -0
  30. data/assets/favicon/favicon-16x16.png +0 -0
  31. data/assets/favicon/favicon-32x32.png +0 -0
  32. data/assets/favicon/favicon.ico +0 -0
  33. data/assets/favicon/favicon.svg +1 -0
  34. data/assets/favicon/mstile-150x150.png +0 -0
  35. data/assets/favicon/safari-pinned-tab.svg +88 -0
  36. data/assets/favicon/site.webmanifest +19 -0
  37. data/assets/images/about-me.jpg +0 -0
  38. data/assets/images/posts/default-post-img.jpg +0 -0
  39. data/assets/images/posts/text-syntax.jpg +0 -0
  40. data/assets/images/posts/welcome.jpg +0 -0
  41. data/assets/images/profile.png +0 -0
  42. data/assets/images/promo-banner.jpg +0 -0
  43. data/assets/js/blog.js +9 -0
  44. data/assets/js/demo/style-switcher.js +45 -0
  45. data/assets/logo/logo.jpg +0 -0
  46. data/assets/logo/logo.svg +1 -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/resume/resume.pdf +0 -0
  51. data/assets/scss/bootstrap/js/dist/alert.js +199 -0
  52. data/assets/scss/bootstrap/js/dist/alert.js.map +1 -0
  53. data/assets/scss/bootstrap/js/dist/button.js +187 -0
  54. data/assets/scss/bootstrap/js/dist/button.js.map +1 -0
  55. data/assets/scss/bootstrap/js/dist/carousel.js +668 -0
  56. data/assets/scss/bootstrap/js/dist/carousel.js.map +1 -0
  57. data/assets/scss/bootstrap/js/dist/collapse.js +428 -0
  58. data/assets/scss/bootstrap/js/dist/collapse.js.map +1 -0
  59. data/assets/scss/bootstrap/js/dist/dropdown.js +595 -0
  60. data/assets/scss/bootstrap/js/dist/dropdown.js.map +1 -0
  61. data/assets/scss/bootstrap/js/dist/index.js +23 -0
  62. data/assets/scss/bootstrap/js/dist/index.js.map +1 -0
  63. data/assets/scss/bootstrap/js/dist/modal.js +650 -0
  64. data/assets/scss/bootstrap/js/dist/modal.js.map +1 -0
  65. data/assets/scss/bootstrap/js/dist/popover.js +261 -0
  66. data/assets/scss/bootstrap/js/dist/popover.js.map +1 -0
  67. data/assets/scss/bootstrap/js/dist/scrollspy.js +375 -0
  68. data/assets/scss/bootstrap/js/dist/scrollspy.js.map +1 -0
  69. data/assets/scss/bootstrap/js/dist/tab.js +269 -0
  70. data/assets/scss/bootstrap/js/dist/tab.js.map +1 -0
  71. data/assets/scss/bootstrap/js/dist/toast.js +283 -0
  72. data/assets/scss/bootstrap/js/dist/toast.js.map +1 -0
  73. data/assets/scss/bootstrap/js/dist/tooltip.js +760 -0
  74. data/assets/scss/bootstrap/js/dist/tooltip.js.map +1 -0
  75. data/assets/scss/bootstrap/js/dist/util.js +172 -0
  76. data/assets/scss/bootstrap/js/dist/util.js.map +1 -0
  77. data/assets/scss/bootstrap/js/src/alert.js +179 -0
  78. data/assets/scss/bootstrap/js/src/button.js +171 -0
  79. data/assets/scss/bootstrap/js/src/carousel.js +606 -0
  80. data/assets/scss/bootstrap/js/src/collapse.js +402 -0
  81. data/assets/scss/bootstrap/js/src/dropdown.js +545 -0
  82. data/assets/scss/bootstrap/js/src/index.js +52 -0
  83. data/assets/scss/bootstrap/js/src/modal.js +594 -0
  84. data/assets/scss/bootstrap/js/src/popover.js +184 -0
  85. data/assets/scss/bootstrap/js/src/scrollspy.js +326 -0
  86. data/assets/scss/bootstrap/js/src/tab.js +260 -0
  87. data/assets/scss/bootstrap/js/src/toast.js +227 -0
  88. data/assets/scss/bootstrap/js/src/tooltip.js +752 -0
  89. data/assets/scss/bootstrap/js/src/util.js +177 -0
  90. data/assets/scss/bootstrap/js/tests/README.md +69 -0
  91. data/assets/scss/bootstrap/js/tests/browsers.js +82 -0
  92. data/assets/scss/bootstrap/js/tests/index.html +133 -0
  93. data/assets/scss/bootstrap/js/tests/integration/bundle.js +8 -0
  94. data/assets/scss/bootstrap/js/tests/integration/index.html +66 -0
  95. data/assets/scss/bootstrap/js/tests/integration/rollup.bundle.js +20 -0
  96. data/assets/scss/bootstrap/js/tests/karma.conf.js +143 -0
  97. data/assets/scss/bootstrap/js/tests/unit/.eslintrc.json +40 -0
  98. data/assets/scss/bootstrap/js/tests/unit/alert.js +123 -0
  99. data/assets/scss/bootstrap/js/tests/unit/button.js +222 -0
  100. data/assets/scss/bootstrap/js/tests/unit/carousel.js +1333 -0
  101. data/assets/scss/bootstrap/js/tests/unit/collapse.js +892 -0
  102. data/assets/scss/bootstrap/js/tests/unit/dropdown.js +1419 -0
  103. data/assets/scss/bootstrap/js/tests/unit/modal.js +815 -0
  104. data/assets/scss/bootstrap/js/tests/unit/popover.js +471 -0
  105. data/assets/scss/bootstrap/js/tests/unit/scrollspy.js +728 -0
  106. data/assets/scss/bootstrap/js/tests/unit/tab.js +518 -0
  107. data/assets/scss/bootstrap/js/tests/unit/toast.js +259 -0
  108. data/assets/scss/bootstrap/js/tests/unit/tooltip.js +1109 -0
  109. data/assets/scss/bootstrap/js/tests/unit/util.js +163 -0
  110. data/assets/scss/bootstrap/js/tests/visual/alert.html +58 -0
  111. data/assets/scss/bootstrap/js/tests/visual/button.html +51 -0
  112. data/assets/scss/bootstrap/js/tests/visual/carousel.html +66 -0
  113. data/assets/scss/bootstrap/js/tests/visual/collapse.html +78 -0
  114. data/assets/scss/bootstrap/js/tests/visual/dropdown.html +212 -0
  115. data/assets/scss/bootstrap/js/tests/visual/modal.html +268 -0
  116. data/assets/scss/bootstrap/js/tests/visual/popover.html +46 -0
  117. data/assets/scss/bootstrap/js/tests/visual/scrollspy.html +95 -0
  118. data/assets/scss/bootstrap/js/tests/visual/tab.html +234 -0
  119. data/assets/scss/bootstrap/js/tests/visual/toast.html +72 -0
  120. data/assets/scss/bootstrap/js/tests/visual/tooltip.html +106 -0
  121. data/assets/scss/bootstrap/scss/_alert.scss +51 -0
  122. data/assets/scss/bootstrap/scss/_badge.scss +54 -0
  123. data/assets/scss/bootstrap/scss/_breadcrumb.scss +41 -0
  124. data/assets/scss/bootstrap/scss/_button-group.scss +163 -0
  125. data/assets/scss/bootstrap/scss/_buttons.scss +137 -0
  126. data/assets/scss/bootstrap/scss/_card.scss +289 -0
  127. data/assets/scss/bootstrap/scss/_carousel.scss +197 -0
  128. data/assets/scss/bootstrap/scss/_close.scss +41 -0
  129. data/assets/scss/bootstrap/scss/_code.scss +48 -0
  130. data/assets/scss/bootstrap/scss/_custom-forms.scss +507 -0
  131. data/assets/scss/bootstrap/scss/_dropdown.scss +191 -0
  132. data/assets/scss/bootstrap/scss/_forms.scss +330 -0
  133. data/assets/scss/bootstrap/scss/_functions.scss +86 -0
  134. data/assets/scss/bootstrap/scss/_grid.scss +52 -0
  135. data/assets/scss/bootstrap/scss/_images.scss +42 -0
  136. data/assets/scss/bootstrap/scss/_input-group.scss +193 -0
  137. data/assets/scss/bootstrap/scss/_jumbotron.scss +17 -0
  138. data/assets/scss/bootstrap/scss/_list-group.scss +149 -0
  139. data/assets/scss/bootstrap/scss/_media.scss +8 -0
  140. data/assets/scss/bootstrap/scss/_mixins.scss +47 -0
  141. data/assets/scss/bootstrap/scss/_modal.scss +229 -0
  142. data/assets/scss/bootstrap/scss/_nav.scss +120 -0
  143. data/assets/scss/bootstrap/scss/_navbar.scss +294 -0
  144. data/assets/scss/bootstrap/scss/_pagination.scss +73 -0
  145. data/assets/scss/bootstrap/scss/_popover.scss +171 -0
  146. data/assets/scss/bootstrap/scss/_print.scss +141 -0
  147. data/assets/scss/bootstrap/scss/_progress.scss +43 -0
  148. data/assets/scss/bootstrap/scss/_reboot.scss +483 -0
  149. data/assets/scss/bootstrap/scss/_root.scss +19 -0
  150. data/assets/scss/bootstrap/scss/_spinners.scss +55 -0
  151. data/assets/scss/bootstrap/scss/_tables.scss +185 -0
  152. data/assets/scss/bootstrap/scss/_toasts.scss +44 -0
  153. data/assets/scss/bootstrap/scss/_tooltip.scss +115 -0
  154. data/assets/scss/bootstrap/scss/_transitions.scss +20 -0
  155. data/assets/scss/bootstrap/scss/_type.scss +125 -0
  156. data/assets/scss/bootstrap/scss/_utilities.scss +17 -0
  157. data/assets/scss/bootstrap/scss/_variables.scss +1123 -0
  158. data/assets/scss/bootstrap/scss/bootstrap-grid.scss +29 -0
  159. data/assets/scss/bootstrap/scss/bootstrap-reboot.scss +12 -0
  160. data/assets/scss/bootstrap/scss/bootstrap.scss +44 -0
  161. data/assets/scss/bootstrap/scss/mixins/_alert.scss +13 -0
  162. data/assets/scss/bootstrap/scss/mixins/_background-variant.scss +21 -0
  163. data/assets/scss/bootstrap/scss/mixins/_badge.scss +17 -0
  164. data/assets/scss/bootstrap/scss/mixins/_border-radius.scss +63 -0
  165. data/assets/scss/bootstrap/scss/mixins/_box-shadow.scss +20 -0
  166. data/assets/scss/bootstrap/scss/mixins/_breakpoints.scss +123 -0
  167. data/assets/scss/bootstrap/scss/mixins/_buttons.scss +107 -0
  168. data/assets/scss/bootstrap/scss/mixins/_caret.scss +62 -0
  169. data/assets/scss/bootstrap/scss/mixins/_clearfix.scss +7 -0
  170. data/assets/scss/bootstrap/scss/mixins/_deprecate.scss +10 -0
  171. data/assets/scss/bootstrap/scss/mixins/_float.scss +14 -0
  172. data/assets/scss/bootstrap/scss/mixins/_forms.scss +192 -0
  173. data/assets/scss/bootstrap/scss/mixins/_gradients.scss +45 -0
  174. data/assets/scss/bootstrap/scss/mixins/_grid-framework.scss +66 -0
  175. data/assets/scss/bootstrap/scss/mixins/_grid.scss +51 -0
  176. data/assets/scss/bootstrap/scss/mixins/_hover.scss +37 -0
  177. data/assets/scss/bootstrap/scss/mixins/_image.scss +36 -0
  178. data/assets/scss/bootstrap/scss/mixins/_list-group.scss +21 -0
  179. data/assets/scss/bootstrap/scss/mixins/_lists.scss +7 -0
  180. data/assets/scss/bootstrap/scss/mixins/_nav-divider.scss +10 -0
  181. data/assets/scss/bootstrap/scss/mixins/_pagination.scss +22 -0
  182. data/assets/scss/bootstrap/scss/mixins/_reset-text.scss +17 -0
  183. data/assets/scss/bootstrap/scss/mixins/_resize.scss +6 -0
  184. data/assets/scss/bootstrap/scss/mixins/_screen-reader.scss +33 -0
  185. data/assets/scss/bootstrap/scss/mixins/_size.scss +7 -0
  186. data/assets/scss/bootstrap/scss/mixins/_table-row.scss +39 -0
  187. data/assets/scss/bootstrap/scss/mixins/_text-emphasis.scss +16 -0
  188. data/assets/scss/bootstrap/scss/mixins/_text-hide.scss +11 -0
  189. data/assets/scss/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  190. data/assets/scss/bootstrap/scss/mixins/_transition.scss +16 -0
  191. data/assets/scss/bootstrap/scss/mixins/_visibility.scss +8 -0
  192. data/assets/scss/bootstrap/scss/utilities/_align.scss +8 -0
  193. data/assets/scss/bootstrap/scss/utilities/_background.scss +19 -0
  194. data/assets/scss/bootstrap/scss/utilities/_borders.scss +75 -0
  195. data/assets/scss/bootstrap/scss/utilities/_clearfix.scss +3 -0
  196. data/assets/scss/bootstrap/scss/utilities/_display.scss +26 -0
  197. data/assets/scss/bootstrap/scss/utilities/_embed.scss +39 -0
  198. data/assets/scss/bootstrap/scss/utilities/_flex.scss +51 -0
  199. data/assets/scss/bootstrap/scss/utilities/_float.scss +11 -0
  200. data/assets/scss/bootstrap/scss/utilities/_overflow.scss +5 -0
  201. data/assets/scss/bootstrap/scss/utilities/_position.scss +32 -0
  202. data/assets/scss/bootstrap/scss/utilities/_screenreaders.scss +11 -0
  203. data/assets/scss/bootstrap/scss/utilities/_shadows.scss +6 -0
  204. data/assets/scss/bootstrap/scss/utilities/_sizing.scss +20 -0
  205. data/assets/scss/bootstrap/scss/utilities/_spacing.scss +73 -0
  206. data/assets/scss/bootstrap/scss/utilities/_stretched-link.scss +19 -0
  207. data/assets/scss/bootstrap/scss/utilities/_text.scss +72 -0
  208. data/assets/scss/bootstrap/scss/utilities/_visibility.scss +13 -0
  209. data/assets/scss/bootstrap/scss/vendor/_rfs.scss +212 -0
  210. data/assets/scss/theme/_about.scss +28 -0
  211. data/assets/scss/theme/_base.scss +207 -0
  212. data/assets/scss/theme/_blog.scss +140 -0
  213. data/assets/scss/theme/_demo.scss +153 -0
  214. data/assets/scss/theme/_mixins.scss +34 -0
  215. data/assets/scss/theme/_responsive.scss +88 -0
  216. data/assets/scss/theme/styles.scss +14 -0
  217. data/assets/scss/theme-8.scss +41 -0
  218. data/assets/styles.scss +6 -0
  219. metadata +221 -4
@@ -0,0 +1,606 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v4.3.0): carousel.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import $ from 'jquery'
9
+ import Util from './util'
10
+
11
+ /**
12
+ * ------------------------------------------------------------------------
13
+ * Constants
14
+ * ------------------------------------------------------------------------
15
+ */
16
+
17
+ const NAME = 'carousel'
18
+ const VERSION = '4.3.0'
19
+ const DATA_KEY = 'bs.carousel'
20
+ const EVENT_KEY = `.${DATA_KEY}`
21
+ const DATA_API_KEY = '.data-api'
22
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
23
+ const ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key
24
+ const ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key
25
+ const TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch
26
+ const SWIPE_THRESHOLD = 40
27
+
28
+ const Default = {
29
+ interval : 5000,
30
+ keyboard : true,
31
+ slide : false,
32
+ pause : 'hover',
33
+ wrap : true,
34
+ touch : true
35
+ }
36
+
37
+ const DefaultType = {
38
+ interval : '(number|boolean)',
39
+ keyboard : 'boolean',
40
+ slide : '(boolean|string)',
41
+ pause : '(string|boolean)',
42
+ wrap : 'boolean',
43
+ touch : 'boolean'
44
+ }
45
+
46
+ const Direction = {
47
+ NEXT : 'next',
48
+ PREV : 'prev',
49
+ LEFT : 'left',
50
+ RIGHT : 'right'
51
+ }
52
+
53
+ const Event = {
54
+ SLIDE : `slide${EVENT_KEY}`,
55
+ SLID : `slid${EVENT_KEY}`,
56
+ KEYDOWN : `keydown${EVENT_KEY}`,
57
+ MOUSEENTER : `mouseenter${EVENT_KEY}`,
58
+ MOUSELEAVE : `mouseleave${EVENT_KEY}`,
59
+ TOUCHSTART : `touchstart${EVENT_KEY}`,
60
+ TOUCHMOVE : `touchmove${EVENT_KEY}`,
61
+ TOUCHEND : `touchend${EVENT_KEY}`,
62
+ POINTERDOWN : `pointerdown${EVENT_KEY}`,
63
+ POINTERUP : `pointerup${EVENT_KEY}`,
64
+ DRAG_START : `dragstart${EVENT_KEY}`,
65
+ LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,
66
+ CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
67
+ }
68
+
69
+ const ClassName = {
70
+ CAROUSEL : 'carousel',
71
+ ACTIVE : 'active',
72
+ SLIDE : 'slide',
73
+ RIGHT : 'carousel-item-right',
74
+ LEFT : 'carousel-item-left',
75
+ NEXT : 'carousel-item-next',
76
+ PREV : 'carousel-item-prev',
77
+ ITEM : 'carousel-item',
78
+ POINTER_EVENT : 'pointer-event'
79
+ }
80
+
81
+ const Selector = {
82
+ ACTIVE : '.active',
83
+ ACTIVE_ITEM : '.active.carousel-item',
84
+ ITEM : '.carousel-item',
85
+ ITEM_IMG : '.carousel-item img',
86
+ NEXT_PREV : '.carousel-item-next, .carousel-item-prev',
87
+ INDICATORS : '.carousel-indicators',
88
+ DATA_SLIDE : '[data-slide], [data-slide-to]',
89
+ DATA_RIDE : '[data-ride="carousel"]'
90
+ }
91
+
92
+ const PointerType = {
93
+ TOUCH : 'touch',
94
+ PEN : 'pen'
95
+ }
96
+
97
+ /**
98
+ * ------------------------------------------------------------------------
99
+ * Class Definition
100
+ * ------------------------------------------------------------------------
101
+ */
102
+ class Carousel {
103
+ constructor(element, config) {
104
+ this._items = null
105
+ this._interval = null
106
+ this._activeElement = null
107
+ this._isPaused = false
108
+ this._isSliding = false
109
+ this.touchTimeout = null
110
+ this.touchStartX = 0
111
+ this.touchDeltaX = 0
112
+
113
+ this._config = this._getConfig(config)
114
+ this._element = element
115
+ this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)
116
+ this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0
117
+ this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)
118
+
119
+ this._addEventListeners()
120
+ }
121
+
122
+ // Getters
123
+
124
+ static get VERSION() {
125
+ return VERSION
126
+ }
127
+
128
+ static get Default() {
129
+ return Default
130
+ }
131
+
132
+ // Public
133
+
134
+ next() {
135
+ if (!this._isSliding) {
136
+ this._slide(Direction.NEXT)
137
+ }
138
+ }
139
+
140
+ nextWhenVisible() {
141
+ // Don't call next when the page isn't visible
142
+ // or the carousel or its parent isn't visible
143
+ if (!document.hidden &&
144
+ ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {
145
+ this.next()
146
+ }
147
+ }
148
+
149
+ prev() {
150
+ if (!this._isSliding) {
151
+ this._slide(Direction.PREV)
152
+ }
153
+ }
154
+
155
+ pause(event) {
156
+ if (!event) {
157
+ this._isPaused = true
158
+ }
159
+
160
+ if (this._element.querySelector(Selector.NEXT_PREV)) {
161
+ Util.triggerTransitionEnd(this._element)
162
+ this.cycle(true)
163
+ }
164
+
165
+ clearInterval(this._interval)
166
+ this._interval = null
167
+ }
168
+
169
+ cycle(event) {
170
+ if (!event) {
171
+ this._isPaused = false
172
+ }
173
+
174
+ if (this._interval) {
175
+ clearInterval(this._interval)
176
+ this._interval = null
177
+ }
178
+
179
+ if (this._config.interval && !this._isPaused) {
180
+ this._interval = setInterval(
181
+ (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),
182
+ this._config.interval
183
+ )
184
+ }
185
+ }
186
+
187
+ to(index) {
188
+ this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)
189
+
190
+ const activeIndex = this._getItemIndex(this._activeElement)
191
+
192
+ if (index > this._items.length - 1 || index < 0) {
193
+ return
194
+ }
195
+
196
+ if (this._isSliding) {
197
+ $(this._element).one(Event.SLID, () => this.to(index))
198
+ return
199
+ }
200
+
201
+ if (activeIndex === index) {
202
+ this.pause()
203
+ this.cycle()
204
+ return
205
+ }
206
+
207
+ const direction = index > activeIndex
208
+ ? Direction.NEXT
209
+ : Direction.PREV
210
+
211
+ this._slide(direction, this._items[index])
212
+ }
213
+
214
+ dispose() {
215
+ $(this._element).off(EVENT_KEY)
216
+ $.removeData(this._element, DATA_KEY)
217
+
218
+ this._items = null
219
+ this._config = null
220
+ this._element = null
221
+ this._interval = null
222
+ this._isPaused = null
223
+ this._isSliding = null
224
+ this._activeElement = null
225
+ this._indicatorsElement = null
226
+ }
227
+
228
+ // Private
229
+
230
+ _getConfig(config) {
231
+ config = {
232
+ ...Default,
233
+ ...config
234
+ }
235
+ Util.typeCheckConfig(NAME, config, DefaultType)
236
+ return config
237
+ }
238
+
239
+ _handleSwipe() {
240
+ const absDeltax = Math.abs(this.touchDeltaX)
241
+
242
+ if (absDeltax <= SWIPE_THRESHOLD) {
243
+ return
244
+ }
245
+
246
+ const direction = absDeltax / this.touchDeltaX
247
+
248
+ // swipe left
249
+ if (direction > 0) {
250
+ this.prev()
251
+ }
252
+
253
+ // swipe right
254
+ if (direction < 0) {
255
+ this.next()
256
+ }
257
+ }
258
+
259
+ _addEventListeners() {
260
+ if (this._config.keyboard) {
261
+ $(this._element)
262
+ .on(Event.KEYDOWN, (event) => this._keydown(event))
263
+ }
264
+
265
+ if (this._config.pause === 'hover') {
266
+ $(this._element)
267
+ .on(Event.MOUSEENTER, (event) => this.pause(event))
268
+ .on(Event.MOUSELEAVE, (event) => this.cycle(event))
269
+ }
270
+
271
+ if (this._config.touch) {
272
+ this._addTouchEventListeners()
273
+ }
274
+ }
275
+
276
+ _addTouchEventListeners() {
277
+ if (!this._touchSupported) {
278
+ return
279
+ }
280
+
281
+ const start = (event) => {
282
+ if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
283
+ this.touchStartX = event.originalEvent.clientX
284
+ } else if (!this._pointerEvent) {
285
+ this.touchStartX = event.originalEvent.touches[0].clientX
286
+ }
287
+ }
288
+
289
+ const move = (event) => {
290
+ // ensure swiping with one touch and not pinching
291
+ if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
292
+ this.touchDeltaX = 0
293
+ } else {
294
+ this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX
295
+ }
296
+ }
297
+
298
+ const end = (event) => {
299
+ if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
300
+ this.touchDeltaX = event.originalEvent.clientX - this.touchStartX
301
+ }
302
+
303
+ this._handleSwipe()
304
+ if (this._config.pause === 'hover') {
305
+ // If it's a touch-enabled device, mouseenter/leave are fired as
306
+ // part of the mouse compatibility events on first tap - the carousel
307
+ // would stop cycling until user tapped out of it;
308
+ // here, we listen for touchend, explicitly pause the carousel
309
+ // (as if it's the second time we tap on it, mouseenter compat event
310
+ // is NOT fired) and after a timeout (to allow for mouse compatibility
311
+ // events to fire) we explicitly restart cycling
312
+
313
+ this.pause()
314
+ if (this.touchTimeout) {
315
+ clearTimeout(this.touchTimeout)
316
+ }
317
+ this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)
318
+ }
319
+ }
320
+
321
+ $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())
322
+ if (this._pointerEvent) {
323
+ $(this._element).on(Event.POINTERDOWN, (event) => start(event))
324
+ $(this._element).on(Event.POINTERUP, (event) => end(event))
325
+
326
+ this._element.classList.add(ClassName.POINTER_EVENT)
327
+ } else {
328
+ $(this._element).on(Event.TOUCHSTART, (event) => start(event))
329
+ $(this._element).on(Event.TOUCHMOVE, (event) => move(event))
330
+ $(this._element).on(Event.TOUCHEND, (event) => end(event))
331
+ }
332
+ }
333
+
334
+ _keydown(event) {
335
+ if (/input|textarea/i.test(event.target.tagName)) {
336
+ return
337
+ }
338
+
339
+ switch (event.which) {
340
+ case ARROW_LEFT_KEYCODE:
341
+ event.preventDefault()
342
+ this.prev()
343
+ break
344
+ case ARROW_RIGHT_KEYCODE:
345
+ event.preventDefault()
346
+ this.next()
347
+ break
348
+ default:
349
+ }
350
+ }
351
+
352
+ _getItemIndex(element) {
353
+ this._items = element && element.parentNode
354
+ ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))
355
+ : []
356
+ return this._items.indexOf(element)
357
+ }
358
+
359
+ _getItemByDirection(direction, activeElement) {
360
+ const isNextDirection = direction === Direction.NEXT
361
+ const isPrevDirection = direction === Direction.PREV
362
+ const activeIndex = this._getItemIndex(activeElement)
363
+ const lastItemIndex = this._items.length - 1
364
+ const isGoingToWrap = isPrevDirection && activeIndex === 0 ||
365
+ isNextDirection && activeIndex === lastItemIndex
366
+
367
+ if (isGoingToWrap && !this._config.wrap) {
368
+ return activeElement
369
+ }
370
+
371
+ const delta = direction === Direction.PREV ? -1 : 1
372
+ const itemIndex = (activeIndex + delta) % this._items.length
373
+
374
+ return itemIndex === -1
375
+ ? this._items[this._items.length - 1] : this._items[itemIndex]
376
+ }
377
+
378
+ _triggerSlideEvent(relatedTarget, eventDirectionName) {
379
+ const targetIndex = this._getItemIndex(relatedTarget)
380
+ const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))
381
+ const slideEvent = $.Event(Event.SLIDE, {
382
+ relatedTarget,
383
+ direction: eventDirectionName,
384
+ from: fromIndex,
385
+ to: targetIndex
386
+ })
387
+
388
+ $(this._element).trigger(slideEvent)
389
+
390
+ return slideEvent
391
+ }
392
+
393
+ _setActiveIndicatorElement(element) {
394
+ if (this._indicatorsElement) {
395
+ const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))
396
+ $(indicators)
397
+ .removeClass(ClassName.ACTIVE)
398
+
399
+ const nextIndicator = this._indicatorsElement.children[
400
+ this._getItemIndex(element)
401
+ ]
402
+
403
+ if (nextIndicator) {
404
+ $(nextIndicator).addClass(ClassName.ACTIVE)
405
+ }
406
+ }
407
+ }
408
+
409
+ _slide(direction, element) {
410
+ const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)
411
+ const activeElementIndex = this._getItemIndex(activeElement)
412
+ const nextElement = element || activeElement &&
413
+ this._getItemByDirection(direction, activeElement)
414
+ const nextElementIndex = this._getItemIndex(nextElement)
415
+ const isCycling = Boolean(this._interval)
416
+
417
+ let directionalClassName
418
+ let orderClassName
419
+ let eventDirectionName
420
+
421
+ if (direction === Direction.NEXT) {
422
+ directionalClassName = ClassName.LEFT
423
+ orderClassName = ClassName.NEXT
424
+ eventDirectionName = Direction.LEFT
425
+ } else {
426
+ directionalClassName = ClassName.RIGHT
427
+ orderClassName = ClassName.PREV
428
+ eventDirectionName = Direction.RIGHT
429
+ }
430
+
431
+ if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
432
+ this._isSliding = false
433
+ return
434
+ }
435
+
436
+ const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)
437
+ if (slideEvent.isDefaultPrevented()) {
438
+ return
439
+ }
440
+
441
+ if (!activeElement || !nextElement) {
442
+ // Some weirdness is happening, so we bail
443
+ return
444
+ }
445
+
446
+ this._isSliding = true
447
+
448
+ if (isCycling) {
449
+ this.pause()
450
+ }
451
+
452
+ this._setActiveIndicatorElement(nextElement)
453
+
454
+ const slidEvent = $.Event(Event.SLID, {
455
+ relatedTarget: nextElement,
456
+ direction: eventDirectionName,
457
+ from: activeElementIndex,
458
+ to: nextElementIndex
459
+ })
460
+
461
+ if ($(this._element).hasClass(ClassName.SLIDE)) {
462
+ $(nextElement).addClass(orderClassName)
463
+
464
+ Util.reflow(nextElement)
465
+
466
+ $(activeElement).addClass(directionalClassName)
467
+ $(nextElement).addClass(directionalClassName)
468
+
469
+ const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)
470
+ if (nextElementInterval) {
471
+ this._config.defaultInterval = this._config.defaultInterval || this._config.interval
472
+ this._config.interval = nextElementInterval
473
+ } else {
474
+ this._config.interval = this._config.defaultInterval || this._config.interval
475
+ }
476
+
477
+ const transitionDuration = Util.getTransitionDurationFromElement(activeElement)
478
+
479
+ $(activeElement)
480
+ .one(Util.TRANSITION_END, () => {
481
+ $(nextElement)
482
+ .removeClass(`${directionalClassName} ${orderClassName}`)
483
+ .addClass(ClassName.ACTIVE)
484
+
485
+ $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)
486
+
487
+ this._isSliding = false
488
+
489
+ setTimeout(() => $(this._element).trigger(slidEvent), 0)
490
+ })
491
+ .emulateTransitionEnd(transitionDuration)
492
+ } else {
493
+ $(activeElement).removeClass(ClassName.ACTIVE)
494
+ $(nextElement).addClass(ClassName.ACTIVE)
495
+
496
+ this._isSliding = false
497
+ $(this._element).trigger(slidEvent)
498
+ }
499
+
500
+ if (isCycling) {
501
+ this.cycle()
502
+ }
503
+ }
504
+
505
+ // Static
506
+
507
+ static _jQueryInterface(config) {
508
+ return this.each(function () {
509
+ let data = $(this).data(DATA_KEY)
510
+ let _config = {
511
+ ...Default,
512
+ ...$(this).data()
513
+ }
514
+
515
+ if (typeof config === 'object') {
516
+ _config = {
517
+ ..._config,
518
+ ...config
519
+ }
520
+ }
521
+
522
+ const action = typeof config === 'string' ? config : _config.slide
523
+
524
+ if (!data) {
525
+ data = new Carousel(this, _config)
526
+ $(this).data(DATA_KEY, data)
527
+ }
528
+
529
+ if (typeof config === 'number') {
530
+ data.to(config)
531
+ } else if (typeof action === 'string') {
532
+ if (typeof data[action] === 'undefined') {
533
+ throw new TypeError(`No method named "${action}"`)
534
+ }
535
+ data[action]()
536
+ } else if (_config.interval && _config.ride) {
537
+ data.pause()
538
+ data.cycle()
539
+ }
540
+ })
541
+ }
542
+
543
+ static _dataApiClickHandler(event) {
544
+ const selector = Util.getSelectorFromElement(this)
545
+
546
+ if (!selector) {
547
+ return
548
+ }
549
+
550
+ const target = $(selector)[0]
551
+
552
+ if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
553
+ return
554
+ }
555
+
556
+ const config = {
557
+ ...$(target).data(),
558
+ ...$(this).data()
559
+ }
560
+ const slideIndex = this.getAttribute('data-slide-to')
561
+
562
+ if (slideIndex) {
563
+ config.interval = false
564
+ }
565
+
566
+ Carousel._jQueryInterface.call($(target), config)
567
+
568
+ if (slideIndex) {
569
+ $(target).data(DATA_KEY).to(slideIndex)
570
+ }
571
+
572
+ event.preventDefault()
573
+ }
574
+ }
575
+
576
+ /**
577
+ * ------------------------------------------------------------------------
578
+ * Data Api implementation
579
+ * ------------------------------------------------------------------------
580
+ */
581
+
582
+ $(document)
583
+ .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)
584
+
585
+ $(window).on(Event.LOAD_DATA_API, () => {
586
+ const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))
587
+ for (let i = 0, len = carousels.length; i < len; i++) {
588
+ const $carousel = $(carousels[i])
589
+ Carousel._jQueryInterface.call($carousel, $carousel.data())
590
+ }
591
+ })
592
+
593
+ /**
594
+ * ------------------------------------------------------------------------
595
+ * jQuery
596
+ * ------------------------------------------------------------------------
597
+ */
598
+
599
+ $.fn[NAME] = Carousel._jQueryInterface
600
+ $.fn[NAME].Constructor = Carousel
601
+ $.fn[NAME].noConflict = () => {
602
+ $.fn[NAME] = JQUERY_NO_CONFLICT
603
+ return Carousel._jQueryInterface
604
+ }
605
+
606
+ export default Carousel