quasar 1.18.10 → 1.19.2

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 (150) 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 +6 -0
  14. package/dist/icon-set/material-symbols-rounded.umd.min.js +6 -0
  15. package/dist/icon-set/material-symbols-sharp.umd.min.js +6 -0
  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/svg-bootstrap-icons.umd.min.js +1 -1
  21. package/dist/icon-set/svg-eva-icons.umd.min.js +1 -1
  22. package/dist/icon-set/svg-fontawesome-v5.umd.min.js +1 -1
  23. package/dist/icon-set/svg-fontawesome-v6.umd.min.js +1 -1
  24. package/dist/icon-set/svg-ionicons-v4.umd.min.js +1 -1
  25. package/dist/icon-set/svg-ionicons-v5.umd.min.js +1 -1
  26. package/dist/icon-set/svg-ionicons-v6.umd.min.js +1 -1
  27. package/dist/icon-set/svg-line-awesome.umd.min.js +1 -1
  28. package/dist/icon-set/svg-material-icons-outlined.umd.min.js +1 -1
  29. package/dist/icon-set/svg-material-icons-round.umd.min.js +1 -1
  30. package/dist/icon-set/svg-material-icons-sharp.umd.min.js +1 -1
  31. package/dist/icon-set/svg-material-icons.umd.min.js +1 -1
  32. package/dist/icon-set/svg-material-symbols-outlined.umd.min.js +6 -0
  33. package/dist/icon-set/svg-material-symbols-rounded.umd.min.js +6 -0
  34. package/dist/icon-set/svg-material-symbols-sharp.umd.min.js +6 -0
  35. package/dist/icon-set/svg-mdi-v4.umd.min.js +1 -1
  36. package/dist/icon-set/svg-mdi-v5.umd.min.js +1 -1
  37. package/dist/icon-set/svg-mdi-v6.umd.min.js +1 -1
  38. package/dist/icon-set/svg-themify.umd.min.js +1 -1
  39. package/dist/icon-set/themify.umd.min.js +1 -1
  40. package/dist/lang/ar.umd.min.js +1 -1
  41. package/dist/lang/az-latn.umd.min.js +1 -1
  42. package/dist/lang/bg.umd.min.js +1 -1
  43. package/dist/lang/ca.umd.min.js +2 -2
  44. package/dist/lang/cs.umd.min.js +1 -1
  45. package/dist/lang/da.umd.min.js +1 -1
  46. package/dist/lang/de.umd.min.js +1 -1
  47. package/dist/lang/el.umd.min.js +1 -1
  48. package/dist/lang/en-gb.umd.min.js +1 -1
  49. package/dist/lang/en-us.umd.min.js +1 -1
  50. package/dist/lang/eo.umd.min.js +1 -1
  51. package/dist/lang/es.umd.min.js +1 -1
  52. package/dist/lang/et.umd.min.js +1 -1
  53. package/dist/lang/eu.umd.min.js +1 -1
  54. package/dist/lang/fa-ir.umd.min.js +1 -1
  55. package/dist/lang/fa.umd.min.js +1 -1
  56. package/dist/lang/fi.umd.min.js +1 -1
  57. package/dist/lang/fr.umd.min.js +1 -1
  58. package/dist/lang/gn.umd.min.js +1 -1
  59. package/dist/lang/he.umd.min.js +1 -1
  60. package/dist/lang/hr.umd.min.js +1 -1
  61. package/dist/lang/hu.umd.min.js +1 -1
  62. package/dist/lang/id.umd.min.js +1 -1
  63. package/dist/lang/is.umd.min.js +1 -1
  64. package/dist/lang/it.umd.min.js +1 -1
  65. package/dist/lang/ja.umd.min.js +1 -1
  66. package/dist/lang/km.umd.min.js +1 -1
  67. package/dist/lang/ko-kr.umd.min.js +2 -2
  68. package/dist/lang/kur-ckb.umd.min.js +1 -1
  69. package/dist/lang/kz.umd.min.js +1 -1
  70. package/dist/lang/lu.umd.min.js +1 -1
  71. package/dist/lang/lv.umd.min.js +1 -1
  72. package/dist/lang/ml.umd.min.js +1 -1
  73. package/dist/lang/mm.umd.min.js +6 -0
  74. package/dist/lang/ms.umd.min.js +1 -1
  75. package/dist/lang/my.umd.min.js +1 -1
  76. package/dist/lang/nb-no.umd.min.js +1 -1
  77. package/dist/lang/nl.umd.min.js +1 -1
  78. package/dist/lang/pl.umd.min.js +1 -1
  79. package/dist/lang/pt-br.umd.min.js +1 -1
  80. package/dist/lang/pt.umd.min.js +1 -1
  81. package/dist/lang/ro.umd.min.js +1 -1
  82. package/dist/lang/ru.umd.min.js +1 -1
  83. package/dist/lang/sk.umd.min.js +1 -1
  84. package/dist/lang/sl.umd.min.js +1 -1
  85. package/dist/lang/sm.umd.min.js +6 -0
  86. package/dist/lang/sr.umd.min.js +1 -1
  87. package/dist/lang/sv.umd.min.js +1 -1
  88. package/dist/lang/ta.umd.min.js +1 -1
  89. package/dist/lang/th.umd.min.js +1 -1
  90. package/dist/lang/tr.umd.min.js +1 -1
  91. package/dist/lang/ug.umd.min.js +1 -1
  92. package/dist/lang/uk.umd.min.js +1 -1
  93. package/dist/lang/vi.umd.min.js +1 -1
  94. package/dist/lang/zh-hans.umd.min.js +1 -1
  95. package/dist/lang/zh-hant.umd.min.js +1 -1
  96. package/dist/quasar.addon.css +1 -1
  97. package/dist/quasar.addon.rtl.css +1 -1
  98. package/dist/quasar.common.js +2 -2
  99. package/dist/quasar.css +12 -6
  100. package/dist/quasar.esm.js +2 -2
  101. package/dist/quasar.ie.polyfills.js +1 -1
  102. package/dist/quasar.ie.polyfills.umd.min.js +1 -1
  103. package/dist/quasar.min.css +1 -1
  104. package/dist/quasar.rtl.css +12 -6
  105. package/dist/quasar.rtl.min.css +1 -1
  106. package/dist/quasar.sass +11 -5
  107. package/dist/quasar.styl +11 -5
  108. package/dist/quasar.umd.js +124 -104
  109. package/dist/quasar.umd.min.js +2 -2
  110. package/dist/quasar.umd.modern.js +119 -100
  111. package/dist/quasar.umd.modern.min.js +2 -2
  112. package/dist/types/extras/icon-set.d.ts +6 -0
  113. package/dist/types/index.d.ts +2 -0
  114. package/dist/web-types/web-types.json +1 -1
  115. package/icon-set/material-symbols-outlined.js +128 -0
  116. package/icon-set/material-symbols-rounded.js +128 -0
  117. package/icon-set/material-symbols-sharp.js +128 -0
  118. package/icon-set/svg-material-symbols-outlined.js +202 -0
  119. package/icon-set/svg-material-symbols-rounded.js +202 -0
  120. package/icon-set/svg-material-symbols-sharp.js +202 -0
  121. package/lang/ca.js +31 -31
  122. package/lang/index.json +8 -0
  123. package/lang/ko-kr.js +21 -21
  124. package/lang/mm.js +93 -0
  125. package/lang/sm.js +93 -0
  126. package/package.json +1 -1
  127. package/src/components/btn/QBtn.js +2 -2
  128. package/src/components/editor/QEditor.js +12 -30
  129. package/src/components/editor/editor-caret.js +1 -1
  130. package/src/components/field/QField.js +3 -2
  131. package/src/components/file/QFile.js +4 -2
  132. package/src/components/icon/QIcon.js +24 -1
  133. package/src/components/icon/QIcon.sass +7 -3
  134. package/src/components/icon/QIcon.styl +7 -3
  135. package/src/components/infinite-scroll/QInfiniteScroll.js +10 -10
  136. package/src/components/input/QInput.js +5 -2
  137. package/src/components/layout/QLayout.js +1 -0
  138. package/src/components/select/QSelect.js +11 -6
  139. package/src/components/table/QTable.sass +1 -1
  140. package/src/components/table/QTable.styl +1 -1
  141. package/src/components/uploader/QUploaderBase.js +24 -19
  142. package/src/css/core/colors.sass +1 -0
  143. package/src/css/core/colors.styl +1 -0
  144. package/src/css/core/dark.sass +1 -0
  145. package/src/css/core/dark.styl +1 -0
  146. package/src/directives/Ripple.js +2 -7
  147. package/src/mixins/anchor.js +1 -1
  148. package/src/mixins/composition.js +16 -13
  149. package/src/mixins/virtual-scroll.js +3 -2
  150. package/src/utils/date.js +1 -1
