@vuetify/nightly 2.6.6 → 2.6.7

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 (63) hide show
  1. package/CHANGELOG.md +11 -6
  2. package/dist/json/web-types.json +5 -5
  3. package/dist/vuetify.css +47 -67
  4. package/dist/vuetify.css.map +1 -1
  5. package/dist/vuetify.js +85 -78
  6. package/dist/vuetify.js.map +1 -1
  7. package/dist/vuetify.min.css +2 -2
  8. package/dist/vuetify.min.js +2 -2
  9. package/es5/components/VDialog/VDialog.js +13 -8
  10. package/es5/components/VDialog/VDialog.js.map +1 -1
  11. package/es5/components/VList/VListItem.js +5 -3
  12. package/es5/components/VList/VListItem.js.map +1 -1
  13. package/es5/components/VOtpInput/VOtpInput.js +26 -58
  14. package/es5/components/VOtpInput/VOtpInput.js.map +1 -1
  15. package/es5/components/VSelect/VSelect.js +6 -2
  16. package/es5/components/VSelect/VSelect.js.map +1 -1
  17. package/es5/components/VSlideGroup/VSlideGroup.js +43 -23
  18. package/es5/components/VSlideGroup/VSlideGroup.js.map +1 -1
  19. package/es5/components/VTabs/VTabs.js +10 -0
  20. package/es5/components/VTabs/VTabs.js.map +1 -1
  21. package/es5/framework.js +1 -1
  22. package/es5/mixins/dependent/index.js.map +1 -1
  23. package/es5/mixins/detachable/index.js.map +1 -1
  24. package/lib/components/VDialog/VDialog.js +13 -7
  25. package/lib/components/VDialog/VDialog.js.map +1 -1
  26. package/lib/components/VList/VListItem.js +5 -3
  27. package/lib/components/VList/VListItem.js.map +1 -1
  28. package/lib/components/VOtpInput/VOtpInput.js +25 -55
  29. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  30. package/lib/components/VSelect/VSelect.js +6 -2
  31. package/lib/components/VSelect/VSelect.js.map +1 -1
  32. package/lib/components/VSlideGroup/VSlideGroup.js +23 -7
  33. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  34. package/lib/components/VTabs/VTabs.js +10 -0
  35. package/lib/components/VTabs/VTabs.js.map +1 -1
  36. package/lib/framework.js +1 -1
  37. package/lib/mixins/dependent/index.js.map +1 -1
  38. package/lib/mixins/detachable/index.js.map +1 -1
  39. package/package.json +2 -1
  40. package/src/components/VAutocomplete/VAutocomplete.sass +0 -4
  41. package/src/components/VBtn/VBtn.sass +1 -1
  42. package/src/components/VChip/VChip.sass +1 -1
  43. package/src/components/VDialog/VDialog.sass +1 -1
  44. package/src/components/VDialog/VDialog.ts +9 -6
  45. package/src/components/VDialog/__tests__/VDialog.spec.ts +5 -5
  46. package/src/components/VDialog/__tests__/__snapshots__/VDialog.spec.ts.snap +4 -16
  47. package/src/components/VExpansionPanel/VExpansionPanel.sass +2 -2
  48. package/src/components/VInput/VInput.sass +2 -5
  49. package/src/components/VList/VListItem.ts +5 -3
  50. package/src/components/VList/__tests__/VListItem.spec.ts +12 -0
  51. package/src/components/VOtpInput/VOtpInput.ts +23 -43
  52. package/src/components/VOtpInput/__tests__/VOtpInput.spec.ts +3 -27
  53. package/src/components/VRadioGroup/VRadio.sass +0 -4
  54. package/src/components/VSelect/VSelect.sass +3 -1
  55. package/src/components/VSelect/VSelect.ts +2 -2
  56. package/src/components/VSkeletonLoader/VSkeletonLoader.sass +1 -1
  57. package/src/components/VSlideGroup/VSlideGroup.ts +20 -8
  58. package/src/components/VTabs/VTabs.ts +10 -0
  59. package/src/components/VTimeline/VTimeline.sass +16 -9
  60. package/src/components/VTimeline/_mixins.sass +4 -3
  61. package/src/mixins/dependent/index.ts +3 -3
  62. package/src/mixins/detachable/index.ts +3 -3
  63. package/src/styles/components/_selection-controls.sass +3 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vuetify/nightly",
