vuetify 2.5.9 → 2.5.13

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 (206) hide show
  1. package/dist/json/attributes.json +58 -66
  2. package/dist/json/tags.json +0 -2
  3. package/dist/json/web-types.json +89 -146
  4. package/dist/vuetify.css +37 -24
  5. package/dist/vuetify.css.map +1 -1
  6. package/dist/vuetify.js +374 -177
  7. package/dist/vuetify.js.map +1 -1
  8. package/dist/vuetify.min.css +2 -2
  9. package/dist/vuetify.min.js +2 -2
  10. package/es5/components/VAppBar/VAppBar.js +3 -0
  11. package/es5/components/VAppBar/VAppBar.js.map +1 -1
  12. package/es5/components/VAutocomplete/VAutocomplete.js +20 -2
  13. package/es5/components/VAutocomplete/VAutocomplete.js.map +1 -1
  14. package/es5/components/VCalendar/mixins/calendar-with-events.js +4 -2
  15. package/es5/components/VCalendar/mixins/calendar-with-events.js.map +1 -1
  16. package/es5/components/VCalendar/mixins/mouse.js +19 -0
  17. package/es5/components/VCalendar/mixins/mouse.js.map +1 -1
  18. package/es5/components/VCalendar/util/timestamp.js +2 -2
  19. package/es5/components/VCalendar/util/timestamp.js.map +1 -1
  20. package/es5/components/VCombobox/VCombobox.js +0 -5
  21. package/es5/components/VCombobox/VCombobox.js.map +1 -1
  22. package/es5/components/VDataTable/VDataTableHeaderMobile.js +2 -2
  23. package/es5/components/VDataTable/VDataTableHeaderMobile.js.map +1 -1
  24. package/es5/components/VDialog/VDialog.js +4 -2
  25. package/es5/components/VDialog/VDialog.js.map +1 -1
  26. package/es5/components/VList/VListItem.js +8 -1
  27. package/es5/components/VList/VListItem.js.map +1 -1
  28. package/es5/components/VOverlay/VOverlay.js +1 -0
  29. package/es5/components/VOverlay/VOverlay.js.map +1 -1
  30. package/es5/components/VRadioGroup/VRadioGroup.js +7 -0
  31. package/es5/components/VRadioGroup/VRadioGroup.js.map +1 -1
  32. package/es5/components/VRangeSlider/VRangeSlider.js +4 -1
  33. package/es5/components/VRangeSlider/VRangeSlider.js.map +1 -1
  34. package/es5/components/VSelect/VSelect.js +1 -1
  35. package/es5/components/VSelect/VSelect.js.map +1 -1
  36. package/es5/components/VSlideGroup/VSlideGroup.js +93 -37
  37. package/es5/components/VSlideGroup/VSlideGroup.js.map +1 -1
  38. package/es5/components/VTabs/VTab.js +15 -4
  39. package/es5/components/VTabs/VTab.js.map +1 -1
  40. package/es5/components/VTabs/VTabsBar.js +1 -1
  41. package/es5/components/VTabs/VTabsBar.js.map +1 -1
  42. package/es5/components/VTextarea/VTextarea.js +11 -2
  43. package/es5/components/VTextarea/VTextarea.js.map +1 -1
  44. package/es5/components/VTooltip/VTooltip.js +2 -5
  45. package/es5/components/VTooltip/VTooltip.js.map +1 -1
  46. package/es5/components/VTreeview/VTreeview.js +1 -1
  47. package/es5/components/VTreeview/VTreeview.js.map +1 -1
  48. package/es5/components/transitions/createTransition.js +1 -5
  49. package/es5/components/transitions/createTransition.js.map +1 -1
  50. package/es5/directives/click-outside/index.js +19 -10
  51. package/es5/directives/click-outside/index.js.map +1 -1
  52. package/es5/directives/intersect/index.js +12 -11
  53. package/es5/directives/intersect/index.js.map +1 -1
  54. package/es5/directives/mutate/index.js +7 -6
  55. package/es5/directives/mutate/index.js.map +1 -1
  56. package/es5/directives/resize/index.js +8 -7
  57. package/es5/directives/resize/index.js.map +1 -1
  58. package/es5/directives/ripple/index.js +2 -3
  59. package/es5/directives/ripple/index.js.map +1 -1
  60. package/es5/directives/scroll/index.js +13 -10
  61. package/es5/directives/scroll/index.js.map +1 -1
  62. package/es5/framework.js +1 -1
  63. package/es5/locale/fr.js +1 -1
  64. package/es5/locale/fr.js.map +1 -1
  65. package/es5/mixins/detachable/index.js +32 -14
  66. package/es5/mixins/detachable/index.js.map +1 -1
  67. package/es5/mixins/intersectable/index.js +5 -2
  68. package/es5/mixins/intersectable/index.js.map +1 -1
  69. package/es5/mixins/menuable/index.js +5 -5
  70. package/es5/mixins/menuable/index.js.map +1 -1
  71. package/es5/mixins/overlayable/index.js +22 -35
  72. package/es5/mixins/overlayable/index.js.map +1 -1
  73. package/es5/mixins/routable/index.js +9 -3
  74. package/es5/mixins/routable/index.js.map +1 -1
  75. package/es5/services/goto/index.js +3 -1
  76. package/es5/services/goto/index.js.map +1 -1
  77. package/es5/util/helpers.js +23 -0
  78. package/es5/util/helpers.js.map +1 -1
  79. package/lib/components/VAppBar/VAppBar.js +4 -0
  80. package/lib/components/VAppBar/VAppBar.js.map +1 -1
  81. package/lib/components/VAutocomplete/VAutocomplete.js +18 -2
  82. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  83. package/lib/components/VCalendar/mixins/calendar-with-events.js +4 -2
  84. package/lib/components/VCalendar/mixins/calendar-with-events.js.map +1 -1
  85. package/lib/components/VCalendar/mixins/mouse.js +19 -0
  86. package/lib/components/VCalendar/mixins/mouse.js.map +1 -1
  87. package/lib/components/VCalendar/util/timestamp.js +2 -2
  88. package/lib/components/VCalendar/util/timestamp.js.map +1 -1
  89. package/lib/components/VCombobox/VCombobox.js +0 -5
  90. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  91. package/lib/components/VDataTable/VDataTableHeaderMobile.js +2 -2
  92. package/lib/components/VDataTable/VDataTableHeaderMobile.js.map +1 -1
  93. package/lib/components/VDialog/VDialog.js +5 -2
  94. package/lib/components/VDialog/VDialog.js.map +1 -1
  95. package/lib/components/VList/VListItem.js +9 -1
  96. package/lib/components/VList/VListItem.js.map +1 -1
  97. package/lib/components/VOverlay/VOverlay.js +1 -0
  98. package/lib/components/VOverlay/VOverlay.js.map +1 -1
  99. package/lib/components/VRadioGroup/VRadioGroup.js +9 -0
  100. package/lib/components/VRadioGroup/VRadioGroup.js.map +1 -1
  101. package/lib/components/VRangeSlider/VRangeSlider.js +4 -1
  102. package/lib/components/VRangeSlider/VRangeSlider.js.map +1 -1
  103. package/lib/components/VSelect/VSelect.js +1 -1
  104. package/lib/components/VSelect/VSelect.js.map +1 -1
  105. package/lib/components/VSlideGroup/VSlideGroup.js +63 -40
  106. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  107. package/lib/components/VTabs/VTab.js +16 -6
  108. package/lib/components/VTabs/VTab.js.map +1 -1
  109. package/lib/components/VTabs/VTabsBar.js +1 -1
  110. package/lib/components/VTabs/VTabsBar.js.map +1 -1
  111. package/lib/components/VTextarea/VTextarea.js +8 -0
  112. package/lib/components/VTextarea/VTextarea.js.map +1 -1
  113. package/lib/components/VTooltip/VTooltip.js +2 -5
  114. package/lib/components/VTooltip/VTooltip.js.map +1 -1
  115. package/lib/components/VTreeview/VTreeview.js +1 -1
  116. package/lib/components/VTreeview/VTreeview.js.map +1 -1
  117. package/lib/components/transitions/createTransition.js +1 -5
  118. package/lib/components/transitions/createTransition.js.map +1 -1
  119. package/lib/directives/click-outside/index.js +20 -10
  120. package/lib/directives/click-outside/index.js.map +1 -1
  121. package/lib/directives/intersect/index.js +12 -10
  122. package/lib/directives/intersect/index.js.map +1 -1
  123. package/lib/directives/mutate/index.js +7 -6
  124. package/lib/directives/mutate/index.js.map +1 -1
  125. package/lib/directives/resize/index.js +6 -5
  126. package/lib/directives/resize/index.js.map +1 -1
  127. package/lib/directives/ripple/index.js +2 -3
  128. package/lib/directives/ripple/index.js.map +1 -1
  129. package/lib/directives/scroll/index.js +9 -6
  130. package/lib/directives/scroll/index.js.map +1 -1
  131. package/lib/framework.js +1 -1
  132. package/lib/locale/fr.js +1 -1
  133. package/lib/locale/fr.js.map +1 -1
  134. package/lib/mixins/detachable/index.js +28 -13
  135. package/lib/mixins/detachable/index.js.map +1 -1
  136. package/lib/mixins/intersectable/index.js +5 -2
  137. package/lib/mixins/intersectable/index.js.map +1 -1
  138. package/lib/mixins/menuable/index.js +4 -4
  139. package/lib/mixins/menuable/index.js.map +1 -1
  140. package/lib/mixins/overlayable/index.js +23 -36
  141. package/lib/mixins/overlayable/index.js.map +1 -1
  142. package/lib/mixins/routable/index.js +12 -3
  143. package/lib/mixins/routable/index.js.map +1 -1
  144. package/lib/services/goto/index.js +3 -1
  145. package/lib/services/goto/index.js.map +1 -1
  146. package/lib/util/helpers.js +21 -0
  147. package/lib/util/helpers.js.map +1 -1
  148. package/package.json +2 -3
  149. package/src/components/VAppBar/VAppBar.ts +3 -0
  150. package/src/components/VAutocomplete/VAutocomplete.ts +15 -2
  151. package/src/components/VCalendar/mixins/calendar-with-events.sass +7 -1
  152. package/src/components/VCalendar/mixins/calendar-with-events.ts +3 -3
  153. package/src/components/VCalendar/mixins/mouse.ts +21 -0
  154. package/src/components/VCalendar/util/__tests__/events.spec.ts +1 -1
  155. package/src/components/VCalendar/util/timestamp.ts +2 -2
  156. package/src/components/VCombobox/VCombobox.ts +0 -5
  157. package/src/components/VCombobox/__tests__/VCombobox-multiple.spec.ts +113 -0
  158. package/src/components/VCombobox/__tests__/VCombobox.spec.ts +30 -0
  159. package/src/components/VDataTable/VDataTableHeaderMobile.ts +3 -1
  160. package/src/components/VDataTable/__tests__/__snapshots__/VDataTable.spec.ts.snap +0 -20
  161. package/src/components/VDialog/VDialog.ts +4 -2
  162. package/src/components/VImg/__tests__/VImg.spec.ts +1 -1
  163. package/src/components/VList/VListItem.sass +2 -1
  164. package/src/components/VList/VListItem.ts +7 -1
  165. package/src/components/VList/__tests__/VListItem.spec.ts +16 -0
  166. package/src/components/VOverlay/VOverlay.ts +1 -0
  167. package/src/components/VRadioGroup/VRadioGroup.ts +8 -0
  168. package/src/components/VRangeSlider/VRangeSlider.ts +3 -1
  169. package/src/components/VSelect/VSelect.ts +1 -1
  170. package/src/components/VSlideGroup/VSlideGroup.ts +75 -35
  171. package/src/components/VSlideGroup/__tests__/VSlideGroup.spec.ts +1 -3
  172. package/src/components/VSnackbar/VSnackbar.sass +2 -0
  173. package/src/components/VStepper/VStepper.sass +5 -1
  174. package/src/components/VStepper/_variables.scss +2 -1
  175. package/src/components/VTabs/VTab.ts +14 -4
  176. package/src/components/VTabs/VTabs.sass +5 -2
  177. package/src/components/VTabs/VTabsBar.ts +2 -2
  178. package/src/components/VTextarea/VTextarea.ts +7 -0
  179. package/src/components/VTooltip/VTooltip.ts +2 -5
  180. package/src/components/VTreeview/VTreeview.ts +1 -1
  181. package/src/components/transitions/createTransition.ts +1 -5
  182. package/src/directives/click-outside/__tests__/click-outside-shadow-dom.spec.ts +9 -6
  183. package/src/directives/click-outside/__tests__/click-outside.spec.ts +7 -4
  184. package/src/directives/click-outside/index.ts +19 -10
  185. package/src/directives/intersect/__tests__/intersect.spec.ts +13 -10
  186. package/src/directives/intersect/index.ts +13 -12
  187. package/src/directives/mutate/__tests__/mutate.spec.ts +36 -17
  188. package/src/directives/mutate/index.ts +8 -7
  189. package/src/directives/resize/__tests__/resize.spec.ts +4 -4
  190. package/src/directives/resize/index.ts +10 -5
  191. package/src/directives/ripple/index.ts +3 -5
  192. package/src/directives/scroll/__tests__/scroll.spec.ts +9 -9
  193. package/src/directives/scroll/index.ts +8 -7
  194. package/src/globals.d.ts +10 -11
  195. package/src/locale/fr.ts +1 -1
  196. package/src/mixins/detachable/index.ts +32 -15
  197. package/src/mixins/intersectable/index.ts +5 -2
  198. package/src/mixins/menuable/index.ts +4 -4
  199. package/src/mixins/overlayable/index.ts +24 -35
  200. package/src/mixins/routable/__tests__/routable.spec.ts +82 -5
  201. package/src/mixins/routable/index.ts +10 -3
  202. package/src/services/goto/index.ts +6 -1
  203. package/src/styles/components/_selection-controls.sass +4 -7
  204. package/src/styles/generic/_transitions.scss +219 -215
  205. package/src/styles/settings/_variables.scss +7 -7
  206. package/src/util/helpers.ts +22 -0
