quasar 1.15.21 → 1.16.1

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 (134) 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/ionicons-v4.umd.min.js +1 -1
  6. package/dist/icon-set/line-awesome.umd.min.js +1 -1
  7. package/dist/icon-set/material-icons-outlined.umd.min.js +1 -1
  8. package/dist/icon-set/material-icons-round.umd.min.js +1 -1
  9. package/dist/icon-set/material-icons-sharp.umd.min.js +1 -1
  10. package/dist/icon-set/material-icons.umd.min.js +1 -1
  11. package/dist/icon-set/mdi-v3.umd.min.js +1 -1
  12. package/dist/icon-set/mdi-v4.umd.min.js +1 -1
  13. package/dist/icon-set/mdi-v5.umd.min.js +1 -1
  14. package/dist/icon-set/mdi-v6.umd.min.js +6 -0
  15. package/dist/icon-set/svg-bootstrap-icons.umd.min.js +1 -1
  16. package/dist/icon-set/svg-eva-icons.umd.min.js +1 -1
  17. package/dist/icon-set/svg-fontawesome-v5.umd.min.js +1 -1
  18. package/dist/icon-set/svg-ionicons-v4.umd.min.js +1 -1
  19. package/dist/icon-set/svg-ionicons-v5.umd.min.js +1 -1
  20. package/dist/icon-set/svg-line-awesome.umd.min.js +1 -1
  21. package/dist/icon-set/svg-material-icons-outlined.umd.min.js +2 -2
  22. package/dist/icon-set/svg-material-icons-round.umd.min.js +2 -2
  23. package/dist/icon-set/svg-material-icons-sharp.umd.min.js +2 -2
  24. package/dist/icon-set/svg-material-icons.umd.min.js +2 -2
  25. package/dist/icon-set/svg-mdi-v4.umd.min.js +1 -1
  26. package/dist/icon-set/svg-mdi-v5.umd.min.js +1 -1
  27. package/dist/icon-set/svg-mdi-v6.umd.min.js +6 -0
  28. package/dist/icon-set/svg-themify.umd.min.js +1 -1
  29. package/dist/icon-set/themify.umd.min.js +1 -1
  30. package/dist/lang/ar.umd.min.js +2 -2
  31. package/dist/lang/az-latn.umd.min.js +1 -1
  32. package/dist/lang/bg.umd.min.js +1 -1
  33. package/dist/lang/ca.umd.min.js +1 -1
  34. package/dist/lang/cs.umd.min.js +1 -1
  35. package/dist/lang/da.umd.min.js +1 -1
  36. package/dist/lang/de.umd.min.js +2 -2
  37. package/dist/lang/el.umd.min.js +1 -1
  38. package/dist/lang/en-gb.umd.min.js +1 -1
  39. package/dist/lang/en-us.umd.min.js +1 -1
  40. package/dist/lang/eo.umd.min.js +1 -1
  41. package/dist/lang/es.umd.min.js +1 -1
  42. package/dist/lang/et.umd.min.js +1 -1
  43. package/dist/lang/fa-ir.umd.min.js +1 -1
  44. package/dist/lang/fa.umd.min.js +1 -1
  45. package/dist/lang/fi.umd.min.js +1 -1
  46. package/dist/lang/fr.umd.min.js +1 -1
  47. package/dist/lang/gn.umd.min.js +1 -1
  48. package/dist/lang/he.umd.min.js +1 -1
  49. package/dist/lang/hr.umd.min.js +1 -1
  50. package/dist/lang/hu.umd.min.js +1 -1
  51. package/dist/lang/id.umd.min.js +1 -1
  52. package/dist/lang/is.umd.min.js +1 -1
  53. package/dist/lang/it.umd.min.js +1 -1
  54. package/dist/lang/ja.umd.min.js +1 -1
  55. package/dist/lang/km.umd.min.js +1 -1
  56. package/dist/lang/ko-kr.umd.min.js +1 -1
  57. package/dist/lang/kur-ckb.umd.min.js +1 -1
  58. package/dist/lang/lu.umd.min.js +1 -1
  59. package/dist/lang/lv.umd.min.js +1 -1
  60. package/dist/lang/ml.umd.min.js +1 -1
  61. package/dist/lang/ms.umd.min.js +1 -1
  62. package/dist/lang/nb-no.umd.min.js +1 -1
  63. package/dist/lang/nl.umd.min.js +1 -1
  64. package/dist/lang/pl.umd.min.js +1 -1
  65. package/dist/lang/pt-br.umd.min.js +1 -1
  66. package/dist/lang/pt.umd.min.js +1 -1
  67. package/dist/lang/ro.umd.min.js +1 -1
  68. package/dist/lang/ru.umd.min.js +1 -1
  69. package/dist/lang/sk.umd.min.js +1 -1
  70. package/dist/lang/sl.umd.min.js +1 -1
  71. package/dist/lang/sr.umd.min.js +2 -2
  72. package/dist/lang/sv.umd.min.js +1 -1
  73. package/dist/lang/ta.umd.min.js +1 -1
  74. package/dist/lang/th.umd.min.js +1 -1
  75. package/dist/lang/tr.umd.min.js +1 -1
  76. package/dist/lang/ug.umd.min.js +1 -1
  77. package/dist/lang/uk.umd.min.js +1 -1
  78. package/dist/lang/vi.umd.min.js +1 -1
  79. package/dist/lang/zh-hans.umd.min.js +1 -1
  80. package/dist/lang/zh-hant.umd.min.js +1 -1
  81. package/dist/quasar.addon.css +1 -1
  82. package/dist/quasar.addon.rtl.css +1 -1
  83. package/dist/quasar.common.js +2 -2
  84. package/dist/quasar.css +17 -17
  85. package/dist/quasar.esm.js +2 -2
  86. package/dist/quasar.ie.polyfills.js +1 -1
  87. package/dist/quasar.ie.polyfills.umd.min.js +1 -1
  88. package/dist/quasar.min.css +1 -1
  89. package/dist/quasar.rtl.css +26 -26
  90. package/dist/quasar.rtl.min.css +1 -1
  91. package/dist/quasar.sass +15 -12
  92. package/dist/quasar.styl +15 -14
  93. package/dist/quasar.umd.js +69 -20
  94. package/dist/quasar.umd.min.js +2 -2
  95. package/dist/quasar.umd.modern.js +67 -16
  96. package/dist/quasar.umd.modern.min.js +2 -2
  97. package/dist/types/extras/icon-set.d.ts +2 -0
  98. package/dist/web-types/web-types.json +1 -1
  99. package/icon-set/bootstrap-icons.js +1 -1
  100. package/icon-set/eva-icons.js +1 -1
  101. package/icon-set/ionicons-v4.js +1 -1
  102. package/icon-set/mdi-v6.js +141 -0
  103. package/icon-set/svg-bootstrap-icons.js +1 -1
  104. package/icon-set/svg-eva-icons.js +1 -1
  105. package/icon-set/svg-ionicons-v4.js +1 -1
  106. package/icon-set/svg-ionicons-v5.js +1 -1
  107. package/icon-set/svg-mdi-v5.js +1 -1
  108. package/icon-set/svg-mdi-v6.js +225 -0
  109. package/icon-set/svg-themify.js +1 -1
  110. package/icon-set/themify.js +1 -1
  111. package/lang/ar.js +1 -1
  112. package/lang/de.js +1 -1
  113. package/lang/index.json +1 -1
  114. package/lang/sr.js +4 -4
  115. package/package.json +2 -2
  116. package/src/components/chat/QChatMessage.js +2 -2
  117. package/src/components/checkbox/QCheckbox.sass +1 -0
  118. package/src/components/checkbox/QCheckbox.styl +1 -0
  119. package/src/components/expansion-item/QExpansionItem.js +1 -1
  120. package/src/components/fab/QFab.js +10 -2
  121. package/src/components/fab/QFab.sass +13 -12
  122. package/src/components/fab/QFab.styl +13 -12
  123. package/src/components/field/QField.js +1 -1
  124. package/src/components/input/QInput.js +5 -1
  125. package/src/components/popup-edit/QPopupEdit.js +1 -1
  126. package/src/components/radio/QRadio.sass +1 -0
  127. package/src/components/radio/QRadio.styl +1 -0
  128. package/src/components/select/QSelect.js +34 -4
  129. package/src/components/toggle/QToggle.sass +1 -0
  130. package/src/components/toggle/QToggle.styl +1 -0
  131. package/src/css/normalize.styl +0 -7
  132. package/src/mixins/mask.js +5 -1
  133. package/src/mixins/validate.js +5 -0
  134. package/src/utils/slot.js +1 -1
