quasar 2.16.11 → 2.17.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 (170) hide show
  1. package/dist/api/Platform.json +1 -1
  2. package/dist/api/QOptionGroup.json +1 -1
  3. package/dist/api/QScrollArea.json +1 -1
  4. package/dist/api/QSelect.json +1 -1
  5. package/dist/api/QUploader.json +1 -1
  6. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  7. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  8. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  9. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  10. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  11. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  12. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  13. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  14. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  15. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  16. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  17. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  18. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  19. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  20. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  21. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  22. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  23. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  24. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  25. package/dist/icon-set/mdi-v7.umd.prod.js +1 -1
  26. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  27. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  28. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  29. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  30. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +1 -1
  39. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
  40. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  42. package/dist/icon-set/svg-mdi-v7.umd.prod.js +1 -1
  43. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  44. package/dist/icon-set/themify.umd.prod.js +1 -1
  45. package/dist/lang/ar-TN.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/bs-BA.umd.prod.js +1 -1
  51. package/dist/lang/ca.umd.prod.js +1 -1
  52. package/dist/lang/cs.umd.prod.js +1 -1
  53. package/dist/lang/da.umd.prod.js +1 -1
  54. package/dist/lang/de-CH.umd.prod.js +1 -1
  55. package/dist/lang/de-DE.umd.prod.js +1 -1
  56. package/dist/lang/de.umd.prod.js +1 -1
  57. package/dist/lang/el.umd.prod.js +1 -1
  58. package/dist/lang/en-GB.umd.prod.js +1 -1
  59. package/dist/lang/en-US.umd.prod.js +1 -1
  60. package/dist/lang/eo.umd.prod.js +1 -1
  61. package/dist/lang/es.umd.prod.js +1 -1
  62. package/dist/lang/et.umd.prod.js +1 -1
  63. package/dist/lang/eu.umd.prod.js +1 -1
  64. package/dist/lang/fa-IR.umd.prod.js +1 -1
  65. package/dist/lang/fa.umd.prod.js +1 -1
  66. package/dist/lang/fi.umd.prod.js +1 -1
  67. package/dist/lang/fr.umd.prod.js +1 -1
  68. package/dist/lang/gn.umd.prod.js +1 -1
  69. package/dist/lang/he.umd.prod.js +1 -1
  70. package/dist/lang/hi.umd.prod.js +1 -1
  71. package/dist/lang/hr.umd.prod.js +1 -1
  72. package/dist/lang/hu.umd.prod.js +1 -1
  73. package/dist/lang/id.umd.prod.js +1 -1
  74. package/dist/lang/is.umd.prod.js +1 -1
  75. package/dist/lang/it.umd.prod.js +1 -1
  76. package/dist/lang/ja.umd.prod.js +1 -1
  77. package/dist/lang/kk.umd.prod.js +1 -1
  78. package/dist/lang/km.umd.prod.js +1 -1
  79. package/dist/lang/ko-KR.umd.prod.js +1 -1
  80. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  81. package/dist/lang/lt.umd.prod.js +1 -1
  82. package/dist/lang/lu.umd.prod.js +1 -1
  83. package/dist/lang/lv.umd.prod.js +1 -1
  84. package/dist/lang/mk.umd.prod.js +1 -1
  85. package/dist/lang/ml.umd.prod.js +1 -1
  86. package/dist/lang/mm.umd.prod.js +1 -1
  87. package/dist/lang/ms-MY.umd.prod.js +1 -1
  88. package/dist/lang/ms.umd.prod.js +1 -1
  89. package/dist/lang/my.umd.prod.js +1 -1
  90. package/dist/lang/nb-NO.umd.prod.js +1 -1
  91. package/dist/lang/nl.umd.prod.js +1 -1
  92. package/dist/lang/pl.umd.prod.js +1 -1
  93. package/dist/lang/pt-BR.umd.prod.js +1 -1
  94. package/dist/lang/pt.umd.prod.js +1 -1
  95. package/dist/lang/ro.umd.prod.js +1 -1
  96. package/dist/lang/ru.umd.prod.js +1 -1
  97. package/dist/lang/sk.umd.prod.js +1 -1
  98. package/dist/lang/sl.umd.prod.js +1 -1
  99. package/dist/lang/sm.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/tl.umd.prod.js +1 -1
  106. package/dist/lang/tr.umd.prod.js +1 -1
  107. package/dist/lang/ug.umd.prod.js +1 -1
  108. package/dist/lang/uk.umd.prod.js +1 -1
  109. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  110. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  111. package/dist/lang/vi.umd.prod.js +1 -1
  112. package/dist/lang/zh-CN.umd.prod.js +1 -1
  113. package/dist/lang/zh-TW.umd.prod.js +1 -1
  114. package/dist/quasar.client.js +748 -2140
  115. package/dist/quasar.css +3 -2
  116. package/dist/quasar.prod.css +1 -1
  117. package/dist/quasar.rtl.css +3 -2
  118. package/dist/quasar.rtl.prod.css +1 -1
  119. package/dist/quasar.sass +8 -4
  120. package/dist/quasar.server.prod.cjs +53 -53
  121. package/dist/quasar.server.prod.js +51 -51
  122. package/dist/quasar.umd.js +338 -1733
  123. package/dist/quasar.umd.prod.js +44 -44
  124. package/dist/types/index.d.ts +120 -51
  125. package/dist/vetur/quasar-attributes.json +1 -1
  126. package/dist/vetur/quasar-tags.json +1 -1
  127. package/dist/web-types/web-types.json +1 -1
  128. package/package.json +9 -9
  129. package/src/components/menu/QMenu.sass +2 -2
  130. package/src/components/option-group/QOptionGroup.js +38 -15
  131. package/src/components/option-group/QOptionGroup.json +88 -1
  132. package/src/components/scroll-area/QScrollArea.js +115 -107
  133. package/src/components/scroll-area/QScrollArea.json +40 -0
  134. package/src/components/scroll-area/ScrollAreaControls.js +54 -0
  135. package/src/components/select/QSelect.js +16 -18
  136. package/src/components/select/QSelect.json +7 -0
  137. package/src/components/spinner/QSpinnerAudio.js +4 -70
  138. package/src/components/spinner/QSpinnerBall.js +4 -86
  139. package/src/components/spinner/QSpinnerBars.js +4 -125
  140. package/src/components/spinner/QSpinnerBox.js +4 -43
  141. package/src/components/spinner/QSpinnerClock.js +4 -54
  142. package/src/components/spinner/QSpinnerComment.js +4 -66
  143. package/src/components/spinner/QSpinnerCube.js +4 -114
  144. package/src/components/spinner/QSpinnerDots.js +4 -86
  145. package/src/components/spinner/QSpinnerFacebook.js +4 -85
  146. package/src/components/spinner/QSpinnerGears.js +4 -41
  147. package/src/components/spinner/QSpinnerGrid.js +4 -134
  148. package/src/components/spinner/QSpinnerHearts.js +4 -36
  149. package/src/components/spinner/QSpinnerHourglass.js +4 -94
  150. package/src/components/spinner/QSpinnerInfinity.js +4 -25
  151. package/src/components/spinner/QSpinnerIos.js +4 -156
  152. package/src/components/spinner/QSpinnerOrbit.js +4 -33
  153. package/src/components/spinner/QSpinnerOval.js +4 -32
  154. package/src/components/spinner/QSpinnerPie.js +4 -63
  155. package/src/components/spinner/QSpinnerPuff.js +4 -65
  156. package/src/components/spinner/QSpinnerRadio.js +4 -58
  157. package/src/components/spinner/QSpinnerRings.js +4 -88
  158. package/src/components/spinner/QSpinnerTail.js +4 -66
  159. package/src/components/tabs/QRouteTab.js +4 -3
  160. package/src/components/tabs/QTabs.js +28 -15
  161. package/src/components/tooltip/QTooltip.sass +2 -0
  162. package/src/components/uploader/QUploader.json +9 -0
  163. package/src/components/uploader/QUploader.sass +0 -1
  164. package/src/components/uploader/uploader-core.js +6 -2
  165. package/src/composables/private.use-panel/use-panel.js +5 -3
  166. package/src/css/variables.sass +3 -0
  167. package/src/plugins/platform/Platform.js +40 -5
  168. package/src/plugins/platform/Platform.json +52 -69
  169. package/src/plugins/platform/Platform.test.js +22 -14
  170. package/src/utils/private.position-engine/position-engine.js +11 -4
