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.
Files changed (148) hide show
  1. package/dist/api/BottomSheet.json +1 -1
  2. package/dist/api/Notify.json +5 -5
  3. package/dist/api/QAvatar.json +1 -1
  4. package/dist/api/QBreadcrumbsEl.json +1 -1
  5. package/dist/api/QBtn.json +2 -2
  6. package/dist/api/QBtnDropdown.json +3 -3
  7. package/dist/api/QBtnToggle.json +1 -1
  8. package/dist/api/QCarousel.json +4 -4
  9. package/dist/api/QChip.json +4 -4
  10. package/dist/api/QExpansionItem.json +3 -3
  11. package/dist/api/QFab.json +2 -2
  12. package/dist/api/QFabAction.json +1 -1
  13. package/dist/api/QLinearProgress.json +1 -1
  14. package/dist/api/QPagination.json +4 -4
  15. package/dist/api/QPullToRefresh.json +1 -1
  16. package/dist/api/QRating.json +3 -3
  17. package/dist/api/QRouteTab.json +1 -1
  18. package/dist/api/QSelect.json +1 -1
  19. package/dist/api/QStep.json +4 -4
  20. package/dist/api/QStepper.json +4 -4
  21. package/dist/api/QTab.json +1 -1
  22. package/dist/api/QTable.json +4 -4
  23. package/dist/api/QTimelineEntry.json +1 -1
  24. package/dist/api/QToggle.json +1 -1
  25. package/dist/api/QTree.json +1 -1
  26. package/dist/api/QVideo.json +11 -1
  27. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  28. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  29. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  30. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  31. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  32. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  33. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  34. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  35. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  36. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  37. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  38. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  39. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  40. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  42. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  43. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  44. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  45. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  46. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  47. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  48. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  49. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  50. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  51. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  52. package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
  53. package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
  54. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  55. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  56. package/dist/icon-set/themify.umd.prod.js +1 -1
  57. package/dist/lang/ar.umd.prod.js +1 -1
  58. package/dist/lang/az-Latn.umd.prod.js +1 -1
  59. package/dist/lang/bg.umd.prod.js +1 -1
  60. package/dist/lang/bn.umd.prod.js +1 -1
  61. package/dist/lang/ca.umd.prod.js +1 -1
  62. package/dist/lang/cs.umd.prod.js +1 -1
  63. package/dist/lang/da.umd.prod.js +1 -1
  64. package/dist/lang/de.umd.prod.js +1 -1
  65. package/dist/lang/el.umd.prod.js +1 -1
  66. package/dist/lang/en-GB.umd.prod.js +1 -1
  67. package/dist/lang/en-US.umd.prod.js +1 -1
  68. package/dist/lang/eo.umd.prod.js +1 -1
  69. package/dist/lang/es.umd.prod.js +1 -1
  70. package/dist/lang/et.umd.prod.js +1 -1
  71. package/dist/lang/fa-IR.umd.prod.js +1 -1
  72. package/dist/lang/fa.umd.prod.js +1 -1
  73. package/dist/lang/fi.umd.prod.js +1 -1
  74. package/dist/lang/fr.umd.prod.js +1 -1
  75. package/dist/lang/gn.umd.prod.js +1 -1
  76. package/dist/lang/he.umd.prod.js +1 -1
  77. package/dist/lang/hr.umd.prod.js +1 -1
  78. package/dist/lang/hu.umd.prod.js +1 -1
  79. package/dist/lang/id.umd.prod.js +1 -1
  80. package/dist/lang/is.umd.prod.js +1 -1
  81. package/dist/lang/it.umd.prod.js +1 -1
  82. package/dist/lang/ja.umd.prod.js +1 -1
  83. package/dist/lang/km.umd.prod.js +1 -1
  84. package/dist/lang/ko-KR.umd.prod.js +1 -1
  85. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  86. package/dist/lang/lt.umd.prod.js +1 -1
  87. package/dist/lang/lu.umd.prod.js +1 -1
  88. package/dist/lang/lv.umd.prod.js +1 -1
  89. package/dist/lang/ml.umd.prod.js +1 -1
  90. package/dist/lang/ms.umd.prod.js +1 -1
  91. package/dist/lang/nb-NO.umd.prod.js +1 -1
  92. package/dist/lang/nl.umd.prod.js +1 -1
  93. package/dist/lang/pl.umd.prod.js +1 -1
  94. package/dist/lang/pt-BR.umd.prod.js +1 -1
  95. package/dist/lang/pt.umd.prod.js +1 -1
  96. package/dist/lang/ro.umd.prod.js +1 -1
  97. package/dist/lang/ru.umd.prod.js +1 -1
  98. package/dist/lang/sk.umd.prod.js +1 -1
  99. package/dist/lang/sl.umd.prod.js +1 -1
  100. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  101. package/dist/lang/sr.umd.prod.js +1 -1
  102. package/dist/lang/sv.umd.prod.js +1 -1
  103. package/dist/lang/ta.umd.prod.js +1 -1
  104. package/dist/lang/th.umd.prod.js +1 -1
  105. package/dist/lang/tr.umd.prod.js +1 -1
  106. package/dist/lang/ug.umd.prod.js +1 -1
  107. package/dist/lang/uk.umd.prod.js +1 -1
  108. package/dist/lang/vi.umd.prod.js +1 -1
  109. package/dist/lang/zh-CN.umd.prod.js +1 -1
  110. package/dist/lang/zh-TW.umd.prod.js +1 -1
  111. package/dist/quasar.cjs.prod.js +2 -2
  112. package/dist/quasar.css +5 -5
  113. package/dist/quasar.esm.prod.js +2 -2
  114. package/dist/quasar.prod.css +1 -1
  115. package/dist/quasar.rtl.css +5 -5
  116. package/dist/quasar.rtl.prod.css +1 -1
  117. package/dist/quasar.sass +5 -6
  118. package/dist/quasar.umd.js +268 -206
  119. package/dist/quasar.umd.prod.js +2 -2
  120. package/dist/ssr-directives/Morph.js +1 -1
  121. package/dist/types/index.d.ts +5 -1
  122. package/dist/types/utils/date.d.ts +2 -1
  123. package/dist/vetur/quasar-attributes.json +4 -0
  124. package/dist/vetur/quasar-tags.json +2 -1
  125. package/dist/web-types/web-types.json +59 -50
  126. package/package.json +1 -1
  127. package/src/api.extends.json +1 -1
  128. package/src/components/dialog/QDialog.js +7 -5
  129. package/src/components/linear-progress/QLinearProgress.json +1 -1
  130. package/src/components/menu/QMenu.js +6 -2
  131. package/src/components/range/QRange.js +67 -89
  132. package/src/components/rating/QRating.json +3 -3
  133. package/src/components/resize-observer/QResizeObserver.js +11 -10
  134. package/src/components/scroll-area/QScrollArea.js +5 -1
  135. package/src/components/scroll-observer/QScrollObserver.js +2 -0
  136. package/src/components/slider/QSlider.js +20 -10
  137. package/src/components/slider/QSlider.sass +5 -6
  138. package/src/components/slider/use-slider.js +19 -16
  139. package/src/components/tabs/QTabs.js +27 -11
  140. package/src/components/tooltip/QTooltip.js +1 -2
  141. package/src/components/video/QVideo.js +4 -1
  142. package/src/components/video/QVideo.json +12 -1
  143. package/src/composables/private/use-field.js +13 -15
  144. package/src/composables/private/use-model-toggle.js +1 -1
  145. package/src/composables/private/use-portal.js +9 -7
  146. package/src/composables/private/use-tick.js +7 -14
  147. package/src/utils/clone.js +53 -4
  148. 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, prepareTick } = useTick()
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
- registerTick(() => {
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 && keyCode === 38 /* ArrowUp */)
350
- || (props.vertical !== true && keyCode === 37 /* ArrowLeft */)
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 () { hasFocus.value = true }
488
- function onFocusout () { hasFocus.value = false }
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, prepareTick } = useTick()
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
- "src=\"https://www.youtube.com/embed/k3_tw44QsZQ\""
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
- let focusFn
266
+ function focusHandler () {
267
+ const el = document.activeElement
268
+ let target = state.targetRef !== void 0 && state.targetRef.value
267
269
 
268
- function focus () {
269
- focusFn !== void 0 && removeFocusFn(focusFn)
270
- focusFn = addFocusFn(() => {
271
- focusFn = void 0
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
- focusFn !== void 0 && removeFocusFn(focusFn)
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), prepareTick()
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 (onGlobalDialog === false && portalEl === null) {
52
- portalEl = createGlobalNode()
53
- }
51
+ if (portalIsActive.value === false) {
52
+ if (onGlobalDialog === false && portalEl === null) {
53
+ portalEl = createGlobalNode()
54
+ }
54
55
 
55
- portalIsActive.value = true
56
+ portalIsActive.value = true
56
57
 
57
- // register portal
58
- portalList.push(vm.proxy)
58
+ // register portal
59
+ portalList.push(vm.proxy)
59
60
 
60
- addFocusWaitFlag(focusObj)
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
  }
@@ -1,6 +1,55 @@
1
- export default function (data) {
2
- const s = JSON.stringify(data)
3
- if (s) {
4
- return JSON.parse(s)
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
- const waitFlags = []
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
- const index = waitFlags.indexOf(flag)
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
- const index = queue.indexOf(fn)
33
- if (index !== -1) {
34
- queue.splice(index, 1)
35
- }
33
+ queue = queue.filter(entry => entry !== fn)
36
34
  }