package/lang/sm.js ADDED
@@ -0,0 +1,93 @@
1
+ export default {
2
+ isoName: 'sm',
3
+ nativeName: 'Fa\'asāmoa',
4
+ label: {
5
+ clear: 'Kilia',
6
+ ok: '\'Oukei',
7
+ cancel: 'Fa\'alēaogāina',
8
+ close: 'Tapuni',
9
+ set: 'Seti',
10
+ select: 'Filifili',
11
+ reset: 'Toe seti',
12
+ remove: '\'Ave\'ese',
13
+ update: 'Fa\'afou',
14
+ create: 'Fatu',
15
+ search: 'Sā\'ili',
16
+ filter: 'Fa\'amamā',
17
+ refresh: 'Fa\'afou'
18
+ },
19
+ date: {
20
+ days: 'Aso Sā_Aso Gafua_Aso Lua_Aso Lulu_Aso Tofi_Aso Faraile_Aso To\'onai'.split('_'),
21
+ daysShort: 'Sā_Gaf_Lua_Lul_Tof_Far_Too'.split('_'),
22
+ months: 'Ianuari_Fepuari_Mati_\'Aperila_Mē_Iuni_Iulai_\'Aokuso_Sētema_\'Oketopa_Nōvema_Tēsema'.split('_'),
23
+ monthsShort: 'Ian_Fep_Mat_Ape_Mē_Iun_Iul_Auk_Sēt_Oke_Nōv_Tēs'.split('_'),
24
+ firstDayOfWeek: 1, // 0-6, 0 - Sunday, 1 Monday, ...
25
+ format24h: false,
26
+ pluralDay: 'aso'
27
+ },
28
+ table: {
29
+ noData: 'Lēai ni fa\'amatalaga o maua',
30
+ noResults: 'Lēai ni fa\'amaumauga na maua',
31
+ loading: '\'Āmatalia...',
32
+ selectedRecords: function (rows) {
33
+ return rows === 1
34
+ ? '1 le laina \'ua filifilia.'
35
+ : (rows === 0 ? 'Lēai ni' : rows) + ' laina \'ua filifilia.'
36
+ },
37
+ recordsPerPage: 'Laina \'i le ītūlau:',
38
+ allRows: 'Laina \'uma',
39
+ pagination: function (start, end, total) {
40
+ return start + '-' + end + ' o ' + total
41
+ },
42
+ columns: 'Poutū'
43
+ },
44
+ editor: {
45
+ url: 'Tuātusi initaneti',
46
+ bold: 'Fa\'aolaola',
47
+ italic: 'Fa\'api\'o',
48
+ strikethrough: 'Kolosi',
49
+ underline: 'Vase lalo',
50
+ unorderedList: 'Lisi \'e fe\'i fa\'atulagaina',
51
+ orderedList: 'Lisi \'ua fa\'atulagaina',
52
+ subscript: 'Fa\'anini\'i i lalo',
53
+ superscript: 'Fa\'anini\'i i luga',
54
+ hyperlink: 'So\'otaga initaneti',
55
+ toggleFullscreen: 'Fa\'atelē ma fa\'alititi le va\'ai',
56
+ quote: 'Saunoaga',
57
+ left: 'Ōgatasi agavale',
58
+ center: 'Ōgatasi \'ogātotonu',
59
+ right: 'Ōgatasi taumatau',
60
+ justify: 'Ōgatasi lautele',
61
+ print: 'Lolomi',
62
+ outdent: 'Fa\'alaititi le va',
63
+ indent: 'Fa\'atelē le va',
64
+ removeFormat: '\'Ave\'ese le fa\'atulagaga',
65
+ formatting: 'Fa\'atulagaga',
66
+ fontSize: 'Telē o le mata\'itusi',
67
+ align: 'Ōgatasi',
68
+ hr: 'Fa\'aopoopo se laina',
69
+ undo: 'Toe \'ave\'ese',
70
+ redo: 'Toe fai',
71
+ heading1: 'Ulutala 1',
72
+ heading2: 'Ulutala 2',
73
+ heading3: 'Ulutala 3',
74
+ heading4: 'Ulutala 4',
75
+ heading5: 'Ulutala 5',
76
+ heading6: 'Ulutala 6',
77
+ paragraph: 'Palakalafa',
78
+ code: 'Fa\'ailo fa\'akomepiuta',
79
+ size1: 'Matuā laitiiti',
80
+ size2: 'Fa\'alaititi',
81
+ size3: 'Tūlaga masani',
82
+ size4: 'Lāpo\'a feololo',
83
+ size5: 'Lāpo\'a',
84
+ size6: 'Lāpo\'a atu',
85
+ size7: 'Pito i lāpo\'a',
86
+ defaultFont: 'Foliga fou ole mata\'itusi',
87
+ viewSource: 'Va\'ai \'ile tusitusiga fa\'akomepiuta'
88
+ },
89
+ tree: {
90
+ noNodes: 'Lēai ni vāega o maua',
91
+ noResults: 'Lēai ni vāega na maua'
92
+ }
93
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quasar",
3
- "version": "1.18.10",
3
+ "version": "1.19.2",
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",
@@ -320,11 +320,11 @@ export default Vue.extend({
320
320
  if (this.loading === true && this.percentage !== void 0) {
321
321
  child.push(
322
322
  h('span', {
323
- staticClass: 'q-btn__progress absolute-full overflow-hidden'
323
+ staticClass: 'q-btn__progress absolute-full overflow-hidden',
324
+ class: this.darkPercentage === true ? 'q-btn__progress--dark' : ''
324
325
  }, [
325
326
  h('span', {
326
327
  staticClass: 'q-btn__progress-indicator fit block',
327
- class: this.darkPercentage === true ? 'q-btn__progress--dark' : '',
328
328
  style: this.percentageStyle
329
329
  })
330
330
  ])
@@ -379,33 +379,14 @@ export default Vue.extend({
379
379
  }
380
380
  },
381
381
 
382
- __onMousedown () {
382
+ // mousedown, touchstart
383
+ __onPointerStart (e) {
383
384
  this.__offsetBottom = void 0
385
+ this.qListeners[e.type] !== void 0 && this.$emit(e.type, e)
384
386
  },
385
387
 
386
- __onMouseup (e) {
388
+ __onSelectionchange () {
387
389
  this.caret.save()
388
- if (this.qListeners.mouseup !== void 0) {
389
- this.$emit('mouseup', e)
390
- }
391
- },
392
-
393
- __onKeyup (e) {
394
- this.caret.save()
395
- if (this.qListeners.keyup !== void 0) {
396
- this.$emit('keyup', e)
397
- }
398
- },
399
-
400
- __onTouchstart () {
401
- this.__offsetBottom = void 0
402
- },
403
-
404
- __onTouchend (e) {
405
- this.caret.save()
406
- if (this.qListeners.touchend !== void 0) {
407
- this.$emit('touchend', e)
408
- }
409
390
  },
410
391
 
411
392
  runCmd (cmd, param, update = true) {
@@ -468,6 +449,12 @@ export default Vue.extend({
468
449
  this.caret = new Caret(this.$refs.content, this)
469
450
  this.__setContent(this.value)
470
451
  this.refreshToolbar()
452
+
453
+ document.addEventListener('selectionchange', this.__onSelectionchange)
454
+ },
455
+
456
+ beforeDestroy () {
457
+ document.removeEventListener('selectionchange', this.__onSelectionchange)
471
458
  },
472
459
 
473
460
  render (h) {
@@ -505,13 +492,8 @@ export default Vue.extend({
505
492
  focus: this.__onFocus,
506
493
 
507
494
  // clean saved scroll position
508
- mousedown: this.__onMousedown,
509
- touchstart: this.__onTouchstart,
510
-
511
- // save caret
512
- mouseup: this.__onMouseup,
513
- keyup: this.__onKeyup,
514
- touchend: this.__onTouchend
495
+ mousedown: this.__onPointerStart,
496
+ touchstart: this.__onPointerStart
515
497
  }
516
498
 
517
499
  return h('div', {
@@ -198,7 +198,7 @@ export class Caret {
198
198
  return false
199
199
  }
200
200
 
201
- if (el !== null && list.includes(el.nodeName.toLowerCase()) === true) {
201
+ if (list.includes(el.nodeName.toLowerCase()) === true) {
202
202
  return true
203
203
  }
204
204
 
@@ -365,8 +365,9 @@ export default Vue.extend({
365
365
  ref: 'target',
366
366
  staticClass: 'q-field__native row',
367
367
  attrs: {
368
+ tabindex: -1,
368
369
  ...this.qAttrs,
369
- 'data-autofocus': this.autofocus
370
+ 'data-autofocus': this.autofocus || void 0
370
371
  }
371
372
  }, this.$scopedSlots.control(this.controlSlotScope))
372
373
  )
@@ -542,7 +543,7 @@ export default Vue.extend({
542
543
  const attrs = this.__getControl === void 0 && this.$scopedSlots.control === void 0
543
544
  ? {
544
545
  ...this.qAttrs,
545
- 'data-autofocus': this.autofocus,
546
+ 'data-autofocus': this.autofocus || void 0,
546
547
  ...this.attrs
547
548
  }
548
549
  : this.attrs
@@ -95,6 +95,10 @@ export default Vue.extend({
95
95
 
96
96
  isAppending () {
97
97
  return this.multiple === true && this.append === true
98
+ },
99
+
100
+ fieldClass () {
101
+ return 'q-file q-field--auto-height' + (this.dnd === true ? ' q-file--dnd' : '')
98
102
  }
99
103
  },
100
104
 
@@ -261,8 +265,6 @@ export default Vue.extend({
261
265
  },
262
266
 
263
267
  created () {
264
- this.fieldClass = 'q-file q-field--auto-height'
265
-
266
268
  // necessary for QField's clearable
267
269
  // and FileValueMixin
268
270
  this.type = 'file'
@@ -30,8 +30,15 @@ const matMap = {
30
30
  s_: '-sharp'
31
31
  }
32
32
 
33
+ const symMap = {
34
+ sym_o_: '-outlined',
35
+ sym_r_: '-rounded',
36
+ sym_s_: '-sharp'
37
+ }
38
+
33
39
  const libRE = new RegExp('^(' + Object.keys(libMap).join('|') + ')')
34
40
  const matRE = new RegExp('^(' + Object.keys(matMap).join('|') + ')')
41
+ const symRE = new RegExp('^(' + Object.keys(symMap).join('|') + ')')
35
42
  const mRE = /^[Mm]\s?[-+]?\.?\d/
36
43
  const imgRE = /^img:/
37
44
  const svgUseRE = /^svguse:/
@@ -136,6 +143,22 @@ export default Vue.extend({
136
143
  else if (ionRE.test(icon) === true) {
137
144
  cls = `ionicons ion-${this.$q.platform.is.ios === true ? 'ios' : 'md'}${icon.substr(3)}`
138
145
  }
146
+ else if (symRE.test(icon) === true) {
147
+ // "notranslate" class is for Google Translate
148
+ // to avoid tampering with Material Symbols ligature font
149
+ //
150
+ // Caution: To be able to add suffix to the class name,
151
+ // keep the 'material-symbols' at the end of the string.
152
+ cls = 'notranslate material-symbols'
153
+
154
+ const matches = icon.match(symRE)
155
+ if (matches !== null) {
156
+ icon = icon.substring(6)
157
+ cls += symMap[ matches[ 1 ] ]
158
+ }
159
+
160
+ content = icon
161
+ }
139
162
  else {
140
163
  // "notranslate" class is for Google Translate
141
164
  // to avoid tampering with Material Icons ligature font
@@ -187,7 +210,7 @@ export default Vue.extend({
187
210
  return h('span', data, mergeSlot([
188
211
  h('svg', {
189
212
  attrs: {
190
- viewBox: this.type.viewBox,
213
+ viewBox: this.type.viewBox || '0 0 24 24',
191
214
  focusable: 'false' /* needed for IE11 */
192
215
  }
193
216
  }, this.type.nodes)
@@ -2,6 +2,7 @@
2
2
  line-height: 1
3
3
  width: 1em
4
4
  height: 1em
5
+ flex-shrink: 0
5
6
  letter-spacing: normal
6
7
  text-transform: none
7
8
  white-space: nowrap
@@ -21,14 +22,17 @@
21
22
 
22
23
  > svg,
23
24
  > img
24
- width: 1em
25
- height: 1em
25
+ width: 100%
26
+ height: 100%
26
27
 
27
28
  .q-icon,
28
29
  .material-icons,
29
30
  .material-icons-outlined,
30
31
  .material-icons-round,
31
- .material-icons-sharp
32
+ .material-icons-sharp,
33
+ .material-symbols-outlined,
34
+ .material-symbols-rounded,
35
+ .material-symbols-sharp
32
36
  user-select: none
33
37
  cursor: inherit
34
38
  font-size: inherit
@@ -2,6 +2,7 @@
2
2
  line-height: 1
3
3
  width: 1em
4
4
  height: 1em
5
+ flex-shrink: 0
5
6
  letter-spacing: normal
6
7
  text-transform: none
7
8
  white-space: nowrap
@@ -21,14 +22,17 @@
21
22
 
22
23
  > svg,
23
24
  > img
24
- width: 1em
25
- height: 1em
25
+ width: 100%
26
+ height: 100%
26
27
 
27
28
  .q-icon,
28
29
  .material-icons,
29
30
  .material-icons-outlined,
30
31
  .material-icons-round,
31
- .material-icons-sharp
32
+ .material-icons-sharp,
33
+ .material-symbols-outlined,
34
+ .material-symbols-rounded,
35
+ .material-symbols-sharp
32
36
  user-select: none
33
37
  cursor: inherit
34
38
  font-size: inherit
@@ -150,6 +150,16 @@ export default Vue.extend({
150
150
 
151
151
  if (this.isWorking === true) {
152
152
  this.__scrollTarget.addEventListener('scroll', this.poll, passive)
153
+
154
+ if (this.reverse === true) {
155
+ const
156
+ scrollHeight = getScrollHeight(this.__scrollTarget),
157
+ containerHeight = height(this.__scrollTarget)
158
+
159
+ setScrollPosition(this.__scrollTarget, scrollHeight - containerHeight)
160
+ }
161
+
162
+ this.immediatePoll()
153
163
  }
154
164
  },
155
165
 
@@ -181,16 +191,6 @@ export default Vue.extend({
181
191
  this.__setDebounce(this.debounce)
182
192
 
183
193
  this.updateScrollTarget()
184
-
185
- if (this.reverse === true) {
186
- const
187
- scrollHeight = getScrollHeight(this.__scrollTarget),
188
- containerHeight = height(this.__scrollTarget)
189
-
190
- setScrollPosition(this.__scrollTarget, scrollHeight - containerHeight)
191
- }
192
-
193
- this.immediatePoll()
194
194
  },
195
195
 
196
196
  activated () {
@@ -154,7 +154,7 @@ export default Vue.extend({
154
154
  inputAttrs () {
155
155
  const attrs = {
156
156
  tabindex: 0,
157
- 'data-autofocus': this.autofocus,
157
+ 'data-autofocus': this.autofocus || void 0,
158
158
  rows: this.type === 'textarea' ? 6 : void 0,
159
159
  'aria-label': this.label,
160
160
  name: this.nameProp,
@@ -207,7 +207,7 @@ export default Vue.extend({
207
207
  },
208
208
 
209
209
  __onInput (e) {
210
- if (!e || !e.target || e.target.composing === true) {
210
+ if (!e || !e.target || e.target.qComposing === true) {
211
211
  return
212
212
  }
213
213
 
@@ -285,13 +285,16 @@ export default Vue.extend({
285
285
  const inp = this.$refs.input
286
286
  if (inp !== void 0) {
287
287
  const parentStyle = inp.parentNode.style
288
+ const { overflow } = inp.style
288
289
 
289
290
  // reset height of textarea to a small size to detect the real height
290
291
  // but keep the total control size the same
291
292
  parentStyle.marginBottom = (inp.scrollHeight - 1) + 'px'
292
293
  inp.style.height = '1px'
294
+ inp.style.overflow = 'hidden'
293
295
 
294
296
  inp.style.height = inp.scrollHeight + 'px'
297
+ inp.style.overflow = overflow
295
298
  parentStyle.marginBottom = ''
296
299
  }
297
300
  },
@@ -137,6 +137,7 @@ export default Vue.extend({
137
137
  const layout = h('div', {
138
138
  class: this.classes,
139
139
  style: this.style,
140
+ attrs: { tabindex: -1 },
140
141
  on: { ...this.qListeners }
141
142
  }, mergeSlot([
142
143
  h(QScrollObserver, {
@@ -164,13 +164,18 @@ export default Vue.extend({
164
164
  this.__updateMenu(show)
165
165
  },
166
166
 
167
- virtualScrollLength () {
167
+ virtualScrollLength (newLength, oldLength) {
168
168
  if (this.menu === true && this.innerLoading === false) {
169
- this.reset()
169
+ this.__resetVirtualScroll(-1, true)
170
170
 
171
171
  this.$nextTick(() => {
172
172
  if (this.menu === true && this.innerLoading === false) {
173
- this.__updateMenu(true)
173
+ if (newLength > oldLength) {
174
+ this.__resetVirtualScroll()
175
+ }
176
+ else {
177
+ this.__updateMenu(true)
178
+ }
174
179
  }
175
180
  })
176
181
  }
@@ -408,7 +413,7 @@ export default Vue.extend({
408
413
 
409
414
  virtualScrollItemSizeComputed () {
410
415
  return this.virtualScrollItemSize === void 0
411
- ? (this.dense === true ? 24 : 48)
416
+ ? (this.optionsDense === true ? 24 : 48)
412
417
  : this.virtualScrollItemSize
413
418
  },
414
419
 
@@ -1088,7 +1093,7 @@ export default Vue.extend({
1088
1093
  maxlength: this.maxlength, // this is converted to prop by QField
1089
1094
  tabindex: this.tabindex,
1090
1095
  autocomplete: this.autocomplete,
1091
- 'data-autofocus': fromDialog === true ? false : this.autofocus,
1096
+ 'data-autofocus': (fromDialog !== true && this.autofocus) || void 0,
1092
1097
  disabled: this.disable === true,
1093
1098
  readonly: this.readonly === true
1094
1099
  },
@@ -1109,7 +1114,7 @@ export default Vue.extend({
1109
1114
  __onInput (e) {
1110
1115
  clearTimeout(this.inputTimer)
1111
1116
 
1112
- if (e && e.target && e.target.composing === true) {
1117
+ if (e && e.target && e.target.qComposing === true) {
1113
1118
  return
1114
1119
  }
1115
1120
 
@@ -186,7 +186,7 @@
186
186
  * Separators
187
187
  */
188
188
  .q-table--horizontal-separator, .q-table--cell-separator
189
- thead th, tbody tr:not(:last-child) td
189
+ thead th, tbody tr:not(:last-child) > td
190
190
  border-bottom-width: 1px
191
191
 
192
192
  .q-table--vertical-separator, .q-table--cell-separator
@@ -186,7 +186,7 @@
186
186
  * Separators
187
187
  */
188
188
  .q-table--horizontal-separator, .q-table--cell-separator
189
- thead th, tbody tr:not(:last-child) td
189
+ thead th, tbody tr:not(:last-child) > td
190
190
  border-bottom-width: 1px
191
191
 
192
192
  .q-table--vertical-separator, .q-table--cell-separator
@@ -316,28 +316,32 @@ export default Vue.extend({
316
316
 
317
317
  return [
318
318
  h('div', {
319
- staticClass: 'q-uploader__header-content flex flex-center no-wrap q-gutter-xs'
319
+ staticClass: 'q-uploader__header-content column'
320
320
  }, [
321
- this.__getBtn(h, this.queuedFiles.length > 0, 'removeQueue', this.removeQueuedFiles),
322
- this.__getBtn(h, this.uploadedFiles.length > 0, 'removeUploaded', this.removeUploadedFiles),
323
-
324
- this.isUploading === true
325
- ? h(QSpinner, { staticClass: 'q-uploader__spinner' })
326
- : null,
327
-
328
- h('div', { staticClass: 'col column justify-center' }, [
329
- this.label !== void 0
330
- ? h('div', { staticClass: 'q-uploader__title' }, [ this.label ])
321
+ h('div', {
322
+ staticClass: 'flex flex-center no-wrap q-gutter-xs'
323
+ }, [
324
+ this.__getBtn(h, this.queuedFiles.length > 0, 'removeQueue', this.removeQueuedFiles),
325
+ this.__getBtn(h, this.uploadedFiles.length > 0, 'removeUploaded', this.removeUploadedFiles),
326
+
327
+ this.isUploading === true
328
+ ? h(QSpinner, { staticClass: 'q-uploader__spinner' })
331
329
  : null,
332
330
 
333
- h('div', { staticClass: 'q-uploader__subtitle' }, [
334
- this.uploadSizeLabel + ' / ' + this.uploadProgressLabel
335
- ])
336
- ]),
331
+ h('div', { staticClass: 'col column justify-center' }, [
332
+ this.label !== void 0
333
+ ? h('div', { staticClass: 'q-uploader__title' }, [ this.label ])
334
+ : null,
335
+
336
+ h('div', { staticClass: 'q-uploader__subtitle' }, [
337
+ this.uploadSizeLabel + ' / ' + this.uploadProgressLabel
338
+ ])
339
+ ]),
337
340
 
338
- this.__getBtn(h, this.canAddFiles, 'add', this.pickFiles),
339
- this.__getBtn(h, this.hideUploadBtn === false && this.canUpload === true, 'upload', this.upload),
340
- this.__getBtn(h, this.isUploading, 'clear', this.abort)
341
+ this.__getBtn(h, this.canAddFiles, 'add', this.pickFiles),
342
+ this.__getBtn(h, this.hideUploadBtn === false && this.canUpload === true, 'upload', this.upload),
343
+ this.__getBtn(h, this.isUploading, 'clear', this.abort)
344
+ ])
341
345
  ])
342
346
  ]
343
347
  },
@@ -438,7 +442,8 @@ export default Vue.extend({
438
442
  'q-uploader--bordered': this.bordered,
439
443
  'q-uploader--square no-border-radius': this.square,
440
444
  'q-uploader--flat no-shadow': this.flat,
441
- 'disabled q-uploader--disable': this.disable
445
+ 'disabled q-uploader--disable': this.disable,
446
+ 'q-uploader--dnd': this.dnd
442
447
  },
443
448
  on: this.canAddFiles === true
444
449
  ? cache(this, 'drag', {
@@ -7,6 +7,7 @@
7
7
  --q-color-info: #{$info}
8
8
  --q-color-warning: #{$warning}
9
9
  --q-color-dark: #{$dark}
10
+ --q-color-dark-page: #{$dark-page}
10
11
 
11
12
  .text-dark
12
13
  color: $dark !important
@@ -7,6 +7,7 @@
7
7
  --q-color-info: $info
8
8
  --q-color-warning: $warning
9
9
  --q-color-dark: $dark
10
+ --q-color-dark-page: $dark-page
10
11
 
11
12
  .text-dark
12
13
  color: $dark !important
@@ -1,6 +1,7 @@
1
1
  body.body--dark
2
2
  color: #fff
3
3
  background: $dark-page
4
+ background: var(--q-color-dark-page)
4
5
 
5
6
  .q-dark
6
7
  color: #fff
@@ -1,6 +1,7 @@
1
1
  body.body--dark
2
2
  color: #fff
3
3
  background: $dark-page
4
+ background: var(--q-color-dark-page)
4
5
 
5
6
  .q-dark
6
7
  color: #fff
@@ -101,11 +101,7 @@ export default {
101
101
  evt.qSkipRipple !== true &&
102
102
  // on ENTER in form IE emits a PointerEvent with negative client cordinates
103
103
  (client.is.ie !== true || evt.clientX >= 0) &&
104
- (
105
- ctx.modifiers.early === true
106
- ? ['mousedown', 'touchstart'].includes(evt.type) === true
107
- : evt.type === 'click'
108
- )
104
+ evt.type === (ctx.modifiers.early === true ? 'pointerdown' : 'click')
109
105
  ) {
110
106
  showRipple(evt, el, ctx, evt.qKeyEvent === true)
111
107
  }
@@ -128,8 +124,7 @@ export default {
128
124
  el.__qripple = ctx
129
125
 
130
126
  addEvt(ctx, 'main', [
131
- [ el, 'mousedown', 'start', 'passive' ],
132
- [ el, 'touchstart', 'start', 'passive' ],
127
+ [ el, 'pointerdown', 'start', 'passive' ],
133
128
  [ el, 'click', 'start', 'passive' ],
134
129
  [ el, 'keydown', 'keystart', 'passive' ],
135
130
  [ el, 'keyup', 'keystart', 'passive' ]
@@ -139,7 +139,7 @@ export default {
139
139
  },
140
140
 
141
141
  __pickAnchorEl () {
142
- if (this.target === false || this.target === '') {
142
+ if (this.target === false || this.target === '' || this.parentEl === null) {
143
143
  this.anchorEl = void 0
144
144
  }
145
145
  else if (this.target === true) {
@@ -1,28 +1,31 @@
1
+ import { client } from '../plugins/Platform.js'
2
+
1
3
  const isJapanese = /[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]/
2
4
  const isChinese = /[\u4e00-\u9fff\u3400-\u4dbf\u{20000}-\u{2a6df}\u{2a700}-\u{2b73f}\u{2b740}-\u{2b81f}\u{2b820}-\u{2ceaf}\uf900-\ufaff\u3300-\u33ff\ufe30-\ufe4f\uf900-\ufaff\u{2f800}-\u{2fa1f}]/u
3
5
  const isKorean = /[\u3131-\u314e\u314f-\u3163\uac00-\ud7a3]/
6
+ const isPlainText = /[a-z0-9_ -]$/i
4
7
 
5
8
  export default {
6
9
  methods: {
7
10
  __onComposition (e) {
8
11
  if (e.type === 'compositionend' || e.type === 'change') {
9
- if (e.target.composing !== true) { return }
10
- e.target.composing = false
12
+ if (e.target.qComposing !== true) { return }
13
+ e.target.qComposing = false
11
14
  this.__onInput(e)
12
15
  }
13
- else if (e.type === 'compositionupdate') {
14
- if (
15
- typeof e.data === 'string' &&
16
- isJapanese.test(e.data) === false &&
17
- isChinese.test(e.data) === false &&
18
- isKorean.test(e.data) === false
19
- ) {
20
- e.target.composing = false
16
+ else if (
17
+ e.type === 'compositionupdate' &&
18
+ e.target.qComposing !== true &&
19
+ typeof e.data === 'string'
20
+ ) {
21
+ const isComposing = client.is.firefox === true
22
+ ? isPlainText.test(e.data) === false
23
+ : isJapanese.test(e.data) === true || isChinese.test(e.data) === true || isKorean.test(e.data) === true
24
+
25
+ if (isComposing === true) {
26
+ e.target.qComposing = true
21
27
  }
22
28
  }
23
- else {
24
- e.target.composing = true
25
- }
26
29
  }
27
30
  }
28
31
  }