@@ -1,69 +1,9 @@
1
1
  import { h } from 'vue'
2
2
 
3
3
  import useSpinner, { useSpinnerProps } from './use-spinner.js'
4
-
5
4
  import { createComponent } from '../../utils/private.create/create.js'
6
5
 
7
- const createSvg = () => [
8
- h('g', {
9
- fill: 'none',
10
- 'fill-rule': 'evenodd',
11
- 'stroke-width': '2'
12
- }, [
13
- h('circle', {
14
- cx: '22',
15
- cy: '22',
16
- r: '1'
17
- }, [
18
- h('animate', {
19
- attributeName: 'r',
20
- begin: '0s',
21
- dur: '1.8s',
22
- values: '1; 20',
23
- calcMode: 'spline',
24
- keyTimes: '0; 1',
25
- keySplines: '0.165, 0.84, 0.44, 1',
26
- repeatCount: 'indefinite'
27
- }),
28
- h('animate', {
29
- attributeName: 'stroke-opacity',
30
- begin: '0s',
31
- dur: '1.8s',
32
- values: '1; 0',
33
- calcMode: 'spline',
34
- keyTimes: '0; 1',
35
- keySplines: '0.3, 0.61, 0.355, 1',
36
- repeatCount: 'indefinite'
37
- })
38
- ]),
39
- h('circle', {
40
- cx: '22',
41
- cy: '22',
42
- r: '1'
43
- }, [
44
- h('animate', {
45
- attributeName: 'r',
46
- begin: '-0.9s',
47
- dur: '1.8s',
48
- values: '1; 20',
49
- calcMode: 'spline',
50
- keyTimes: '0; 1',
51
- keySplines: '0.165, 0.84, 0.44, 1',
52
- repeatCount: 'indefinite'
53
- }),
54
- h('animate', {
55
- attributeName: 'stroke-opacity',
56
- begin: '-0.9s',
57
- dur: '1.8s',
58
- values: '1; 0',
59
- calcMode: 'spline',
60
- keyTimes: '0; 1',
61
- keySplines: '0.3, 0.61, 0.355, 1',
62
- repeatCount: 'indefinite'
63
- })
64
- ])
65
- ])
66
- ]
6
+ const innerHTML = '<g fill="none" fill-rule="evenodd" stroke-width="2"><circle cx="22" cy="22" r="1"><animate attributeName="r" begin="0s" dur="1.8s" values="1; 20" calcMode="spline" keyTimes="0; 1" keySplines="0.165, 0.84, 0.44, 1" repeatCount="indefinite"></animate><animate attributeName="stroke-opacity" begin="0s" dur="1.8s" values="1; 0" calcMode="spline" keyTimes="0; 1" keySplines="0.3, 0.61, 0.355, 1" repeatCount="indefinite"></animate></circle><circle cx="22" cy="22" r="1"><animate attributeName="r" begin="-0.9s" dur="1.8s" values="1; 20" calcMode="spline" keyTimes="0; 1" keySplines="0.165, 0.84, 0.44, 1" repeatCount="indefinite"></animate><animate attributeName="stroke-opacity" begin="-0.9s" dur="1.8s" values="1; 0" calcMode="spline" keyTimes="0; 1" keySplines="0.3, 0.61, 0.355, 1" repeatCount="indefinite"></animate></circle></g>'
67
7
 
