active_frontend 13.3.0 → 14.0.0

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 (221) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.fasterer.yml +19 -0
  4. data/.reek +27 -0
  5. data/.rubocop.yml +38 -0
  6. data/.scss-lint.yml +27 -0
  7. data/Rakefile +1 -1
  8. data/active_frontend.gemspec +21 -18
  9. data/app/.DS_Store +0 -0
  10. data/app/assets/.DS_Store +0 -0
  11. data/app/assets/fonts/.DS_Store +0 -0
  12. data/app/assets/fonts/dripicons/.DS_Store +0 -0
  13. data/app/assets/fonts/dripicons/dripicons.woff +0 -0
  14. data/app/assets/fonts/fakt-pro/.DS_Store +0 -0
  15. data/app/assets/fonts/fakt-pro/fakt-pro-bold.woff +0 -0
  16. data/app/assets/fonts/fakt-pro/fakt-pro-normal.woff +0 -0
  17. data/app/assets/fonts/fakt-pro/fakt-pro-semibold.woff +0 -0
  18. data/app/assets/fonts/fakt-pro/fakt-pro-semilight.woff +0 -0
  19. data/app/assets/fonts/fakt-soft-pro/.DS_Store +0 -0
  20. data/app/assets/fonts/fakt-soft-pro/fakt-soft-pro-bold.woff +0 -0
  21. data/app/assets/fonts/fakt-soft-pro/fakt-soft-pro-normal.woff +0 -0
  22. data/app/assets/fonts/fakt-soft-pro/fakt-soft-pro-semibold.woff +0 -0
  23. data/app/assets/fonts/fakt-soft-pro/fakt-soft-pro-semilight.woff +0 -0
  24. data/app/assets/images/.DS_Store +0 -0
  25. data/app/assets/images/.keep +0 -0
  26. data/app/assets/images/placeholders/.DS_Store +0 -0
  27. data/app/assets/images/placeholders/camera-large.png +0 -0
  28. data/app/assets/images/placeholders/camera-small.png +0 -0
  29. data/app/assets/images/placeholders/camera.png +0 -0
  30. data/app/assets/images/placeholders/document-large.png +0 -0
  31. data/app/assets/images/placeholders/document-small.png +0 -0
  32. data/app/assets/images/placeholders/document.png +0 -0
  33. data/app/assets/images/placeholders/photo-large.png +0 -0
  34. data/app/assets/images/placeholders/{picture-small.png → photo-small.png} +0 -0
  35. data/app/assets/images/placeholders/photo.png +0 -0
  36. data/app/assets/images/placeholders/store-large.png +0 -0
  37. data/app/assets/images/placeholders/store-small.png +0 -0
  38. data/app/assets/images/placeholders/store.png +0 -0
  39. data/app/assets/images/placeholders/user-large.png +0 -0
  40. data/app/assets/images/placeholders/user-small.png +0 -0
  41. data/app/assets/images/placeholders/user.png +0 -0
  42. data/app/helpers/active_frontend_helper.rb +22 -37
  43. data/lib/.DS_Store +0 -0
  44. data/lib/active_frontend.rb +3 -4
  45. data/lib/active_frontend/.DS_Store +0 -0
  46. data/lib/active_frontend/version.rb +1 -1
  47. data/lib/generators/active_frontend/install_generator.rb +3 -3
  48. data/lib/generators/active_frontend/templates/install.js +35 -30
  49. data/lib/generators/active_frontend/templates/install.scss +55 -58
  50. data/vendor/.DS_Store +0 -0
  51. data/vendor/assets/.DS_Store +0 -0
  52. data/vendor/assets/javascripts/.DS_Store +0 -0
  53. data/vendor/assets/javascripts/active_frontend.js +35 -30
  54. data/vendor/assets/javascripts/base/_affix.js +170 -0
  55. data/vendor/assets/javascripts/base/_alert.js +80 -0
  56. data/vendor/assets/javascripts/base/_animation.js +106 -0
  57. data/vendor/assets/javascripts/base/_button.js +123 -0
  58. data/vendor/assets/javascripts/base/_carousel.js +237 -0
  59. data/vendor/assets/javascripts/base/_collapse.js +200 -0
  60. data/vendor/assets/javascripts/base/_colorpicker.js +147 -0
  61. data/vendor/assets/javascripts/base/_datepicker.js +1411 -0
  62. data/vendor/assets/javascripts/base/_dropdown.js +154 -0
  63. data/vendor/assets/javascripts/base/_filepicker.js +235 -0
  64. data/vendor/assets/javascripts/base/_hoverdown.js +116 -0
  65. data/vendor/assets/javascripts/base/_layout.js +126 -0
  66. data/vendor/assets/javascripts/base/_list.js +103 -0
  67. data/vendor/assets/javascripts/{_modal.js → base/_modal.js} +170 -167
  68. data/vendor/assets/javascripts/base/_popover.js +101 -0
  69. data/vendor/assets/javascripts/base/_scrollspy.js +161 -0
  70. data/vendor/assets/javascripts/base/_switch.js +160 -0
  71. data/vendor/assets/javascripts/base/_tab.js +139 -0
  72. data/vendor/assets/javascripts/base/_table.js +224 -0
  73. data/vendor/assets/javascripts/base/_timeago.js +270 -0
  74. data/vendor/assets/javascripts/base/_timepicker.js +541 -0
  75. data/vendor/assets/javascripts/base/_tooltip.js +525 -0
  76. data/vendor/assets/javascripts/base/_tour.js +268 -0
  77. data/vendor/assets/javascripts/base/_transition.js +52 -0
  78. data/vendor/assets/javascripts/base/_typeahead.js +362 -0
  79. data/vendor/assets/javascripts/extensions/_calendar.js +4709 -0
  80. data/vendor/assets/javascripts/extensions/_chart.js +9371 -0
  81. data/vendor/assets/javascripts/extensions/_map.js +2153 -0
  82. data/vendor/assets/stylesheets/.DS_Store +0 -0
  83. data/vendor/assets/stylesheets/{_mixin.scss → _utility.scss} +96 -10
  84. data/vendor/assets/stylesheets/_variable.scss +201 -19
  85. data/vendor/assets/stylesheets/active_frontend.scss +55 -58
  86. data/vendor/assets/stylesheets/blocks/_anchor.scss +15 -0
  87. data/vendor/assets/stylesheets/blocks/_button.scss +278 -0
  88. data/vendor/assets/stylesheets/blocks/_code.scss +144 -0
  89. data/vendor/assets/stylesheets/blocks/_common.scss +127 -0
  90. data/vendor/assets/stylesheets/blocks/_form.scss +508 -0
  91. data/vendor/assets/stylesheets/blocks/_icon.scss +359 -0
  92. data/vendor/assets/stylesheets/blocks/_list.scss +76 -0
  93. data/vendor/assets/stylesheets/blocks/_multimedia.scss +62 -0
  94. data/vendor/assets/stylesheets/blocks/_reset.scss +179 -0
  95. data/vendor/assets/stylesheets/blocks/_table.scss +211 -0
  96. data/vendor/assets/stylesheets/blocks/_typography.scss +204 -0
  97. data/vendor/assets/stylesheets/components/_ad.scss +78 -0
  98. data/vendor/assets/stylesheets/components/_affix.scss +14 -0
  99. data/vendor/assets/stylesheets/components/_alert.scss +50 -0
  100. data/vendor/assets/stylesheets/components/_animation.scss +1670 -0
  101. data/vendor/assets/stylesheets/components/_breadcrumb.scss +17 -0
  102. data/vendor/assets/stylesheets/components/_calendar.scss +213 -0
  103. data/vendor/assets/stylesheets/components/_card.scss +30 -0
  104. data/vendor/assets/stylesheets/components/_carousel.scss +135 -0
  105. data/vendor/assets/stylesheets/components/_chart.scss +10 -0
  106. data/vendor/assets/stylesheets/components/_collapse.scss +17 -0
  107. data/vendor/assets/stylesheets/components/_colorpicker.scss +38 -0
  108. data/vendor/assets/stylesheets/components/_datepicker.scss +80 -0
  109. data/vendor/assets/stylesheets/components/_dropmenu.scss +151 -0
  110. data/vendor/assets/stylesheets/components/_footer.scss +11 -0
  111. data/vendor/assets/stylesheets/components/_grid.scss +144 -0
  112. data/vendor/assets/stylesheets/components/_header.scss +99 -0
  113. data/vendor/assets/stylesheets/components/_label_and_badge.scss +57 -0
  114. data/vendor/assets/stylesheets/components/_layout.scss +63 -0
  115. data/vendor/assets/stylesheets/components/_map.scss +14 -0
  116. data/vendor/assets/stylesheets/components/_milestone.scss +49 -0
  117. data/vendor/assets/stylesheets/components/_missive.scss +40 -0
  118. data/vendor/assets/stylesheets/components/_modal.scss +126 -0
  119. data/vendor/assets/stylesheets/components/_nav_and_tab.scss +202 -0
  120. data/vendor/assets/stylesheets/components/_navbar.scss +66 -0
  121. data/vendor/assets/stylesheets/components/_pagination.scss +79 -0
  122. data/vendor/assets/stylesheets/components/_placeholder.scss +23 -0
  123. data/vendor/assets/stylesheets/components/_popover.scss +167 -0
  124. data/vendor/assets/stylesheets/components/_progress.scss +62 -0
  125. data/vendor/assets/stylesheets/components/_sidebar.scss +74 -0
  126. data/vendor/assets/stylesheets/components/_spinner.scss +83 -0
  127. data/vendor/assets/stylesheets/components/_switch.scss +150 -0
  128. data/vendor/assets/stylesheets/components/_timepicker.scss +30 -0
  129. data/vendor/assets/stylesheets/components/_tooltip.scss +93 -0
  130. data/vendor/assets/stylesheets/components/_transition.scss +12 -0
  131. data/vendor/assets/stylesheets/components/_typeahead.scss +18 -0
  132. metadata +150 -94
  133. data/app/assets/fonts/gotham/gotham-bold.woff +0 -0
  134. data/app/assets/fonts/gotham/gotham-book.woff +0 -0
  135. data/app/assets/fonts/gotham/gotham-light.woff +0 -0
  136. data/app/assets/fonts/gotham/gotham-medium.woff +0 -0
  137. data/app/assets/fonts/gotham/gotham-rounded-bold.woff +0 -0
  138. data/app/assets/fonts/gotham/gotham-rounded-book.woff +0 -0
  139. data/app/assets/fonts/gotham/gotham-rounded-light.woff +0 -0
  140. data/app/assets/fonts/gotham/gotham-rounded-medium.woff +0 -0
  141. data/app/assets/images/placeholders/archive-large.png +0 -0
  142. data/app/assets/images/placeholders/archive-small.png +0 -0
  143. data/app/assets/images/placeholders/archive.png +0 -0
  144. data/app/assets/images/placeholders/picture-large.png +0 -0
  145. data/app/assets/images/placeholders/picture.png +0 -0
  146. data/vendor/assets/javascripts/_affix.js +0 -153
  147. data/vendor/assets/javascripts/_alert.js +0 -85
  148. data/vendor/assets/javascripts/_animation.js +0 -103
  149. data/vendor/assets/javascripts/_button.js +0 -107
  150. data/vendor/assets/javascripts/_carousel.js +0 -228
  151. data/vendor/assets/javascripts/_chart.js +0 -3742
  152. data/vendor/assets/javascripts/_collapse.js +0 -202
  153. data/vendor/assets/javascripts/_color_picker.js +0 -108
  154. data/vendor/assets/javascripts/_date_picker.js +0 -1650
  155. data/vendor/assets/javascripts/_dropdown.js +0 -156
  156. data/vendor/assets/javascripts/_file_input.js +0 -71
  157. data/vendor/assets/javascripts/_hoverdown.js +0 -109
  158. data/vendor/assets/javascripts/_inputmask.js +0 -341
  159. data/vendor/assets/javascripts/_loader.js +0 -361
  160. data/vendor/assets/javascripts/_map.js +0 -2401
  161. data/vendor/assets/javascripts/_popover.js +0 -99
  162. data/vendor/assets/javascripts/_scrollspy.js +0 -163
  163. data/vendor/assets/javascripts/_slider.js +0 -1572
  164. data/vendor/assets/javascripts/_sort.js +0 -1432
  165. data/vendor/assets/javascripts/_swoggle.js +0 -415
  166. data/vendor/assets/javascripts/_tab.js +0 -146
  167. data/vendor/assets/javascripts/_tablespy.js +0 -1883
  168. data/vendor/assets/javascripts/_time_ago.js +0 -206
  169. data/vendor/assets/javascripts/_time_picker.js +0 -1088
  170. data/vendor/assets/javascripts/_tooltip.js +0 -504
  171. data/vendor/assets/javascripts/_transition.js +0 -50
  172. data/vendor/assets/javascripts/_typeahead.js +0 -366
  173. data/vendor/assets/stylesheets/_ad.scss +0 -63
  174. data/vendor/assets/stylesheets/_affix.scss +0 -14
  175. data/vendor/assets/stylesheets/_alert.scss +0 -114
  176. data/vendor/assets/stylesheets/_animation.scss +0 -1370
  177. data/vendor/assets/stylesheets/_breadcrumb.scss +0 -100
  178. data/vendor/assets/stylesheets/_button.scss +0 -386
  179. data/vendor/assets/stylesheets/_canvas.scss +0 -182
  180. data/vendor/assets/stylesheets/_carousel.scss +0 -158
  181. data/vendor/assets/stylesheets/_chart.scss +0 -15
  182. data/vendor/assets/stylesheets/_code.scss +0 -150
  183. data/vendor/assets/stylesheets/_collapse.scss +0 -14
  184. data/vendor/assets/stylesheets/_color.scss +0 -55
  185. data/vendor/assets/stylesheets/_colorpicker.scss +0 -63
  186. data/vendor/assets/stylesheets/_datepicker.scss +0 -122
  187. data/vendor/assets/stylesheets/_dropdown.scss +0 -248
  188. data/vendor/assets/stylesheets/_footer.scss +0 -71
  189. data/vendor/assets/stylesheets/_form.scss +0 -661
  190. data/vendor/assets/stylesheets/_grid.scss +0 -184
  191. data/vendor/assets/stylesheets/_header.scss +0 -156
  192. data/vendor/assets/stylesheets/_icon.scss +0 -362
  193. data/vendor/assets/stylesheets/_image.scss +0 -33
  194. data/vendor/assets/stylesheets/_label_and_badge.scss +0 -104
  195. data/vendor/assets/stylesheets/_link.scss +0 -55
  196. data/vendor/assets/stylesheets/_list.scss +0 -122
  197. data/vendor/assets/stylesheets/_loader.scss +0 -71
  198. data/vendor/assets/stylesheets/_map.scss +0 -44
  199. data/vendor/assets/stylesheets/_missive.scss +0 -74
  200. data/vendor/assets/stylesheets/_modal.scss +0 -204
  201. data/vendor/assets/stylesheets/_nav_and_tab.scss +0 -230
  202. data/vendor/assets/stylesheets/_navbar.scss +0 -73
  203. data/vendor/assets/stylesheets/_pagination.scss +0 -79
  204. data/vendor/assets/stylesheets/_panel.scss +0 -80
  205. data/vendor/assets/stylesheets/_placeholder.scss +0 -63
  206. data/vendor/assets/stylesheets/_popover.scss +0 -128
  207. data/vendor/assets/stylesheets/_progress.scss +0 -86
  208. data/vendor/assets/stylesheets/_reset.scss +0 -140
  209. data/vendor/assets/stylesheets/_sidebar.scss +0 -148
  210. data/vendor/assets/stylesheets/_slider.scss +0 -151
  211. data/vendor/assets/stylesheets/_spinner.scss +0 -572
  212. data/vendor/assets/stylesheets/_subheader.scss +0 -112
  213. data/vendor/assets/stylesheets/_swoggle.scss +0 -120
  214. data/vendor/assets/stylesheets/_table.scss +0 -210
  215. data/vendor/assets/stylesheets/_timepicker.scss +0 -77
  216. data/vendor/assets/stylesheets/_toolbar.scss +0 -130
  217. data/vendor/assets/stylesheets/_tooltip.scss +0 -105
  218. data/vendor/assets/stylesheets/_transition.scss +0 -11
  219. data/vendor/assets/stylesheets/_trunk.scss +0 -147
  220. data/vendor/assets/stylesheets/_typeahead.scss +0 -18
  221. data/vendor/assets/stylesheets/_typography.scss +0 -233
