quasar 2.4.2 → 2.4.3
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/dist/api/BottomSheet.json +1 -1
- package/dist/api/Notify.json +5 -5
- package/dist/api/QAvatar.json +1 -1
- package/dist/api/QBreadcrumbsEl.json +1 -1
- package/dist/api/QBtn.json +2 -2
- package/dist/api/QBtnDropdown.json +3 -3
- package/dist/api/QBtnToggle.json +1 -1
- package/dist/api/QCarousel.json +4 -4
- package/dist/api/QChip.json +4 -4
- package/dist/api/QExpansionItem.json +3 -3
- package/dist/api/QFab.json +2 -2
- package/dist/api/QFabAction.json +1 -1
- package/dist/api/QLinearProgress.json +1 -1
- package/dist/api/QPagination.json +4 -4
- package/dist/api/QPullToRefresh.json +1 -1
- package/dist/api/QRating.json +3 -3
- package/dist/api/QRouteTab.json +1 -1
- package/dist/api/QSelect.json +1 -1
- package/dist/api/QStep.json +4 -4
- package/dist/api/QStepper.json +4 -4
- package/dist/api/QTab.json +1 -1
- package/dist/api/QTable.json +4 -4
- package/dist/api/QTimelineEntry.json +1 -1
- package/dist/api/QToggle.json +1 -1
- package/dist/api/QTree.json +1 -1
- package/dist/api/QVideo.json +11 -1
- package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
- package/dist/icon-set/eva-icons.umd.prod.js +1 -1
- package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
- package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
- package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
- package/dist/icon-set/line-awesome.umd.prod.js +1 -1
- package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
- package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
- package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
- package/dist/icon-set/material-icons.umd.prod.js +1 -1
- package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
- package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
- package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
- package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
- package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
- package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
- package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
- package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
- package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
- package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
- package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
- package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
- package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
- package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
- package/dist/icon-set/svg-themify.umd.prod.js +1 -1
- package/dist/icon-set/themify.umd.prod.js +1 -1
- package/dist/lang/ar.umd.prod.js +1 -1
- package/dist/lang/az-Latn.umd.prod.js +1 -1
- package/dist/lang/bg.umd.prod.js +1 -1
- package/dist/lang/bn.umd.prod.js +1 -1
- package/dist/lang/ca.umd.prod.js +1 -1
- package/dist/lang/cs.umd.prod.js +1 -1
- package/dist/lang/da.umd.prod.js +1 -1
- package/dist/lang/de.umd.prod.js +1 -1
- package/dist/lang/el.umd.prod.js +1 -1
- package/dist/lang/en-GB.umd.prod.js +1 -1
- package/dist/lang/en-US.umd.prod.js +1 -1
- package/dist/lang/eo.umd.prod.js +1 -1
- package/dist/lang/es.umd.prod.js +1 -1
- package/dist/lang/et.umd.prod.js +1 -1
- package/dist/lang/fa-IR.umd.prod.js +1 -1
- package/dist/lang/fa.umd.prod.js +1 -1
- package/dist/lang/fi.umd.prod.js +1 -1
- package/dist/lang/fr.umd.prod.js +1 -1
- package/dist/lang/gn.umd.prod.js +1 -1
- package/dist/lang/he.umd.prod.js +1 -1
- package/dist/lang/hr.umd.prod.js +1 -1
- package/dist/lang/hu.umd.prod.js +1 -1
- package/dist/lang/id.umd.prod.js +1 -1
- package/dist/lang/is.umd.prod.js +1 -1
- package/dist/lang/it.umd.prod.js +1 -1
- package/dist/lang/ja.umd.prod.js +1 -1
- package/dist/lang/km.umd.prod.js +1 -1
- package/dist/lang/ko-KR.umd.prod.js +1 -1
- package/dist/lang/kur-CKB.umd.prod.js +1 -1
- package/dist/lang/lt.umd.prod.js +1 -1
- package/dist/lang/lu.umd.prod.js +1 -1
- package/dist/lang/lv.umd.prod.js +1 -1
- package/dist/lang/ml.umd.prod.js +1 -1
- package/dist/lang/ms.umd.prod.js +1 -1
- package/dist/lang/nb-NO.umd.prod.js +1 -1
- package/dist/lang/nl.umd.prod.js +1 -1
- package/dist/lang/pl.umd.prod.js +1 -1
- package/dist/lang/pt-BR.umd.prod.js +1 -1
- package/dist/lang/pt.umd.prod.js +1 -1
- package/dist/lang/ro.umd.prod.js +1 -1
- package/dist/lang/ru.umd.prod.js +1 -1
- package/dist/lang/sk.umd.prod.js +1 -1
- package/dist/lang/sl.umd.prod.js +1 -1
- package/dist/lang/sr-CYR.umd.prod.js +1 -1
- package/dist/lang/sr.umd.prod.js +1 -1
- package/dist/lang/sv.umd.prod.js +1 -1
- package/dist/lang/ta.umd.prod.js +1 -1
- package/dist/lang/th.umd.prod.js +1 -1
- package/dist/lang/tr.umd.prod.js +1 -1
- package/dist/lang/ug.umd.prod.js +1 -1
- package/dist/lang/uk.umd.prod.js +1 -1
- package/dist/lang/vi.umd.prod.js +1 -1
- package/dist/lang/zh-CN.umd.prod.js +1 -1
- package/dist/lang/zh-TW.umd.prod.js +1 -1
- package/dist/quasar.cjs.prod.js +2 -2
- package/dist/quasar.css +5 -5
- package/dist/quasar.esm.prod.js +2 -2
- package/dist/quasar.prod.css +1 -1
- package/dist/quasar.rtl.css +5 -5
- package/dist/quasar.rtl.prod.css +1 -1
- package/dist/quasar.sass +5 -6
- package/dist/quasar.umd.js +268 -206
- package/dist/quasar.umd.prod.js +2 -2
- package/dist/ssr-directives/Morph.js +1 -1
- package/dist/types/index.d.ts +5 -1
- package/dist/types/utils/date.d.ts +2 -1
- package/dist/vetur/quasar-attributes.json +4 -0
- package/dist/vetur/quasar-tags.json +2 -1
- package/dist/web-types/web-types.json +59 -50
- package/package.json +1 -1
- package/src/api.extends.json +1 -1
- package/src/components/dialog/QDialog.js +7 -5
- package/src/components/linear-progress/QLinearProgress.json +1 -1
- package/src/components/menu/QMenu.js +6 -2
- package/src/components/range/QRange.js +67 -89
- package/src/components/rating/QRating.json +3 -3
- package/src/components/resize-observer/QResizeObserver.js +11 -10
- package/src/components/scroll-area/QScrollArea.js +5 -1
- package/src/components/scroll-observer/QScrollObserver.js +2 -0
- package/src/components/slider/QSlider.js +20 -10
- package/src/components/slider/QSlider.sass +5 -6
- package/src/components/slider/use-slider.js +19 -16
- package/src/components/tabs/QTabs.js +27 -11
- package/src/components/tooltip/QTooltip.js +1 -2
- package/src/components/video/QVideo.js +4 -1
- package/src/components/video/QVideo.json +12 -1
- package/src/composables/private/use-field.js +13 -15
- package/src/composables/private/use-model-toggle.js +1 -1
- package/src/composables/private/use-portal.js +9 -7
- package/src/composables/private/use-tick.js +7 -14
- package/src/utils/clone.js +53 -4
- package/src/utils/private/focus-manager.js +8 -10
|
@@ -70,7 +70,8 @@ export default createComponent({
|
|
|
70
70
|
const vm = getCurrentInstance()
|
|
71
71
|
const { proxy: { $q } } = vm
|
|
72
72
|
|
|
73
|
-
const { registerTick
|
|
73
|
+
const { registerTick: registerScrollTick } = useTick()
|
|
74
|
+
const { registerTimeout: registerFocusTimeout, removeTimeout: removeFocusTimeout } = useTimeout()
|
|
74
75
|
const { registerTimeout } = useTimeout()
|
|
75
76
|
|
|
76
77
|
const rootRef = ref(null)
|
|
@@ -178,7 +179,7 @@ export default createComponent({
|
|
|
178
179
|
}
|
|
179
180
|
|
|
180
181
|
function recalculateScroll () {
|
|
181
|
-
|
|
182
|
+
registerScrollTick(() => {
|
|
182
183
|
if (vm.isDeactivated !== true && vm.isUnmounted !== true) {
|
|
183
184
|
updateContainer({
|
|
184
185
|
width: rootRef.value.offsetWidth,
|
|
@@ -186,8 +187,6 @@ export default createComponent({
|
|
|
186
187
|
})
|
|
187
188
|
}
|
|
188
189
|
})
|
|
189
|
-
|
|
190
|
-
prepareTick()
|
|
191
190
|
}
|
|
192
191
|
|
|
193
192
|
function updateContainer (domSize) {
|
|
@@ -346,11 +345,8 @@ export default createComponent({
|
|
|
346
345
|
return true
|
|
347
346
|
}
|
|
348
347
|
|
|
349
|
-
const dirPrev = (props.vertical === true
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
const dirNext = (props.vertical === true && keyCode === 40 /* ArrowDown */)
|
|
353
|
-
|| (props.vertical !== true && keyCode === 39 /* ArrowRight */)
|
|
348
|
+
const dirPrev = keyCode === (props.vertical === true ? 38 /* ArrowUp */ : 37 /* ArrowLeft */)
|
|
349
|
+
const dirNext = keyCode === (props.vertical === true ? 40 /* ArrowDown */ : 39 /* ArrowRight */)
|
|
354
350
|
|
|
355
351
|
const dir = dirPrev === true ? -1 : (dirNext === true ? 1 : void 0)
|
|
356
352
|
|
|
@@ -484,8 +480,28 @@ export default createComponent({
|
|
|
484
480
|
}
|
|
485
481
|
}
|
|
486
482
|
|
|
487
|
-
function onFocusin () {
|
|
488
|
-
|
|
483
|
+
function onFocusin (e) {
|
|
484
|
+
removeFocusTimeout()
|
|
485
|
+
|
|
486
|
+
if (
|
|
487
|
+
hasFocus.value !== true
|
|
488
|
+
&& rootRef.value !== null
|
|
489
|
+
&& e.target
|
|
490
|
+
&& typeof e.target.closest === 'function'
|
|
491
|
+
) {
|
|
492
|
+
const tab = e.target.closest('.q-tab')
|
|
493
|
+
|
|
494
|
+
// if the target is contained by a QTab/QRouteTab
|
|
495
|
+
// (it might be other elements focused, like additional QBtn)
|
|
496
|
+
if (tab && rootRef.value.contains(tab) === true) {
|
|
497
|
+
hasFocus.value = true
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function onFocusout () {
|
|
503
|
+
registerFocusTimeout(() => { hasFocus.value = false }, 30)
|
|
504
|
+
}
|
|
489
505
|
|
|
490
506
|
function verifyRouteModel () {
|
|
491
507
|
if ($tabs.avoidRouteWatcher !== true) {
|
|
@@ -92,7 +92,7 @@ export default createComponent({
|
|
|
92
92
|
const selfOrigin = computed(() => parsePosition(props.self, $q.lang.rtl))
|
|
93
93
|
const hideOnRouteChange = computed(() => props.persistent !== true)
|
|
94
94
|
|
|
95
|
-
const { registerTick, removeTick
|
|
95
|
+
const { registerTick, removeTick } = useTick()
|
|
96
96
|
const { registerTimeout, removeTimeout } = useTimeout()
|
|
97
97
|
const { transition, transitionStyle } = useTransition(props, showing)
|
|
98
98
|
const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget)
|
|
@@ -158,7 +158,6 @@ export default createComponent({
|
|
|
158
158
|
updatePosition()
|
|
159
159
|
configureScrollTarget()
|
|
160
160
|
})
|
|
161
|
-
prepareTick()
|
|
162
161
|
|
|
163
162
|
if (unwatchPosition === void 0) {
|
|
164
163
|
unwatchPosition = watch(
|
|
@@ -13,7 +13,9 @@ export default createComponent({
|
|
|
13
13
|
src: {
|
|
14
14
|
type: String,
|
|
15
15
|
required: true
|
|
16
|
-
}
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
title: String
|
|
17
19
|
},
|
|
18
20
|
|
|
19
21
|
setup (props) {
|
|
@@ -30,6 +32,7 @@ export default createComponent({
|
|
|
30
32
|
}, [
|
|
31
33
|
h('iframe', {
|
|
32
34
|
src: props.src,
|
|
35
|
+
title: props.title,
|
|
33
36
|
frameborder: '0',
|
|
34
37
|
allowfullscreen: true
|
|
35
38
|
})
|
|
@@ -11,9 +11,20 @@
|
|
|
11
11
|
"desc": "The source url to display in an iframe",
|
|
12
12
|
"required": true,
|
|
13
13
|
"examples": [
|
|
14
|
-
"
|
|
14
|
+
"https://www.youtube.com/embed/k3_tw44QsZQ"
|
|
15
15
|
],
|
|
16
16
|
"category": "model"
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
"title": {
|
|
20
|
+
"type": "String",
|
|
21
|
+
"desc": "(Accessibility) Set the native 'title' attribute value of the inner iframe being used",
|
|
22
|
+
"required": false,
|
|
23
|
+
"examples": [
|
|
24
|
+
"My Daily Marathon"
|
|
25
|
+
],
|
|
26
|
+
"category": "accessibility",
|
|
27
|
+
"addedIn": "v2.4.3"
|
|
17
28
|
}
|
|
18
29
|
}
|
|
19
30
|
}
|
|
@@ -263,26 +263,24 @@ export default function (state) {
|
|
|
263
263
|
state.targetUid.value = getTargetUid(val)
|
|
264
264
|
})
|
|
265
265
|
|
|
266
|
-
|
|
266
|
+
function focusHandler () {
|
|
267
|
+
const el = document.activeElement
|
|
268
|
+
let target = state.targetRef !== void 0 && state.targetRef.value
|
|
267
269
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
const el = document.activeElement
|
|
273
|
-
let target = state.targetRef !== void 0 && state.targetRef.value
|
|
274
|
-
|
|
275
|
-
if (target && (el === null || el.id !== state.targetUid.value)) {
|
|
276
|
-
target.hasAttribute('tabindex') === true || (target = target.querySelector('[tabindex]'))
|
|
277
|
-
if (target && target !== el) {
|
|
278
|
-
target.focus()
|
|
279
|
-
}
|
|
270
|
+
if (target && (el === null || el.id !== state.targetUid.value)) {
|
|
271
|
+
target.hasAttribute('tabindex') === true || (target = target.querySelector('[tabindex]'))
|
|
272
|
+
if (target && target !== el) {
|
|
273
|
+
target.focus()
|
|
280
274
|
}
|
|
281
|
-
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function focus () {
|
|
279
|
+
addFocusFn(focusHandler)
|
|
282
280
|
}
|
|
283
281
|
|
|
284
282
|
function blur () {
|
|
285
|
-
|
|
283
|
+
removeFocusFn(focusHandler)
|
|
286
284
|
const el = document.activeElement
|
|
287
285
|
if (el !== null && state.rootRef.value.contains(el)) {
|
|
288
286
|
el.blur()
|
|
@@ -15,7 +15,7 @@ export const useModelToggleEmits = [
|
|
|
15
15
|
'before-show', 'show', 'before-hide', 'hide'
|
|
16
16
|
]
|
|
17
17
|
|
|
18
|
-
// handleShow/handleHide -> removeTick(), self (& emit show)
|
|
18
|
+
// handleShow/handleHide -> removeTick(), self (& emit show)
|
|
19
19
|
|
|
20
20
|
export default function ({
|
|
21
21
|
showing,
|
|
@@ -48,16 +48,18 @@ export default function (vm, innerRef, renderPortalContent, checkGlobalDialog) {
|
|
|
48
48
|
return
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
if (
|
|
52
|
-
portalEl
|
|
53
|
-
|
|
51
|
+
if (portalIsActive.value === false) {
|
|
52
|
+
if (onGlobalDialog === false && portalEl === null) {
|
|
53
|
+
portalEl = createGlobalNode()
|
|
54
|
+
}
|
|
54
55
|
|
|
55
|
-
|
|
56
|
+
portalIsActive.value = true
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
// register portal
|
|
59
|
+
portalList.push(vm.proxy)
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
addFocusWaitFlag(focusObj)
|
|
62
|
+
}
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
function hidePortal () {
|
|
@@ -4,8 +4,6 @@ import { nextTick, onBeforeUnmount } from 'vue'
|
|
|
4
4
|
* Usage:
|
|
5
5
|
* registerTick(fn)
|
|
6
6
|
* registerTick(fn)
|
|
7
|
-
* ....
|
|
8
|
-
* prepareTick()
|
|
9
7
|
*/
|
|
10
8
|
|
|
11
9
|
export default function () {
|
|
@@ -18,22 +16,17 @@ export default function () {
|
|
|
18
16
|
return {
|
|
19
17
|
registerTick (fn) {
|
|
20
18
|
tickFn = fn
|
|
19
|
+
|
|
20
|
+
nextTick(() => {
|
|
21
|
+
if (tickFn === fn) {
|
|
22
|
+
tickFn()
|
|
23
|
+
tickFn = void 0
|
|
24
|
+
}
|
|
25
|
+
})
|
|
21
26
|
},
|
|
22
27
|
|
|
23
28
|
removeTick () {
|
|
24
29
|
tickFn = void 0
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
prepareTick () {
|
|
28
|
-
if (tickFn !== void 0) {
|
|
29
|
-
const fn = tickFn
|
|
30
|
-
nextTick(() => {
|
|
31
|
-
if (tickFn === fn) {
|
|
32
|
-
tickFn()
|
|
33
|
-
tickFn = void 0
|
|
34
|
-
}
|
|
35
|
-
})
|
|
36
|
-
}
|
|
37
30
|
}
|
|
38
31
|
}
|
|
39
32
|
}
|
package/src/utils/clone.js
CHANGED
|
@@ -1,6 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
// adapted from https://stackoverflow.com/a/40294058
|
|
2
|
+
|
|
3
|
+
export default function cloneDeep (data, hash = new WeakMap()) {
|
|
4
|
+
if (Object(data) !== data) return data
|
|
5
|
+
if (hash.has(data)) return hash.get(data)
|
|
6
|
+
|
|
7
|
+
const result = data instanceof Date
|
|
8
|
+
? new Date(data)
|
|
9
|
+
: (data instanceof RegExp
|
|
10
|
+
? new RegExp(data.source, data.flags)
|
|
11
|
+
: (data instanceof Set
|
|
12
|
+
? new Set()
|
|
13
|
+
: (data instanceof Map
|
|
14
|
+
? new Map()
|
|
15
|
+
: (typeof data.constructor !== 'function'
|
|
16
|
+
? Object.create(null)
|
|
17
|
+
: (data.prototype !== void 0 && typeof data.prototype.constructor === 'function'
|
|
18
|
+
? data
|
|
19
|
+
: new data.constructor()
|
|
20
|
+
)
|
|
21
|
+
)
|
|
22
|
+
)
|
|
23
|
+
)
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
if (typeof data.constructor === 'function' && typeof data.valueOf === 'function') {
|
|
27
|
+
const val = data.valueOf()
|
|
28
|
+
|
|
29
|
+
if (Object(val) !== val) {
|
|
30
|
+
const result = new data.constructor(val)
|
|
31
|
+
|
|
32
|
+
hash.set(data, result)
|
|
33
|
+
|
|
34
|
+
return result
|
|
35
|
+
}
|
|
5
36
|
}
|
|
37
|
+
|
|
38
|
+
hash.set(data, result)
|
|
39
|
+
|
|
40
|
+
if (data instanceof Set) {
|
|
41
|
+
data.forEach(val => {
|
|
42
|
+
result.add(cloneDeep(val, hash))
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
else if (data instanceof Map) {
|
|
46
|
+
data.forEach((val, key) => {
|
|
47
|
+
result.set(key, cloneDeep(val, hash))
|
|
48
|
+
})
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return Object.assign(
|
|
52
|
+
result,
|
|
53
|
+
...Object.keys(data).map(key => ({ [ key ]: cloneDeep(data[ key ], hash) }))
|
|
54
|
+
)
|
|
6
55
|
}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
let queue = []
|
|
2
|
-
|
|
2
|
+
let waitFlags = []
|
|
3
|
+
|
|
4
|
+
function clearFlag (flag) {
|
|
5
|
+
waitFlags = waitFlags.filter(entry => entry !== flag)
|
|
6
|
+
}
|
|
3
7
|
|
|
4
8
|
export function addFocusWaitFlag (flag) {
|
|
9
|
+
clearFlag(flag)
|
|
5
10
|
waitFlags.push(flag)
|
|
6
11
|
}
|
|
7
12
|
|
|
8
13
|
export function removeFocusWaitFlag (flag) {
|
|
9
|
-
|
|
10
|
-
if (index !== -1) {
|
|
11
|
-
waitFlags.splice(index, 1)
|
|
12
|
-
}
|
|
14
|
+
clearFlag(flag)
|
|
13
15
|
|
|
14
16
|
if (waitFlags.length === 0 && queue.length > 0) {
|
|
15
17
|
// only call last focus handler (can't focus multiple things at once)
|
|
@@ -24,13 +26,9 @@ export function addFocusFn (fn) {
|
|
|
24
26
|
}
|
|
25
27
|
else {
|
|
26
28
|
queue.push(fn)
|
|
27
|
-
return fn
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
export function removeFocusFn (fn) {
|
|
32
|
-
|
|
33
|
-
if (index !== -1) {
|
|
34
|
-
queue.splice(index, 1)
|
|
35
|
-
}
|
|
33
|
+
queue = queue.filter(entry => entry !== fn)
|
|
36
34
|
}
|