68
8
  export default createComponent({
69
9
  name: 'QSpinnerPuff',
@@ -72,15 +12,14 @@ export default createComponent({
72
12
 
73
13
  setup (props) {
74
14
  const { cSize, classes } = useSpinner(props)
75
- const svg = createSvg()
76
-
77
15
  return () => h('svg', {
78
16
  class: classes.value,
79
17
  stroke: 'currentColor',
80
18
  width: cSize.value,
81
19
  height: cSize.value,
82
20
  viewBox: '0 0 44 44',
83
- xmlns: 'http://www.w3.org/2000/svg'
84
- }, svg)
21
+ xmlns: 'http://www.w3.org/2000/svg',
22
+ innerHTML
23
+ })
85
24
  }
86
25
  })
@@ -1,62 +1,9 @@
1
1
  import { h } from 'vue'
2
2
 
3
3
  import useSpinner, { useSpinnerProps } from './use-spinner.js'
4
-
5
4
  import { createComponent } from '../../utils/private.create/create.js'
6
5
 
7
- const createSvg = () => [
8
- h('g', {
9
- transform: 'scale(0.55)'
10
- }, [
11
- h('circle', {
12
- cx: '30',
13
- cy: '150',
14
- r: '30',
15
- fill: 'currentColor'
16
- }, [
17
- h('animate', {
18
- attributeName: 'opacity',
19
- from: '0',
20
- to: '1',
21
- dur: '1s',
22
- begin: '0',
23
- repeatCount: 'indefinite',
24
- keyTimes: '0;0.5;1',
25
- values: '0;1;1'
26
- })
27
- ]),
28
- h('path', {
29
- d: 'M90,150h30c0-49.7-40.3-90-90-90v30C63.1,90,90,116.9,90,150z',
30
- fill: 'currentColor'
31
- }, [
32
- h('animate', {
33
- attributeName: 'opacity',
34
- from: '0',
35
- to: '1',
36
- dur: '1s',
37
- begin: '0.1',
38
- repeatCount: 'indefinite',
39
- keyTimes: '0;0.5;1',
40
- values: '0;1;1'
41
- })
42
- ]),
43
- h('path', {
44
- d: 'M150,150h30C180,67.2,112.8,0,30,0v30C96.3,30,150,83.7,150,150z',
45
- fill: 'currentColor'
46
- }, [
47
- h('animate', {
48
- attributeName: 'opacity',
49
- from: '0',
50
- to: '1',
51
- dur: '1s',
52
- begin: '0.2',
53
- repeatCount: 'indefinite',
54
- keyTimes: '0;0.5;1',
55
- values: '0;1;1'
56
- })
57
- ])
58
- ])
59
- ]
6
+ const innerHTML = '<g transform="scale(0.55)"><circle cx="30" cy="150" r="30" fill="currentColor"><animate attributeName="opacity" from="0" to="1" dur="1s" begin="0" repeatCount="indefinite" keyTimes="0;0.5;1" values="0;1;1"></animate></circle><path d="M90,150h30c0-49.7-40.3-90-90-90v30C63.1,90,90,116.9,90,150z" fill="currentColor"><animate attributeName="opacity" from="0" to="1" dur="1s" begin="0.1" repeatCount="indefinite" keyTimes="0;0.5;1" values="0;1;1"></animate></path><path d="M150,150h30C180,67.2,112.8,0,30,0v30C96.3,30,150,83.7,150,150z" fill="currentColor"><animate attributeName="opacity" from="0" to="1" dur="1s" begin="0.2" repeatCount="indefinite" keyTimes="0;0.5;1" values="0;1;1"></animate></path></g>'
60
7
 