@@ -26,10 +26,6 @@ export default mixins(Colorable, Delayable, Dependent, Menuable, Toggleable).ext
26
26
  default: 0,
27
27
  },
28
28
  disabled: Boolean,
29
- fixed: {
30
- type: Boolean,
31
- default: true,
32
- },
33
29
  openDelay: {
34
30
  type: [Number, String],
35
31
  default: 0,
@@ -97,8 +93,9 @@ export default mixins(Colorable, Delayable, Dependent, Menuable, Toggleable).ext
97
93
 
98
94
  if (this.nudgeTop) top -= parseInt(this.nudgeTop)
99
95
  if (this.nudgeBottom) top += parseInt(this.nudgeBottom)
96
+ if (this.attach === false) top += this.pageYOffset
100
97
 
101
- return `${this.calcYOverflow(top + this.pageYOffset)}px`
98
+ return `${this.calcYOverflow(top)}px`
102
99
  },
103
100
  classes (): object {
104
101
  return {
@@ -228,7 +228,7 @@ export default mixins(
228
228
 
229
229
  this.nodes[key] = node
230
230
 
231
- if (children.length) {
231
+ if (children.length && this.selectionType !== 'independent') {
232
232
  const { isSelected, isIndeterminate } = this.calculateState(key, this.nodes)
233
233
 
234
234
  node.isSelected = isSelected
@@ -87,11 +87,7 @@ export function createSimpleTransition (
87
87
  }
88
88
  if (context.props.hideOnLeave) {
89
89
  data.on!.leave = mergeTransitions(data.on!.leave, (el: HTMLElement) => {
90
- (el as any)._initialDisplay = el.style.display
91
- el.style.display = 'none'
92
- })
93
- data.on!.afterLeave = mergeTransitions(data.on!.afterLeave, (el?: HTMLElement) => {
94
- if (el) el.style.display = (el as any)._initialDisplay || ''
90
+ el.style.setProperty('display', 'none', 'important')
95
91
  })
96
92
  }
97
93
 
@@ -13,7 +13,8 @@ function bootstrap (args?: object) {
13
13
  handler: jest.fn(),
14
14
  ...args,
15
15
  },
16
- }
16
+ } as any
17
+ const vnode = { context: { _uid: 1 } } as any
17
18
 
18
19
  let shadowClickHandler
19
20
  let outsideClickHandler
@@ -37,9 +38,11 @@ function bootstrap (args?: object) {
37
38
  jest.spyOn(window.document, 'removeEventListener')
38
39
  jest.spyOn(shadowRoot, 'removeEventListener')
39
40
 
40
- ClickOutside.inserted(shadowEl as HTMLElement, binding as any)
41
+ ClickOutside.inserted(shadowEl as HTMLElement, binding, vnode)
41
42
 
42
43
  return {
44
+ binding,
45
+ vnode,
43
46
  callback: binding.value.handler,
44
47
  shadowEl: shadowEl as HTMLElement,
45
48
  outsideEl: outsideEl as HTMLElement,
@@ -53,18 +56,18 @@ function bootstrap (args?: object) {
53
56
 
54
57
  describe('click-outside.js within the Shadow DOM', () => {
55
58
  it('should register and unregister handler outside of the shadow DOM', () => {
56
- const { outsideClickHandler, shadowEl } = bootstrap()
59
+ const { outsideClickHandler, shadowEl, binding, vnode } = bootstrap()
57
60
  expect(window.document.addEventListener).toHaveBeenCalledWith('click', outsideClickHandler, true)
58
61
 
59
- ClickOutside.unbind(shadowEl)
62
+ ClickOutside.unbind(shadowEl, binding, vnode)
60
63
  expect(window.document.removeEventListener).toHaveBeenCalledWith('click', outsideClickHandler, true)
61
64
  })
62
65
 
63
66
  it('should register and unregister handler within the shadow DOM', () => {
64
- const { shadowClickHandler, shadowRoot, shadowEl } = bootstrap()
67
+ const { shadowClickHandler, shadowRoot, shadowEl, binding, vnode } = bootstrap()
65
68
  expect(shadowRoot.addEventListener).toHaveBeenCalledWith('click', shadowClickHandler, true)
66
69
 
67
- ClickOutside.unbind(shadowEl)
70
+ ClickOutside.unbind(shadowEl, binding, vnode)
68
71
  expect(shadowRoot.removeEventListener).toHaveBeenCalledWith('click', shadowClickHandler, true)
69
72
  })
70
73
 
@@ -10,7 +10,8 @@ function bootstrap (args?: object) {
10
10
  handler: jest.fn(),
11
11
  ...args,
12
12
  },
13
- }
13
+ } as any
14
+ const vnode = { context: { _uid: 1 } } as any
14
15
 
15
16
  let clickHandler
16
17
  let mousedownHandler
@@ -20,9 +21,11 @@ function bootstrap (args?: object) {
20
21
  })
21
22
  jest.spyOn(window.document, 'removeEventListener')
22
23
 
23
- ClickOutside.inserted(el as HTMLElement, binding as any)
24
+ ClickOutside.inserted(el as HTMLElement, binding, vnode)
24
25
 
25
26
  return {
27
+ binding,
28
+ vnode,
26
29
  callback: binding.value.handler,
27
30
  el: el as HTMLElement,
28
31
  clickHandler,
@@ -32,10 +35,10 @@ function bootstrap (args?: object) {
32
35
 
33
36
  describe('click-outside', () => {
34
37
  it('should register and unregister handler', () => {
35
- const { clickHandler, el } = bootstrap()
38
+ const { clickHandler, el, binding, vnode } = bootstrap()
36
39
  expect(window.document.addEventListener).toHaveBeenCalledWith('click', clickHandler, true)
37
40
 
38
- ClickOutside.unbind(el)
41
+ ClickOutside.unbind(el, binding, vnode)
39
42
  expect(window.document.removeEventListener).toHaveBeenCalledWith('click', clickHandler, true)
40
43
  })
41
44
 
@@ -1,5 +1,6 @@
1
1
  import { attachedRoot } from '../../util/dom'
2
2
  import { VNodeDirective } from 'vue/types/vnode'
3
+ import { VNode } from 'vue'
3
4
 
4
5
  interface ClickOutsideBindingArgs {
5
6
  handler: (e: Event) => void
@@ -52,7 +53,7 @@ function checkIsActive (e: PointerEvent, binding: ClickOutsideDirective): boolea
52
53
  return isActive(e)
53
54
  }
54
55
 
55
- function directive (e: PointerEvent, el: HTMLElement, binding: ClickOutsideDirective) {
56
+ function directive (e: PointerEvent, el: HTMLElement, binding: ClickOutsideDirective, vnode: VNode) {
56
57
  const handler = typeof binding.value === 'function' ? binding.value : binding.value!.handler
57
58
 
58
59
  el._clickOutside!.lastMousedownWasOutside && checkEvent(e, el, binding) && setTimeout(() => {
@@ -65,7 +66,7 @@ function handleShadow (el: HTMLElement, callback: Function): void {
65
66
 
66
67
  callback(document)
67
68
 
68
- if (root instanceof ShadowRoot) {
69
+ if (typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot) {
69
70
  callback(root)
70
71
  }
71
72
  }
@@ -76,8 +77,8 @@ export const ClickOutside = {
76
77
  // sure that the root element is
77
78
  // available, iOS does not support
78
79
  // clicks on body
79
- inserted (el: HTMLElement, binding: ClickOutsideDirective) {
80
- const onClick = (e: Event) => directive(e as PointerEvent, el, binding)
80
+ inserted (el: HTMLElement, binding: ClickOutsideDirective, vnode: VNode) {
81
+ const onClick = (e: Event) => directive(e as PointerEvent, el, binding, vnode)
81
82
  const onMousedown = (e: Event) => {
82
83
  el._clickOutside!.lastMousedownWasOutside = checkEvent(e as PointerEvent, el, binding)
83
84
  }
@@ -87,23 +88,31 @@ export const ClickOutside = {
87
88
  app.addEventListener('mousedown', onMousedown, true)
88
89
  })
89
90
 
90
- el._clickOutside = {
91
- lastMousedownWasOutside: true,
91
+ if (!el._clickOutside) {
92
+ el._clickOutside = {
93
+ lastMousedownWasOutside: true,
94
+ }
95
+ }
96
+
97
+ el._clickOutside[vnode.context!._uid] = {
92
98
  onClick,
93
99
  onMousedown,
94
100
  }
95
101
  },
96
102
 
97
- unbind (el: HTMLElement) {
103
+ unbind (el: HTMLElement, binding: ClickOutsideDirective, vnode: VNode) {
98
104
  if (!el._clickOutside) return
99
105
 
100
106
  handleShadow(el, (app: HTMLElement) => {
101
107
  if (!app || !el._clickOutside) return
102
- app.removeEventListener('click', el._clickOutside.onClick, true)
103
- app.removeEventListener('mousedown', el._clickOutside.onMousedown, true)
108
+
109
+ const { onClick, onMousedown } = el._clickOutside[vnode.context!._uid]
110
+
111
+ app.removeEventListener('click', onClick, true)
112
+ app.removeEventListener('mousedown', onMousedown, true)
104
113
  })
105
114
 
106
- delete el._clickOutside
115
+ delete el._clickOutside[vnode.context!._uid]
107
116
  },
108
117
  }
109
118
 
@@ -10,16 +10,19 @@ describe('intersect', () => {
10
10
  Intersect.inserted(el, {
11
11
  value: callback,
12
12
  modifiers: { quiet: true },
13
- } as any)
13
+ } as any, { context: { _uid: 1 } } as any)
14
14
 
15
15
  expect((el as any)._observe).toBeTruthy()
16
16
  expect(callback).not.toHaveBeenCalled()
17
17
 
18
18
  document.body.removeChild(el)
19
19
 
20
- Intersect.unbind(el)
20
+ Intersect.unbind(el, {
21
+ value: callback,
22
+ modifiers: { quiet: true },
23
+ } as any, { context: { _uid: 1 } } as any)
21
24
 
22
- expect((el as any)._observe).toBeFalsy()
25
+ expect((el as any)._observe[1]).toBeFalsy()
23
26
  })
24
27
 
25
28
  it('should invoke callback once and unbind', () => {
@@ -32,19 +35,19 @@ describe('intersect', () => {
32
35
  Intersect.inserted(el, {
33
36
  value: callback,
34
37
  modifiers: { once: true },
35
- } as any)
38
+ } as any, { context: { _uid: 1 } } as any)
36
39
 
37
- expect(callback).toHaveBeenCalledTimes(1)
38
- expect((el as any)._observe).toBeTruthy()
40
+ expect(callback).toHaveBeenCalledTimes(0)
41
+ expect((el as any)._observe[1]).toBeTruthy()
39
42
 
40
- ;(el as any)._observe.observer.callback([{ isIntersecting: false }])
43
+ ;(el as any)._observe[1].observer.callback([{ isIntersecting: false }])
41
44
 
42
45
  expect(callback).toHaveBeenCalledTimes(1)
43
- expect((el as any)._observe).toBeTruthy()
46
+ expect((el as any)._observe[1]).toBeTruthy()
44
47
 
45
- ;(el as any)._observe.observer.callback([{ isIntersecting: true }])
48
+ ;(el as any)._observe[1].observer.callback([{ isIntersecting: true }])
46
49
 
47
50
  expect(callback).toHaveBeenCalledTimes(2)
48
- expect((el as any)._observe).toBeFalsy()
51
+ expect((el as any)._observe[1]).toBeFalsy()
49
52
  })
50
53
  })
@@ -1,4 +1,5 @@
1
1
  import { VNodeDirective } from 'vue/types/vnode'
2
+ import { VNode } from 'vue'
2
3
 
3
4
  type ObserveHandler = (
4
5
  entries: IntersectionObserverEntry[],
@@ -14,7 +15,7 @@ interface ObserveVNodeDirective extends Omit<VNodeDirective, 'modifiers'> {
14
15
  }
15
16
  }
16
17
 
17
- function inserted (el: HTMLElement, binding: ObserveVNodeDirective) {
18
+ function inserted (el: HTMLElement, binding: ObserveVNodeDirective, vnode: VNode) {
18
19
  if (typeof window === 'undefined' || !('IntersectionObserver' in window)) return
19
20
 
20
21
  const modifiers = binding.modifiers || {}
@@ -26,9 +27,9 @@ function inserted (el: HTMLElement, binding: ObserveVNodeDirective) {
26
27
  entries: IntersectionObserverEntry[] = [],
27
28
  observer: IntersectionObserver
28
29
  ) => {
29
- /* istanbul ignore if */
30
- if (!el._observe) return // Just in case, should never fire
30
+ if (!el._observe?.[vnode.context!._uid]) return // Just in case, should never fire
31
31
 
32
+ const _observe = el._observe[vnode.context!._uid]
32
33
  const isIntersecting = entries.some(entry => entry.isIntersecting)
33
34
 
34
35
  // If is not quiet or has already been
@@ -36,31 +37,31 @@ function inserted (el: HTMLElement, binding: ObserveVNodeDirective) {
36
37
  if (
37
38
  handler && (
38
39
  !modifiers.quiet ||
39
- el._observe.init
40
+ _observe.init
40
41
  ) && (
41
42
  !modifiers.once ||
42
43
  isIntersecting ||
43
- !el._observe.init
44
+ _observe.init
44
45
  )
45
46
  ) {
46
47
  handler(entries, observer, isIntersecting)
47
48
  }
48
49
 
49
- if (isIntersecting && modifiers.once) unbind(el)
50
- else el._observe.init = true
50
+ if (isIntersecting && modifiers.once) unbind(el, binding, vnode)
51
+ else _observe.init = true
51
52
  }, options)
52
53
 
53
- el._observe = { init: false, observer }
54
+ el._observe = Object(el._observe)
55
+ el._observe![vnode.context!._uid] = { init: false, observer }
54
56
 
55
57
  observer.observe(el)
56
58
  }
57
59
 
58
- function unbind (el: HTMLElement) {
59
- /* istanbul ignore if */
60
+ function unbind (el: HTMLElement, binding: ObserveVNodeDirective, vnode: VNode) {
60
61
  if (!el._observe) return
61
62
 
62
- el._observe.observer.unobserve(el)
63
- delete el._observe
63
+ el._observe[vnode.context!._uid].observer.unobserve(el)
64
+ delete el._observe[vnode.context!._uid]
64
65
  }
65
66
 
66
67
  export const Intersect = {
@@ -29,16 +29,18 @@ describe('mutate.ts', () => {
29
29
 
30
30
  Mutate.inserted(el, {
31
31
  value: callback,
32
- } as any)
32
+ } as any, { context: { _uid: 1 } } as any)
33
33
 
34
34
  expect(el._mutate).toBeTruthy()
35
35
  expect(callback).not.toHaveBeenCalled()
36
36
 
37
37
  document.body.removeChild(el)
38
38
 
39
- Mutate.unbind(el)
39
+ Mutate.unbind(el, {
40
+ value: callback,
41
+ } as any, { context: { _uid: 1 } } as any)
40
42
 
41
- expect(el._mutate).toBeFalsy()
43
+ expect(el._mutate[1]).toBeFalsy()
42
44
  })
43
45
 
44
46
  it('should fire event on mutation', () => {
@@ -48,15 +50,17 @@ describe('mutate.ts', () => {
48
50
 
49
51
  Mutate.inserted(el, {
50
52
  value: callback,
51
- } as any)
53
+ } as any, { context: { _uid: 1 } } as any)
52
54
 
53
- el._mutate.observer.trigger([{}])
55
+ el._mutate[1].observer.trigger([{}])
54
56
 
55
57
  expect(callback).toHaveBeenCalledTimes(1)
56
58
 
57
59
  document.body.removeChild(el)
58
60
 
59
- Mutate.unbind(el)
61
+ Mutate.unbind(el, {
62
+ value: callback,
63
+ } as any, { context: { _uid: 1 } } as any)
60
64
  })
61
65
 
62
66
  it('should fire event once', () => {
@@ -69,12 +73,12 @@ describe('mutate.ts', () => {
69
73
  modifiers: {
70
74
  once: true,
71
75
  },
72
- } as any)
76
+ } as any, { context: { _uid: 1 } } as any)
73
77
 
74
- el._mutate.observer.trigger([{}])
78
+ el._mutate[1].observer.trigger([{}])
75
79
 
76
80
  expect(callback).toHaveBeenCalledTimes(1)
77
- expect(el._mutate).toBeFalsy()
81
+ expect(el._mutate[1]).toBeFalsy()
78
82
 
79
83
  document.body.removeChild(el)
80
84
  })
@@ -92,16 +96,24 @@ describe('mutate.ts', () => {
92
96
  },
93
97
  handler: callback,
94
98
  },
95
- } as any)
99
+ } as any, { context: { _uid: 1 } } as any)
96
100
 
97
- el._mutate.observer.trigger([{}])
101
+ el._mutate[1].observer.trigger([{}])
98
102
 
99
103
  expect(callback).toHaveBeenCalledTimes(1)
100
- expect(el._mutate.observer._observe).toHaveBeenLastCalledWith({ attributes: false, subtree: true })
104
+ expect(el._mutate[1].observer._observe).toHaveBeenLastCalledWith({ attributes: false, subtree: true })
101
105
 
102
106
  document.body.removeChild(el)
103
107
 
104
- Mutate.unbind(el)
108
+ Mutate.unbind(el, {
109
+ value: {
110
+ options: {
111
+ attributes: false,
112
+ subtree: true,
113
+ },
114
+ handler: callback,
115
+ },
116
+ } as any, { context: { _uid: 1 } } as any)
105
117
  })
106
118
 
107
119
  it('should work with observer modifiers', () => {
@@ -116,15 +128,22 @@ describe('mutate.ts', () => {
116
128
  child: true,
117
129
  sub: true,
118
130
  },
119
- } as any)
131
+ } as any, { context: { _uid: 1 } } as any)
120
132
 
121
- el._mutate.observer.trigger([{}])
133
+ el._mutate[1].observer.trigger([{}])
122
134
 
123
135
  expect(callback).toHaveBeenCalledTimes(1)
124
- expect(el._mutate.observer._observe).toHaveBeenLastCalledWith({ attributes: true, childList: true, subtree: true })
136
+ expect(el._mutate[1].observer._observe).toHaveBeenLastCalledWith({ attributes: true, childList: true, subtree: true })
125
137
 
126
138
  document.body.removeChild(el)
127
139
 
128
- Mutate.unbind(el)
140
+ Mutate.unbind(el, {
141
+ value: callback,
142
+ modifiers: {
143
+ attr: true,
144
+ child: true,
145
+ sub: true,
146
+ },
147
+ } as any, { context: { _uid: 1 } } as any)
129
148
  })
130
149
  })
