quasar 2.16.11 → 2.17.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 (184) 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 +758 -2145
  115. package/dist/quasar.css +6 -5
  116. package/dist/quasar.prod.css +1 -1
  117. package/dist/quasar.rtl.css +6 -5
  118. package/dist/quasar.rtl.prod.css +1 -1
  119. package/dist/quasar.sass +67 -63
  120. package/dist/quasar.server.prod.cjs +49 -49
  121. package/dist/quasar.server.prod.js +47 -47
  122. package/dist/quasar.umd.js +348 -1738
  123. package/dist/quasar.umd.prod.js +48 -48
  124. package/dist/types/api/slider.d.ts +2 -1
  125. package/dist/types/extras/icon-set.d.ts +11 -6
  126. package/dist/types/index.d.ts +272 -203
  127. package/dist/types/plugin.d.ts +7 -7
  128. package/dist/vetur/quasar-attributes.json +1 -1
  129. package/dist/vetur/quasar-tags.json +1 -1
  130. package/dist/web-types/web-types.json +1 -1
  131. package/package.json +9 -9
  132. package/src/components/menu/QMenu.sass +2 -2
  133. package/src/components/option-group/QOptionGroup.js +38 -15
  134. package/src/components/option-group/QOptionGroup.json +88 -1
  135. package/src/components/scroll-area/QScrollArea.js +115 -107
  136. package/src/components/scroll-area/QScrollArea.json +40 -0
  137. package/src/components/scroll-area/ScrollAreaControls.js +54 -0
  138. package/src/components/select/QSelect.js +16 -18
  139. package/src/components/select/QSelect.json +7 -0
  140. package/src/components/spinner/QSpinnerAudio.js +4 -70
  141. package/src/components/spinner/QSpinnerBall.js +4 -86
  142. package/src/components/spinner/QSpinnerBars.js +4 -125
  143. package/src/components/spinner/QSpinnerBox.js +4 -43
  144. package/src/components/spinner/QSpinnerClock.js +4 -54
  145. package/src/components/spinner/QSpinnerComment.js +4 -66
  146. package/src/components/spinner/QSpinnerCube.js +4 -114
  147. package/src/components/spinner/QSpinnerDots.js +4 -86
  148. package/src/components/spinner/QSpinnerFacebook.js +4 -85
  149. package/src/components/spinner/QSpinnerGears.js +4 -41
  150. package/src/components/spinner/QSpinnerGrid.js +4 -134
  151. package/src/components/spinner/QSpinnerHearts.js +4 -36
  152. package/src/components/spinner/QSpinnerHourglass.js +4 -94
  153. package/src/components/spinner/QSpinnerInfinity.js +4 -25
  154. package/src/components/spinner/QSpinnerIos.js +4 -156
  155. package/src/components/spinner/QSpinnerOrbit.js +4 -33
  156. package/src/components/spinner/QSpinnerOval.js +4 -32
  157. package/src/components/spinner/QSpinnerPie.js +4 -63
  158. package/src/components/spinner/QSpinnerPuff.js +4 -65
  159. package/src/components/spinner/QSpinnerRadio.js +4 -58
  160. package/src/components/spinner/QSpinnerRings.js +4 -88
  161. package/src/components/spinner/QSpinnerTail.js +4 -66
  162. package/src/components/tabs/QRouteTab.js +4 -3
  163. package/src/components/tabs/QTabs.js +28 -15
  164. package/src/components/time/QTime.sass +5 -5
  165. package/src/components/tooltip/QTooltip.sass +2 -0
  166. package/src/components/uploader/QUploader.json +9 -0
  167. package/src/components/uploader/QUploader.sass +0 -1
  168. package/src/components/uploader/uploader-core.js +6 -2
  169. package/src/composables/private.use-key-composition/use-key-composition.js +19 -2
  170. package/src/composables/private.use-panel/use-panel.js +5 -3
  171. package/src/css/core/elevation.sass +6 -4
  172. package/src/css/core/flex.sass +5 -6
  173. package/src/css/core/size.sass +20 -18
  174. package/src/css/core/typography.sass +11 -9
  175. package/src/css/core/visibility.sass +2 -2
  176. package/src/css/flex-addon.sass +22 -20
  177. package/src/css/helpers/math.sass +1 -1
  178. package/src/css/helpers/string.sass +7 -4
  179. package/src/css/variables.sass +14 -9
  180. package/src/plugins/platform/Platform.js +40 -5
  181. package/src/plugins/platform/Platform.json +52 -69
  182. package/src/plugins/platform/Platform.test.js +22 -14
  183. package/src/utils/private.config/nodes.js +1 -3
  184. 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
 