61
8
  export default createComponent({
62
9
  name: 'QSpinnerRadio',
@@ -65,15 +12,14 @@ export default createComponent({
65
12
 
66
13
  setup (props) {
67
14
  const { cSize, classes } = useSpinner(props)
68
- const svg = createSvg()
69
-
70
15
  return () => h('svg', {
71
16
  class: classes.value,
72
17
  width: cSize.value,
73
18
  height: cSize.value,
74
19
  viewBox: '0 0 100 100',
75
20
  preserveAspectRatio: 'xMidYMid',
76
- xmlns: 'http://www.w3.org/2000/svg'
77
- }, svg)
21
+ xmlns: 'http://www.w3.org/2000/svg',
22
+ innerHTML
23
+ })
78
24
  }
79
25
  })
@@ -1,92 +1,9 @@
1
1
  import { h } from 'vue'
2
2
 
3
3
  import useSpinner, { useSpinnerProps } from './use-spinner.js'
4
-
5
4
  import { createComponent } from '../../utils/private.create/create.js'
6
5
 
7
- const createSvg = () => [
8
- h('g', {
9
- fill: 'none',
10
- 'fill-rule': 'evenodd',
11
- transform: 'translate(1 1)',
12
- 'stroke-width': '2'
13
- }, [
14
- h('circle', {
15
- cx: '22',
16
- cy: '22',
17
- r: '6'
18
- }, [
19
- h('animate', {
20
- attributeName: 'r',
21
- begin: '1.5s',
22
- dur: '3s',
23
- values: '6;22',
24
- calcMode: 'linear',
25
- repeatCount: 'indefinite'
26
- }),
27
- h('animate', {
28
- attributeName: 'stroke-opacity',
29
- begin: '1.5s',
30
- dur: '3s',
31
- values: '1;0',
32
- calcMode: 'linear',
33
- repeatCount: 'indefinite'
34
- }),
35
- h('animate', {
36
- attributeName: 'stroke-width',
37
- begin: '1.5s',
38
- dur: '3s',
39
- values: '2;0',
40
- calcMode: 'linear',
41
- repeatCount: 'indefinite'
42
- })
43
- ]),
44
- h('circle', {
45
- cx: '22',
46
- cy: '22',
47
- r: '6'
48
- }, [
49
- h('animate', {
50
- attributeName: 'r',
51
- begin: '3s',
52
- dur: '3s',
53
- values: '6;22',
54
- calcMode: 'linear',
55
- repeatCount: 'indefinite'
56
- }),
57
- h('animate', {
58
- attributeName: 'stroke-opacity',
59
- begin: '3s',
60
- dur: '3s',
61
- values: '1;0',
62
- calcMode: 'linear',
63
- repeatCount: 'indefinite'
64
- }),
65
- h('animate', {
66
- attributeName: 'stroke-width',
67
- begin: '3s',
68
- dur: '3s',
69
- values: '2;0',
70
- calcMode: 'linear',
71
- repeatCount: 'indefinite'
72
- })
73
- ]),
74
- h('circle', {
75
- cx: '22',
76
- cy: '22',
77
- r: '8'
78
- }, [
79
- h('animate', {
80
- attributeName: 'r',
81
- begin: '0s',
82
- dur: '1.5s',
83
- values: '6;1;2;3;4;5;6',
84
- calcMode: 'linear',
85
- repeatCount: 'indefinite'
86
- })
87
- ])
88
- ])
89
- ]
6
+ const innerHTML = '<g fill="none" fill-rule="evenodd" transform="translate(1 1)" stroke-width="2"><circle cx="22" cy="22" r="6"><animate attributeName="r" begin="1.5s" dur="3s" values="6;22" calcMode="linear" repeatCount="indefinite"></animate><animate attributeName="stroke-opacity" begin="1.5s" dur="3s" values="1;0" calcMode="linear" repeatCount="indefinite"></animate><animate attributeName="stroke-width" begin="1.5s" dur="3s" values="2;0" calcMode="linear" repeatCount="indefinite"></animate></circle><circle cx="22" cy="22" r="6"><animate attributeName="r" begin="3s" dur="3s" values="6;22" calcMode="linear" repeatCount="indefinite"></animate><animate attributeName="stroke-opacity" begin="3s" dur="3s" values="1;0" calcMode="linear" repeatCount="indefinite"></animate><animate attributeName="stroke-width" begin="3s" dur="3s" values="2;0" calcMode="linear" repeatCount="indefinite"></animate></circle><circle cx="22" cy="22" r="8"><animate attributeName="r" begin="0s" dur="1.5s" values="6;1;2;3;4;5;6" calcMode="linear" repeatCount="indefinite"></animate></circle></g>'
90
7
 