@@ -13,18 +13,6 @@
13
13
  &--form-square
14
14
  border-radius: $generic-border-radius
15
15
 
16
- &--opened
17
- .q-fab__actions
18
- opacity: 1
19
- transform: scale(1) translate(0, 0)
20
- pointer-events: all
21
- .q-fab__icon
22
- transform: rotate(180deg)
23
- opacity: 0
24
- .q-fab__active-icon
25
- transform: rotate(0deg)
26
- opacity: 1
27
-
28
16
  &__icon, &__active-icon
29
17
  transition: opacity .4s, transform .4s
30
18
  &__icon
@@ -91,6 +79,14 @@
91
79
  min-height: 24px
92
80
  position: relative
93
81
 
82
+ &--opened
83
+ .q-fab__icon
84
+ transform: rotate(180deg)
85
+ opacity: 0
86
+ .q-fab__active-icon
87
+ transform: rotate(0deg)
88
+ opacity: 1
89
+
94
90
  &__actions
95
91
  position: absolute
96
92
  opacity: 0
@@ -139,6 +135,11 @@
139
135
  left: 50%
140
136
  margin-left: -28px
141
137
 
138
+ &--opened
139
+ opacity: 1
140
+ transform: scale(1) translate(0, 0)
141
+ pointer-events: all
142
+
142
143
  &--align-left