@@ -1,4 +1,4 @@
1
- @import '../../css/helpers/math.sass'
1
+ @use 'sass:math'
2
2
 
3
3
  .q-time
4
4
  box-shadow: $shadow-2
@@ -129,8 +129,8 @@
129
129
  $left: (1 + cos($angle))
130
130
 
131
131
  &__clock-pos-#{$pos}
132
- top: toFixed(percentage($top * 0.5), 100)
133
- left: toFixed(percentage($left * 0.5), 100) #{"/* rtl:ignore */"}
132
+ top: toFixed(math.percentage($top * 0.5), 100)
133
+ left: toFixed(math.percentage($left * 0.5), 100) #{"/* rtl:ignore */"}
134
134
 
135
135
  @for $pos from 12 through 23
136
136
  $angle: (270 + 30 * $pos)
@@ -138,8 +138,8 @@
138
138
  $left: (1 + cos($angle))
139
139
 
140
140
  &__clock-pos-#{$pos}
141
- top: toFixed(percentage(.15 + $top * .35), 100)
142
- left: toFixed(percentage(.15 + $left * .35), 100) #{"/* rtl:ignore */"}
141
+ top: toFixed(math.percentage(.15 + $top * .35), 100)
142
+ left: toFixed(math.percentage(.15 + $left * .35), 100) #{"/* rtl:ignore */"}
143
143
 
144
144
  &__now-button
145
145
  background-color: var(--q-primary)
@@ -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,3 +1,10 @@
1
+ import { client } from '../../plugins/platform/Platform.js'
2
+
3
+ const isJapanese = /[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]/
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
5
+ const isKorean = /[\u3131-\u314e\u314f-\u3163\uac00-\ud7a3]/
6
+ const isPlainText = /[a-z0-9_ -]$/i
7
+
1
8
  export default function (onInput) {
2
9
  return function onComposition (e) {
3
10
  if (e.type === 'compositionend' || e.type === 'change') {
@@ -5,8 +12,18 @@ export default function (onInput) {
5
12
  e.target.qComposing = false
6
13
  onInput(e)
7
14
  }
8
- else if (e.type === 'compositionstart') {
9
- e.target.qComposing = true
15
+ else if (
16
+ e.type === 'compositionupdate'
17
+ && e.target.qComposing !== true
18
+ && typeof e.data === 'string'
19
+ ) {
20
+ const isComposing = client.is.firefox === true
21
+ ? isPlainText.test(e.data) === false
22
+ : isJapanese.test(e.data) === true || isChinese.test(e.data) === true || isKorean.test(e.data) === true
23
+
24
+ if (isComposing === true) {
25
+ e.target.qComposing = true
26
+ }
10
27
  }
11
28
  }
12
29
  }
@@ -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
 
@@ -1,11 +1,13 @@
1
+ @use 'sass:list'
2
+
1
3
  .shadow-transition
2
4
  transition: $shadow-transition !important
3
5
 
4
6
  @for $z from 1 through 24
5
7
  .shadow-#{$z}
6
- box-shadow: nth($shadows, $z)
8
+ box-shadow: list.nth($shadows, $z)
7
9
  .shadow-up-#{$z}
8
- box-shadow: nth($shadows-up, $z)
10
+ box-shadow: list.nth($shadows-up, $z)
9
11
 
10
12
  .inset-shadow
11
13
  box-shadow: $inset-shadow
@@ -15,9 +17,9 @@
15
17
  body.body--dark
16
18
  @for $z from 1 through 24
17
19
  .shadow-#{$z}
18
- box-shadow: nth($dark-shadows, $z)
20
+ box-shadow: list.nth($dark-shadows, $z)
19
21
  .shadow-up-#{$z}
20
- box-shadow: nth($dark-shadows-up, $z)
22
+ box-shadow: list.nth($dark-shadows-up, $z)
21
23
 
22
24
  .inset-shadow
23
25
  box-shadow: $inset-dark-shadow