91
8
  export default createComponent({
92
9
  name: 'QSpinnerRings',
@@ -95,15 +12,14 @@ export default createComponent({
95
12
 
96
13
  setup (props) {
97
14
  const { cSize, classes } = useSpinner(props)
98
- const svg = createSvg()
99
-
100
15
  return () => h('svg', {
101
16
  class: classes.value,
102
17
  stroke: 'currentColor',
103
18
  width: cSize.value,
104
19
  height: cSize.value,
105
20
  viewBox: '0 0 45 45',
106
- xmlns: 'http://www.w3.org/2000/svg'
107
- }, svg)
21
+ xmlns: 'http://www.w3.org/2000/svg',
22
+ innerHTML
23
+ })
108
24
  }
109
25
  })
@@ -1,70 +1,9 @@
1
1
  import { h } from 'vue'
2
2
 
3
3
  import useSpinner, { useSpinnerProps } from './use-spinner.js'
4
-
5
4
  import { createComponent } from '../../utils/private.create/create.js'
6
5
 
7
- const createSvg = () => [
8
- h('defs', [
9
- h('linearGradient', {
10
- x1: '8.042%',
11
- y1: '0%',
12
- x2: '65.682%',
13
- y2: '23.865%',
14
- id: 'a'
15
- }, [
16
- h('stop', {
17
- 'stop-color': 'currentColor',
18
- 'stop-opacity': '0',
19
- offset: '0%'
20
- }),
21
- h('stop', {
22
- 'stop-color': 'currentColor',
23
- 'stop-opacity': '.631',
24
- offset: '63.146%'
25
- }),
26
- h('stop', {
27
- 'stop-color': 'currentColor',
28
- offset: '100%'
29
- })
30
- ])
31
- ]),
32
- h('g', {
33
- transform: 'translate(1 1)',
34
- fill: 'none',
35
- 'fill-rule': 'evenodd'
36
- }, [
37
- h('path', {
38
- d: 'M36 18c0-9.94-8.06-18-18-18',
39
- stroke: 'url(#a)',
40
- 'stroke-width': '2'
41
- }, [
42
- h('animateTransform', {
43
- attributeName: 'transform',
44
- type: 'rotate',
45
- from: '0 18 18',
46
- to: '360 18 18',
47
- dur: '0.9s',
48
- repeatCount: 'indefinite'
49
- })
50
- ]),
51
- h('circle', {
52
- fill: 'currentColor',
53
- cx: '36',
54
- cy: '18',
55
- r: '1'
56
- }, [
57
- h('animateTransform', {
58
- attributeName: 'transform',
59
- type: 'rotate',
60
- from: '0 18 18',
61
- to: '360 18 18',
62
- dur: '0.9s',
63
- repeatCount: 'indefinite'
64
- })
65
- ])
66
- ])
67
- ]
6
+ const innerHTML = '<defs><linearGradient x1="8.042%" y1="0%" x2="65.682%" y2="23.865%" id="a"><stop stop-color="currentColor" stop-opacity="0" offset="0%"></stop><stop stop-color="currentColor" stop-opacity=".631" offset="63.146%"></stop><stop stop-color="currentColor" offset="100%"></stop></linearGradient></defs><g transform="translate(1 1)" fill="none" fill-rule="evenodd"><path d="M36 18c0-9.94-8.06-18-18-18" stroke="url(#a)" stroke-width="2"><animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="0.9s" repeatCount="indefinite"></animateTransform></path><circle fill="currentColor" cx="36" cy="18" r="1"><animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="0.9s" repeatCount="indefinite"></animateTransform></circle></g>'
68
7
 
