quasar 2.1.6 → 2.2.0

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 (146) hide show
  1. package/dist/api/QCarousel.json +19 -5
  2. package/dist/api/QColor.json +8 -1
  3. package/dist/api/QDate.json +2 -1
  4. package/dist/api/QFile.json +2 -1
  5. package/dist/api/QInnerLoading.json +32 -0
  6. package/dist/api/QInput.json +2 -1
  7. package/dist/api/QOptionGroup.json +22 -0
  8. package/dist/api/QRadio.json +2 -1
  9. package/dist/api/QRange.json +5 -1
  10. package/dist/api/QSelect.json +2 -1
  11. package/dist/api/QSkeleton.json +14 -0
  12. package/dist/api/QSlider.json +2 -1
  13. package/dist/api/QStepper.json +16 -2
  14. package/dist/api/QTabPanels.json +16 -2
  15. package/dist/api/QTabs.json +2 -1
  16. package/dist/api/QTime.json +2 -1
  17. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  18. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  19. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  20. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  21. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  22. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  23. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  24. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  25. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  26. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  27. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  28. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  29. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  30. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  39. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  40. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
  42. package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
  43. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  44. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  45. package/dist/icon-set/themify.umd.prod.js +1 -1
  46. package/dist/lang/ar.umd.prod.js +1 -1
  47. package/dist/lang/az-Latn.umd.prod.js +1 -1
  48. package/dist/lang/bg.umd.prod.js +1 -1
  49. package/dist/lang/bn.umd.prod.js +1 -1
  50. package/dist/lang/ca.umd.prod.js +1 -1
  51. package/dist/lang/cs.umd.prod.js +1 -1
  52. package/dist/lang/da.umd.prod.js +1 -1
  53. package/dist/lang/de.umd.prod.js +1 -1
  54. package/dist/lang/el.umd.prod.js +1 -1
  55. package/dist/lang/en-GB.umd.prod.js +1 -1
  56. package/dist/lang/en-US.umd.prod.js +1 -1
  57. package/dist/lang/eo.umd.prod.js +1 -1
  58. package/dist/lang/es.umd.prod.js +1 -1
  59. package/dist/lang/et.umd.prod.js +1 -1
  60. package/dist/lang/fa-IR.umd.prod.js +1 -1
  61. package/dist/lang/fa.umd.prod.js +1 -1
  62. package/dist/lang/fi.umd.prod.js +1 -1
  63. package/dist/lang/fr.umd.prod.js +1 -1
  64. package/dist/lang/gn.umd.prod.js +1 -1
  65. package/dist/lang/he.umd.prod.js +1 -1
  66. package/dist/lang/hr.umd.prod.js +1 -1
  67. package/dist/lang/hu.umd.prod.js +1 -1
  68. package/dist/lang/id.umd.prod.js +1 -1
  69. package/dist/lang/is.umd.prod.js +1 -1
  70. package/dist/lang/it.umd.prod.js +1 -1
  71. package/dist/lang/ja.umd.prod.js +1 -1
  72. package/dist/lang/km.umd.prod.js +1 -1
  73. package/dist/lang/ko-KR.umd.prod.js +1 -1
  74. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  75. package/dist/lang/lt.umd.prod.js +6 -0
  76. package/dist/lang/lu.umd.prod.js +1 -1
  77. package/dist/lang/lv.umd.prod.js +1 -1
  78. package/dist/lang/ml.umd.prod.js +1 -1
  79. package/dist/lang/ms.umd.prod.js +1 -1
  80. package/dist/lang/nb-NO.umd.prod.js +1 -1
  81. package/dist/lang/nl.umd.prod.js +1 -1
  82. package/dist/lang/pl.umd.prod.js +1 -1
  83. package/dist/lang/pt-BR.umd.prod.js +1 -1
  84. package/dist/lang/pt.umd.prod.js +1 -1
  85. package/dist/lang/ro.umd.prod.js +1 -1
  86. package/dist/lang/ru.umd.prod.js +1 -1
  87. package/dist/lang/sk.umd.prod.js +1 -1
  88. package/dist/lang/sl.umd.prod.js +1 -1
  89. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  90. package/dist/lang/sr.umd.prod.js +1 -1
  91. package/dist/lang/sv.umd.prod.js +1 -1
  92. package/dist/lang/ta.umd.prod.js +1 -1
  93. package/dist/lang/th.umd.prod.js +1 -1
  94. package/dist/lang/tr.umd.prod.js +1 -1
  95. package/dist/lang/ug.umd.prod.js +2 -2
  96. package/dist/lang/uk.umd.prod.js +1 -1
  97. package/dist/lang/vi.umd.prod.js +1 -1
  98. package/dist/lang/zh-CN.umd.prod.js +1 -1
  99. package/dist/lang/zh-TW.umd.prod.js +1 -1
  100. package/dist/quasar.cjs.prod.js +2 -2
  101. package/dist/quasar.css +24 -17
  102. package/dist/quasar.esm.prod.js +2 -2
  103. package/dist/quasar.prod.css +1 -1
  104. package/dist/quasar.rtl.css +29 -22
  105. package/dist/quasar.rtl.prod.css +1 -1
  106. package/dist/quasar.sass +24 -16
  107. package/dist/quasar.umd.js +240 -195
  108. package/dist/quasar.umd.prod.js +2 -2
  109. package/dist/ssr-directives/Morph.js +1 -1
  110. package/dist/types/index.d.ts +1868 -1521
  111. package/dist/vetur/quasar-attributes.json +43 -11
  112. package/dist/vetur/quasar-tags.json +9 -1
  113. package/dist/web-types/web-types.json +103 -15
  114. package/lang/index.json +4 -0
  115. package/lang/lt.js +103 -0
  116. package/lang/ug.js +42 -42
  117. package/package.json +1 -1
  118. package/src/components/carousel/QCarousel.js +8 -1
  119. package/src/components/carousel/QCarousel.json +9 -1
  120. package/src/components/color/QColor.js +73 -61
  121. package/src/components/color/QColor.json +8 -1
  122. package/src/components/color/QColor.sass +5 -1
  123. package/src/components/date/QDate.json +1 -1
  124. package/src/components/dialog/QDialog.js +6 -0
  125. package/src/components/file/QFile.json +1 -1
  126. package/src/components/inner-loading/QInnerLoading.js +31 -7
  127. package/src/components/inner-loading/QInnerLoading.json +29 -0
  128. package/src/components/inner-loading/QInnerLoading.sass +4 -0
  129. package/src/components/input/QInput.json +1 -1
  130. package/src/components/option-group/QOptionGroup.js +29 -19
  131. package/src/components/option-group/QOptionGroup.json +26 -0
  132. package/src/components/radio/QRadio.json +1 -1
  133. package/src/components/range/QRange.json +1 -1
  134. package/src/components/rating/QRating.js +59 -39
  135. package/src/components/rating/QRating.sass +8 -6
  136. package/src/components/select/QSelect.js +5 -53
  137. package/src/components/select/QSelect.json +1 -1
  138. package/src/components/skeleton/QSkeleton.js +15 -5
  139. package/src/components/skeleton/QSkeleton.json +9 -0
  140. package/src/components/skeleton/QSkeleton.sass +7 -6
  141. package/src/components/slider/QSlider.json +1 -1
  142. package/src/components/tabs/QTabs.json +1 -1
  143. package/src/components/time/QTime.json +1 -1
  144. package/src/composables/private/use-panel.js +13 -8
  145. package/src/composables/private/use-panel.json +11 -2
  146. package/src/css/core/transitions.sass +4 -4