@@ -1,4 +1,4 @@
1
- import { VNodeDirective } from 'vue'
1
+ import { VNode, VNodeDirective } from 'vue'
2
2
 
3
3
  type MutateHandler = (
4
4
  mutationsList: MutationRecord[],
@@ -16,7 +16,7 @@ interface MutateVNodeDirective extends Omit<VNodeDirective, 'modifiers'> {
16
16
  }
17
17
  }
18
18
 
19
- function inserted (el: HTMLElement, binding: MutateVNodeDirective) {
19
+ function inserted (el: HTMLElement, binding: MutateVNodeDirective, vnode: VNode) {
20
20
  const modifiers = binding.modifiers || {}
21
21
  const value = binding.value
22
22
  const callback = typeof value === 'object' ? value.handler : value!
@@ -52,19 +52,20 @@ function inserted (el: HTMLElement, binding: MutateVNodeDirective) {
52
52
  callback(mutationsList, observer)
53
53
 
54
54
  // If has the once modifier, unbind
55
- once && unbind(el)
55
+ once && unbind(el, binding, vnode)
56
56
  })
57
57
 
58
58
  observer.observe(el, options)
59
- el._mutate = { observer }
59
+ el._mutate = Object(el._mutate)
60
+ el._mutate![vnode.context!._uid] = { observer }
60
61
  }
