quasar 1.22.3 → 1.22.5

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 (122) hide show
  1. package/dist/icon-set/bootstrap-icons.umd.min.js +1 -1
  2. package/dist/icon-set/eva-icons.umd.min.js +1 -1
  3. package/dist/icon-set/fontawesome-v5-pro.umd.min.js +1 -1
  4. package/dist/icon-set/fontawesome-v5.umd.min.js +1 -1
  5. package/dist/icon-set/fontawesome-v6-pro.umd.min.js +1 -1
  6. package/dist/icon-set/fontawesome-v6.umd.min.js +1 -1
  7. package/dist/icon-set/ionicons-v4.umd.min.js +1 -1
  8. package/dist/icon-set/line-awesome.umd.min.js +1 -1
  9. package/dist/icon-set/material-icons-outlined.umd.min.js +1 -1
  10. package/dist/icon-set/material-icons-round.umd.min.js +1 -1
  11. package/dist/icon-set/material-icons-sharp.umd.min.js +1 -1
  12. package/dist/icon-set/material-icons.umd.min.js +1 -1
  13. package/dist/icon-set/material-symbols-outlined.umd.min.js +1 -1
  14. package/dist/icon-set/material-symbols-rounded.umd.min.js +1 -1
  15. package/dist/icon-set/material-symbols-sharp.umd.min.js +1 -1
  16. package/dist/icon-set/mdi-v3.umd.min.js +1 -1
  17. package/dist/icon-set/mdi-v4.umd.min.js +1 -1
  18. package/dist/icon-set/mdi-v5.umd.min.js +1 -1
  19. package/dist/icon-set/mdi-v6.umd.min.js +1 -1
  20. package/dist/icon-set/mdi-v7.umd.min.js +1 -1
  21. package/dist/icon-set/svg-bootstrap-icons.umd.min.js +1 -1
  22. package/dist/icon-set/svg-eva-icons.umd.min.js +1 -1
  23. package/dist/icon-set/svg-fontawesome-v5.umd.min.js +1 -1
  24. package/dist/icon-set/svg-fontawesome-v6.umd.min.js +1 -1
  25. package/dist/icon-set/svg-ionicons-v4.umd.min.js +1 -1
  26. package/dist/icon-set/svg-ionicons-v5.umd.min.js +1 -1
  27. package/dist/icon-set/svg-ionicons-v6.umd.min.js +1 -1
  28. package/dist/icon-set/svg-line-awesome.umd.min.js +1 -1
  29. package/dist/icon-set/svg-material-icons-outlined.umd.min.js +1 -1
  30. package/dist/icon-set/svg-material-icons-round.umd.min.js +1 -1
  31. package/dist/icon-set/svg-material-icons-sharp.umd.min.js +1 -1
  32. package/dist/icon-set/svg-material-icons.umd.min.js +1 -1
  33. package/dist/icon-set/svg-material-symbols-outlined.umd.min.js +1 -1
  34. package/dist/icon-set/svg-material-symbols-rounded.umd.min.js +1 -1
  35. package/dist/icon-set/svg-material-symbols-sharp.umd.min.js +1 -1
  36. package/dist/icon-set/svg-mdi-v4.umd.min.js +1 -1
  37. package/dist/icon-set/svg-mdi-v5.umd.min.js +1 -1
  38. package/dist/icon-set/svg-mdi-v6.umd.min.js +1 -1
  39. package/dist/icon-set/svg-mdi-v7.umd.min.js +1 -1
  40. package/dist/icon-set/svg-themify.umd.min.js +1 -1
  41. package/dist/icon-set/themify.umd.min.js +1 -1
  42. package/dist/lang/ar.umd.min.js +1 -1
  43. package/dist/lang/az-latn.umd.min.js +1 -1
  44. package/dist/lang/bg.umd.min.js +1 -1
  45. package/dist/lang/ca.umd.min.js +1 -1
  46. package/dist/lang/cs.umd.min.js +1 -1
  47. package/dist/lang/da.umd.min.js +1 -1
  48. package/dist/lang/de.umd.min.js +1 -1
  49. package/dist/lang/el.umd.min.js +1 -1
  50. package/dist/lang/en-gb.umd.min.js +1 -1
  51. package/dist/lang/en-us.umd.min.js +1 -1
  52. package/dist/lang/eo.umd.min.js +1 -1
  53. package/dist/lang/es.umd.min.js +1 -1
  54. package/dist/lang/et.umd.min.js +1 -1
  55. package/dist/lang/eu.umd.min.js +1 -1
  56. package/dist/lang/fa-ir.umd.min.js +1 -1
  57. package/dist/lang/fa.umd.min.js +1 -1
  58. package/dist/lang/fi.umd.min.js +1 -1
  59. package/dist/lang/fr.umd.min.js +1 -1
  60. package/dist/lang/gn.umd.min.js +1 -1
  61. package/dist/lang/he.umd.min.js +1 -1
  62. package/dist/lang/hr.umd.min.js +1 -1
  63. package/dist/lang/hu.umd.min.js +1 -1
  64. package/dist/lang/id.umd.min.js +1 -1
  65. package/dist/lang/is.umd.min.js +1 -1
  66. package/dist/lang/it.umd.min.js +1 -1
  67. package/dist/lang/ja.umd.min.js +1 -1
  68. package/dist/lang/km.umd.min.js +1 -1
  69. package/dist/lang/ko-kr.umd.min.js +1 -1
  70. package/dist/lang/kur-ckb.umd.min.js +1 -1
  71. package/dist/lang/kz.umd.min.js +1 -1
  72. package/dist/lang/lu.umd.min.js +1 -1
  73. package/dist/lang/lv.umd.min.js +1 -1
  74. package/dist/lang/ml.umd.min.js +1 -1
  75. package/dist/lang/mm.umd.min.js +1 -1
  76. package/dist/lang/ms.umd.min.js +1 -1
  77. package/dist/lang/my.umd.min.js +1 -1
  78. package/dist/lang/nb-no.umd.min.js +1 -1
  79. package/dist/lang/nl.umd.min.js +1 -1
  80. package/dist/lang/pl.umd.min.js +1 -1
  81. package/dist/lang/pt-br.umd.min.js +1 -1
  82. package/dist/lang/pt.umd.min.js +1 -1
  83. package/dist/lang/ro.umd.min.js +1 -1
  84. package/dist/lang/ru.umd.min.js +1 -1
  85. package/dist/lang/sk.umd.min.js +1 -1
  86. package/dist/lang/sl.umd.min.js +1 -1
  87. package/dist/lang/sm.umd.min.js +1 -1
  88. package/dist/lang/sr.umd.min.js +1 -1
  89. package/dist/lang/sv.umd.min.js +1 -1
  90. package/dist/lang/ta.umd.min.js +1 -1
  91. package/dist/lang/th.umd.min.js +1 -1
  92. package/dist/lang/tr.umd.min.js +1 -1
  93. package/dist/lang/ug.umd.min.js +1 -1
  94. package/dist/lang/uk.umd.min.js +1 -1
  95. package/dist/lang/uz-Cyrl.umd.min.js +1 -1
  96. package/dist/lang/uz-Latn.umd.min.js +1 -1
  97. package/dist/lang/vi.umd.min.js +1 -1
  98. package/dist/lang/zh-hans.umd.min.js +1 -1
  99. package/dist/lang/zh-hant.umd.min.js +1 -1
  100. package/dist/quasar.addon.css +1 -1
  101. package/dist/quasar.addon.rtl.css +1 -1
  102. package/dist/quasar.common.js +2 -2
  103. package/dist/quasar.css +1 -1
  104. package/dist/quasar.esm.js +2 -2
  105. package/dist/quasar.ie.polyfills.js +1 -1
  106. package/dist/quasar.ie.polyfills.umd.min.js +1 -1
  107. package/dist/quasar.rtl.css +1 -1
  108. package/dist/quasar.sass +1 -1
  109. package/dist/quasar.styl +1 -1
  110. package/dist/quasar.umd.js +134 -39
  111. package/dist/quasar.umd.min.js +2 -2
  112. package/dist/quasar.umd.modern.js +129 -38
  113. package/dist/quasar.umd.modern.min.js +2 -2
  114. package/dist/web-types/web-types.json +1 -1
  115. package/package.json +1 -1
  116. package/src/components/dialog/QDialog.js +2 -1
  117. package/src/components/infinite-scroll/QInfiniteScroll.js +37 -2
  118. package/src/css/core/visibility.sass +0 -1
  119. package/src/css/core/visibility.styl +0 -1
  120. package/src/mixins/prevent-scroll.js +9 -1
  121. package/src/utils/is.js +11 -6
  122. package/src/utils/private/position-engine.js +67 -30
