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,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