61
62
 
62
- function unbind (el: HTMLElement) {
63
+ function unbind (el: HTMLElement, binding: MutateVNodeDirective, vnode: VNode) {
63
64
  /* istanbul ignore if */
64
65
  if (!el._mutate) return
65
66
 
66
- el._mutate.observer.disconnect()
67
- delete el._mutate
67
+ el._mutate[vnode.context!._uid].observer.disconnect()
68
+ delete el._mutate[vnode.context!._uid]
68
69
  }
69
70
 
70
71
  export const Mutate = {
@@ -8,10 +8,10 @@ describe('resize.ts', () => {
8
8
  jest.spyOn(window, 'removeEventListener')
9
9
  const el = {}
10
10
 
11
- Resize.inserted(el as HTMLElement, { value: callback } as any)
11
+ Resize.inserted(el as HTMLElement, { value: callback } as any, { context: { _uid: 1 } } as any)
12
12
  expect(callback).toHaveBeenCalled()
13
13
  expect(window.addEventListener).toHaveBeenCalledWith('resize', callback, { passive: true })
14
- Resize.unbind(el as HTMLElement)
14
+ Resize.unbind(el as HTMLElement, { value: callback } as any, { context: { _uid: 1 } } as any)
15
15
  expect(window.removeEventListener).toHaveBeenCalledWith('resize', callback, { passive: true })
16
16
  })
17
17
 
@@ -21,10 +21,10 @@ describe('resize.ts', () => {
21
21
  jest.spyOn(window, 'removeEventListener')
22
22
  const el = {}
23
23
 
24
- Resize.inserted(el as HTMLElement, { value: callback, modifiers: { quiet: true } } as any)
24
+ Resize.inserted(el as HTMLElement, { value: callback, modifiers: { quiet: true } } as any, { context: { _uid: 1 } } as any)
25
25
  expect(callback).not.toHaveBeenCalled()
26
26
  expect(window.addEventListener).toHaveBeenCalledWith('resize', callback, { passive: true })
27
- Resize.unbind(el as HTMLElement)
27
+ Resize.unbind(el as HTMLElement, { value: callback, modifiers: { quiet: true } } as any, { context: { _uid: 1 } } as any)
28
28
  expect(window.removeEventListener).toHaveBeenCalledWith('resize', callback, { passive: true })
29
29
  })
30
30
  })
