vuetify 2.5.12 → 2.6.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 (197) hide show
  1. package/dist/json/attributes.json +152 -0
  2. package/dist/json/tags.json +71 -14
  3. package/dist/json/web-types.json +603 -135
  4. package/dist/vuetify.css +137 -3
  5. package/dist/vuetify.css.map +1 -1
  6. package/dist/vuetify.js +940 -285
  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/VAutocomplete/VAutocomplete.js +1 -0
  11. package/es5/components/VAutocomplete/VAutocomplete.js.map +1 -1
  12. package/es5/components/VCalendar/VCalendar.js +2 -2
  13. package/es5/components/VCalendar/VCalendar.js.map +1 -1
  14. package/es5/components/VCalendar/mixins/calendar-with-events.js +6 -4
  15. package/es5/components/VCalendar/mixins/calendar-with-events.js.map +1 -1
  16. package/es5/components/VCalendar/mixins/mouse.js +1 -1
  17. package/es5/components/VCalendar/mixins/mouse.js.map +1 -1
  18. package/es5/components/VDataTable/Row.js +23 -7
  19. package/es5/components/VDataTable/Row.js.map +1 -1
  20. package/es5/components/VDatePicker/mixins/date-picker-table.js +13 -3
  21. package/es5/components/VDatePicker/mixins/date-picker-table.js.map +1 -1
  22. package/es5/components/VInput/VInput.js +3 -1
  23. package/es5/components/VInput/VInput.js.map +1 -1
  24. package/es5/components/VMenu/VMenu.js +1 -1
  25. package/es5/components/VMenu/VMenu.js.map +1 -1
  26. package/es5/components/VOtpInput/VOtpInput.js +375 -0
  27. package/es5/components/VOtpInput/VOtpInput.js.map +1 -0
  28. package/es5/components/VOtpInput/index.js +20 -0
  29. package/es5/components/VOtpInput/index.js.map +1 -0
  30. package/es5/components/VOverlay/VOverlay.js +1 -0
  31. package/es5/components/VOverlay/VOverlay.js.map +1 -1
  32. package/es5/components/VRadioGroup/VRadioGroup.js +7 -0
  33. package/es5/components/VRadioGroup/VRadioGroup.js.map +1 -1
  34. package/es5/components/VRangeSlider/VRangeSlider.js +4 -1
  35. package/es5/components/VRangeSlider/VRangeSlider.js.map +1 -1
  36. package/es5/components/VSlideGroup/VSlideGroup.js +8 -1
  37. package/es5/components/VSlideGroup/VSlideGroup.js.map +1 -1
  38. package/es5/components/VSnackbar/VSnackbar.js +4 -8
  39. package/es5/components/VSnackbar/VSnackbar.js.map +1 -1
  40. package/es5/components/VTabs/VTab.js +6 -3
  41. package/es5/components/VTabs/VTab.js.map +1 -1
  42. package/es5/components/VTextField/VTextField.js +6 -1
  43. package/es5/components/VTextField/VTextField.js.map +1 -1
  44. package/es5/components/VTooltip/VTooltip.js +0 -1
  45. package/es5/components/VTooltip/VTooltip.js.map +1 -1
  46. package/es5/components/VTreeview/VTreeview.js +2 -1
  47. package/es5/components/VTreeview/VTreeview.js.map +1 -1
  48. package/es5/components/VTreeview/VTreeviewNode.js +3 -1
  49. package/es5/components/VTreeview/VTreeviewNode.js.map +1 -1
  50. package/es5/components/index.js +13 -0
  51. package/es5/components/index.js.map +1 -1
  52. package/es5/components/transitions/createTransition.js +0 -20
  53. package/es5/components/transitions/createTransition.js.map +1 -1
  54. package/es5/directives/click-outside/index.js +21 -10
  55. package/es5/directives/click-outside/index.js.map +1 -1
  56. package/es5/directives/intersect/index.js +16 -12
  57. package/es5/directives/intersect/index.js.map +1 -1
  58. package/es5/directives/mutate/index.js +10 -8
  59. package/es5/directives/mutate/index.js.map +1 -1
  60. package/es5/directives/resize/index.js +11 -8
  61. package/es5/directives/resize/index.js.map +1 -1
  62. package/es5/directives/scroll/index.js +13 -10
  63. package/es5/directives/scroll/index.js.map +1 -1
  64. package/es5/framework.js +1 -1
  65. package/es5/locale/da.js +77 -0
  66. package/es5/locale/da.js.map +1 -0
  67. package/es5/locale/index.js +8 -0
  68. package/es5/locale/index.js.map +1 -1
  69. package/es5/mixins/intersectable/index.js +11 -2
  70. package/es5/mixins/intersectable/index.js.map +1 -1
  71. package/es5/mixins/overlayable/index.js +21 -11
  72. package/es5/mixins/overlayable/index.js.map +1 -1
  73. package/es5/util/helpers.js +8 -1
  74. package/es5/util/helpers.js.map +1 -1
  75. package/lib/components/VAutocomplete/VAutocomplete.js +1 -0
  76. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  77. package/lib/components/VCalendar/VCalendar.js +2 -2
  78. package/lib/components/VCalendar/VCalendar.js.map +1 -1
  79. package/lib/components/VCalendar/mixins/calendar-with-events.js +5 -3
  80. package/lib/components/VCalendar/mixins/calendar-with-events.js.map +1 -1
  81. package/lib/components/VCalendar/mixins/mouse.js +1 -1
  82. package/lib/components/VCalendar/mixins/mouse.js.map +1 -1
  83. package/lib/components/VDataTable/Row.js +13 -6
  84. package/lib/components/VDataTable/Row.js.map +1 -1
  85. package/lib/components/VDatePicker/mixins/date-picker-table.js +12 -2
  86. package/lib/components/VDatePicker/mixins/date-picker-table.js.map +1 -1
  87. package/lib/components/VInput/VInput.js +2 -0
  88. package/lib/components/VInput/VInput.js.map +1 -1
  89. package/lib/components/VMenu/VMenu.js +1 -1
  90. package/lib/components/VMenu/VMenu.js.map +1 -1
  91. package/lib/components/VOtpInput/VOtpInput.js +342 -0
  92. package/lib/components/VOtpInput/VOtpInput.js.map +1 -0
  93. package/lib/components/VOtpInput/index.js +4 -0
  94. package/lib/components/VOtpInput/index.js.map +1 -0
  95. package/lib/components/VOverlay/VOverlay.js +1 -0
  96. package/lib/components/VOverlay/VOverlay.js.map +1 -1
  97. package/lib/components/VRadioGroup/VRadioGroup.js +9 -0
  98. package/lib/components/VRadioGroup/VRadioGroup.js.map +1 -1
  99. package/lib/components/VRangeSlider/VRangeSlider.js +4 -1
  100. package/lib/components/VRangeSlider/VRangeSlider.js.map +1 -1
  101. package/lib/components/VSlideGroup/VSlideGroup.js +9 -1
  102. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  103. package/lib/components/VSnackbar/VSnackbar.js +4 -8
  104. package/lib/components/VSnackbar/VSnackbar.js.map +1 -1
  105. package/lib/components/VTabs/VTab.js +7 -5
  106. package/lib/components/VTabs/VTab.js.map +1 -1
  107. package/lib/components/VTextField/VTextField.js +8 -1
  108. package/lib/components/VTextField/VTextField.js.map +1 -1
  109. package/lib/components/VTooltip/VTooltip.js +0 -1
  110. package/lib/components/VTooltip/VTooltip.js.map +1 -1
  111. package/lib/components/VTreeview/VTreeview.js +2 -1
  112. package/lib/components/VTreeview/VTreeview.js.map +1 -1
  113. package/lib/components/VTreeview/VTreeviewNode.js +3 -1
  114. package/lib/components/VTreeview/VTreeviewNode.js.map +1 -1
  115. package/lib/components/index.js +1 -0
  116. package/lib/components/index.js.map +1 -1
  117. package/lib/components/transitions/createTransition.js +0 -6
  118. package/lib/components/transitions/createTransition.js.map +1 -1
  119. package/lib/directives/click-outside/index.js +22 -10
  120. package/lib/directives/click-outside/index.js.map +1 -1
  121. package/lib/directives/intersect/index.js +16 -12
  122. package/lib/directives/intersect/index.js.map +1 -1
  123. package/lib/directives/mutate/index.js +10 -8
  124. package/lib/directives/mutate/index.js.map +1 -1
  125. package/lib/directives/resize/index.js +9 -6
  126. package/lib/directives/resize/index.js.map +1 -1
  127. package/lib/directives/scroll/index.js +9 -6
  128. package/lib/directives/scroll/index.js.map +1 -1
  129. package/lib/framework.js +1 -1
  130. package/lib/locale/da.js +70 -0
  131. package/lib/locale/da.js.map +1 -0
  132. package/lib/locale/index.js +1 -0
  133. package/lib/locale/index.js.map +1 -1
  134. package/lib/mixins/intersectable/index.js +9 -2
  135. package/lib/mixins/intersectable/index.js.map +1 -1
  136. package/lib/mixins/overlayable/index.js +21 -11
  137. package/lib/mixins/overlayable/index.js.map +1 -1
  138. package/lib/util/helpers.js +8 -1
  139. package/lib/util/helpers.js.map +1 -1
  140. package/package.json +2 -2
  141. package/src/components/VAutocomplete/VAutocomplete.ts +2 -0
  142. package/src/components/VAutocomplete/__tests__/VAutocomplete3.spec.ts +16 -0
  143. package/src/components/VCalendar/VCalendar.ts +2 -2
  144. package/src/components/VCalendar/VCalendarCategory.sass +67 -0
  145. package/src/components/VCalendar/_variables.scss +4 -0
  146. package/src/components/VCalendar/mixins/calendar-with-events.sass +7 -1
  147. package/src/components/VCalendar/mixins/calendar-with-events.ts +4 -4
  148. package/src/components/VCalendar/mixins/mouse.ts +1 -1
  149. package/src/components/VDataTable/Row.ts +21 -14
  150. package/src/components/VDatePicker/__tests__/VDatePicker.date.spec.ts +16 -0
  151. package/src/components/VDatePicker/__tests__/VDatePicker.month.spec.ts +16 -0
  152. package/src/components/VDatePicker/mixins/date-picker-table.ts +24 -2
  153. package/src/components/VDialog/VDialog.sass +1 -1
  154. package/src/components/VImg/__tests__/VImg.spec.ts +1 -1
  155. package/src/components/VInput/VInput.sass +8 -0
  156. package/src/components/VInput/VInput.ts +2 -0
  157. package/src/components/VMenu/VMenu.ts +1 -1
  158. package/src/components/VOtpInput/VOtpInput.sass +37 -0
  159. package/src/components/VOtpInput/VOtpInput.ts +322 -0
  160. package/src/components/VOtpInput/__tests__/VOtpInput.spec.ts +294 -0
  161. package/src/components/VOtpInput/_variables.scss +4 -0
  162. package/src/components/VOtpInput/index.ts +4 -0
  163. package/src/components/VOverlay/VOverlay.ts +1 -0
  164. package/src/components/VRadioGroup/VRadioGroup.ts +8 -0
  165. package/src/components/VRangeSlider/VRangeSlider.ts +3 -1
  166. package/src/components/VSlideGroup/VSlideGroup.ts +14 -1
  167. package/src/components/VSnackbar/VSnackbar.ts +3 -7
  168. package/src/components/VSnackbar/__tests__/VSnackbar.spec.ts +4 -1
  169. package/src/components/VTabs/VTab.ts +6 -4
  170. package/src/components/VTextField/VTextField.ts +8 -3
  171. package/src/components/VTooltip/VTooltip.sass +4 -1
  172. package/src/components/VTooltip/VTooltip.ts +0 -1
  173. package/src/components/VTooltip/_variables.scss +1 -0
  174. package/src/components/VTreeview/VTreeview.ts +2 -1
  175. package/src/components/VTreeview/VTreeviewNode.ts +3 -1
  176. package/src/components/index.ts +1 -0
  177. package/src/components/transitions/createTransition.ts +0 -8
  178. package/src/directives/click-outside/__tests__/click-outside-shadow-dom.spec.ts +9 -6
  179. package/src/directives/click-outside/__tests__/click-outside.spec.ts +7 -4
  180. package/src/directives/click-outside/index.ts +19 -10
  181. package/src/directives/intersect/__tests__/intersect.spec.ts +13 -10
  182. package/src/directives/intersect/index.ts +15 -13
  183. package/src/directives/mutate/__tests__/mutate.spec.ts +36 -17
  184. package/src/directives/mutate/index.ts +9 -9
  185. package/src/directives/resize/__tests__/resize.spec.ts +4 -4
  186. package/src/directives/resize/index.ts +11 -6
  187. package/src/directives/scroll/__tests__/scroll.spec.ts +9 -9
  188. package/src/directives/scroll/index.ts +8 -7
  189. package/src/globals.d.ts +10 -12
  190. package/src/locale/da.ts +69 -0
  191. package/src/locale/index.ts +1 -0
  192. package/src/mixins/intersectable/index.ts +11 -2
  193. package/src/mixins/overlayable/index.ts +22 -11
  194. package/src/styles/settings/_variables.scss +3 -2
  195. package/src/util/__tests__/__snapshots__/helpers.spec.ts.snap +11 -0
  196. package/src/util/__tests__/helpers.spec.ts +17 -0
  197. package/src/util/helpers.ts +9 -2