3
3
  "description": "Vue Material Component Framework",
4
- "version": "2.6.6",
4
+ "version": "2.6.7",
5
5
  "author": {
6
6
  "name": "John Leider",
7
7
  "email": "john@vuetifyjs.com"
@@ -70,6 +70,7 @@
70
70
  "@fortawesome/vue-fontawesome": "^0.1.10",
71
71
  "@types/jest": "^26.0.14",
72
72
  "@types/node": "^14.11.10",
73
+ "@types/resize-observer-browser": "^0.1.7",
73
74
  "@vue/test-utils": "1.0.0-beta.29",
74
75
  "autoprefixer": "^9.6.1",
75
76
  "babel-loader": "^8.0.6",
@@ -34,10 +34,6 @@
34
34
  .v-select__slot > input
35
35
  margin-top: $autocomplete-dense-enclosed-input-margin-top
36
36
 
37
- &:not(.v-input--is-disabled).v-select.v-text-field
38
- input
39
- pointer-events: inherit
40
-
41
37
  &__content.v-menu__content
42
38
  border-radius: 0
43
39
 
@@ -162,7 +162,7 @@
162
162
  display: flex
163
163
  flex: 1 0 auto
164
164
  min-width: 100% !important
165
- max-width: auto
165
+ max-width: none
166
166
 
167
167
  .v-btn--is-elevated
168
168
  +elevation(2)
@@ -150,7 +150,7 @@
150
150
 
151
151
  .v-chip--pill
152
152
  .v-chip__filter
153
- margin-right: $chip-pill-filter-margin
153
+ margin: $chip-pill-filter-margin
154
154
 
155
155
  .v-avatar
156
156
  height: $chip-pill-avatar-size !important
@@ -9,6 +9,7 @@
9
9
  transition: .3s map-get($transition, 'fast-in-fast-out')
10
10
  width: 100%
11
11
  z-index: inherit
12
+ outline: none
12
13
  +elevation($dialog-elevation)
13
14
 
14
15
  &:not(.v-dialog--fullscreen)
@@ -46,7 +47,6 @@
46
47
  transition: .2s map-get($transition, 'fast-in-fast-out'), z-index 1ms
47
48
  width: 100%
48
49
  z-index: 6
49
- outline: none
50
50
 
51
51
  .v-dialog__container
52
52
  display: none
@@ -178,9 +178,9 @@ export default baseMixins.extend({
178
178
  // Double nextTick to wait for lazy content to be generated
179
179
  this.$nextTick(() => {
180
180
  this.$nextTick(() => {
181
- if (!this.$refs.content.contains(document.activeElement)) {
181
+ if (!this.$refs.dialog?.contains(document.activeElement)) {
182
182
  this.previousActiveElement = document.activeElement as HTMLElement
183
- this.$refs.content.focus()
183
+ this.$refs.dialog?.focus()
184
184
  }
185
185
  this.bind()
186
186
  })
@@ -222,10 +222,11 @@ export default baseMixins.extend({
222
222
 
223
223
  if (
224
224
  !!target &&
225
+ this.$refs.dialog &&
225
226
  // It isn't the document or the dialog body
226
- ![document, this.$refs.content].includes(target) &&
227
+ ![document, this.$refs.dialog].includes(target) &&
227
228
  // It isn't inside the dialog body
228
- !this.$refs.content.contains(target) &&
229
+ !this.$refs.dialog.contains(target) &&
229
230
  // We're the topmost dialog
230
231
  this.activeZIndex >= this.getMaxZIndex() &&
231
232
  // It isn't inside a dependent element (like a menu)
@@ -233,7 +234,7 @@ export default baseMixins.extend({
233
234
  // So we must have focused something outside the dialog and its children
234
235
  ) {
235
236
  // Find and focus the first available element inside the dialog
236
- const focusable = this.$refs.content.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')
237
+ const focusable = this.$refs.dialog.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')
237
238
  const el = [...focusable].find(el => !el.hasAttribute('disabled')) as HTMLElement | undefined
238
239
  el && el.focus()
239
240
  }
@@ -251,7 +252,6 @@ export default baseMixins.extend({
251
252
  class: this.contentClasses,
252
253
  attrs: {
253
254
  role: 'dialog',
254
- tabindex: this.isActive ? 0 : undefined,
255
255
  'aria-modal': this.hideOverlay ? undefined : 'true',
256
256
  ...this.getScopeIdAttrs(),
257
257
  },
@@ -278,6 +278,9 @@ export default baseMixins.extend({
278
278
  genInnerContent () {
279
279
  const data: VNodeData = {
280
280
  class: this.classes,
281
+ attrs: {
282
+ tabindex: this.isActive ? 0 : undefined,
283
+ },
281
284
  ref: 'dialog',
282
285
  directives: [
283
286
  {
@@ -308,15 +308,15 @@ describe('VDialog.ts', () => {
308
308
  propsData: { eager: true },
309
309
  })
310
310
 
311
- const content = wrapper.find('.v-dialog__content')
311
+ const dialog = wrapper.find('.v-dialog')
312
312
 
313
- expect(content.html()).toMatchSnapshot()
314
- expect(content.element.tabIndex).toBe(-1)
313
+ expect(dialog.html()).toMatchSnapshot()
314
+ expect(dialog.element.tabIndex).toBe(-1)
315
315
 
316
316
  wrapper.setData({ isActive: true })
317
317
 
318
- expect(content.element.tabIndex).toBe(0)
319
- expect(content.html()).toMatchSnapshot()
318
+ expect(dialog.element.tabIndex).toBe(0)
319
+ expect(dialog.html()).toMatchSnapshot()
320
320
  })
321
321
 
322
322
  // https://github.com/vuetifyjs/vuetify/issues/8697
@@ -1,29 +1,17 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`VDialog.ts should only set tabindex if active 1`] = `
4
- <div role="dialog"
5
- aria-modal="true"
6
- class="v-dialog__content"
7
- style="z-index: 0;"
4
+ <div class="v-dialog"
5
+ style="transform-origin: center center; display: none;"
8
6
  >
9
- <div class="v-dialog"
10
- style="transform-origin: center center; display: none;"
11
- >
12
- </div>
13
7
  </div>
14
8
  `;
15
9
 
16
10
  exports[`VDialog.ts should only set tabindex if active 2`] = `
17
- <div role="dialog"
18
- aria-modal="true"
19
- class="v-dialog__content v-dialog__content--active"
20
- style="z-index: 202; z-index: 202;"
11
+ <div class="v-dialog v-dialog--active"
12
+ style="transform-origin: center center;"
21
13
  tabindex="0"
22
14
  >
23
- <div class="v-dialog v-dialog--active"
24
- style="transform-origin: center center;"
25
- >
26
- </div>
27
15
  </div>
28
16
  `;
29
17
 
@@ -24,8 +24,8 @@
24
24
  &.v-expansion-panels--hover
25
25
  > .v-expansion-panel
26
26
  > .v-expansion-panel-header
27
- &:hover
28
- +states($material)
27
+ &:hover::before
28
+ opacity: map-deep-get($material, 'states', 'hover')
29
29
 
30
30
  // Block
31
31
  .v-expansion-panels
@@ -111,9 +111,6 @@
111
111
  &--dense > .v-input__control > .v-input__slot
112
112
  margin-bottom: $input-dense-slot-margin-bottom
113
113
 
114
- &--is-disabled:not(.v-input--is-readonly)
115
- pointer-events: none
116
-
117
114
  &--is-loading > .v-input__control > .v-input__slot
118
115
  &:before,
119
116
  &:after
@@ -128,8 +125,8 @@
128
125
 
129
126
  &--hide-spin-buttons
130
127
  input::-webkit-outer-spin-button,
131
- input::-webkit-inner-spin-button
128
+ input::-webkit-inner-spin-button
132
129
  -webkit-appearance: none
133
130
  margin: 0
134
- input[type=number]
131
+ input[type=number]
135
132
  -moz-appearance: textfield
@@ -168,10 +168,12 @@ export default baseMixins.extend<options>().extend({
168
168
  data[this.to ? 'nativeOn' : 'on'] = {
169
169
  ...data[this.to ? 'nativeOn' : 'on'],
170
170
  keydown: (e: KeyboardEvent) => {
171
- /* istanbul ignore else */
172
- if (e.keyCode === keyCodes.enter) this.click(e)
171
+ if (!this.disabled) {
172
+ /* istanbul ignore else */
173
+ if (e.keyCode === keyCodes.enter) this.click(e)
173
174
 
174
- this.$emit('keydown', e)
175
+ this.$emit('keydown', e)
176
+ }
175
177
  },
176
178
  }
177
179
 
@@ -234,4 +234,16 @@ describe('VListItem.ts', () => {
234
234
  wrapper2.vm.toggle()
235
235
  expect(wrapper2.vm.isActive).toBeTruthy()
236
236
  })
237
+
238
+ it('should not react to keydown.enter when disabled', () => {
239
+ const click = jest.fn()
240
+ const wrapper = mountFunction({
241
+ methods: { click },
242
+ propsData: { disabled: true },
243
+ })
244
+
245
+ wrapper.trigger('keydown.enter')
246
+
247
+ expect(click).not.toHaveBeenCalled()
248
+ })
237
249
  })
@@ -49,7 +49,6 @@ export default baseMixins.extend<options>().extend({
49
49
  },
50
50
 
51
51
  data: () => ({
52
- badInput: false,
53
52
  initialValue: null,
54
53
  isBooted: false,
55
54
  otp: [] as string[],
@@ -66,9 +65,6 @@ export default baseMixins.extend<options>().extend({
66
65
  'v-otp-input--plain': this.plain,
67
66
  }
68
67
  },
69
- isDirty (): boolean {
70
- return VInput.options.computed.isDirty.call(this) || this.badInput
71
- },
72
68
  },
73
69
 
74
70
  watch: {
@@ -159,18 +155,17 @@ export default baseMixins.extend<options>().extend({
159
155
  },
160
156
  attrs: {
161
157
  ...this.attrs$,
158
+ autocomplete: 'one-time-code',
162
159
  disabled: this.isDisabled,
163
160
  readonly: this.isReadonly,
164
161
  type: this.type,
165
162
  id: `${this.computedId}--${otpIdx}`,
166
163
  class: `otp-field-box--${otpIdx}`,
167
- maxlength: 1,
168
164
  },
169
165
  on: Object.assign(listeners, {
170
166
  blur: this.onBlur,
171
167
  input: (e: Event) => this.onInput(e, otpIdx),
172
168
  focus: (e: Event) => this.onFocus(e, otpIdx),
173
- paste: (e: ClipboardEvent) => this.onPaste(e, otpIdx),
174
169
  keydown: this.onKeyDown,
175
170
  keyup: (e: KeyboardEvent) => this.onKeyUp(e, otpIdx),
176
171
  }),
@@ -212,22 +207,31 @@ export default baseMixins.extend<options>().extend({
212
207
  e && this.$emit('focus', e)
213
208
  }
214
209
  },
215
- onInput (e: Event, otpIdx: number) {
210
+ onInput (e: Event, index: number) {
211
+ const maxCursor = +this.length - 1
212
+
216
213
  const target = e.target as HTMLInputElement
217
214
  const value = target.value
218
- this.applyValue(otpIdx, target.value, () => {
219
- this.internalValue = this.otp.join('')
220
- })
221
- this.badInput = target.validity && target.validity.badInput
215
+ const inputDataArray = value?.split('') || []
216
+
217
+ const newOtp: string[] = [...this.otp]
218
+ for (let i = 0; i < inputDataArray.length; i++) {
219
+ const appIdx = index + i
220
+ if (appIdx > maxCursor) break
221
+ newOtp[appIdx] = inputDataArray[i].toString()
222
+ }
223
+ if (!inputDataArray.length) {
224
+ newOtp.splice(index, 1)
225
+ }
226
+
227
+ this.otp = newOtp
228
+ this.internalValue = this.otp.join('')
222
229
 
223
- const nextIndex = otpIdx + 1
224
- if (value) {
225
- if (nextIndex < +this.length) {
226
- this.changeFocus(nextIndex)
227
- } else {
228
- this.clearFocus(otpIdx)
229
- this.onCompleted()
230
- }
230
+ if (index + inputDataArray.length >= +this.length) {
231
+ this.onCompleted()
232
+ this.clearFocus(index)
233
+ } else if (inputDataArray.length) {
234
+ this.changeFocus(index + inputDataArray.length)
231
235
  }
232
236
  },
233
237
  clearFocus (index: number) {
@@ -255,30 +259,6 @@ export default baseMixins.extend<options>().extend({
255
259
 
256
260
  VInput.options.methods.onMouseUp.call(this, e)
257
261
  },
258
- onPaste (event: ClipboardEvent, index: number) {
259
- const maxCursor = +this.length - 1
260
- const inputVal = event?.clipboardData?.getData('Text')
261
- const inputDataArray = inputVal?.split('') || []
262
- event.preventDefault()
263
- const newOtp: string[] = [...this.otp]
264
- for (let i = 0; i < inputDataArray.length; i++) {
265
- const appIdx = index + i
266
- if (appIdx > maxCursor) break
267
- newOtp[appIdx] = inputDataArray[i].toString()
268
- }
269
- this.otp = newOtp
270
- this.internalValue = this.otp.join('')
271
- const targetFocus = Math.min(index + inputDataArray.length, maxCursor)
272
- this.changeFocus(targetFocus)
273
-
274
- if (newOtp.length === +this.length) { this.onCompleted(); this.clearFocus(targetFocus) }
275
- },
276
- applyValue (index: number, inputVal: string, next: Function) {
277
- const newOtp: string[] = [...this.otp]
278
- newOtp[index] = inputVal
279
- this.otp = newOtp
280
- next()
281
- },
282
262
  changeFocus (index: number) {
283
263
  this.onFocus(undefined, index || 0)
284
264
  },
@@ -173,14 +173,7 @@ describe('VOtpInput.ts', () => {
173
173
  expect(change).toHaveBeenCalledTimes(2)
174
174
  })
175
175
 
176
- it('should process input when paste event', async () => {
177
- const getData = jest.fn(() => '1337078')
178
- const event = {
179
- clipboardData: {
180
- getData,
181
- },
182
- }
183
-
176
+ it('should process input on paste', async () => {
184
177
  const wrapper = mountFunction({})
185
178
 
186
179
  const input = wrapper.findAll('input').at(0)
@@ -190,30 +183,13 @@ describe('VOtpInput.ts', () => {
190
183
  await wrapper.vm.$nextTick()
191
184
  expect(document.activeElement === element).toBe(true)
192
185
 
193
- input.trigger('paste', event)
186
+ element.value = '1337078'
187
+ input.trigger('input')
194
188
  await wrapper.vm.$nextTick()
195
189
 
196
190
  expect(wrapper.vm.otp).toStrictEqual('133707'.split(''))
197
191
  })
198
192
 
199
- it('should process input when paste event with empty event', async () => {
200
- const event = {}
201
-
202
- const wrapper = mountFunction({})
203
-
204
- const input = wrapper.findAll('input').at(0)
205
-
206
- const element = input.element as HTMLInputElement
207
- input.trigger('focus')
208
- await wrapper.vm.$nextTick()
209
- expect(document.activeElement === element).toBe(true)
210
-
211
- input.trigger('paste', event)
212
- await wrapper.vm.$nextTick()
213
-
214
- expect(wrapper.vm.otp).toStrictEqual(''.split(''))
215
- })
216
-
217
193
  it('should clear cursor when input typing is done', async () => {
218
194
  const onFinish = jest.fn()
219
195
  const clearFocus = jest.fn()
@@ -6,10 +6,6 @@
6
6
  label
7
7
  color: map-deep-get($material, 'text', 'disabled')
8
8
 
9
- .v-icon
10
- // needed for helper override
11
- color: map-deep-get($material, 'selection-controls', 'disabled') !important
12
-
13
9
  .v-radio
14
10
  align-items: center
15
11
  display: flex
@@ -63,7 +63,6 @@
63
63
  input
64
64
  flex: 1 1 // Doesn't resize on IE11 with 3rd param
65
65
  min-width: 0
66
- pointer-events: none
67
66
  position: relative
68
67
 
69
68
  &:not(.v-text-field--single-line) input
@@ -118,6 +117,9 @@
118
117
  .v-select__selections
119
118
  flex-direction: row-reverse
120
119
 
120
+ &.v-input--is-disabled:not(.v-input--is-readonly):not(.v-autocomplete)
121
+ pointer-events: none
122
+
121
123
  &__selections
122
124
  align-items: center
123
125
  display: flex
@@ -157,7 +157,7 @@ export default baseMixins.extend<options>().extend({
157
157
  computedCounterValue (): number {
158
158
  const value = this.multiple
159
159
  ? this.selectedItems
160
- : (this.getText(this.selectedItems[0]) || '').toString()
160
+ : (this.getText(this.selectedItems[0]) ?? '').toString()
161
161
 
162
162
  if (typeof this.counterValue === 'function') {
163
163
  return this.counterValue(value)
@@ -650,7 +650,7 @@ export default baseMixins.extend<options>().extend({
650
650
  this.keyboardLookupLastTime = now
651
651
 
652
652
  const index = this.allItems.findIndex(item => {
653
- const text = (this.getText(item) || '').toString()
653
+ const text = (this.getText(item) ?? '').toString()
654
654
 
655
655
  return text.toLowerCase().startsWith(this.keyboardLookupPrefix)
656
656
  })
@@ -209,7 +209,7 @@
209
209
  ~ .v-skeleton-loader__card-heading
210
210
  border-radius: 0
211
211
 
212
- &::first-child, &::last-child
212
+ &:first-child, &:last-child
213
213
  border-radius: inherit
214
214
 
215
215
  &__list-item
@@ -138,7 +138,6 @@ export const BaseSlideGroup = mixins<options &
138
138
  },
139
139
 
140
140
  data: () => ({
141
- internalItemsLength: 0,
142
141
  isOverflowing: false,
143
142
  resizeTimeout: 0,
144
143
  startX: 0,
@@ -231,13 +230,26 @@ export const BaseSlideGroup = mixins<options &
231
230
  },
232
231
  },
233
232
 
234
- beforeUpdate () {
235
- this.internalItemsLength = (this.$children || []).length
236
- },
237
-
238
- updated () {
239
- if (this.internalItemsLength === (this.$children || []).length) return
240
- this.setWidths()
233
+ mounted () {
234
+ if (typeof ResizeObserver !== 'undefined') {
235
+ const obs = new ResizeObserver(() => {
236
+ this.onResize()
237
+ })
238
+ obs.observe(this.$el)
239
+ obs.observe(this.$refs.content)
240
+ this.$on('hook:destroyed', () => {
241
+ obs.disconnect()
242
+ })
243
+ } else {
244
+ let itemsLength = 0
245
+ this.$on('hook:beforeUpdate', () => {
246
+ itemsLength = (this.$refs.content?.children || []).length
247
+ })
248
+ this.$on('hook:updated', () => {
249
+ if (itemsLength === (this.$refs.content?.children || []).length) return
250
+ this.setWidths()
251
+ })
252
+ }
241
253
  },
242
254
 
243
255
  methods: {
@@ -141,6 +141,16 @@ export default baseMixins.extend<options>().extend({
141
141
  },
142
142
 
143
143
  mounted () {
144
+ if (typeof ResizeObserver !== 'undefined') {
145
+ const obs = new ResizeObserver(() => {
146
+ this.onResize()
147
+ })
148
+ obs.observe(this.$el)
149
+ this.$on('hook:destroyed', () => {
150
+ obs.disconnect()
151
+ })
152
+ }
153
+
144
154
  this.$nextTick(() => {
145
155
  window.setTimeout(this.callSlider, 30)
146
156
  })
@@ -2,6 +2,12 @@
2
2
  @import './_variables.scss'
3
3
  @import './_mixins.sass'
4
4
 
5
+ /**
6
+ * .v-timeline::before - center divider
7
+ * .v-card::before - arrow shadow (conflicts with active link overlay)
8
+ * .v-card::after - arrow
9
+ */
10
+
5
11
  // Theme
6
12
  +theme(v-timeline) using ($material)
7
13
  &::before
@@ -12,7 +18,7 @@
12
18
  background: map-get($material, 'cards')
13
19
 
14
20
  .v-card
15
- &::before
21
+ &:not(.v-card--link)::before
16
22
  border-right-color: $shadow-key-ambient-opacity
17
23
 
18
24
  // Elements
@@ -20,7 +26,7 @@
20
26
  padding-top: $timeline-item-padding
21
27
  position: relative
22
28
 
23
- &:before
29
+ &::before
24
30
  bottom: 0
25
31
  content: ''
26
32
  height: 100%
@@ -85,7 +91,8 @@
85
91
  // Wedge
86
92
  .v-timeline-item__body
87
93
  > .v-card:not(.v-card--flat)
88
- &:before, &:after
94
+ &:not(.v-card--link)::before,
95
+ &::after
89
96
  content: ''
90
97
  position: absolute
91
98
  border-top: $timeline-wedge-size solid transparent
@@ -93,10 +100,10 @@
93
100
  border-right: $timeline-wedge-size solid black
94
101
  top: calc(50% - #{$timeline-wedge-size})
95
102
 
96
- &:after
103
+ &::after
97
104
  border-right-color: inherit
98
105
 
99
- &:before
106
+ &:not(.v-card--link)::before
100
107
  top: calc(50% - #{$timeline-wedge-size} + 2px)
101
108
 
102
109
  // Modifiers
@@ -106,12 +113,12 @@
106
113
 
107
114
  .v-timeline-item__body
108
115
  > .v-card
109
- &:before
110
- top: calc(0% + #{$timeline-wedge-size} + 2px)
111
-
112
- &:after
116
+ &::after
113
117
  top: calc(0% + #{$timeline-wedge-size})
114
118
 
119
+ &:not(.v-card--link)::before
120
+ top: calc(0% + #{$timeline-wedge-size} + 2px)
121
+
115
122
  .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse)
116
123
  +timeline-line-align($timeline-divider-center, left, right)
117
124
 
@@ -9,8 +9,9 @@
9
9
  width: $inner-dot-size
10
10
 
11
11
  @mixin timeline-wedge-align($direction)
12
- .v-timeline-item__body
13
- > .v-card:before, .v-card:after
12
+ .v-timeline-item__body > .v-card
13
+ &:not(.v-card--link)::before,
14
+ &::after
14
15
  +ltr()
15
16
  transform: rotate(if($direction == right, 180deg, 0))
16
17
  #{$direction}: -($timeline-wedge-size)
@@ -32,7 +33,7 @@
32
33
  text-align: if($direction == left, left, right)
33
34
 
34
35
  @mixin timeline-line-align($center, $first, $second)
35
- &:before
36
+ &::before
36
37
  +ltr()
37
38
  #{$first}: calc(#{$center} - #{$timeline-line-width / 2})
38
39
  #{$second}: initial
@@ -3,10 +3,10 @@ import Vue from 'vue'
3
3
  import mixins from '../../util/mixins'
4
4
  import { VOverlay } from '../../components/VOverlay'
5
5
 
6
- interface options extends Vue {
6
+ interface options {
7
7
  $el: HTMLElement
8
8
  $refs: {
9
- content: HTMLElement
9
+ content?: HTMLElement
10
10
  }
11
11
  overlay?: InstanceType<typeof VOverlay>
12
12
  }
@@ -31,7 +31,7 @@ function searchChildren (children: Vue[]): DependentInstance[] {
31
31
  }
32
32
 
33
33
  /* @vue/component */
34
- export default mixins<options>().extend({
34
+ export default mixins<Vue & options>().extend({
35
35
  name: 'dependent',
36
36
 
37
37
  data () {
@@ -7,13 +7,13 @@ import mixins, { ExtractVue } from '../../util/mixins'
7
7
  import { consoleWarn } from '../../util/console'
8
8
 
9
9
  // Types
10
- import Vue, { PropOptions } from 'vue'
10
+ import { PropOptions } from 'vue'
11
11
  import { VNode } from 'vue/types'
12
12
 
13
- interface options extends Vue {
13
+ interface options {
14
14
  $el: HTMLElement
15
15
  $refs: {
16
- content: HTMLElement
16
+ content?: HTMLElement
17
17
  }
18
18
  }
19
19
 
@@ -109,6 +109,9 @@
109
109
  .v-icon
110
110
  color: inherit
111
111
 
112
+ &.v-input--is-disabled:not(.v-input--is-readonly)
113
+ pointer-events: none
114
+
112
115
  .v-input--selection-controls__input:hover
113
116
  .v-input--selection-controls__ripple:before
114
117
  background: currentColor