69
8
  export default createComponent({
70
9
  name: 'QSpinnerTail',
@@ -73,14 +12,13 @@ export default createComponent({
73
12
 
74
13
  setup (props) {
75
14
  const { cSize, classes } = useSpinner(props)
76
- const svg = createSvg()
77
-
78
15
  return () => h('svg', {
79
16
  class: classes.value,
80
17
  width: cSize.value,
81
18
  height: cSize.value,
82
19
  viewBox: '0 0 38 38',
83
- xmlns: 'http://www.w3.org/2000/svg'
84
- }, svg)
20
+ xmlns: 'http://www.w3.org/2000/svg',
21
+ innerHTML
22
+ })
85
23
  }
86
24
  })
@@ -30,9 +30,10 @@ export default createComponent({
30
30
  }
31
31
  )
32
32
 
33
- watch(() => `${ props.name } | ${ props.exact } | ${ (routeData.resolvedLink.value || {}).href }`, () => {
34
- $tabs.verifyRouteModel()
35
- })
33
+ watch(
34
+ () => `${ props.name } | ${ props.exact } | ${ (routeData.resolvedLink.value || {}).href }`,
35
+ $tabs.verifyRouteModel
36
+ )
36
37
 
37
38
  return () => renderTab(routeData.linkTag.value, routeData.linkAttrs.value)
38
39
  }