@@ -90,9 +90,7 @@ export default mixins(
90
90
  : Themeable.options.computed.isDark.call(this)
91
91
  },
92
92
  styles (): object {
93
- // Styles are not needed when
94
- // using the absolute prop.
95
- if (this.absolute) return {}
93
+ if (this.absolute || !this.app) return {}
96
94
 
97
95
  const {
98
96
  bar,
@@ -104,12 +102,10 @@ export default mixins(
104
102
  top,
105
103
  } = this.$vuetify.application
106
104
 
107
- // Should always move for y-axis
108
- // applicationable components.
109
105
  return {
110
106
  paddingBottom: convertToUnit(bottom + footer + insetFooter),
111
- paddingLeft: !this.app ? undefined : convertToUnit(left),
112
- paddingRight: !this.app ? undefined : convertToUnit(right),
107
+ paddingLeft: convertToUnit(left),
108
+ paddingRight: convertToUnit(right),
113
109
  paddingTop: convertToUnit(bar + top),
114
110
  }
115
111
  },
@@ -63,7 +63,10 @@ describe('VSnackbar.ts', () => {
63
63
  [true, false],
64
64
  ])('should have app padding on the x-axis using %s', (absolute, expected: boolean) => {
65
65
  const wrapper = mountFunction({
66
- propsData: { absolute },
66
+ propsData: {
67
+ app: true,
68
+ absolute,
69
+ },
67
70
  })
68
71
 
69
72
  expect(Object.keys(wrapper.vm.styles).length > 0).toBe(expected)
@@ -67,10 +67,6 @@ export default baseMixins.extend<options>().extend(
67
67
  },
68
68
  },
69
69
 
70
- mounted () {
71
- this.onRouteChange()
72
- },
73
-
74
70
  methods: {
75
71
  click (e: KeyboardEvent | MouseEvent): void {
76
72
  // Prevent keyboard actions
@@ -94,6 +90,12 @@ export default baseMixins.extend<options>().extend(
94
90
 
95
91
  this.to || this.toggle()
96
92
  },
93
+ toggle () {
94
+ // VItemGroup treats a change event as a click
95
+ if (!this.isActive) {
96
+ this.$emit('change')
97
+ }
98
+ },
97
99
  },
98
100
 
99
101
  render (h): VNode {
@@ -231,10 +231,15 @@ export default baseMixins.extend<options>().extend({
231
231
  mounted () {
232
232
  // #11533
233
233
  this.$watch(() => this.labelValue, this.setLabelWidth)
234
-
235
234
  this.autofocus && this.tryAutofocus()
236
-
237
- requestAnimationFrame(() => (this.isBooted = true))
235
+ requestAnimationFrame(() => {
236
+ this.isBooted = true
237
+ requestAnimationFrame(() => {
238
+ if (!this.isIntersecting) {
239
+ this.onResize()
240
+ }
241
+ })
242
+ })
238
243
  },
239
244
 
240
245
  methods: {
@@ -17,9 +17,12 @@
17
17
  position: absolute
18
18
  text-transform: initial
19
19
  width: auto
20
- opacity: 1
20
+ opacity: 0
21
21
  pointer-events: none
22
22
 
23
+ &.menuable__content__active
24
+ opacity: $tooltip-opacity
25
+
23
26
  &--fixed
24
27
  position: fixed
25
28
 
@@ -125,7 +125,6 @@ export default mixins(Colorable, Delayable, Dependent, Menuable, Toggleable).ext
125
125
  left: this.calculatedLeft,
126
126
  maxWidth: convertToUnit(this.maxWidth),
127
127
  minWidth: convertToUnit(this.minWidth),
128
- opacity: this.isActive ? 0.9 : 0,
129
128
  top: this.calculatedTop,
130
129
  zIndex: this.zIndex || this.activeZIndex,
131
130
  }
@@ -2,6 +2,7 @@
2
2
 
3
3
  $tooltip-background-color: rgba(map-get($grey, 'darken-2'), 0.9) !default;
4
4
  $tooltip-text-color: map-get($shades, 'white') !default;
5
+ $tooltip-opacity: .9 !default;
5
6
  $tooltip-border-radius: $border-radius-root !default;
6
7
  $tooltip-font-size: 14px !default;
7
8
  $tooltip-transition-timing-function: map-get($transition, 'linear-out-slow-in') !default;
@@ -59,6 +59,7 @@ export default mixins(
59
59
  default: () => ([]),
60
60
  } as PropValidator<NodeArray>,
61
61
  dense: Boolean,
62
+ disabled: Boolean,
62
63
  filter: Function as PropType<TreeviewItemFunction>,
63
64
  hoverable: Boolean,
64
65
  items: {
@@ -415,7 +416,7 @@ export default mixins(
415
416
  }).map(item => {
416
417
  const genChild = VTreeviewNode.options.methods.genChild.bind(this)
417
418
 
418
- return genChild(item, getObjectValueByPath(item, this.itemDisabled))
419
+ return genChild(item, this.disabled || getObjectValueByPath(item, this.itemDisabled))
419
420
  })
420
421
  /* istanbul ignore next */
421
422
  : this.$slots.default! // TODO: remove type annotation with TS 3.2
@@ -36,6 +36,7 @@ export const VTreeviewNodeProps = {
36
36
  type: String,
37
37
  default: 'primary',
38
38
  },
39
+ disablePerNode: Boolean,
39
40
  expandIcon: {
40
41
  type: String,
41
42
  default: '$subgroup',
@@ -122,7 +123,7 @@ const VTreeviewNode = baseMixins.extend<options>().extend({
122
123
  disabled (): boolean {
123
124
  return (
124
125
  getObjectValueByPath(this.item, this.itemDisabled) ||
125
- (this.parentIsDisabled && this.selectionType === 'leaf')
126
+ (!this.disablePerNode && (this.parentIsDisabled && this.selectionType === 'leaf'))
126
127
  )
127
128
  },
128
129
  key (): string {
@@ -310,6 +311,7 @@ const VTreeviewNode = baseMixins.extend<options>().extend({
310
311
  selectable: this.selectable,
311
312
  selectedColor: this.selectedColor,
312
313
  color: this.color,
314
+ disablePerNode: this.disablePerNode,
313
315
  expandIcon: this.expandIcon,
314
316
  indeterminateIcon: this.indeterminateIcon,
315
317
  offIcon: this.offIcon,
@@ -43,6 +43,7 @@ export * from './VMain'
43
43
  export * from './VMenu'
44
44
  export * from './VMessages'
45
45
  export * from './VNavigationDrawer'
46
+ export * from './VOtpInput'
46
47
  export * from './VOverflowBtn'
47
48
  export * from './VOverlay'
48
49
  export * from './VPagination'
@@ -87,16 +87,8 @@ export function createSimpleTransition (
87
87
  }
88
88
  if (context.props.hideOnLeave) {
89
89
  data.on!.leave = mergeTransitions(data.on!.leave, (el: HTMLElement) => {
90
- el._initialDisplay = [el.style.display, el.style.getPropertyPriority('display')]
91
90
  el.style.setProperty('display', 'none', 'important')
92
91
  })
93
- data.on!.afterLeave = mergeTransitions(data.on!.afterLeave, (el?: HTMLElement) => {
94
- if (el) {
95
- el._initialDisplay
96
- ? el.style.setProperty('display', ...el._initialDisplay)
97
- : el.style.removeProperty('display')
98
- }
99
- })
100
92
  }
101
93
 
102
94
  return h(tag, mergeData(context.data, data), context.children)
@@ -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(() => {
@@ -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
- if (!app || !el._clickOutside) return
102
- app.removeEventListener('click', el._clickOutside.onClick, true)
103
- app.removeEventListener('mousedown', el._clickOutside.onMousedown, true)
107
+ if (!app || !el._clickOutside?.[vnode.context!._uid]) return
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,8 +27,8 @@ 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
+ const _observe = el._observe?.[vnode.context!._uid]
31
+ if (!_observe) return // Just in case, should never fire
31
32
 
32
33
  const isIntersecting = entries.some(entry => entry.isIntersecting)
33
34
 
@@ -36,31 +37,32 @@ 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
- if (!el._observe) return
60
+ function unbind (el: HTMLElement, binding: ObserveVNodeDirective, vnode: VNode) {
61
+ const observe = el._observe?.[vnode.context!._uid]
62
+ if (!observe) return
61
63
 
62
- el._observe.observer.unobserve(el)
63
- delete el._observe
64
+ observe.observer.unobserve(el)
65
+ delete el._observe![vnode.context!._uid]
64
66
  }
65
67
 
66
68
  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,19 @@ 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
- /* istanbul ignore if */
64
- if (!el._mutate) return
63
+ function unbind (el: HTMLElement, binding: MutateVNodeDirective, vnode: VNode) {
64
+ if (!el._mutate?.[vnode.context!._uid]) return
65
65
 
66
- el._mutate.observer.disconnect()
67
- delete el._mutate
66
+ el._mutate[vnode.context!._uid]!.observer.disconnect()
67
+ delete el._mutate[vnode.context!._uid]
68
68
  }
69
69
 
70
70
  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
  })