@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.
- package/CHANGELOG.md +11 -6
- package/dist/json/web-types.json +5 -5
- package/dist/vuetify.css +47 -67
- package/dist/vuetify.css.map +1 -1
- package/dist/vuetify.js +85 -78
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +2 -2
- package/es5/components/VDialog/VDialog.js +13 -8
- package/es5/components/VDialog/VDialog.js.map +1 -1
- package/es5/components/VList/VListItem.js +5 -3
- package/es5/components/VList/VListItem.js.map +1 -1
- package/es5/components/VOtpInput/VOtpInput.js +26 -58
- package/es5/components/VOtpInput/VOtpInput.js.map +1 -1
- package/es5/components/VSelect/VSelect.js +6 -2
- package/es5/components/VSelect/VSelect.js.map +1 -1
- package/es5/components/VSlideGroup/VSlideGroup.js +43 -23
- package/es5/components/VSlideGroup/VSlideGroup.js.map +1 -1
- package/es5/components/VTabs/VTabs.js +10 -0
- package/es5/components/VTabs/VTabs.js.map +1 -1
- package/es5/framework.js +1 -1
- package/es5/mixins/dependent/index.js.map +1 -1
- package/es5/mixins/detachable/index.js.map +1 -1
- package/lib/components/VDialog/VDialog.js +13 -7
- package/lib/components/VDialog/VDialog.js.map +1 -1
- package/lib/components/VList/VListItem.js +5 -3
- package/lib/components/VList/VListItem.js.map +1 -1
- package/lib/components/VOtpInput/VOtpInput.js +25 -55
- package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
- package/lib/components/VSelect/VSelect.js +6 -2
- package/lib/components/VSelect/VSelect.js.map +1 -1
- package/lib/components/VSlideGroup/VSlideGroup.js +23 -7
- package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
- package/lib/components/VTabs/VTabs.js +10 -0
- package/lib/components/VTabs/VTabs.js.map +1 -1
- package/lib/framework.js +1 -1
- package/lib/mixins/dependent/index.js.map +1 -1
- package/lib/mixins/detachable/index.js.map +1 -1
- package/package.json +2 -1
- package/src/components/VAutocomplete/VAutocomplete.sass +0 -4
- package/src/components/VBtn/VBtn.sass +1 -1
- package/src/components/VChip/VChip.sass +1 -1
- package/src/components/VDialog/VDialog.sass +1 -1
- package/src/components/VDialog/VDialog.ts +9 -6
- package/src/components/VDialog/__tests__/VDialog.spec.ts +5 -5
- package/src/components/VDialog/__tests__/__snapshots__/VDialog.spec.ts.snap +4 -16
- package/src/components/VExpansionPanel/VExpansionPanel.sass +2 -2
- package/src/components/VInput/VInput.sass +2 -5
- package/src/components/VList/VListItem.ts +5 -3
- package/src/components/VList/__tests__/VListItem.spec.ts +12 -0
- package/src/components/VOtpInput/VOtpInput.ts +23 -43
- package/src/components/VOtpInput/__tests__/VOtpInput.spec.ts +3 -27
- package/src/components/VRadioGroup/VRadio.sass +0 -4
- package/src/components/VSelect/VSelect.sass +3 -1
- package/src/components/VSelect/VSelect.ts +2 -2
- package/src/components/VSkeletonLoader/VSkeletonLoader.sass +1 -1
- package/src/components/VSlideGroup/VSlideGroup.ts +20 -8
- package/src/components/VTabs/VTabs.ts +10 -0
- package/src/components/VTimeline/VTimeline.sass +16 -9
- package/src/components/VTimeline/_mixins.sass +4 -3
- package/src/mixins/dependent/index.ts +3 -3
- package/src/mixins/detachable/index.ts +3 -3
- 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.
|
|
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",
|
|
@@ -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.
|
|
181
|
+
if (!this.$refs.dialog?.contains(document.activeElement)) {
|
|
182
182
|
this.previousActiveElement = document.activeElement as HTMLElement
|
|
183
|
-
this.$refs.
|
|
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.
|
|
227
|
+
![document, this.$refs.dialog].includes(target) &&
|
|
227
228
|
// It isn't inside the dialog body
|
|
228
|
-
!this.$refs.
|
|
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.
|
|
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
|
|
311
|
+
const dialog = wrapper.find('.v-dialog')
|
|
312
312
|
|
|
313
|
-
expect(
|
|
314
|
-
expect(
|
|
313
|
+
expect(dialog.html()).toMatchSnapshot()
|
|
314
|
+
expect(dialog.element.tabIndex).toBe(-1)
|
|
315
315
|
|
|
316
316
|
wrapper.setData({ isActive: true })
|
|
317
317
|
|
|
318
|
-
expect(
|
|
319
|
-
expect(
|
|
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
|
|
5
|
-
|
|
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
|
|
18
|
-
|
|
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
|
|
|
@@ -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
|
-
|
|
172
|
-
|
|
171
|
+
if (!this.disabled) {
|
|
172
|
+
/* istanbul ignore else */
|
|
173
|
+
if (e.keyCode === keyCodes.enter) this.click(e)
|
|
173
174
|
|
|
174
|
-
|
|
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,
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
|
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
|
-
|
|
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()
|
|
@@ -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])
|
|
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)
|
|
653
|
+
const text = (this.getText(item) ?? '').toString()
|
|
654
654
|
|
|
655
655
|
return text.toLowerCase().startsWith(this.keyboardLookupPrefix)
|
|
656
656
|
})
|
|
@@ -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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
6
|
+
interface options {
|
|
7
7
|
$el: HTMLElement
|
|
8
8
|
$refs: {
|
|
9
|
-
content
|
|
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
|
|
10
|
+
import { PropOptions } from 'vue'
|
|
11
11
|
import { VNode } from 'vue/types'
|
|
12
12
|
|
|
13
|
-
interface options
|
|
13
|
+
interface options {
|
|
14
14
|
$el: HTMLElement
|
|
15
15
|
$refs: {
|
|
16
|
-
content
|
|
16
|
+
content?: HTMLElement
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|