active_frontend 13.3.0 → 14.0.0

Sign up to get free protection for your applications and to get access to all the features.
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);