@@ -4,6 +4,7 @@ import QIcon from '../icon/QIcon.js'
4
4
 
5
5
  import { stopAndPrevent } from '../../utils/event.js'
6
6
  import { between } from '../../utils/format.js'
7
+ import { hMergeSlot } from '../../utils/private/render.js'
7
8
 
8
9
  import useSize, { useSizeProps } from '../../composables/private/use-size.js'
9
10
  import { useFormProps, useFormAttrs, useFormInject } from '../../composables/private/use-form.js'
@@ -94,6 +95,51 @@ export default defineComponent({
94
95
  }
95
96
  })
96
97
 
98
+ const stars = computed(() => {
99
+ const
100
+ acc = [],
101
+ icons = iconData.value,
102
+ ceil = Math.ceil(props.modelValue)
103
+
104
+ const halfIndex = props.iconHalf === void 0 || ceil === props.modelValue
105
+ ? -1
106
+ : ceil
107
+
108
+ for (let i = 1; i <= props.max; i++) {
109
+ const
110
+ active = (mouseModel.value === 0 && props.modelValue >= i) || (mouseModel.value > 0 && mouseModel.value >= i),
111
+ half = halfIndex === i && mouseModel.value < i,
112
+ exSelected = mouseModel.value > 0 && (half === true ? ceil : props.modelValue) >= i && mouseModel.value < i,
113
+ color = half === true
114
+ ? (i <= icons.halfColorLen ? props.colorHalf[ i - 1 ] : icons.halfColor)
115
+ : (
116
+ icons.selColor !== void 0 && active === true
117
+ ? (i <= icons.selColorLen ? props.colorSelected[ i - 1 ] : icons.selColor)
118
+ : (i <= icons.colorLen ? props.color[ i - 1 ] : icons.color)
119
+ )
120
+
121
+ acc.push({
122
+ name: (
123
+ half === true
124
+ ? (i <= icons.halfIconLen ? props.iconHalf[ i - 1 ] : icons.halfIcon)
125
+ : (
126
+ icons.selIcon !== void 0 && (active === true || exSelected === true)
127
+ ? (i <= icons.selIconLen ? props.iconSelected[ i - 1 ] : icons.selIcon)
128
+ : (i <= icons.iconLen ? props.icon[ i - 1 ] : icons.icon)
129
+ )
130
+ ) || $q.iconSet.rating.icon,
131
+
132
+ classes: 'q-rating__icon'
133
+ + (active === true || half === true ? ' q-rating__icon--active' : '')
134
+ + (exSelected === true ? ' q-rating__icon--exselected' : '')
135
+ + (mouseModel.value === i ? ' q-rating__icon--hovered' : '')
136
+ + (color !== void 0 ? ` text-${ color }` : '')
137
+ })
138
+ }
139
+
140
+ return acc
141
+ })
142
+
97
143
  const attributes = computed(() => {
98
144
  if (props.disable === true) {
99
145
  return { 'aria-disabled': 'true' }
@@ -103,6 +149,8 @@ export default defineComponent({
103
149
  }
104
150
  })
105
151
 
152
+ const tabindex = computed(() => (editable.value === true ? 0 : null))
153
+
106
154
  function set (value) {
107
155
  if (editable.value === true) {
108
156
  const
@@ -150,57 +198,29 @@ export default defineComponent({
150
198
  })
151
199
 
152
200
  return () => {
153
- const
154
- child = [],
155
- tabindex = editable.value === true ? 0 : null,
156
- icons = iconData.value,
157
- ceil = Math.ceil(props.modelValue)
201
+ const child = []
158
202
 
159
- const halfIndex = props.iconHalf === void 0 || ceil === props.modelValue
160
- ? -1
161
- : ceil
162
-
163
- for (let i = 1; i <= props.max; i++) {
164
- const
165
- active = (mouseModel.value === 0 && props.modelValue >= i) || (mouseModel.value > 0 && mouseModel.value >= i),
166
- half = halfIndex === i && mouseModel.value < i,
167
- exSelected = mouseModel.value > 0 && (half === true ? ceil : props.modelValue) >= i && mouseModel.value < i,
168
- name = half === true
169
- ? (i <= icons.halfIconLen ? props.iconHalf[ i - 1 ] : icons.halfIcon)
170
- : (
171
- icons.selIcon !== void 0 && (active === true || exSelected === true)
172
- ? (i <= icons.selIconLen ? props.iconSelected[ i - 1 ] : icons.selIcon)
173
- : (i <= icons.iconLen ? props.icon[ i - 1 ] : icons.icon)
174
- ),
175
- color = half === true
176
- ? (i <= icons.halfColorLen ? props.colorHalf[ i - 1 ] : icons.halfColor)
177
- : (
178
- icons.selColor !== void 0 && active === true
179
- ? (i <= icons.selColorLen ? props.colorSelected[ i - 1 ] : icons.selColor)
180
- : (i <= icons.colorLen ? props.color[ i - 1 ] : icons.color)
181
- ),
182
- classes = 'q-rating__icon'
183
- + (active === true || half === true ? ' q-rating__icon--active' : '')
184
- + (exSelected === true ? ' q-rating__icon--exselected' : '')
185
- + (mouseModel.value === i ? ' q-rating__icon--hovered' : '')
186
- + (color !== void 0 ? ` text-${ color }` : '')
203
+ stars.value.forEach(({ classes, name }, index) => {
204
+ const i = index + 1
187
205
 
188
206
  child.push(
189
- h(QIcon, {
207
+ h('div', {
190
208
  key: i,
191
209
  ref: vm => { iconRefs[ `rt${ i }` ] = vm },
192
- class: classes,
193
- name: name || $q.iconSet.rating.icon,
194
- tabindex,
210
+ class: 'q-rating__icon-container flex flex-center',
211
+ tabindex: tabindex.value,
195
212
  onClick () { set(i) },
196
213
  onMouseover () { setHoverValue(i) },
197
214
  onMouseout: resetMouseModel,
198
215
  onFocus () { setHoverValue(i) },
199
216
  onBlur: resetMouseModel,
200
217
  onKeyup (e) { onKeyup(e, i) }
201
- }, slots[ `tip-${ i }` ])
218
+ }, hMergeSlot(
219
+ slots[ `tip-${ i }` ],
220
+ [ h(QIcon, { class: classes, name }) ]
221
+ ))
202
222
  )
203
- }
223
+ })
204
224
 
205
225
  if (props.name !== void 0 && props.disable !== true) {
206
226
  injectFormInput(child, 'push')
@@ -2,6 +2,13 @@
2
2
  color: $rating-grade-color
3
3
  vertical-align: middle
4
4
 
5
+ &__icon-container
6
+ height: 1em
7
+ outline: 0
8
+
9
+ & + &
10
+ margin-left: 2px
11
+
5
12
  &__icon
6
13
  color: currentColor
7
14
  text-shadow: $rating-shadow
@@ -17,13 +24,8 @@
17
24
  &--exselected
18
25
  opacity: .7
19
26
 
20
- & + &
21
- margin-left: 2px
22
-
23
27
  &--no-dimming .q-rating__icon
24
28
  opacity: 1
25
29
 
26
- &--editable .q-icon
30
+ &--editable .q-rating__icon-container
27
31
  cursor: pointer
28
- &--non-editable span, .q-icon
29
- outline: 0
@@ -1,4 +1,4 @@
1
- import { h, defineComponent, ref, computed, watch, onBeforeUpdate, onUpdated, onBeforeMount, onBeforeUnmount, nextTick, getCurrentInstance } from 'vue'
1
+ import { h, defineComponent, ref, computed, watch, onBeforeUpdate, onUpdated, onBeforeUnmount, nextTick, getCurrentInstance } from 'vue'
2
2
 
3
3
  import QField from '../field/QField.js'
4
4
  import QIcon from '../icon/QIcon.js'
@@ -142,7 +142,7 @@ export default defineComponent({
142
142
  const dialogFieldFocused = ref(false)
143
143
  const innerLoadingIndicator = ref(false)
144
144
 
145
- let inputTimer, innerValueCache, optionScopeCache,
145
+ let inputTimer, innerValueCache,
146
146
  hasDialog, userInputValue, filterId, defaultInputValue,
147
147
  transitionShowComputed, searchBuffer, searchBufferExp
148
148
 
@@ -268,7 +268,7 @@ export default defineComponent({
268
268
  const tabindex = computed(() => (state.focused.value === true ? props.tabindex : -1))
269
269
 
270
270
  const comboboxAttrs = computed(() => ({
271
- tabindex: tabindex.value,
271
+ tabindex: props.tabindex,
272
272
  role: 'combobox',
273
273
  'aria-label': props.label,
274
274
  'aria-autocomplete': props.useInput === true ? 'list' : 'none',
@@ -309,7 +309,6 @@ export default defineComponent({
309
309
  }
310
310
 
311
311
  const { from, to } = virtualScrollSliceRange.value
312
- const { options, optionEls } = optionScopeCache
313
312
 
314
313
  return props.options.slice(from, to).map((opt, i) => {
315
314
  const disable = isOptionDisabled.value(opt) === true
@@ -341,7 +340,7 @@ export default defineComponent({
341
340
  }
342
341
  }
343
342
 
344
- const option = {
343
+ return {
345
344
  index,
346
345
  opt,
347
346
  html: needsHtmlFn.value(opt),
@@ -352,22 +351,6 @@ export default defineComponent({
352
351
  setOptionIndex,
353
352
  itemProps
354
353
  }
355
-
356
- const optionWithoutEvents = {
357
- ...option,
358
- itemProps: {
359
- ...itemProps,
360
- onClick: void 0,
361
- onMousemove: void 0
362
- }
363
- }
364
-
365
- if (options[ i ] === void 0 || isDeepEqual(optionWithoutEvents, options[ i ]) !== true) {
366
- options[ i ] = optionWithoutEvents
367
- optionEls[ i ] = void 0
368
- }
369
-
370
- return option
371
354
  })
372
355
  })
373
356
 
@@ -949,14 +932,6 @@ export default defineComponent({
949
932
  }
950
933
 
951
934
  function getAllOptions () {
952
- if (
953
- slots.option !== void 0
954
- && optionScopeCache.optionSlot !== slots.option
955
- ) {
956
- optionScopeCache.optionSlot = slots.option
957
- optionScopeCache.optionEls = []
958
- }
959
-
960
935
  const fn = slots.option !== void 0
961
936
  ? slots.option
962
937
  : scope => {
@@ -976,17 +951,7 @@ export default defineComponent({
976
951
  })
977
952
  }
978
953
 
979
- const { optionEls } = optionScopeCache
980
-
981
- let options = padVirtualScroll('div', optionScope.value.map((scope, i) => {
982
- if (optionEls[ i ] === void 0) {
983
- optionEls[ i ] = fn(scope)
984
- }
985
-
986
- // rendered vnode always needs a new
987
- // "instance" otherwise DOM diff will say nothing changed
988
- return { ...optionEls[ i ] }
989
- }))
954
+ let options = padVirtualScroll('div', optionScope.value.map(fn))
990
955
 
991
956
  if (slots[ 'before-options' ] !== void 0) {
992
957
  options = slots[ 'before-options' ]().concat(options)
@@ -1298,10 +1263,6 @@ export default defineComponent({
1298
1263
  }
1299
1264
 
1300
1265
  function closeMenu () {
1301
- if (optionScopeCache !== void 0) {
1302
- optionScopeCache.optionEls = []
1303
- }
1304
-
1305
1266
  if (dialog.value === true) {
1306
1267
  return
1307
1268
  }
@@ -1417,16 +1378,7 @@ export default defineComponent({
1417
1378
 
1418
1379
  updatePreState()
1419
1380
 
1420
- onBeforeMount(() => {
1421
- optionScopeCache = {
1422
- optionSlot: slots.option,
1423
- options: [],
1424
- optionEls: []
1425
- }
1426
- })
1427
-
1428
1381
  onBeforeUnmount(() => {
1429
- optionScopeCache = void 0
1430
1382
  clearTimeout(inputTimer)
1431
1383
  })
1432
1384
 
@@ -8,7 +8,7 @@
8
8
  "props": {
9
9
  "model-value": {
10
10
  "extends": "model-value",
11
- "type": [ "Number", "String", "Array", "null" ],
11
+ "type": [ "Number", "String", "Array", "null", "undefined" ],
12
12
  "desc": "Model of the component; Must be Array if using 'multiple' prop; Either use this property (along with a listener for 'update:modelValue' event) OR use v-model directive",
13
13
  "examples": [ "v-model=\"myModel\"" ]
14
14
  },
@@ -38,6 +38,10 @@ export default defineComponent({
38
38
  validator: v => skeletonAnimations.includes(v),
39
39
  default: 'wave'
40
40
  },
41
+ animationSpeed: {
42
+ type: [ String, Number ],
43
+ default: 1500
44
+ },
41
45
 
42
46
  square: Boolean,
43
47
  bordered: Boolean,
@@ -51,11 +55,17 @@ export default defineComponent({
51
55
  const vm = getCurrentInstance()
52
56
  const isDark = useDark(props, vm.proxy.$q)
53
57
 
54
- const style = computed(() => (
55
- props.size !== void 0
56
- ? { width: props.size, height: props.size }
57
- : { width: props.width, height: props.height }
58
- ))
58
+ const style = computed(() => {
59
+ const size = props.size !== void 0
60
+ ? [ props.size, props.size ]
61
+ : [ props.width, props.height ]
62
+
63
+ return {
64
+ '--q-skeleton-speed': `${ props.animationSpeed }ms`,
65
+ width: size[ 0 ],
66
+ height: size[ 1 ]
67
+ }
68
+ })
59
69
 
60
70
  const classes = computed(() =>
61
71
  `q-skeleton q-skeleton--${ isDark.value === true ? 'dark' : 'light' } q-skeleton--type-${ props.type }`
@@ -32,6 +32,15 @@
32
32
  "category": "style"
33
33
  },
34
34
 
35
+ "animation-speed": {
36
+ "type": [ "String", "Number" ],
37
+ "desc": "Animation speed (in milliseconds, without unit)",
38
+ "default": 300,
39
+ "examples": [ 500, "1200" ],
40
+ "category": "style",
41
+ "addedIn": "v2.2"
42
+ },
43
+
35
44
  "square": {
36
45
  "extends": "square"
37
46
  },
@@ -1,4 +1,5 @@
1
1
  .q-skeleton
2
+ --q-skeleton-speed: 1500ms
2
3
  background: $separator-color
3
4
  border-radius: $generic-border-radius
4
5
 
@@ -58,14 +59,14 @@
58
59
  border-radius: 0
59
60
 
60
61
  &--anim-fade
61
- animation: q-skeleton--fade 1.5s linear .5s infinite
62
+ animation: q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite
62
63
 
63
64
  &--anim-pulse
64
- animation: q-skeleton--pulse 1.5s ease-in-out .5s infinite
65
+ animation: q-skeleton--pulse var(--q-skeleton-speed) ease-in-out .5s infinite
65
66
  &--anim-pulse-x
66
- animation: q-skeleton--pulse-x 1.5s ease-in-out .5s infinite
67
+ animation: q-skeleton--pulse-x var(--q-skeleton-speed) ease-in-out .5s infinite
67
68
  &--anim-pulse-y
68
- animation: q-skeleton--pulse-y 1.5s ease-in-out .5s infinite
69
+ animation: q-skeleton--pulse-y var(--q-skeleton-speed) ease-in-out .5s infinite
69
70
 
70
71
  &--anim-wave,
71
72
  &--anim-blink,
@@ -84,10 +85,10 @@
84
85
 
85
86
  &--anim-blink:after
86
87
  background: rgba(255,255,255,.7)
87
- animation: q-skeleton--fade 1.5s linear .5s infinite
88
+ animation: q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite
88
89
  &--anim-wave:after
89
90
  background: linear-gradient(90deg, rgba(255,255,255,0), rgba(255,255,255,.5), rgba(255,255,255,0))
90
- animation: q-skeleton--wave 1.5s linear .5s infinite
91
+ animation: q-skeleton--wave var(--q-skeleton-speed) linear .5s infinite
91
92
 
92
93
  &--dark
93
94
  background: rgba(255, 255, 255, 0.05)
@@ -8,7 +8,7 @@
8
8
  "props": {
9
9
  "model-value": {
10
10
  "extends": "model-value",
11
- "type": [ "Number", "null" ],
11
+ "type": [ "Number", "null", "undefined" ],
12
12
  "desc": "Model of the component (must be between min/max); Either use this property (along with a listener for 'update:modelValue' event) OR use v-model directive",
13
13
  "examples": [ "v-model=\"positionModel\"" ]
14
14
  },
@@ -6,7 +6,7 @@
6
6
  "props": {
7
7
  "model-value":{
8
8
  "extends": "model-value",
9
- "type": [ "Number", "String", "null" ],
9
+ "type": [ "Number", "String", "null", "undefined" ],
10
10
  "desc": "Model of the component defining current panel name; Either use this property (along with a listener for 'update:modelValue' event) OR use v-model directive",
11
11
  "required": false,
12
12
  "examples": [ "v-model=\"selectedTab\"" ]
@@ -8,7 +8,7 @@
8
8
  "props": {
9
9
  "model-value": {
10
10
  "extends": "model-value",
11
- "type": [ "String", "null" ],
11
+ "type": [ "String", "null", "undefined" ],
12
12
  "desc": "Time of the component; Either use this property (along with a listener for 'update:modelValue' event) OR use v-model directive",
13
13
  "examples": [
14
14
  "v-model=\"currentTime\""
@@ -33,6 +33,10 @@ export const usePanelProps = {
33
33
 
34
34
  transitionPrev: String,
35
35
  transitionNext: String,
36
+ transitionDuration: {
37
+ type: [ String, Number ],
38
+ default: 300
39
+ },
36
40
 
37
41
  keepAlive: Boolean,
38
42
  keepAliveInclude: [ String, Array, RegExp ],
@@ -78,6 +82,10 @@ export default function () {
78
82
  props.transitionNext || `slide-${ props.vertical === true ? 'up' : 'left' }`
79
83
  )
80
84
 
85
+ const transitionStyle = computed(
86
+ () => `--q-transition-duration: ${ props.transitionDuration }ms`
87
+ )
88
+
81
89
  const contentKey = computed(() => (
82
90
  typeof props.modelValue === 'string' || typeof props.modelValue === 'number'
83
91
  ? props.modelValue
@@ -197,7 +205,7 @@ export default function () {
197
205
  }
198
206
 
199
207
  function getPanelContentChild () {
200
- const panel = isValidPanelName(props.modelValue)
208
+ const panel = isValidPanelName(props.modelValue) === true
201
209
  && updatePanelIndex()
202
210
  && panels[ panelIndex.value ]
203
211
 
@@ -208,7 +216,7 @@ export default function () {
208
216
  needsUniqueKeepAliveWrapper.value === true
209
217
  ? getCacheWithFn(contentKey.value, () => ({ ...PanelWrapper, name: contentKey.value }))
210
218
  : PanelWrapper,
211
- { key: contentKey.value },
219
+ { key: contentKey.value, style: transitionStyle.value },
212
220
  () => panel
213
221
  )
214
222
  ])
@@ -216,6 +224,7 @@ export default function () {
216
224
  : [
217
225
  h('div', {
218
226
  class: 'q-panel scroll',
227
+ style: transitionStyle.value,
219
228
  key: contentKey.value,
220
229
  role: 'tabpanel'
221
230
  }, [ panel ])
@@ -228,11 +237,7 @@ export default function () {
228
237
  }
229
238
 
230
239
  return props.animated === true
231
- ? [
232
- h(Transition, {
233
- name: panelTransition.value
234
- }, getPanelContentChild)
235
- ]
240
+ ? [ h(Transition, { name: panelTransition.value }, getPanelContentChild) ]
236
241
  : getPanelContentChild()
237
242
  }
238
243
 
@@ -242,7 +247,7 @@ export default function () {
242
247
  ).filter(
243
248
  panel => panel.props !== null
244
249
  && panel.props.slot === void 0
245
- && isValidPanelName(panel.props.name)
250
+ && isValidPanelName(panel.props.name) === true
246
251
  )
247
252
 
248
253
  return panels.length
@@ -62,14 +62,23 @@
62
62
  "extends": "transition",
63
63
  "desc": "One of Quasar's embedded transitions (has effect only if 'animated' prop is set)",
64
64
  "default": "slide-right/slide-down",
65
- "category": "behavior"
65
+ "category": "transition"
66
66
  },
67
67
 
68
68
  "transition-next": {
69
69
  "extends": "transition",
70
70
  "desc": "One of Quasar's embedded transitions (has effect only if 'animated' prop is set)",
71
71
  "default": "slide-left/slide-up",
72
- "category": "behavior"
72
+ "category": "transition"
73
+ },
74
+
75
+ "transition-duration": {
76
+ "type": [ "String", "Number" ],
77
+ "desc": "Transition duration (in milliseconds, without unit)",
78
+ "default": 300,
79
+ "examples": [ 500, "1200" ],
80
+ "category": "transition",
81
+ "addedIn": "v2.2"
73
82
  }
74
83
  },
75
84
 
@@ -1,9 +1,5 @@
1
1
  // default easing is easeOutCubic
2
2
 
3
- \:root
4
- --q-transition-duration: .3s
5
- --q-transition-easing: cubic-bezier(0.215,0.61,0.355,1)
6
-
7
3
  .q-transition
8
4
  &--slide-right,
9
5
  &--slide-left,
@@ -17,6 +13,10 @@
17
13
  &--scale,
18
14
  &--rotate,
19
15
  &--flip
16
+ &-enter-active,
17
+ &-leave-active
18
+ --q-transition-duration: .3s
19
+ --q-transition-easing: cubic-bezier(0.215,0.61,0.355,1)
20
20
  &-leave-active
21
21
  position: absolute
22
22