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,752 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v4.3.0): tooltip.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import $ from 'jquery'
9
+ import Popper from 'popper.js'
10
+ import Util from './util'
11
+
12
+ /**
13
+ * ------------------------------------------------------------------------
14
+ * Constants
15
+ * ------------------------------------------------------------------------
16
+ */
17
+
18
+ const NAME = 'tooltip'
19
+ const VERSION = '4.3.0'
20
+ const DATA_KEY = 'bs.tooltip'
21
+ const EVENT_KEY = `.${DATA_KEY}`
22
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
23
+ const CLASS_PREFIX = 'bs-tooltip'
24
+ const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
25
+
26
+ const DefaultType = {
27
+ animation : 'boolean',
28
+ template : 'string',
29
+ title : '(string|element|function)',
30
+ trigger : 'string',
31
+ delay : '(number|object)',
32
+ html : 'boolean',
33
+ selector : '(string|boolean)',
34
+ placement : '(string|function)',
35
+ offset : '(number|string|function)',
36
+ container : '(string|element|boolean)',
37
+ fallbackPlacement : '(string|array)',
38
+ boundary : '(string|element)'
39
+ }
40
+
41
+ const AttachmentMap = {
42
+ AUTO : 'auto',
43
+ TOP : 'top',
44
+ RIGHT : 'right',
45
+ BOTTOM : 'bottom',
46
+ LEFT : 'left'
47
+ }
48
+
49
+ const Default = {
50
+ animation : true,
51
+ template : '<div class="tooltip" role="tooltip">' +
52
+ '<div class="arrow"></div>' +
53
+ '<div class="tooltip-inner"></div></div>',
54
+ trigger : 'hover focus',
55
+ title : '',
56
+ delay : 0,
57
+ html : false,
58
+ selector : false,
59
+ placement : 'top',
60
+ offset : 0,
61
+ container : false,
62
+ fallbackPlacement : 'flip',
63
+ boundary : 'scrollParent'
64
+ }
65
+
66
+ const HoverState = {
67
+ SHOW : 'show',
68
+ OUT : 'out'
69
+ }
70
+
71
+ const Event = {
72
+ HIDE : `hide${EVENT_KEY}`,
73
+ HIDDEN : `hidden${EVENT_KEY}`,
74
+ SHOW : `show${EVENT_KEY}`,
75
+ SHOWN : `shown${EVENT_KEY}`,
76
+ INSERTED : `inserted${EVENT_KEY}`,
77
+ CLICK : `click${EVENT_KEY}`,
78
+ FOCUSIN : `focusin${EVENT_KEY}`,
79
+ FOCUSOUT : `focusout${EVENT_KEY}`,
80
+ MOUSEENTER : `mouseenter${EVENT_KEY}`,
81
+ MOUSELEAVE : `mouseleave${EVENT_KEY}`
82
+ }
83
+
84
+ const ClassName = {
85
+ FADE : 'fade',
86
+ SHOW : 'show'
87
+ }
88
+
89
+ const Selector = {
90
+ TOOLTIP : '.tooltip',
91
+ TOOLTIP_INNER : '.tooltip-inner',
92
+ ARROW : '.arrow'
93
+ }
94
+
95
+ const Trigger = {
96
+ HOVER : 'hover',
97
+ FOCUS : 'focus',
98
+ CLICK : 'click',
99
+ MANUAL : 'manual'
100
+ }
101
+
102
+
103
+ /**
104
+ * ------------------------------------------------------------------------
105
+ * Class Definition
106
+ * ------------------------------------------------------------------------
107
+ */
108
+
109
+ class Tooltip {
110
+ constructor(element, config) {
111
+ /**
112
+ * Check for Popper dependency
113
+ * Popper - https://popper.js.org
114
+ */
115
+ if (typeof Popper === 'undefined') {
116
+ throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)')
117
+ }
118
+
119
+ // private
120
+ this._isEnabled = true
121
+ this._timeout = 0
122
+ this._hoverState = ''
123
+ this._activeTrigger = {}
124
+ this._popper = null
125
+
126
+ // Protected
127
+ this.element = element
128
+ this.config = this._getConfig(config)
129
+ this.tip = null
130
+
131
+ this._setListeners()
132
+ }
133
+
134
+ // Getters
135
+
136
+ static get VERSION() {
137
+ return VERSION
138
+ }
139
+
140
+ static get Default() {
141
+ return Default
142
+ }
143
+
144
+ static get NAME() {
145
+ return NAME
146
+ }
147
+
148
+ static get DATA_KEY() {
149
+ return DATA_KEY
150
+ }
151
+
152
+ static get Event() {
153
+ return Event
154
+ }
155
+
156
+ static get EVENT_KEY() {
157
+ return EVENT_KEY
158
+ }
159
+
160
+ static get DefaultType() {
161
+ return DefaultType
162
+ }
163
+
164
+ // Public
165
+
166
+ enable() {
167
+ this._isEnabled = true
168
+ }
169
+
170
+ disable() {
171
+ this._isEnabled = false
172
+ }
173
+
174
+ toggleEnabled() {
175
+ this._isEnabled = !this._isEnabled
176
+ }
177
+
178
+ toggle(event) {
179
+ if (!this._isEnabled) {
180
+ return
181
+ }
182
+
183
+ if (event) {
184
+ const dataKey = this.constructor.DATA_KEY
185
+ let context = $(event.currentTarget).data(dataKey)
186
+
187
+ if (!context) {
188
+ context = new this.constructor(
189
+ event.currentTarget,
190
+ this._getDelegateConfig()
191
+ )
192
+ $(event.currentTarget).data(dataKey, context)
193
+ }
194
+
195
+ context._activeTrigger.click = !context._activeTrigger.click
196
+
197
+ if (context._isWithActiveTrigger()) {
198
+ context._enter(null, context)
199
+ } else {
200
+ context._leave(null, context)
201
+ }
202
+ } else {
203
+ if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
204
+ this._leave(null, this)
205
+ return
206
+ }
207
+
208
+ this._enter(null, this)
209
+ }
210
+ }
211
+
212
+ dispose() {
213
+ clearTimeout(this._timeout)
214
+
215
+ $.removeData(this.element, this.constructor.DATA_KEY)
216
+
217
+ $(this.element).off(this.constructor.EVENT_KEY)
218
+ $(this.element).closest('.modal').off('hide.bs.modal')
219
+
220
+ if (this.tip) {
221
+ $(this.tip).remove()
222
+ }
223
+
224
+ this._isEnabled = null
225
+ this._timeout = null
226
+ this._hoverState = null
227
+ this._activeTrigger = null
228
+ if (this._popper !== null) {
229
+ this._popper.destroy()
230
+ }
231
+
232
+ this._popper = null
233
+ this.element = null
234
+ this.config = null
235
+ this.tip = null
236
+ }
237
+
238
+ show() {
239
+ if ($(this.element).css('display') === 'none') {
240
+ throw new Error('Please use show on visible elements')
241
+ }
242
+
243
+ const showEvent = $.Event(this.constructor.Event.SHOW)
244
+ if (this.isWithContent() && this._isEnabled) {
245
+ $(this.element).trigger(showEvent)
246
+
247
+ const shadowRoot = Util.findShadowRoot(this.element)
248
+ const isInTheDom = $.contains(
249
+ shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,
250
+ this.element
251
+ )
252
+
253
+ if (showEvent.isDefaultPrevented() || !isInTheDom) {
254
+ return
255
+ }
256
+
257
+ const tip = this.getTipElement()
258
+ const tipId = Util.getUID(this.constructor.NAME)
259
+
260
+ tip.setAttribute('id', tipId)
261
+ this.element.setAttribute('aria-describedby', tipId)
262
+
263
+ this.setContent()
264
+
265
+ if (this.config.animation) {
266
+ $(tip).addClass(ClassName.FADE)
267
+ }
268
+
269
+ const placement = typeof this.config.placement === 'function'
270
+ ? this.config.placement.call(this, tip, this.element)
271
+ : this.config.placement
272
+
273
+ const attachment = this._getAttachment(placement)
274
+ this.addAttachmentClass(attachment)
275
+
276
+ const container = this._getContainer()
277
+ $(tip).data(this.constructor.DATA_KEY, this)
278
+
279
+ if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
280
+ $(tip).appendTo(container)
281
+ }
282
+
283
+ $(this.element).trigger(this.constructor.Event.INSERTED)
284
+
285
+ this._popper = new Popper(this.element, tip, {
286
+ placement: attachment,
287
+ modifiers: {
288
+ offset: this._getOffset(),
289
+ flip: {
290
+ behavior: this.config.fallbackPlacement
291
+ },
292
+ arrow: {
293
+ element: Selector.ARROW
294
+ },
295
+ preventOverflow: {
296
+ boundariesElement: this.config.boundary
297
+ }
298
+ },
299
+ onCreate: (data) => {
300
+ if (data.originalPlacement !== data.placement) {
301
+ this._handlePopperPlacementChange(data)
302
+ }
303
+ },
304
+ onUpdate: (data) => this._handlePopperPlacementChange(data)
305
+ })
306
+
307
+ $(tip).addClass(ClassName.SHOW)
308
+
309
+ // If this is a touch-enabled device we add extra
310
+ // empty mouseover listeners to the body's immediate children;
311
+ // only needed because of broken event delegation on iOS
312
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
313
+ if ('ontouchstart' in document.documentElement) {
314
+ $(document.body).children().on('mouseover', null, $.noop)
315
+ }
316
+
317
+ const complete = () => {
318
+ if (this.config.animation) {
319
+ this._fixTransition()
320
+ }
321
+ const prevHoverState = this._hoverState
322
+ this._hoverState = null
323
+
324
+ $(this.element).trigger(this.constructor.Event.SHOWN)
325
+
326
+ if (prevHoverState === HoverState.OUT) {
327
+ this._leave(null, this)
328
+ }
329
+ }
330
+
331
+ if ($(this.tip).hasClass(ClassName.FADE)) {
332
+ const transitionDuration = Util.getTransitionDurationFromElement(this.tip)
333
+
334
+ $(this.tip)
335
+ .one(Util.TRANSITION_END, complete)
336
+ .emulateTransitionEnd(transitionDuration)
337
+ } else {
338
+ complete()
339
+ }
340
+ }
341
+ }
342
+
343
+ hide(callback) {
344
+ const tip = this.getTipElement()
345
+ const hideEvent = $.Event(this.constructor.Event.HIDE)
346
+ const complete = () => {
347
+ if (this._hoverState !== HoverState.SHOW && tip.parentNode) {
348
+ tip.parentNode.removeChild(tip)
349
+ }
350
+
351
+ this._cleanTipClass()
352
+ this.element.removeAttribute('aria-describedby')
353
+ $(this.element).trigger(this.constructor.Event.HIDDEN)
354
+ if (this._popper !== null) {
355
+ this._popper.destroy()
356
+ }
357
+
358
+ if (callback) {
359
+ callback()
360
+ }
361
+ }
362
+
363
+ $(this.element).trigger(hideEvent)
364
+
365
+ if (hideEvent.isDefaultPrevented()) {
366
+ return
367
+ }
368
+
369
+ $(tip).removeClass(ClassName.SHOW)
370
+
371
+ // If this is a touch-enabled device we remove the extra
372
+ // empty mouseover listeners we added for iOS support
373
+ if ('ontouchstart' in document.documentElement) {
374
+ $(document.body).children().off('mouseover', null, $.noop)
375
+ }
376
+
377
+ this._activeTrigger[Trigger.CLICK] = false
378
+ this._activeTrigger[Trigger.FOCUS] = false
379
+ this._activeTrigger[Trigger.HOVER] = false
380
+
381
+ if ($(this.tip).hasClass(ClassName.FADE)) {
382
+ const transitionDuration = Util.getTransitionDurationFromElement(tip)
383
+
384
+ $(tip)
385
+ .one(Util.TRANSITION_END, complete)
386
+ .emulateTransitionEnd(transitionDuration)
387
+ } else {
388
+ complete()
389
+ }
390
+
391
+ this._hoverState = ''
392
+ }
393
+
394
+ update() {
395
+ if (this._popper !== null) {
396
+ this._popper.scheduleUpdate()
397
+ }
398
+ }
399
+
400
+ // Protected
401
+
402
+ isWithContent() {
403
+ return Boolean(this.getTitle())
404
+ }
405
+
406
+ addAttachmentClass(attachment) {
407
+ $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)
408
+ }
409
+
410
+ getTipElement() {
411
+ this.tip = this.tip || $(this.config.template)[0]
412
+ return this.tip
413
+ }
414
+
415
+ setContent() {
416
+ const tip = this.getTipElement()
417
+ this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())
418
+ $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
419
+ }
420
+
421
+ setElementContent($element, content) {
422
+ const html = this.config.html
423
+ if (typeof content === 'object' && (content.nodeType || content.jquery)) {
424
+ // Content is a DOM node or a jQuery
425
+ if (html) {
426
+ if (!$(content).parent().is($element)) {
427
+ $element.empty().append(content)
428
+ }
429
+ } else {
430
+ $element.text($(content).text())
431
+ }
432
+ } else {
433
+ $element[html ? 'html' : 'text'](content)
434
+ }
435
+ }
436
+
437
+ getTitle() {
438
+ let title = this.element.getAttribute('data-original-title')
439
+
440
+ if (!title) {
441
+ title = typeof this.config.title === 'function'
442
+ ? this.config.title.call(this.element)
443
+ : this.config.title
444
+ }
445
+
446
+ return title
447
+ }
448
+
449
+ // Private
450
+
451
+ _getOffset() {
452
+ const offset = {}
453
+
454
+ if (typeof this.config.offset === 'function') {
455
+ offset.fn = (data) => {
456
+ data.offsets = {
457
+ ...data.offsets,
458
+ ...this.config.offset(data.offsets, this.element) || {}
459
+ }
460
+
461
+ return data
462
+ }
463
+ } else {
464
+ offset.offset = this.config.offset
465
+ }
466
+
467
+ return offset
468
+ }
469
+
470
+ _getContainer() {
471
+ if (this.config.container === false) {
472
+ return document.body
473
+ }
474
+
475
+ if (Util.isElement(this.config.container)) {
476
+ return $(this.config.container)
477
+ }
478
+
479
+ return $(document).find(this.config.container)
480
+ }
481
+
482
+ _getAttachment(placement) {
483
+ return AttachmentMap[placement.toUpperCase()]
484
+ }
485
+
486
+ _setListeners() {
487
+ const triggers = this.config.trigger.split(' ')
488
+
489
+ triggers.forEach((trigger) => {
490
+ if (trigger === 'click') {
491
+ $(this.element).on(
492
+ this.constructor.Event.CLICK,
493
+ this.config.selector,
494
+ (event) => this.toggle(event)
495
+ )
496
+ } else if (trigger !== Trigger.MANUAL) {
497
+ const eventIn = trigger === Trigger.HOVER
498
+ ? this.constructor.Event.MOUSEENTER
499
+ : this.constructor.Event.FOCUSIN
500
+ const eventOut = trigger === Trigger.HOVER
501
+ ? this.constructor.Event.MOUSELEAVE
502
+ : this.constructor.Event.FOCUSOUT
503
+
504
+ $(this.element)
505
+ .on(
506
+ eventIn,
507
+ this.config.selector,
508
+ (event) => this._enter(event)
509
+ )
510
+ .on(
511
+ eventOut,
512
+ this.config.selector,
513
+ (event) => this._leave(event)
514
+ )
515
+ }
516
+ })
517
+
518
+ $(this.element).closest('.modal').on(
519
+ 'hide.bs.modal',
520
+ () => {
521
+ if (this.element) {
522
+ this.hide()
523
+ }
524
+ }
525
+ )
526
+
527
+ if (this.config.selector) {
528
+ this.config = {
529
+ ...this.config,
530
+ trigger: 'manual',
531
+ selector: ''
532
+ }
533
+ } else {
534
+ this._fixTitle()
535
+ }
536
+ }
537
+
538
+ _fixTitle() {
539
+ const titleType = typeof this.element.getAttribute('data-original-title')
540
+
541
+ if (this.element.getAttribute('title') || titleType !== 'string') {
542
+ this.element.setAttribute(
543
+ 'data-original-title',
544
+ this.element.getAttribute('title') || ''
545
+ )
546
+
547
+ this.element.setAttribute('title', '')
548
+ }
549
+ }
550
+
551
+ _enter(event, context) {
552
+ const dataKey = this.constructor.DATA_KEY
553
+ context = context || $(event.currentTarget).data(dataKey)
554
+
555
+ if (!context) {
556
+ context = new this.constructor(
557
+ event.currentTarget,
558
+ this._getDelegateConfig()
559
+ )
560
+ $(event.currentTarget).data(dataKey, context)
561
+ }
562
+
563
+ if (event) {
564
+ context._activeTrigger[
565
+ event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER
566
+ ] = true
567
+ }
568
+
569
+ if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
570
+ context._hoverState = HoverState.SHOW
571
+ return
572
+ }
573
+
574
+ clearTimeout(context._timeout)
575
+
576
+ context._hoverState = HoverState.SHOW
577
+
578
+ if (!context.config.delay || !context.config.delay.show) {
579
+ context.show()
580
+ return
581
+ }
582
+
583
+ context._timeout = setTimeout(() => {
584
+ if (context._hoverState === HoverState.SHOW) {
585
+ context.show()
586
+ }
587
+ }, context.config.delay.show)
588
+ }
589
+
590
+ _leave(event, context) {
591
+ const dataKey = this.constructor.DATA_KEY
592
+ context = context || $(event.currentTarget).data(dataKey)
593
+
594
+ if (!context) {
595
+ context = new this.constructor(
596
+ event.currentTarget,
597
+ this._getDelegateConfig()
598
+ )
599
+ $(event.currentTarget).data(dataKey, context)
600
+ }
601
+
602
+ if (event) {
603
+ context._activeTrigger[
604
+ event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER
605
+ ] = false
606
+ }
607
+
608
+ if (context._isWithActiveTrigger()) {
609
+ return
610
+ }
611
+
612
+ clearTimeout(context._timeout)
613
+
614
+ context._hoverState = HoverState.OUT
615
+
616
+ if (!context.config.delay || !context.config.delay.hide) {
617
+ context.hide()
618
+ return
619
+ }
620
+
621
+ context._timeout = setTimeout(() => {
622
+ if (context._hoverState === HoverState.OUT) {
623
+ context.hide()
624
+ }
625
+ }, context.config.delay.hide)
626
+ }
627
+
628
+ _isWithActiveTrigger() {
629
+ for (const trigger in this._activeTrigger) {
630
+ if (this._activeTrigger[trigger]) {
631
+ return true
632
+ }
633
+ }
634
+
635
+ return false
636
+ }
637
+
638
+ _getConfig(config) {
639
+ config = {
640
+ ...this.constructor.Default,
641
+ ...$(this.element).data(),
642
+ ...typeof config === 'object' && config ? config : {}
643
+ }
644
+
645
+ if (typeof config.delay === 'number') {
646
+ config.delay = {
647
+ show: config.delay,
648
+ hide: config.delay
649
+ }
650
+ }
651
+
652
+ if (typeof config.title === 'number') {
653
+ config.title = config.title.toString()
654
+ }
655
+
656
+ if (typeof config.content === 'number') {
657
+ config.content = config.content.toString()
658
+ }
659
+
660
+ Util.typeCheckConfig(
661
+ NAME,
662
+ config,
663
+ this.constructor.DefaultType
664
+ )
665
+
666
+ return config
667
+ }
668
+
669
+ _getDelegateConfig() {
670
+ const config = {}
671
+
672
+ if (this.config) {
673
+ for (const key in this.config) {
674
+ if (this.constructor.Default[key] !== this.config[key]) {
675
+ config[key] = this.config[key]
676
+ }
677
+ }
678
+ }
679
+
680
+ return config
681
+ }
682
+
683
+ _cleanTipClass() {
684
+ const $tip = $(this.getTipElement())
685
+ const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
686
+ if (tabClass !== null && tabClass.length) {
687
+ $tip.removeClass(tabClass.join(''))
688
+ }
689
+ }
690
+
691
+ _handlePopperPlacementChange(popperData) {
692
+ const popperInstance = popperData.instance
693
+ this.tip = popperInstance.popper
694
+ this._cleanTipClass()
695
+ this.addAttachmentClass(this._getAttachment(popperData.placement))
696
+ }
697
+
698
+ _fixTransition() {
699
+ const tip = this.getTipElement()
700
+ const initConfigAnimation = this.config.animation
701
+
702
+ if (tip.getAttribute('x-placement') !== null) {
703
+ return
704
+ }
705
+
706
+ $(tip).removeClass(ClassName.FADE)
707
+ this.config.animation = false
708
+ this.hide()
709
+ this.show()
710
+ this.config.animation = initConfigAnimation
711
+ }
712
+
713
+ // Static
714
+
715
+ static _jQueryInterface(config) {
716
+ return this.each(function () {
717
+ let data = $(this).data(DATA_KEY)
718
+ const _config = typeof config === 'object' && config
719
+
720
+ if (!data && /dispose|hide/.test(config)) {
721
+ return
722
+ }
723
+
724
+ if (!data) {
725
+ data = new Tooltip(this, _config)
726
+ $(this).data(DATA_KEY, data)
727
+ }
728
+
729
+ if (typeof config === 'string') {
730
+ if (typeof data[config] === 'undefined') {
731
+ throw new TypeError(`No method named "${config}"`)
732
+ }
733
+ data[config]()
734
+ }
735
+ })
736
+ }
737
+ }
738
+
739
+ /**
740
+ * ------------------------------------------------------------------------
741
+ * jQuery
742
+ * ------------------------------------------------------------------------
743
+ */
744
+
745
+ $.fn[NAME] = Tooltip._jQueryInterface
746
+ $.fn[NAME].Constructor = Tooltip
747
+ $.fn[NAME].noConflict = () => {
748
+ $.fn[NAME] = JQUERY_NO_CONFLICT
749
+ return Tooltip._jQueryInterface
750
+ }
751
+
752
+ export default Tooltip