@@ -2,7 +2,7 @@
2
2
  "$schema": "",
3
3
  "framework": "vue",
4
4
  "name": "quasar",
5
- "version": "1.22.3",
5
+ "version": "1.22.5",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "types-syntax": "typescript",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quasar",
3
- "version": "1.22.3",
3
+ "version": "1.22.5",
4
4
  "description": "Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time",
5
5
  "module": "src/index.esm.js",
6
6
  "typings": "dist/types/index.d.ts",
@@ -372,7 +372,7 @@ export default Vue.extend({
372
372
  staticClass: 'q-dialog__backdrop fixed-full',
373
373
  attrs: backdropAttrs,
374
374
  on: cache(this, 'bkdrop', {
375
- [ this.$q.platform.is.ios === true ? 'click' : 'focusin' ]: this.__onBackdropClick
375
+ [ this.backdropEvt ]: this.__onBackdropClick
376
376
  })
377
377
  })
378
378
  ] : null),
@@ -395,6 +395,7 @@ export default Vue.extend({
395
395
  created () {
396
396
  this.__useTick('__registerTick', '__removeTick')
397
397
  this.__useTimeout('__registerTimeout')
398
+ this.backdropEvt = this.$q.platform.is.ios === true || this.$q.platform.is.safari ? 'click' : 'focusin'
398
399
  },
399
400
 
400
401
  mounted () {
@@ -44,6 +44,12 @@ export default Vue.extend({
44
44
  }
45
45
  },
46
46
 
47
+ computed: {
48
+ renderLoadingSlot () {
49
+ return this.disable !== true && this.isWorking === true
50
+ }
51
+ },
52
+
47
53
  watch: {
48
54
  disable (val) {
49
55
  if (val === true) { this.stop() }
@@ -62,6 +68,14 @@ export default Vue.extend({
62
68
 
63
69
  debounce (val) {
64
70
  this.__setDebounce(val)
71
+ },
72
+
73
+ isFetching () {
74
+ this.__updateSvgAnimations()
75
+ },
76
+
77
+ renderLoadingSlot () {
78
+ this.__updateSvgAnimations()
65
79
  }
66
80
  },
67
81
 
@@ -183,14 +197,34 @@ export default Vue.extend({
183
197
 
184
198
  this.__scrollTarget.addEventListener('scroll', this.poll, passive)
185
199
  }
200
+ },
201
+
202
+ __updateSvgAnimations (isRetry) {
203
+ if (this.renderLoadingSlot === true) {
204
+ const el = this.$refs.loading
205
+
206
+ if (!el) {
207
+ isRetry !== true && this.$nextTick(() => {
208
+ this.__updateSvgAnimations(true)
209
+ })
210
+ return
211
+ }
212
+
213
+ // we need to pause svg animations (if any) when hiding
214
+ // otherwise the browser will keep on recalculating the style
215
+ const action = `${ this.isFetching === true ? 'un' : '' }pauseAnimations`
216
+ Array.from(el.getElementsByTagName('svg')).forEach(el => {
217
+ el[ action ]()
218
+ })
219
+ }
186
220
  }
187
221
  },
188
222
 
189
223
  mounted () {
190
224
  this.immediatePoll = this.poll
191
225
  this.__setDebounce(this.debounce)
192
-
193
226
  this.updateScrollTarget()
227
+ this.isFetching === false && this.__updateSvgAnimations()
194
228
  },
195
229
 
196
230
  activated () {
@@ -212,9 +246,10 @@ export default Vue.extend({
212
246
  render (h) {
213
247
  const child = uniqueSlot(this, 'default', [])
214
248
 
215
- if (this.disable !== true && this.isWorking === true) {
249
+ if (this.renderLoadingSlot === true) {
216
250
  child[this.reverse === false ? 'push' : 'unshift'](
217
251
  h('div', {
252
+ ref: 'loading',
218
253
  staticClass: 'q-infinite-scroll__loading',
219
254
  class: this.isFetching === true ? '' : 'invisible'
220
255
  }, slot(this, 'loading'))
@@ -162,4 +162,3 @@ body.desktop
162
162
  .q-focusable:focus, .q-manual-focusable--focused
163
163
  > .q-focus-helper
164
164
  opacity: .22
165
-
@@ -161,4 +161,3 @@ body.desktop
161
161
  .q-focusable:focus, .q-manual-focusable--focused
162
162
  > .q-focus-helper
163
163
  opacity: .22
164
-
@@ -10,6 +10,7 @@ let
10
10
  vpPendingUpdate = false,
11
11
  bodyLeft,
12
12
  bodyTop,
13
+ href,
13
14
  closeTimer
14
15
 
15
16
  function onWheel (e) {
@@ -96,6 +97,8 @@ function apply (action) {
96
97
  bodyLeft = body.style.left
97
98
  bodyTop = body.style.top
98
99
 
100
+ href = window.location.href
101
+
99
102
  body.style.left = `-${scrollPositionX}px`
100
103
  body.style.top = `-${scrollPositionY}px`
101
104
  if (overflowY !== 'hidden' && (overflowY === 'scroll' || body.scrollHeight > window.innerHeight)) {
@@ -104,6 +107,7 @@ function apply (action) {
104
107
 
105
108
  body.classList.add('q-body--prevent-scroll')
106
109
  document.qScrollPrevented = true
110
+
107
111
  if (client.is.ios === true) {
108
112
  if (hasViewport === true) {
109
113
  window.scrollTo(0, 0)
@@ -140,7 +144,11 @@ function apply (action) {
140
144
  body.style.left = bodyLeft
141
145
  body.style.top = bodyTop
142
146
 
143
- window.scrollTo(scrollPositionX, scrollPositionY)
147
+ // scroll back only if route has not changed
148
+ if (window.location.href === href) {
149
+ window.scrollTo(scrollPositionX, scrollPositionY)
150
+ }
151
+
144
152
  maxScrollTop = void 0
145
153
  }
146
154
  }
package/src/utils/is.js CHANGED
@@ -36,20 +36,23 @@ export function isDeepEqual (a, b) {
36
36
  return false
37
37
  }
38
38
 
39
- i = a.entries().next()
39
+ let iter = a.entries()
40
+
41
+ i = iter.next()
40
42
  while (i.done !== true) {
41
43
  if (b.has(i.value[0]) !== true) {
42
44
  return false
43
45
  }
44
- i = i.next()
46
+ i = iter.next()
45
47
  }
46
48
 
47
- i = a.entries().next()
49
+ iter = a.entries()
50
+ i = iter.next()
48
51
  while (i.done !== true) {
49
52
  if (isDeepEqual(i.value[1], b.get(i.value[0])) !== true) {
50
53
  return false
51
54
  }
52
- i = i.next()
55
+ i = iter.next()
53
56
  }
54
57
 
55
58
  return true
@@ -60,12 +63,14 @@ export function isDeepEqual (a, b) {
60
63
  return false
61
64
  }
62
65
 
63
- i = a.entries().next()
66
+ const iter = a.entries()
67
+
68
+ i = iter.next()
64
69
  while (i.done !== true) {
65
70
  if (b.has(i.value[0]) !== true) {
66
71
  return false
67
72
  }
68
- i = i.next()
73
+ i = iter.next()
69
74
  }
70
75
 
71
76
  return true
@@ -48,11 +48,6 @@ export function parsePosition (pos, rtl) {
48
48
  }
49
49
  }
50
50
 
51
- export function validateCover (val) {
52
- if (val === true || val === false) { return true }
53
- return validatePosition(val)
54
- }
55
-
56
51
  export function getAnchorProps (el, offset) {
57
52
  let { top, left, right, bottom, width, height } = el.getBoundingClientRect()
58
53
 
@@ -67,17 +62,32 @@ export function getAnchorProps (el, offset) {
67
62
  }
68
63
 
69
64
  return {
70
- top,
71
- left,
72
- right,
73
- bottom,
74
- width,
75
- height,
65
+ top, bottom, height,
66
+ left, right, width,
76
67
  middle: left + (right - left) / 2,
77
68
  center: top + (bottom - top) / 2
78
69
  }
79
70
  }
80
71
 
72
+ function getAbsoluteAnchorProps (el, absoluteOffset, offset) {
73
+ let { top, left } = el.getBoundingClientRect()
74
+
75
+ top += absoluteOffset.top
76
+ left += absoluteOffset.left
77
+
78
+ if (offset !== void 0) {
79
+ top += offset[ 1 ]
80
+ left += offset[ 0 ]
81
+ }
82
+
83
+ return {
84
+ top, bottom: top + 1, height: 1,
85
+ left, right: left + 1, width: 1,
86
+ middle: left,
87
+ center: top
88
+ }
89
+ }
90
+
81
91
  export function getTargetProps (el) {
82
92
  return {
83
93
  top: 0,
@@ -89,6 +99,13 @@ export function getTargetProps (el) {
89
99
  }
90
100
  }
91
101
 
102
+ function getTopLeftProps (anchorProps, targetProps, cfg) {
103
+ return {
104
+ top: anchorProps[ cfg.anchorOrigin.vertical ] - targetProps[ cfg.selfOrigin.vertical ],
105
+ left: anchorProps[ cfg.anchorOrigin.horizontal ] - targetProps[ cfg.selfOrigin.horizontal ]
106
+ }
107
+ }
108
+
92
109
  // cfg: { el, anchorEl, anchorOrigin, selfOrigin, offset, absoluteOffset, cover, fit, maxHeight, maxWidth }
93
110
  export function setPosition (cfg) {
94
111
  if (client.is.ios === true && window.visualViewport !== void 0) {
@@ -107,25 +124,15 @@ export function setPosition (cfg) {
107
124
  }
108
125
  }
109
126
 
110
- let anchorProps
111
-
112
127
  // scroll position might change
113
128
  // if max-height/-width changes, so we
114
129
  // need to restore it after we calculate
115
130
  // the new positioning
116
131
  const { scrollLeft, scrollTop } = cfg.el
117
132
 
118
- if (cfg.absoluteOffset === void 0) {
119
- anchorProps = getAnchorProps(cfg.anchorEl, cfg.cover === true ? [0, 0] : cfg.offset)
120
- }
121
- else {
122
- const
123
- { top: anchorTop, left: anchorLeft } = cfg.anchorEl.getBoundingClientRect(),
124
- top = anchorTop + cfg.absoluteOffset.top,
125
- left = anchorLeft + cfg.absoluteOffset.left
126
-
127
- anchorProps = { top, left, width: 1, height: 1, right: left + 1, center: top, middle: left, bottom: top + 1 }
128
- }
133
+ const anchorProps = cfg.absoluteOffset === void 0
134
+ ? getAnchorProps(cfg.anchorEl, cfg.cover === true ? [ 0, 0 ] : cfg.offset)
135
+ : getAbsoluteAnchorProps(cfg.anchorEl, cfg.absoluteOffset, cfg.offset)
129
136
 
130
137
  let elStyle = {
131
138
  maxHeight: cfg.maxHeight,
@@ -142,14 +149,44 @@ export function setPosition (cfg) {
142
149
 
143
150
  Object.assign(cfg.el.style, elStyle)
144
151
 
145
- const
146
- targetProps = getTargetProps(cfg.el),
147
- props = {
148
- top: anchorProps[cfg.anchorOrigin.vertical] - targetProps[cfg.selfOrigin.vertical],
149
- left: anchorProps[cfg.anchorOrigin.horizontal] - targetProps[cfg.selfOrigin.horizontal]
152
+ const targetProps = getTargetProps(cfg.el)
153
+ let props = getTopLeftProps(anchorProps, targetProps, cfg)
154
+
155
+ if (cfg.absoluteOffset === void 0 || cfg.offset === void 0) {
156
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin)
157
+ }
158
+ else { // we have touch position or context menu with offset
159
+ const { top, left } = props // cache initial values
160
+
161
+ // apply initial boundaries
162
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin)
163
+
164
+ let hasChanged = false
165
+
166
+ // did it flip vertically?
167
+ if (props.top !== top) {
168
+ hasChanged = true
169
+ const offsetY = 2 * cfg.offset[ 1 ]
170
+ anchorProps.center = anchorProps.top -= offsetY
171
+ anchorProps.bottom -= offsetY + 2
172
+ }
173
+
174
+ // did it flip horizontally?
175
+ if (props.left !== left) {
176
+ hasChanged = true
177
+ const offsetX = 2 * cfg.offset[ 0 ]
178
+ anchorProps.middle = anchorProps.left -= offsetX
179
+ anchorProps.right -= offsetX + 2
150
180
  }
151
181
 
152
- applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin)
182
+ if (hasChanged === true) {
183
+ // re-calculate props with the new anchor
184
+ props = getTopLeftProps(anchorProps, targetProps, cfg)
185
+
186
+ // and re-apply boundaries
187
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin)
188
+ }
189
+ }
153
190
 
154
191
  elStyle = {
155
192
  top: props.top + 'px',