@@ -160,18 +160,18 @@ export default createComponent({
160
160
  watch(() => props.outsideArrows, recalculateScroll)
161
161
 
162
162
  function updateModel ({ name, setCurrent, skipEmit }) {
163
- if (currentModel.value !== name) {
164
- if (skipEmit !== true && props[ 'onUpdate:modelValue' ] !== void 0) {
165
- emit('update:modelValue', name)
166
- }
163
+ if (currentModel.value === name) return
167
164
 
168
- if (
169
- setCurrent === true
170
- || props[ 'onUpdate:modelValue' ] === void 0
171
- ) {
172
- animate(currentModel.value, name)
173
- currentModel.value = name
174
- }
165
+ if (skipEmit !== true && props[ 'onUpdate:modelValue' ] !== void 0) {
166
+ emit('update:modelValue', name)
167
+ }
168
+
169
+ if (
170
+ setCurrent === true
171
+ || props[ 'onUpdate:modelValue' ] === void 0
172
+ ) {
173
+ animate(currentModel.value, name)
174
+ currentModel.value = name
175
175
  }
176
176
  }
177
177
 
@@ -219,7 +219,13 @@ export default createComponent({
219
219
  ? tabDataList.find(tab => tab.name.value === newName)
220
220
  : null
221
221
 
222
- if (oldTab && newTab) {
222
+ if (hadActivated === true) {
223
+ // After the component has been re-activated
224
+ // we should not animate the transition.
225
+ // Consider it as if the component has just been mounted.
226
+ hadActivated = false
227
+ }
228
+ else if (oldTab && newTab) {
223
229
  const
224
230
  oldEl = oldTab.tabIndicatorRef.value,
225
231
  newEl = newTab.tabIndicatorRef.value
@@ -413,7 +419,8 @@ export default createComponent({
413
419
  return true
414
420
  }
415
421
 
416
- // do not use directly; use verifyRouteModel() instead
422
+ // 1. Do not use directly; use verifyRouteModel() instead
423
+ // 2. Should set hadActivated to false upon exit
417
424
  function updateActiveRoute () {
418
425
  let name = null, bestScore = { matchedLen: 0, queryDiff: 9999, hrefLen: 0 }
419
426
 
@@ -506,6 +513,7 @@ export default createComponent({
506
513
  && tabDataList.some(tab => tab.routeData === void 0 && tab.name.value === currentModel.value) === true
507
514
  ) {
508
515
  // we shouldn't interfere if non-route tab is active
516
+ hadActivated = false
509
517
  return
510
518
  }
511
519
 
@@ -627,7 +635,7 @@ export default createComponent({
627
635
  unwatchRoute !== void 0 && unwatchRoute()
628
636
  }
629
637
 
630
- let hadRouteWatcher
638
+ let hadRouteWatcher, hadActivated
631
639
 
632
640
  onBeforeUnmount(cleanup)
633
641
 
@@ -637,7 +645,12 @@ export default createComponent({
637
645
  })
638
646
 
639
647
  onActivated(() => {
640
- hadRouteWatcher === true && watchRoute()
648
+ if (hadRouteWatcher === true) {
649
+ watchRoute()
650
+ hadActivated = true
651
+ verifyRouteModel()
652
+ }
653
+
641
654
  recalculateScroll()
642
655
  })
643
656
 
@@ -12,6 +12,8 @@
12
12
  overflow-y: auto
13
13
  overflow-x: hidden
14
14
  padding: $tooltip-padding
15
+ max-width: $tooltip-max-width // required by the position-engine
16
+ max-height: $tooltip-max-height // required by the position-engine
15
17
 
16
18
  @media (max-width: $breakpoint-xs-max)
17
19
  font-size: $tooltip-mobile-fontsize
@@ -55,6 +55,15 @@
55
55
  "category": "behavior"
56
56
  },
57
57
 
58
+ "thumbnail-fit": {
59
+ "type": "String",
60
+ "desc": "How the thumbnail image will fit into the container; Equivalent of the background-size prop",
61
+ "default": "'cover'",
62
+ "examples": [ "'cover'", "'contain'", "'auto'", "'50%'" ],
63
+ "category": "style",
64
+ "addedIn": "v2.17"
65
+ },
66
+
58
67
  "disable": {
59
68
  "extends": "disable"
60
69
  },
@@ -81,7 +81,6 @@
81
81
  height: 200px
82
82
  min-width: 200px
83
83
  background-position: 50% 50%
84
- background-size: cover
85
84
  background-repeat: no-repeat
86
85
 
87
86
  &:before
@@ -32,9 +32,13 @@ export const coreProps = {
32
32
  bordered: Boolean,
33
33
 
34
34
  noThumbnails: Boolean,
35
+ thumbnailFit: {
36
+ type: String,
37
+ default: 'cover'
38
+ },
39
+
35
40
  autoUpload: Boolean,
36
41
  hideUploadBtn: Boolean,
37
-
38
42
  disable: Boolean,
39
43
  readonly: Boolean
40
44
  }
@@ -389,7 +393,7 @@ export function getRenderer (getPlugin, expose) {
389
393
  : (file.__status === 'uploaded' ? ' q-uploader__file--uploaded' : '')
390
394
  ),
391
395
  style: props.noThumbnails !== true && file.__img !== void 0
392
- ? { backgroundImage: 'url("' + file.__img.src + '")' }
396
+ ? { backgroundImage: 'url("' + file.__img.src + '")', backgroundSize: props.thumbnailFit }
393
397
  : null
394
398
  }, [
395
399
  h('div', {
@@ -1,8 +1,9 @@
1
- import { h, ref, computed, watch, nextTick, getCurrentInstance, Transition, KeepAlive } from 'vue'
1
+ import { h, ref, computed, watch, getCurrentInstance, Transition, KeepAlive } from 'vue'
2
2
 
3
3
  import TouchSwipe from '../../directives/touch-swipe/TouchSwipe.js'
4
4
 
5
5
  import useRenderCache from '../../composables/use-render-cache/use-render-cache.js'
6
+ import useTimeout from '../../composables/use-timeout/use-timeout.js'
6
7
 
7
8
  import { hSlot } from '../../utils/private.render/render.js'
8
9
  import { getNormalizedVNodes } from '../../utils/private.vm/vm.js'
@@ -49,6 +50,7 @@ export const usePanelEmits = [ 'update:modelValue', 'beforeTransition', 'transit
49
50
  export default function () {
50
51
  const { props, emit, proxy } = getCurrentInstance()
51
52
  const { getCache } = useRenderCache()
53
+ const { registerTimeout } = useTimeout()
52
54
 
53
55
  let panels, forcedPanelTransition
54
56
 
@@ -117,9 +119,9 @@ export default function () {
117
119
  if (panelIndex.value !== index) {
118
120
  panelIndex.value = index
119
121
  emit('beforeTransition', newVal, oldVal)
120
- nextTick(() => {
122
+ registerTimeout(() => {
121
123
  emit('transition', newVal, oldVal)
122
- })
124
+ }, props.transitionDuration)
123
125
  }
124
126
  })
125
127
 
@@ -704,6 +704,7 @@ $menu-background : #fff !default
704
704
  $menu-box-shadow : $shadow-2 !default
705
705
  $menu-box-shadow-dark : $dark-shadow-2 !default
706
706
  $menu-max-width : 95vw !default
707
+ $menu-max-height : 65vh !default
707
708
 
708
709
  $rating-grade-color : $yellow !default
709
710
  $rating-shadow : 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) !default
@@ -715,6 +716,8 @@ $tooltip-border-radius : $generic-border-radius !default
715
716
  $tooltip-fontsize : 10px !default
716
717
  $tooltip-mobile-padding : 8px 16px !default
717
718
  $tooltip-mobile-fontsize : 14px !default
719
+ $tooltip-max-width : 95vw !default
720
+ $tooltip-max-height : 65vh !default
718
721
 
719
722
  $uploader-title-font-size : 14px !default
720
723
  $uploader-title-line-height : 1.285714 !default
@@ -65,11 +65,46 @@ const hasTouch = __QUASAR_SSR_SERVER__
65
65
  : 'ontouchstart' in window || window.navigator.maxTouchPoints > 0
66
66
 
67
67
  function getPlatform (UA) {
68
- const
69
- userAgent = UA.toLowerCase(),
70
- platformMatch = getPlatformMatch(userAgent),
71
- matched = getMatch(userAgent, platformMatch),
72
- browser = {}
68
+ const userAgent = UA.toLowerCase()
69
+ const platformMatch = getPlatformMatch(userAgent)
70
+ const matched = getMatch(userAgent, platformMatch)
71
+ const browser = {
72
+ mobile: false,
73
+ desktop: false,
74
+
75
+ cordova: false,
76
+ capacitor: false,
77
+ nativeMobile: false,
78
+ // nativeMobileWrapper: void 0,
79
+ electron: false,
80
+ bex: false,
81
+
82
+ linux: false,
83
+ mac: false,
84
+ win: false,
85
+ cros: false,
86
+
87
+ chrome: false,
88
+ firefox: false,
89
+ opera: false,
90
+ safari: false,
91
+ vivaldi: false,
92
+ edge: false,
93
+ edgeChromium: false,
94
+ ie: false,
95
+ webkit: false,
96
+
97
+ android: false,
98
+ ios: false,
99
+ ipad: false,
100
+ iphone: false,
101
+ ipod: false,
102
+ kindle: false,
103
+ winphone: false,
104
+ blackberry: false,
105
+ playbook: false,
106
+ silk: false
107
+ }
73
108
 
74
109
  if (matched.browser) {
75
110
  browser[ matched.browser ] = true