143
144
  > .q-fab__actions
144
145
  &--up, &--down
@@ -394,7 +394,7 @@ export default Vue.extend({
394
394
 
395
395
  if (this.hasError === true) {
396
396
  if (this.computedErrorMessage !== void 0) {
397
- msg = [ h('div', [ this.computedErrorMessage ]) ]
397
+ msg = [ h('div', { attrs: { role: 'alert' } }, [ this.computedErrorMessage ]) ]
398
398
  key = this.computedErrorMessage
399
399
  }
400
400
  else {
@@ -97,6 +97,10 @@ export default Vue.extend({
97
97
  return this.type === 'textarea' || this.autogrow === true
98
98
  },
99
99
 
100
+ isTypeText () {
101
+ return this.isTextarea === true || ['text', 'search', 'url', 'tel', 'password'].includes(this.type)
102
+ },
103
+
100
104
  fieldClass () {
101
105
  return `q-${this.isTextarea === true ? 'textarea' : 'input'}` +
102
106
  (this.autogrow === true ? ' q-textarea--autogrow' : '')
@@ -208,7 +212,7 @@ export default Vue.extend({
208
212
  else {
209
213
  this.__emitValue(val)
210
214
 
211
- if (['text', 'search', 'url', 'tel', 'password'].includes(this.type) && e.target === document.activeElement) {
215
+ if (this.isTypeText === true && e.target === document.activeElement) {
212
216
  const { selectionStart, selectionEnd } = e.target
213
217
 
214
218
  if (selectionStart !== void 0 && selectionEnd !== void 0) {
@@ -132,7 +132,7 @@ export default Vue.extend({
132
132
  title = slot(this, 'title', this.title),
133
133
  child = this.$scopedSlots.default === void 0
134
134
  ? []
135
- : this.$scopedSlots.default(this.defaultSlotScope).slice()
135
+ : [].concat(this.$scopedSlots.default(this.defaultSlotScope))
136
136
 
137
137
  title && child.unshift(
138
138
  h('div', { staticClass: 'q-dialog__title q-mt-sm q-mb-sm' }, [ title ])
@@ -8,6 +8,7 @@ $radio-transition: .22s cubic-bezier(0,0,.2,1) 0ms
8
8
  left: 25%
9
9
  width: 50%
10
10
  height: 50%
11
+ -webkit-print-color-adjust: exact
11
12
 
12
13
  path
13
14
  fill: currentColor
@@ -8,6 +8,7 @@ $radio-transition = .22s cubic-bezier(0,0,.2,1) 0ms
8
8
  left: 25%
9
9
  width: 50%
10
10
  height: 50%
11
+ -webkit-print-color-adjust: exact
11
12
 
12
13
  path
13
14
  fill: currentColor
@@ -284,8 +284,15 @@ export default Vue.extend({
284
284
  dark: this.isOptionsDark
285
285
  }
286
286
 
287
+ const itemAttrs = {
288
+ role: 'option',
289
+ id: `${this.targetUid}_${index}`
290
+ }
291
+
287
292
  if (disable !== true) {
288
293
  this.isOptionSelected(opt) === true && (itemProps.active = true)
294
+ itemAttrs['aria-selected'] = itemProps.active === true ? 'true' : 'false'
295
+
289
296
  this.optionIndex === index && (itemProps.focused = true)
290
297
  }
291
298
 
@@ -305,7 +312,8 @@ export default Vue.extend({
305
312
  focused: itemProps.focused,
306
313
  toggleOption: this.toggleOption,
307
314
  setOptionIndex: this.setOptionIndex,
308
- itemProps
315
+ itemProps,
316
+ itemAttrs
309
317
  }
310
318
 
311
319
  if (options[i] === void 0 || isDeepEqual(option, options[i]) !== true) {
@@ -388,6 +396,23 @@ export default Vue.extend({
388
396
  return this.virtualScrollItemSize === void 0
389
397
  ? (this.dense === true ? 24 : 48)
390
398
  : this.virtualScrollItemSize
399
+ },
400
+
401
+ comboboxAttrs () {
402
+ return {
403
+ role: 'combobox',
404
+ 'aria-multiselectable': this.multiple === true ? 'true' : 'false',
405
+ 'aria-expanded': this.menu === true ? 'true' : 'false',
406
+ 'aria-owns': `${this.targetUid}_lb`,
407
+ 'aria-activedescendant': `${this.targetUid}_${this.optionIndex}`
408
+ }
409
+ },
410
+
411
+ listboxAttrs () {
412
+ return {
413
+ role: 'listbox',
414
+ id: `${this.targetUid}_lb`
415
+ }
391
416
  }
392
417
  },
393
418
 
@@ -869,7 +894,7 @@ export default Vue.extend({
869
894
  }
870
895
 
871
896
  if (this.$scopedSlots.selected !== void 0) {
872
- return this.$scopedSlots.selected().slice()
897
+ return [].concat(this.$scopedSlots.selected())
873
898
  }
874
899
 
875
900
  if (this.useChips === true) {
@@ -921,7 +946,8 @@ export default Vue.extend({
921
946
  staticClass: 'no-outline',
922
947
  attrs: {
923
948
  id: this.targetUid,
924
- tabindex: this.tabindex
949
+ tabindex: this.tabindex,
950
+ ...this.comboboxAttrs
925
951
  },
926
952
  on: cache(this, 'f-tget', {
927
953
  keydown: this.__onTargetKeydown,
@@ -981,6 +1007,7 @@ export default Vue.extend({
981
1007
  : scope => h(QItem, {
982
1008
  key: scope.index,
983
1009
  props: scope.itemProps,
1010
+ attrs: scope.itemAttrs,
984
1011
  on: scope.itemEvents
985
1012
  }, [
986
1013
  h(QItemSection, [
@@ -1038,7 +1065,8 @@ export default Vue.extend({
1038
1065
  autocomplete: this.autocomplete,
1039
1066
  'data-autofocus': fromDialog === true ? false : this.autofocus,
1040
1067
  disabled: this.disable === true,
1041
- readonly: this.readonly === true
1068
+ readonly: this.readonly === true,
1069
+ ...this.comboboxAttrs
1042
1070
  },
1043
1071
  on: this.inputControlEvents
1044
1072
  }
@@ -1249,6 +1277,7 @@ export default Vue.extend({
1249
1277
  transitionHide: this.transitionHide,
1250
1278
  separateClosePopup: true
1251
1279
  },
1280
+ attrs: this.listboxAttrs,
1252
1281
  on: cache(this, 'menu', {
1253
1282
  '&scroll': this.__onVirtualScrollEvt,
1254
1283
  'before-hide': this.__closeMenu,
@@ -1309,6 +1338,7 @@ export default Vue.extend({
1309
1338
  staticClass: 'scroll',
1310
1339
  class: this.menuContentClass,
1311
1340
  style: this.popupContentStyle,
1341
+ attrs: this.listboxAttrs,
1312
1342
  on: cache(this, 'virtMenu', {
1313
1343
  click: prevent,
1314
1344
  '&scroll': this.__onVirtualScrollEvt
@@ -46,6 +46,7 @@ $toggle-transition: .22s cubic-bezier(.4,0,.2,1)
46
46
  min-width: 1.4em
47
47
  height: 1em
48
48
  padding: .325em .3em
49
+ -webkit-print-color-adjust: exact
49
50
 
50
51
  &--indet
51
52
  .q-toggle__thumb
@@ -46,6 +46,7 @@ $toggle-transition = .22s cubic-bezier(.4,0,.2,1)
46
46
  min-width: 1.4em
47
47
  height: 1em
48
48
  padding: .325em .3em
49
+ -webkit-print-color-adjust: exact
49
50
 
50
51
  &--indet
51
52
  .q-toggle__thumb
@@ -160,13 +160,6 @@ progress
160
160
  textarea
161
161
  overflow: auto
162
162
 
163
- /*
164
- * Correct the odd appearance of search inputs in Chrome and Safari.
165
- */
166
-
167
- input[type='search']
168
- -webkit-appearance: textfield
169
-
170
163
  /*
171
164
  * Remove the inner padding and cancel buttons in Chrome on OS X and
172
165
  * Safari on OS X.
@@ -47,6 +47,10 @@ export default {
47
47
  this.__updateMaskInternals()
48
48
  },
49
49
 
50
+ autogrow () {
51
+ this.__updateMaskInternals()
52
+ },
53
+
50
54
  mask (v) {
51
55
  if (v !== void 0) {
52
56
  this.__updateMaskValue(this.innerValue, true)
@@ -111,7 +115,7 @@ export default {
111
115
  __updateMaskInternals () {
112
116
  this.hasMask = this.mask !== void 0 &&
113
117
  this.mask.length > 0 &&
114
- ['text', 'search', 'url', 'tel', 'password'].includes(this.type)
118
+ (this.autogrow === true || ['textarea', 'text', 'search', 'url', 'tel', 'password'].includes(this.type))
115
119
 
116
120
  if (this.hasMask === false) {
117
121
  this.computedUnmask = void 0
@@ -67,6 +67,11 @@ export default {
67
67
  this.validate()
68
68
  }
69
69
  }
70
+ },
71
+
72
+ hasError (invalid) {
73
+ const targetEl = document.getElementById(this.targetUid)
74
+ targetEl !== null && targetEl.setAttribute('aria-invalid', invalid === true)
70
75
  }
71
76
  },
72
77
 
package/src/utils/slot.js CHANGED
@@ -6,7 +6,7 @@ export function slot (vm, slotName, otherwise) {
6
6
 
7
7
  export function uniqueSlot (vm, slotName, otherwise) {
8
8
  return vm.$scopedSlots[slotName] !== void 0
9
- ? vm.$scopedSlots[slotName]().slice()
9
+ ? [].concat(vm.$scopedSlots[slotName]())
10
10
  : otherwise
11
11
  }
12
12