@@ -1,16 +1,19 @@
1
1
  import { VNodeDirective } from 'vue/types/vnode'
2
+ import { VNode } from 'vue'
2
3
 
3
4
  interface ResizeVNodeDirective extends VNodeDirective {
4
5
  value?: () => void
5
6
  options?: boolean | AddEventListenerOptions
6
7
  }
7
8
 
8
- function inserted (el: HTMLElement, binding: ResizeVNodeDirective) {
9
+ function inserted (el: HTMLElement, binding: ResizeVNodeDirective, vnode: VNode) {
9
10
  const callback = binding.value!
10
11
  const options = binding.options || { passive: true }
11
12
 
12
13
  window.addEventListener('resize', callback, options)
13
- el._onResize = {
14
+
15
+ el._onResize = Object(el._onResize)
16
+ el._onResize![vnode.context!._uid] = {
14
17
  callback,
15
18
  options,
16
19
  }
@@ -20,12 +23,14 @@ function inserted (el: HTMLElement, binding: ResizeVNodeDirective) {
20
23
  }
21
24
  }
22
25
 
23
- function unbind (el: HTMLElement) {
26
+ function unbind (el: HTMLElement, binding: ResizeVNodeDirective, vnode: VNode) {
24
27
  if (!el._onResize) return
25
28
 
26
- const { callback, options } = el._onResize
29
+ const { callback, options } = el._onResize[vnode.context!._uid]
30
+
27
31
  window.removeEventListener('resize', callback, options)
28
- delete el._onResize
32
+
33
+ delete el._onResize[vnode.context!._uid]
29
34
  }
30
35
 
31
36
  export const Resize = {
@@ -8,9 +8,7 @@ import { keyCodes } from '../../util/helpers'
8
8
  // Types
9
9
  import { VNode, VNodeDirective } from 'vue'
10
10
 
11
- const rippleStop = Symbol('rippleStop')
12
-
13
- type VuetifyRippleEvent = (MouseEvent | TouchEvent | KeyboardEvent) & { [rippleStop]?: boolean }
11
+ type VuetifyRippleEvent = (MouseEvent | TouchEvent | KeyboardEvent) & { rippleStop?: boolean }
14
12
 
15
13
  const DELAY_RIPPLE = 80
16
14
 
@@ -162,10 +160,10 @@ function rippleShow (e: VuetifyRippleEvent) {
162
160
  const value: RippleOptions = {}
163
161
  const element = e.currentTarget as HTMLElement
164
162
 
165
- if (!element || !element._ripple || element._ripple.touched || e[rippleStop]) return
163
+ if (!element || !element._ripple || element._ripple.touched || e.rippleStop) return
166
164
 
167
165
  // Don't allow the event to trigger ripples on any other elements
168
- e[rippleStop] = true
166
+ e.rippleStop = true
169
167
 
170
168
  if (isTouchEvent(e)) {
171
169
  element._ripple.touched = true
@@ -12,7 +12,7 @@ describe('scroll.ts', () => {
12
12
  let vnode
13
13
 
14
14
  beforeEach(() => {
15
- vnode = null as any
15
+ vnode = { context: { _uid: 1 } } as any
16
16
  options = { passive: true }
17
17
  binding = {
18
18
  value: jest.fn(),
@@ -32,7 +32,7 @@ describe('scroll.ts', () => {
32
32
  inserted(el, binding, vnode, vnode)
33
33
 
34
34
  expect(spyOnWindowAddListener).toHaveBeenCalledWith('scroll', binding.value, options)
35
- expect(el._onScroll).toEqual({
35
+ expect(el._onScroll[1]).toEqual({
36
36
  handler: binding.value,
37
37
  options,
38
38
  target: window,
@@ -41,7 +41,7 @@ describe('scroll.ts', () => {
41
41
  unbind(el, binding, vnode, vnode)
42
42
 
43
43
  expect(spyOnWindowRemoveListener).toHaveBeenCalledWith('scroll', binding.value, options)
44
- expect(el._onScroll).toBeUndefined()
44
+ expect(el._onScroll[1]).toBeUndefined()
45
45
  })
46
46
 
47
47
  it('should work with a provided valid querySelector string', () => {
@@ -66,7 +66,7 @@ describe('scroll.ts', () => {
66
66
  inserted(el, binding, vnode, vnode)
67
67
 
68
68
  expect(spyOnFooAddListener).toHaveBeenCalledWith('scroll', binding.value, options)
69
- expect(el._onScroll).toEqual({
69
+ expect(el._onScroll[1]).toEqual({
70
70
  handler: binding.value,
71
71
  options,
72
72
  target,
@@ -75,7 +75,7 @@ describe('scroll.ts', () => {
75
75
  unbind(el, binding, vnode, vnode)
76
76
 
77
77
  expect(spyOnFooRemoveListener).toHaveBeenCalledWith('scroll', binding.value, options)
78
- expect(el._onScroll).toBeUndefined()
78
+ expect(el._onScroll[1]).toBeUndefined()
79
79
 
80
80
  document.body.removeChild(target)
81
81
  })
@@ -86,7 +86,7 @@ describe('scroll.ts', () => {
86
86
  inserted(el, binding, vnode, vnode)
87
87
 
88
88
  expect(el.addEventListener).toHaveBeenCalledWith('scroll', binding.value, options)
89
- expect(el._onScroll).toEqual({
89
+ expect(el._onScroll[1]).toEqual({
90
90
  handler: binding.value,
91
91
  options,
92
92
  target: undefined,
@@ -95,7 +95,7 @@ describe('scroll.ts', () => {
95
95
  unbind(el, binding, vnode, vnode)
96
96
 
97
97
  expect(el.removeEventListener).toHaveBeenCalledWith('scroll', binding.value, options)
98
- expect(el._onScroll).toBeUndefined()
98
+ expect(el._onScroll[1]).toBeUndefined()
99
99
  })
100
100
 
101
101
  it('should not remove listeners if no _onScroll property present', () => {
@@ -111,7 +111,7 @@ describe('scroll.ts', () => {
111
111
 
112
112
  inserted(el, binding, vnode, vnode)
113
113
 
114
- expect(el._onScroll).toEqual({
114
+ expect(el._onScroll[1]).toEqual({
115
115
  handler,
116
116
  target: window,
117
117
  options: { passive: true },
@@ -121,7 +121,7 @@ describe('scroll.ts', () => {
121
121
 
122
122
  inserted(el, binding, vnode, vnode)
123
123
 
124
- expect(el._onScroll).toEqual({
124
+ expect(el._onScroll[1]).toEqual({
125
125
  handler,
126
126
  target: window,
127
127
  options: { passive: false },