@@ -1,504 +0,0 @@
1
- +function ($) {
2
- 'use strict';
3
-
4
- // TOOLTIP PUBLIC CLASS DEFINITION
5
- // ===============================
6
-
7
- var Tooltip = function (element, options) {
8
- this.type = null
9
- this.options = null
10
- this.enabled = null
11
- this.timeout = null
12
- this.hoverState = null
13
- this.$element = null
14
- this.inState = null
15
-
16
- this.init('tooltip', element, options)
17
- }
18
-
19
- Tooltip.VERSION = '3.3.6'
20
-
21
- Tooltip.TRANSITION_DURATION = 150
22
-
23
- Tooltip.DEFAULTS = {
24
- animation: true,
25
- placement: 'top',
26
- selector: false,
27
- template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
28
- trigger: 'hover focus',
29
- title: '',
30
- delay: 0,
31
- html: false,
32
- container: false,
33
- viewport: {
34
- selector: 'body',
35
- padding: 0
36
- }
37
- }
38
-
39
- Tooltip.prototype.init = function (type, element, options) {
40
- this.enabled = true
41
- this.type = type
42
- this.$element = $(element)
43
- this.options = this.getOptions(options)
44
- this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
45
- this.inState = { click: false, hover: false, focus: false }
46
-
47
- if (this.$element[0] instanceof document.constructor && !this.options.selector) {
48
- throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
49
- }
50
-
51
- var triggers = this.options.trigger.split(' ')
52
-
53
- for (var i = triggers.length; i--;) {
54
- var trigger = triggers[i]
55
-
56
- if (trigger == 'click') {
57
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
58
- } else if (trigger != 'manual') {
59
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
60
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
61
-
62
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
63
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
64
- }
65
- }
66
-
67
- this.options.selector ?
68
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
69
- this.fixTitle()
70
- }
71
-
72
- Tooltip.prototype.getDefaults = function () {
73
- return Tooltip.DEFAULTS
74
- }
75
-
76
- Tooltip.prototype.getOptions = function (options) {
77
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
78
-
79
- if (options.delay && typeof options.delay == 'number') {
80
- options.delay = {
81
- show: options.delay,
82
- hide: options.delay
83
- }
84
- }
85
-
86
- return options
87
- }
88
-
89
- Tooltip.prototype.getDelegateOptions = function () {
90
- var options = {}
91
- var defaults = this.getDefaults()
92
-
93
- this._options && $.each(this._options, function (key, value) {
94
- if (defaults[key] != value) options[key] = value
95
- })
96
-
97
- return options
98
- }
99
-
100
- Tooltip.prototype.enter = function (obj) {
101
- var self = obj instanceof this.constructor ?
102
- obj : $(obj.currentTarget).data('bs.' + this.type)
103
-
104
- if (!self) {
105
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
106
- $(obj.currentTarget).data('bs.' + this.type, self)
107
- }
108
-
109
- if (obj instanceof $.Event) {
110
- self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
111
- }
112
-
113
- if (self.tip().hasClass('in') || self.hoverState == 'in') {
114
- self.hoverState = 'in'
115
- return
116
- }
117
-
118
- clearTimeout(self.timeout)
119
-
120
- self.hoverState = 'in'
121
-
122
- if (!self.options.delay || !self.options.delay.show) return self.show()
123
-
124
- self.timeout = setTimeout(function () {
125
- if (self.hoverState == 'in') self.show()
126
- }, self.options.delay.show)
127
- }
128
-
129
- Tooltip.prototype.isInStateTrue = function () {
130
- for (var key in this.inState) {
131
- if (this.inState[key]) return true
132
- }
133
-
134
- return false
135
- }
136
-
137
- Tooltip.prototype.leave = function (obj) {
138
- var self = obj instanceof this.constructor ?
139
- obj : $(obj.currentTarget).data('bs.' + this.type)
140
-
141
- if (!self) {
142
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
143
- $(obj.currentTarget).data('bs.' + this.type, self)
144
- }
145
-
146
- if (obj instanceof $.Event) {
147
- self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
148
- }
149
-
150
- if (self.isInStateTrue()) return
151
-
152
- clearTimeout(self.timeout)
153
-
154
- self.hoverState = 'out'
155
-
156
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
157
-
158
- self.timeout = setTimeout(function () {
159
- if (self.hoverState == 'out') self.hide()
160
- }, self.options.delay.hide)
161
- }
162
-
163
- Tooltip.prototype.show = function () {
164
- var e = $.Event('show.bs.' + this.type)
165
-
166
- if (this.hasContent() && this.enabled) {
167
- this.$element.trigger(e)
168
-
169
- var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
170
- if (e.isDefaultPrevented() || !inDom) return
171
- var that = this
172
-
173
- var $tip = this.tip()
174
-
175
- var tipId = this.getUID(this.type)
176
-
177
- this.setContent()
178
- $tip.attr('id', tipId)
179
- this.$element.attr('aria-describedby', tipId)
180
-
181
- if (this.options.animation) $tip.addClass('fade')
182
-
183
- var placement = typeof this.options.placement == 'function' ?
184
- this.options.placement.call(this, $tip[0], this.$element[0]) :
185
- this.options.placement
186
-
187
- var autoToken = /\s?auto?\s?/i
188
- var autoPlace = autoToken.test(placement)
189
- if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
190
-
191
- $tip
192
- .detach()
193
- .css({ top: 0, left: 0, display: 'block' })
194
- .addClass(placement)
195
- .data('bs.' + this.type, this)
196
-
197
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
198
- this.$element.trigger('inserted.bs.' + this.type)
199
-
200
- var pos = this.getPosition()
201
- var actualWidth = $tip[0].offsetWidth
202
- var actualHeight = $tip[0].offsetHeight
203
-
204
- if (autoPlace) {
205
- var orgPlacement = placement
206
- var viewportDim = this.getPosition(this.$viewport)
207
-
208
- placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
209
- placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
210
- placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
211
- placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
212
- placement
213
-
214
- $tip
215
- .removeClass(orgPlacement)
216
- .addClass(placement)
217
- }
218
-
219
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
220
-
221
- this.applyPlacement(calculatedOffset, placement)
222
-
223
- var complete = function () {
224
- var prevHoverState = that.hoverState
225
- that.$element.trigger('shown.bs.' + that.type)
226
- that.hoverState = null
227
-
228
- if (prevHoverState == 'out') that.leave(that)
229
- }
230
-
231
- $.support.transition && this.$tip.hasClass('fade') ?
232
- $tip
233
- .one('bsTransitionEnd', complete)
234
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
235
- complete()
236
- }
237
- }
238
-
239
- Tooltip.prototype.applyPlacement = function (offset, placement) {
240
- var $tip = this.tip()
241
- var width = $tip[0].offsetWidth
242
- var height = $tip[0].offsetHeight
243
-
244
- // manually read margins because getBoundingClientRect includes difference
245
- var marginTop = parseInt($tip.css('margin-top'), 10)
246
- var marginLeft = parseInt($tip.css('margin-left'), 10)
247
-
248
- // we must check for NaN for ie 8/9
249
- if (isNaN(marginTop)) marginTop = 0
250
- if (isNaN(marginLeft)) marginLeft = 0
251
-
252
- offset.top += marginTop
253
- offset.left += marginLeft
254
-
255
- // $.fn.offset doesn't round pixel values
256
- // so we use setOffset directly with our own function B-0
257
- $.offset.setOffset($tip[0], $.extend({
258
- using: function (props) {
259
- $tip.css({
260
- top: Math.round(props.top),
261
- left: Math.round(props.left)
262
- })
263
- }
264
- }, offset), 0)
265
-
266
- $tip.addClass('in')
267
-
268
- // check to see if placing tip in new offset caused the tip to resize itself
269
- var actualWidth = $tip[0].offsetWidth
270
- var actualHeight = $tip[0].offsetHeight
271
-
272
- if (placement == 'top' && actualHeight != height) {
273
- offset.top = offset.top + height - actualHeight
274
- }
275
-
276
- var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
277
-
278
- if (delta.left) offset.left += delta.left
279
- else offset.top += delta.top
280
-
281
- var isVertical = /top|bottom/.test(placement)
282
- var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
283
- var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
284
-
285
- $tip.offset(offset)
286
- this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
287
- }
288
-
289
- Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
290
- this.arrow()
291
- .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
292
- .css(isVertical ? 'top' : 'left', '')
293
- }
294
-
295
- Tooltip.prototype.setContent = function () {
296
- var $tip = this.tip()
297
- var title = this.getTitle()
298
-
299
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
300
- $tip.removeClass('fade in top bottom left right')
301
- }
302
-
303
- Tooltip.prototype.hide = function (callback) {
304
- var that = this
305
- var $tip = $(this.$tip)
306
- var e = $.Event('hide.bs.' + this.type)
307
-
308
- function complete() {
309
- if (that.hoverState != 'in') $tip.detach()
310
- that.$element
311
- .removeAttr('aria-describedby')
312
- .trigger('hidden.bs.' + that.type)
313
- callback && callback()
314
- }
315
-
316
- this.$element.trigger(e)
317
-
318
- if (e.isDefaultPrevented()) return
319
-
320
- $tip.removeClass('in')
321
-
322
- $.support.transition && $tip.hasClass('fade') ?
323
- $tip
324
- .one('bsTransitionEnd', complete)
325
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
326
- complete()
327
-
328
- this.hoverState = null
329
-
330
- return this
331
- }
332
-
333
- Tooltip.prototype.fixTitle = function () {
334
- var $e = this.$element
335
- if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
336
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
337
- }
338
- }
339
-
340
- Tooltip.prototype.hasContent = function () {
341
- return this.getTitle()
342
- }
343
-
344
- Tooltip.prototype.getPosition = function ($element) {
345
- $element = $element || this.$element
346
-
347
- var el = $element[0]
348
- var isBody = el.tagName == 'BODY'
349
-
350
- var elRect = el.getBoundingClientRect()
351
- if (elRect.width == null) {
352
- // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
353
- elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
354
- }
355
- var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
356
- var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
357
- var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
358
-
359
- return $.extend({}, elRect, scroll, outerDims, elOffset)
360
- }
361
-
362
- Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
363
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
364
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
365
- placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
366
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
367
-
368
- }
369
-
370
- Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
371
- var delta = { top: 0, left: 0 }
372
- if (!this.$viewport) return delta
373
-
374
- var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
375
- var viewportDimensions = this.getPosition(this.$viewport)
376
-
377
- if (/right|left/.test(placement)) {
378
- var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
379
- var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
380
- if (topEdgeOffset < viewportDimensions.top) { // top overflow
381
- delta.top = viewportDimensions.top - topEdgeOffset
382
- } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
383
- delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
384
- }
385
- } else {
386
- var leftEdgeOffset = pos.left - viewportPadding
387
- var rightEdgeOffset = pos.left + viewportPadding + actualWidth
388
- if (leftEdgeOffset < viewportDimensions.left) { // left overflow
389
- delta.left = viewportDimensions.left - leftEdgeOffset
390
- } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
391
- delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
392
- }
393
- }
394
-
395
- return delta
396
- }
397
-
398
- Tooltip.prototype.getTitle = function () {
399
- var title
400
- var $e = this.$element
401
- var o = this.options
402
-
403
- title = $e.attr('data-original-title')
404
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
405
-
406
- return title
407
- }
408
-
409
- Tooltip.prototype.getUID = function (prefix) {
410
- do prefix += ~~(Math.random() * 1000000)
411
- while (document.getElementById(prefix))
412
- return prefix
413
- }
414
-
415
- Tooltip.prototype.tip = function () {
416
- if (!this.$tip) {
417
- this.$tip = $(this.options.template)
418
- if (this.$tip.length != 1) {
419
- throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
420
- }
421
- }
422
- return this.$tip
423
- }
424
-
425
- Tooltip.prototype.arrow = function () {
426
- return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
427
- }
428
-
429
- Tooltip.prototype.enable = function () {
430
- this.enabled = true
431
- }
432
-
433
- Tooltip.prototype.disable = function () {
434
- this.enabled = false
435
- }
436
-
437
- Tooltip.prototype.toggleEnabled = function () {
438
- this.enabled = !this.enabled
439
- }
440
-
441
- Tooltip.prototype.toggle = function (e) {
442
- var self = this
443
- if (e) {
444
- self = $(e.currentTarget).data('bs.' + this.type)
445
- if (!self) {
446
- self = new this.constructor(e.currentTarget, this.getDelegateOptions())
447
- $(e.currentTarget).data('bs.' + this.type, self)
448
- }
449
- }
450
-
451
- if (e) {
452
- self.inState.click = !self.inState.click
453
- if (self.isInStateTrue()) self.enter(self)
454
- else self.leave(self)
455
- } else {
456
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
457
- }
458
- }
459
-
460
- Tooltip.prototype.destroy = function () {
461
- var that = this
462
- clearTimeout(this.timeout)
463
- this.hide(function () {
464
- that.$element.off('.' + that.type).removeData('bs.' + that.type)
465
- if (that.$tip) {
466
- that.$tip.detach()
467
- }
468
- that.$tip = null
469
- that.$arrow = null
470
- that.$viewport = null
471
- })
472
- }
473
-
474
-
475
- // TOOLTIP PLUGIN DEFINITION
476
- // =========================
477
-
478
- function Plugin(option) {
479
- return this.each(function () {
480
- var $this = $(this)
481
- var data = $this.data('bs.tooltip')
482
- var options = typeof option == 'object' && option
483
-
484
- if (!data && /destroy|hide/.test(option)) return
485
- if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
486
- if (typeof option == 'string') data[option]()
487
- })
488
- }
489
-
490
- var old = $.fn.tooltip
491
-
492
- $.fn.tooltip = Plugin
493
- $.fn.tooltip.Constructor = Tooltip
494
-
495
-
496
- // TOOLTIP NO CONFLICT
497
- // ===================
498
-
499
- $.fn.tooltip.noConflict = function () {
500
- $.fn.tooltip = old
501
- return this
502
- }
503
-
504
- }(jQuery);