quasar 2.3.2 → 2.4.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 (311) hide show
  1. package/dist/api/AppFullscreen.json +15 -8
  2. package/dist/api/BottomSheet.json +6 -0
  3. package/dist/api/Cookies.json +4 -3
  4. package/dist/api/Dialog.json +24 -10
  5. package/dist/api/Loading.json +0 -2
  6. package/dist/api/LoadingBar.json +8 -3
  7. package/dist/api/Morph.json +14 -7
  8. package/dist/api/Mutation.json +1 -1
  9. package/dist/api/Notify.json +41 -27
  10. package/dist/api/QAjaxBar.json +6 -3
  11. package/dist/api/QBreadcrumbs.json +8 -4
  12. package/dist/api/QBreadcrumbsEl.json +35 -12
  13. package/dist/api/QBtn.json +36 -17
  14. package/dist/api/QBtnDropdown.json +41 -20
  15. package/dist/api/QBtnToggle.json +7 -2
  16. package/dist/api/QCard.json +2 -1
  17. package/dist/api/QCardActions.json +2 -1
  18. package/dist/api/QCardSection.json +2 -1
  19. package/dist/api/QCarousel.json +10 -5
  20. package/dist/api/QCarouselControl.json +4 -2
  21. package/dist/api/QChatMessage.json +0 -4
  22. package/dist/api/QCheckbox.json +8 -4
  23. package/dist/api/QChip.json +2 -1
  24. package/dist/api/QCircularProgress.json +14 -7
  25. package/dist/api/QColor.json +6 -3
  26. package/dist/api/QDate.json +33 -5
  27. package/dist/api/QDialog.json +8 -4
  28. package/dist/api/QDrawer.json +10 -5
  29. package/dist/api/QEditor.json +10 -5
  30. package/dist/api/QExpansionItem.json +36 -13
  31. package/dist/api/QFab.json +41 -6
  32. package/dist/api/QFabAction.json +12 -2
  33. package/dist/api/QField.json +3 -1
  34. package/dist/api/QFile.json +8 -2
  35. package/dist/api/QFooter.json +2 -1
  36. package/dist/api/QForm.json +1 -1
  37. package/dist/api/QHeader.json +4 -2
  38. package/dist/api/QIcon.json +2 -1
  39. package/dist/api/QImg.json +8 -4
  40. package/dist/api/QInfiniteScroll.json +6 -3
  41. package/dist/api/QInnerLoading.json +8 -4
  42. package/dist/api/QInput.json +3 -1
  43. package/dist/api/QIntersection.json +4 -2
  44. package/dist/api/QItem.json +33 -11
  45. package/dist/api/QKnob.json +8 -4
  46. package/dist/api/QLayout.json +9 -1
  47. package/dist/api/QLinearProgress.json +4 -2
  48. package/dist/api/QMarkupTable.json +2 -1
  49. package/dist/api/QMenu.json +8 -4
  50. package/dist/api/QNoSsr.json +2 -1
  51. package/dist/api/QOptionGroup.json +76 -5
  52. package/dist/api/QPage.json +2 -1
  53. package/dist/api/QPageScroller.json +8 -4
  54. package/dist/api/QPageSticky.json +2 -1
  55. package/dist/api/QPagination.json +10 -6
  56. package/dist/api/QParallax.json +2 -1
  57. package/dist/api/QPopupEdit.json +5 -2
  58. package/dist/api/QPopupProxy.json +7 -4
  59. package/dist/api/QRange.json +600 -111
  60. package/dist/api/QRating.json +5 -2
  61. package/dist/api/QResizeObserver.json +4 -1
  62. package/dist/api/QRouteTab.json +35 -13
  63. package/dist/api/QScrollArea.json +29 -6
  64. package/dist/api/QScrollObserver.json +13 -1
  65. package/dist/api/QSelect.json +76 -47
  66. package/dist/api/QSeparator.json +2 -1
  67. package/dist/api/QSkeleton.json +8 -4
  68. package/dist/api/QSlideItem.json +9 -0
  69. package/dist/api/QSlideTransition.json +2 -1
  70. package/dist/api/QSlider.json +512 -43
  71. package/dist/api/QSpinner.json +2 -1
  72. package/dist/api/QSplitter.json +4 -2
  73. package/dist/api/QStep.json +2 -1
  74. package/dist/api/QStepper.json +6 -3
  75. package/dist/api/QTab.json +4 -2
  76. package/dist/api/QTabPanels.json +6 -3
  77. package/dist/api/QTable.json +154 -88
  78. package/dist/api/QTabs.json +4 -2
  79. package/dist/api/QTime.json +16 -4
  80. package/dist/api/QTimeline.json +4 -2
  81. package/dist/api/QTimelineEntry.json +4 -2
  82. package/dist/api/QToggle.json +8 -4
  83. package/dist/api/QTooltip.json +18 -9
  84. package/dist/api/QTree.json +34 -19
  85. package/dist/api/QUploader.json +28 -6
  86. package/dist/api/QVirtualScroll.json +26 -11
  87. package/dist/api/ScrollFire.json +1 -1
  88. package/dist/api/TouchHold.json +2 -1
  89. package/dist/api/TouchRepeat.json +2 -1
  90. package/dist/api/TouchSwipe.json +2 -1
  91. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  92. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  93. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  94. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  95. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  96. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  97. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  98. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  99. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  100. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  101. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  102. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  103. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  104. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  105. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  106. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  107. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  108. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  109. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  110. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  111. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  112. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  113. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  114. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  115. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  116. package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
  117. package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
  118. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  119. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  120. package/dist/icon-set/themify.umd.prod.js +1 -1
  121. package/dist/lang/ar.umd.prod.js +1 -1
  122. package/dist/lang/az-Latn.umd.prod.js +1 -1
  123. package/dist/lang/bg.umd.prod.js +1 -1
  124. package/dist/lang/bn.umd.prod.js +1 -1
  125. package/dist/lang/ca.umd.prod.js +1 -1
  126. package/dist/lang/cs.umd.prod.js +1 -1
  127. package/dist/lang/da.umd.prod.js +1 -1
  128. package/dist/lang/de.umd.prod.js +1 -1
  129. package/dist/lang/el.umd.prod.js +1 -1
  130. package/dist/lang/en-GB.umd.prod.js +1 -1
  131. package/dist/lang/en-US.umd.prod.js +1 -1
  132. package/dist/lang/eo.umd.prod.js +1 -1
  133. package/dist/lang/es.umd.prod.js +1 -1
  134. package/dist/lang/et.umd.prod.js +1 -1
  135. package/dist/lang/fa-IR.umd.prod.js +1 -1
  136. package/dist/lang/fa.umd.prod.js +1 -1
  137. package/dist/lang/fi.umd.prod.js +1 -1
  138. package/dist/lang/fr.umd.prod.js +1 -1
  139. package/dist/lang/gn.umd.prod.js +1 -1
  140. package/dist/lang/he.umd.prod.js +1 -1
  141. package/dist/lang/hr.umd.prod.js +1 -1
  142. package/dist/lang/hu.umd.prod.js +1 -1
  143. package/dist/lang/id.umd.prod.js +1 -1
  144. package/dist/lang/is.umd.prod.js +1 -1
  145. package/dist/lang/it.umd.prod.js +1 -1
  146. package/dist/lang/ja.umd.prod.js +1 -1
  147. package/dist/lang/km.umd.prod.js +1 -1
  148. package/dist/lang/ko-KR.umd.prod.js +1 -1
  149. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  150. package/dist/lang/lt.umd.prod.js +1 -1
  151. package/dist/lang/lu.umd.prod.js +1 -1
  152. package/dist/lang/lv.umd.prod.js +1 -1
  153. package/dist/lang/ml.umd.prod.js +1 -1
  154. package/dist/lang/ms.umd.prod.js +1 -1
  155. package/dist/lang/nb-NO.umd.prod.js +1 -1
  156. package/dist/lang/nl.umd.prod.js +1 -1
  157. package/dist/lang/pl.umd.prod.js +1 -1
  158. package/dist/lang/pt-BR.umd.prod.js +1 -1
  159. package/dist/lang/pt.umd.prod.js +1 -1
  160. package/dist/lang/ro.umd.prod.js +1 -1
  161. package/dist/lang/ru.umd.prod.js +1 -1
  162. package/dist/lang/sk.umd.prod.js +1 -1
  163. package/dist/lang/sl.umd.prod.js +1 -1
  164. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  165. package/dist/lang/sr.umd.prod.js +1 -1
  166. package/dist/lang/sv.umd.prod.js +1 -1
  167. package/dist/lang/ta.umd.prod.js +1 -1
  168. package/dist/lang/th.umd.prod.js +1 -1
  169. package/dist/lang/tr.umd.prod.js +1 -1
  170. package/dist/lang/ug.umd.prod.js +1 -1
  171. package/dist/lang/uk.umd.prod.js +1 -1
  172. package/dist/lang/vi.umd.prod.js +1 -1
  173. package/dist/lang/zh-CN.umd.prod.js +1 -1
  174. package/dist/lang/zh-TW.umd.prod.js +1 -1
  175. package/dist/quasar.cjs.prod.js +2 -2
  176. package/dist/quasar.css +268 -184
  177. package/dist/quasar.esm.prod.js +2 -2
  178. package/dist/quasar.prod.css +1 -1
  179. package/dist/quasar.rtl.css +340 -263
  180. package/dist/quasar.rtl.prod.css +1 -1
  181. package/dist/quasar.sass +272 -212
  182. package/dist/quasar.umd.js +16522 -16213
  183. package/dist/quasar.umd.prod.js +2 -2
  184. package/dist/ssr-directives/Morph.js +1 -1
  185. package/dist/transforms/loader-asset-urls.json +20 -0
  186. package/dist/types/api/cookies.d.ts +1 -1
  187. package/dist/types/api/slider.d.ts +46 -0
  188. package/dist/types/api/validation.d.ts +4 -0
  189. package/dist/types/api.d.ts +2 -0
  190. package/dist/types/composables.d.ts +3 -3
  191. package/dist/types/index.d.ts +759 -177
  192. package/dist/vetur/quasar-attributes.json +251 -83
  193. package/dist/vetur/quasar-tags.json +59 -17
  194. package/dist/web-types/web-types.json +587 -155
  195. package/package.json +1 -1
  196. package/src/api.extends.json +0 -1
  197. package/src/components/breadcrumbs/QBreadcrumbs.js +7 -2
  198. package/src/components/breadcrumbs/QBreadcrumbs.sass +0 -3
  199. package/src/components/breadcrumbs/QBreadcrumbsEl.js +14 -8
  200. package/src/components/btn/QBtn.js +6 -5
  201. package/src/components/btn/use-btn.js +21 -21
  202. package/src/components/btn/use-btn.json +22 -13
  203. package/src/components/btn-dropdown/QBtnDropdown.json +1 -0
  204. package/src/components/btn-toggle/QBtnToggle.json +3 -0
  205. package/src/components/checkbox/use-checkbox.js +1 -1
  206. package/src/components/chip/QChip.json +1 -2
  207. package/src/components/color/QColor.js +32 -26
  208. package/src/components/color/QColor.sass +10 -23
  209. package/src/components/date/QDate.json +25 -1
  210. package/src/components/date/QDate.sass +2 -0
  211. package/src/components/drawer/QDrawer.js +18 -15
  212. package/src/components/editor/QEditor.js +1 -1
  213. package/src/components/editor/QEditor.sass +10 -1
  214. package/src/components/expansion-item/QExpansionItem.js +4 -1
  215. package/src/components/expansion-item/QExpansionItem.json +2 -1
  216. package/src/components/fab/QFab.js +18 -12
  217. package/src/components/fab/QFab.json +36 -1
  218. package/src/components/fab/QFab.sass +1 -1
  219. package/src/components/fab/QFabAction.js +14 -7
  220. package/src/components/fab/QFabAction.json +10 -0
  221. package/src/components/field/QField.json +3 -3
  222. package/src/components/file/QFile.js +12 -5
  223. package/src/components/file/QFile.json +9 -6
  224. package/src/components/file/QFile.sass +4 -2
  225. package/src/components/footer/QFooter.js +1 -1
  226. package/src/components/form/QForm.json +2 -3
  227. package/src/components/header/QHeader.js +1 -1
  228. package/src/components/icon/QIcon.js +2 -2
  229. package/src/components/infinite-scroll/QInfiniteScroll.js +4 -5
  230. package/src/components/item/QItem.js +2 -3
  231. package/src/components/layout/QLayout.json +8 -1
  232. package/src/components/linear-progress/QLinearProgress.js +3 -2
  233. package/src/components/linear-progress/QLinearProgress.sass +1 -1
  234. package/src/components/option-group/QOptionGroup.js +3 -0
  235. package/src/components/option-group/QOptionGroup.json +48 -2
  236. package/src/components/pagination/QPagination.json +0 -1
  237. package/src/components/parallax/QParallax.js +4 -2
  238. package/src/components/popup-edit/QPopupEdit.js +2 -5
  239. package/src/components/popup-edit/QPopupEdit.json +1 -0
  240. package/src/components/popup-proxy/QPopupProxy.json +2 -1
  241. package/src/components/radio/QRadio.js +2 -7
  242. package/src/components/range/QRange.js +103 -222
  243. package/src/components/range/QRange.json +11 -121
  244. package/src/components/rating/QRating.json +1 -1
  245. package/src/components/resize-observer/QResizeObserver.json +2 -0
  246. package/src/components/scroll-area/QScrollArea.js +10 -13
  247. package/src/components/scroll-area/QScrollArea.json +29 -9
  248. package/src/components/scroll-observer/QScrollObserver.json +11 -0
  249. package/src/components/select/QSelect.json +41 -15
  250. package/src/components/slide-item/QSlideItem.json +9 -0
  251. package/src/components/slider/QSlider.js +46 -132
  252. package/src/components/slider/QSlider.json +1 -121
  253. package/src/components/slider/QSlider.sass +198 -132
  254. package/src/components/slider/use-slider.js +453 -109
  255. package/src/components/slider/use-slider.json +546 -0
  256. package/src/components/stepper/QStepper.js +3 -3
  257. package/src/components/stepper/QStepper.sass +24 -26
  258. package/src/components/table/QTable.js +27 -47
  259. package/src/components/table/QTable.json +104 -55
  260. package/src/components/table/table-pagination.js +4 -0
  261. package/src/components/tabs/QRouteTab.js +1 -2
  262. package/src/components/tabs/QRouteTab.json +0 -7
  263. package/src/components/tabs/QTabs.js +71 -20
  264. package/src/components/tabs/use-tab.js +26 -13
  265. package/src/components/time/QTime.json +8 -0
  266. package/src/components/tree/QTree.js +14 -12
  267. package/src/components/tree/QTree.json +26 -21
  268. package/src/components/tree/QTree.sass +45 -41
  269. package/src/components/uploader/QUploader.json +14 -2
  270. package/src/components/uploader/uploader-core.js +16 -9
  271. package/src/components/uploader/xhr-uploader-plugin.json +8 -3
  272. package/src/components/virtual-scroll/QVirtualScroll.json +15 -0
  273. package/src/components/virtual-scroll/QVirtualScroll.sass +1 -0
  274. package/src/components/virtual-scroll/use-virtual-scroll.js +30 -17
  275. package/src/components/virtual-scroll/use-virtual-scroll.json +7 -5
  276. package/src/composables/private/use-field.js +5 -5
  277. package/src/composables/private/use-file.js +20 -5
  278. package/src/composables/private/use-form.js +2 -3
  279. package/src/composables/private/use-fullscreen.js +15 -4
  280. package/src/composables/private/use-router-link.js +44 -23
  281. package/src/composables/private/use-router-link.json +26 -10
  282. package/src/composables/private/use-split-attrs.js +7 -10
  283. package/src/composables/private/use-validate.js +21 -15
  284. package/src/composables/private/use-validate.json +1 -0
  285. package/src/css/core/helpers.sass +3 -0
  286. package/src/css/core/positioning.sass +5 -0
  287. package/src/directives/Mutation.json +2 -3
  288. package/src/directives/ScrollFire.js +1 -0
  289. package/src/directives/ScrollFire.json +2 -3
  290. package/src/icon-set.js +2 -4
  291. package/src/plugins/AppFullscreen.js +70 -53
  292. package/src/plugins/AppFullscreen.json +8 -8
  293. package/src/plugins/AppVisibility.js +2 -3
  294. package/src/plugins/BottomSheet.js +3 -5
  295. package/src/plugins/Cookies.json +2 -2
  296. package/src/plugins/Dialog.js +3 -5
  297. package/src/plugins/Dialog.json +6 -5
  298. package/src/plugins/LoadingBar.js +17 -18
  299. package/src/plugins/LoadingBar.json +4 -3
  300. package/src/plugins/Notify.js +296 -295
  301. package/src/plugins/Notify.json +13 -19
  302. package/src/plugins/Platform.js +14 -14
  303. package/src/utils/date.js +4 -4
  304. package/src/utils/dom.js +2 -2
  305. package/src/utils/open-url.js +2 -2
  306. package/src/utils/patterns.js +1 -0
  307. package/src/utils/private/define-reactive-plugin.js +10 -8
  308. package/src/utils/private/global-dialog.js +6 -8
  309. package/src/utils/private/global-dialog.json +6 -0
  310. package/src/utils/private/inject-obj-prop.js +13 -0
  311. package/src/utils/private/is.js +2 -2
@@ -330,6 +330,13 @@ export default createComponent({
330
330
  ] ]
331
331
  })
332
332
 
333
+ function updateBelowBreakpoint () {
334
+ updateLocal(belowBreakpoint, (
335
+ props.behavior === 'mobile'
336
+ || (props.behavior !== 'desktop' && $layout.totalWidth.value <= props.breakpoint)
337
+ ))
338
+ }
339
+
333
340
  watch(belowBreakpoint, val => {
334
341
  if (val === true) { // from lg to xs
335
342
  lastDesktopState = showing.value
@@ -351,13 +358,6 @@ export default createComponent({
351
358
  }
352
359
  })
353
360
 
354
- watch($layout.totalWidth, val => {
355
- updateLocal(belowBreakpoint, (
356
- props.behavior === 'mobile'
357
- || (props.behavior !== 'desktop' && val <= props.breakpoint)
358
- ))
359
- })
360
-
361
361
  watch(() => props.side, (newSide, oldSide) => {
362
362
  if ($layout.instances[ oldSide ] === instance) {
363
363
  $layout.instances[ oldSide ] = void 0
@@ -371,10 +371,20 @@ export default createComponent({
371
371
  $layout[ newSide ].offset = offset.value
372
372
  })
373
373
 
374
- watch(() => props.behavior + props.breakpoint, updateBelowBreakpoint)
374
+ watch($layout.totalWidth, () => {
375
+ if ($layout.isContainer.value === true || document.qScrollPrevented !== true) {
376
+ updateBelowBreakpoint()
377
+ }
378
+ })
379
+
380
+ watch(
381
+ () => props.behavior + props.breakpoint,
382
+ updateBelowBreakpoint
383
+ )
375
384
 
376
385
  watch($layout.isContainer, val => {
377
386
  showing.value === true && preventBodyScroll(val !== true)
387
+ val === true && updateBelowBreakpoint()
378
388
  })
379
389
 
380
390
  watch($layout.scrollbarWidth, () => {
@@ -430,13 +440,6 @@ export default createComponent({
430
440
  }
431
441
  }
432
442
 
433
- function updateBelowBreakpoint () {
434
- updateLocal(belowBreakpoint, (
435
- props.behavior === 'mobile'
436
- || (props.behavior !== 'desktop' && $layout.totalWidth.value <= props.breakpoint)
437
- ))
438
- }
439
-
440
443
  function applyBackdrop (x) {
441
444
  flagBackdropBg.value = x
442
445
  }
@@ -502,7 +502,7 @@ export default createComponent({
502
502
  return h('div', {
503
503
  ref: rootRef,
504
504
  class: classes.value,
505
- style: { height: inFullscreen.value === true ? '100vh' : null },
505
+ style: { height: inFullscreen.value === true ? '100%' : null },
506
506
  ...attributes.value,
507
507
  onFocusin,
508
508
  onFocusout
@@ -6,7 +6,9 @@
6
6
  &.disabled
7
7
  border-style: dashed
8
8
 
9
- > div:first-child, &__toolbars-container, &__toolbars-container > div:first-child
9
+ > div:first-child,
10
+ &__toolbars-container,
11
+ &__toolbars-container > div:first-child
10
12
  border-top-left-radius: inherit
11
13
  border-top-right-radius: inherit
12
14
 
@@ -17,14 +19,18 @@
17
19
  border-bottom-left-radius: inherit
18
20
  border-bottom-right-radius: inherit
19
21
  overflow: auto
22
+ max-width: 100%
23
+
20
24
  pre
21
25
  white-space: pre-wrap
26
+
22
27
  hr
23
28
  border: 0
24
29
  outline: 0
25
30
  margin: 1px
26
31
  height: 1px
27
32
  background: $editor-hr-color
33
+
28
34
  &:empty:not(:focus):before
29
35
  content: attr(placeholder)
30
36
  opacity: .7
@@ -33,6 +39,9 @@
33
39
  border-bottom: 1px solid $editor-border-color
34
40
  min-height: 32px
35
41
 
42
+ &__toolbars-container
43
+ max-width: 100%
44
+
36
45
  .q-btn
37
46
  margin: $editor-button-gutter
38
47
 
@@ -96,7 +96,10 @@ export default createComponent({
96
96
  })
97
97
 
98
98
  const hasLink = computed(() =>
99
- props.disable !== true && props.to !== void 0 && props.to !== null && props.to !== ''
99
+ props.disable !== true && (
100
+ props.href !== void 0
101
+ || (props.to !== void 0 && props.to !== null && props.to !== '')
102
+ )
100
103
  )
101
104
 
102
105
  const linkProps = computed(() => {
@@ -7,8 +7,9 @@
7
7
 
8
8
  "props": {
9
9
  "model-value": {
10
+ "extends": "model-value",
10
11
  "desc": "Model of the component defining 'open' state; Either use this property (along with a listener for 'update:modelValue' event) OR use v-model directive",
11
- "category": "model"
12
+ "required": false
12
13
  },
13
14
 
14
15
  "icon": {
@@ -59,6 +59,8 @@ export default createComponent({
59
59
  hideOnRouteChange
60
60
  })
61
61
 
62
+ const slotScope = computed(() => ({ opened: showing.value }))
63
+
62
64
  const classes = computed(() =>
63
65
  'q-fab z-fab row inline justify-center'
64
66
  + ` q-fab--align-${ props.verticalActionsAlign } ${ formClass.value }`
@@ -76,26 +78,30 @@ export default createComponent({
76
78
  + ` q-fab__icon-holder--${ showing.value === true ? 'opened' : 'closed' }`
77
79
  )
78
80
 
81
+ function getIcon (kebab, camel) {
82
+ const slotFn = slots[ kebab ]
83
+ const classes = `q-fab__${ kebab } absolute-full`
84
+
85
+ return slotFn === void 0
86
+ ? h(QIcon, { class: classes, name: props[ kebab ] || $q.iconSet.fab[ camel ] })
87
+ : h('div', { class: classes }, slotFn(slotScope.value))
88
+ }
89
+
79
90
  function getTriggerContent () {
80
91
  const child = []
81
92
 
82
93
  props.hideIcon !== true && child.push(
83
94
  h('div', { class: iconHolderClass.value }, [
84
- h(QIcon, {
85
- class: 'q-fab__icon absolute-full',
86
- name: props.icon || $q.iconSet.fab.icon
87
- }),
88
-
89
- h(QIcon, {
90
- class: 'q-fab__active-icon absolute-full',
91
- name: props.activeIcon || $q.iconSet.fab.activeIcon
92
- })
95
+ getIcon('icon', 'icon'),
96
+ getIcon('active-icon', 'activeIcon')
93
97
  ])
94
98
  )
95
99
 
96
- props.label !== '' && child[ labelProps.value.action ](
97
- h('div', labelProps.value.data, [ props.label ])
98
- )
100
+ if (props.label !== '' || slots.label !== void 0) {
101
+ child[ labelProps.value.action ](
102
+ h('div', labelProps.value.data, slots.label !== void 0 ? slots.label(slotScope.value) : [ props.label ])
103
+ )
104
+ }
99
105
 
100
106
  return hMergeSlot(slots.tooltip, child)
101
107
  }
@@ -3,8 +3,10 @@
3
3
 
4
4
  "props": {
5
5
  "model-value": {
6
+ "extends": "model-value",
6
7
  "desc": "Controls state of fab actions (showing/hidden); Works best with v-model directive, otherwise use along listening to 'update:modelValue' event",
7
- "category": "model"
8
+ "category": "model",
9
+ "required": false
8
10
  },
9
11
 
10
12
  "icon": {
@@ -52,6 +54,39 @@
52
54
 
53
55
  "tooltip": {
54
56
  "desc": "Slot specifically designed for a QTooltip"
57
+ },
58
+
59
+ "icon": {
60
+ "desc": "Slot for icon shown when FAB is closed; Suggestion: QIcon",
61
+ "scope": {
62
+ "opened": {
63
+ "type": "Boolean",
64
+ "desc": "FAB is opened"
65
+ }
66
+ },
67
+ "addedIn": "v2.4"
68
+ },
69
+
70
+ "active-icon": {
71
+ "desc": "Slot for icon shown when FAB is opened; Suggestion: QIcon",
72
+ "scope": {
73
+ "opened": {
74
+ "type": "Boolean",
75
+ "desc": "FAB is opened"
76
+ }
77
+ },
78
+ "addedIn": "v2.4"
79
+ },
80
+
81
+ "label": {
82
+ "desc": "Slot for label",
83
+ "scope": {
84
+ "opened": {
85
+ "type": "Boolean",
86
+ "desc": "FAB is opened"
87
+ }
88
+ },
89
+ "addedIn": "v2.4"
55
90
  }
56
91
  },
57
92
 
@@ -134,7 +134,7 @@
134
134
  &--up, &--down
135
135
  left: 50%
136
136
  margin-left: -28px
137
-
137
+
138
138
  &--opened
139
139
  opacity: 1
140
140
  transform: scale(1) translate(0, 0)
@@ -66,13 +66,20 @@ export default createComponent({
66
66
  function getContent () {
67
67
  const child = []
68
68
 
69
- props.icon !== '' && child.push(
70
- h(QIcon, { name: props.icon })
71
- )
72
-
73
- props.label !== '' && child[ labelProps.value.action ](
74
- h('div', labelProps.value.data, [ props.label ])
75
- )
69
+ if (slots.icon !== void 0) {
70
+ child.push(slots.icon())
71
+ }
72
+ else if (props.icon !== '') {
73
+ child.push(
74
+ h(QIcon, { name: props.icon })
75
+ )
76
+ }
77
+
78
+ if (props.label !== '' || slots.label !== void 0) {
79
+ child[ labelProps.value.action ](
80
+ h('div', labelProps.value.data, slots.label !== void 0 ? slots.label() : [ props.label ])
81
+ )
82
+ }
76
83
 
77
84
  return hMergeSlot(slots.default, child)
78
85
  }
@@ -35,6 +35,16 @@
35
35
  "slots": {
36
36
  "default": {
37
37
  "desc": "Suggestion for this slot: QTooltip"
38
+ },
39
+
40
+ "icon": {
41
+ "desc": "Slot for icon; Suggestion: QIcon",
42
+ "addedIn": "v2.4"
43
+ },
44
+
45
+ "label": {
46
+ "desc": "Slot for label",
47
+ "addedIn": "v2.4"
38
48
  }
39
49
  },
40
50
 
@@ -30,9 +30,8 @@
30
30
  "examples": [ "qf_363270c0-7a83-62b1-8dcf-6dfd64ee38fa" ]
31
31
  },
32
32
  "field": {
33
- "type": "Object",
34
- "desc": "DOM element of the field",
35
- "__exemption": [ "examples" ]
33
+ "type": "Element",
34
+ "desc": "DOM element of the field"
36
35
  },
37
36
  "editable": {
38
37
  "type": "Boolean",
@@ -57,6 +56,7 @@
57
56
  "params": {
58
57
  "value": {
59
58
  "type": "Any",
59
+ "required": true,
60
60
  "desc": "Value to be emitted",
61
61
  "examples": [ 0, "Changed text" ]
62
62
  }
@@ -9,6 +9,7 @@ import useFileFormDomProps from '../../composables/private/use-file-dom-props.js
9
9
 
10
10
  import { createComponent } from '../../utils/private/create.js'
11
11
  import { humanStorageSize } from '../../utils/format.js'
12
+ import { prevent } from '../../utils/event.js'
12
13
 
13
14
  export default createComponent({
14
15
  name: 'QFile',
@@ -122,9 +123,16 @@ export default createComponent({
122
123
  emit('update:modelValue', props.multiple === true ? files : files[ 0 ])
123
124
  }
124
125
 
126
+ function onKeydown (e) {
127
+ // prevent form submit if ENTER is pressed
128
+ e.keyCode === 13 && prevent(e)
129
+ }
130
+
125
131
  function onKeyup (e) {
126
- // only on ENTER
127
- e.keyCode === 13 && pickFiles(e)
132
+ // only on ENTER and SPACE to match native input field
133
+ if (e.keyCode === 13 || e.keyCode === 32) {
134
+ pickFiles(e)
135
+ }
128
136
  }
129
137
 
130
138
  function getFileInput () {
@@ -158,8 +166,7 @@ export default createComponent({
158
166
  return [
159
167
  h('input', {
160
168
  class: [ props.inputClass, 'q-file__filler' ],
161
- style: props.inputStyle,
162
- tabindex: -1
169
+ style: props.inputStyle
163
170
  })
164
171
  ]
165
172
  }
@@ -256,7 +263,7 @@ export default createComponent({
256
263
  }
257
264
 
258
265
  if (state.editable.value === true) {
259
- Object.assign(data, { onDragover, onKeyup })
266
+ Object.assign(data, { onDragover, onKeydown, onKeyup })
260
267
  }
261
268
 
262
269
  return h('div', data, [ getInput() ].concat(getSelection()))
@@ -42,16 +42,19 @@
42
42
  "definition": {
43
43
  "totalSize": {
44
44
  "type": "String",
45
+ "required": true,
45
46
  "desc": "The total size of files in human readable format",
46
47
  "examples": [ "1.42MB" ]
47
48
  },
48
49
  "filesNumber": {
49
50
  "type": "Number",
51
+ "required": true,
50
52
  "desc": "Number of picked files",
51
53
  "examples": [ 5 ]
52
54
  },
53
55
  "maxFiles": {
54
56
  "type": [ "Number", "String" ],
57
+ "required": true,
55
58
  "desc": "Maximum number of files (same as 'max-files' prop, if specified); When 'max-files' is not specified, this has 'void 0' as value",
56
59
  "examples": [ 5 ]
57
60
  }
@@ -111,9 +114,9 @@
111
114
  },
112
115
 
113
116
  "ref": {
114
- "type": "Object",
115
- "desc": "Reference to the QFile component",
116
- "__exemption": [ "examples" ]
117
+ "type": "Component",
118
+ "tsType": "QFile",
119
+ "desc": "Reference to the QFile component"
117
120
  }
118
121
  }
119
122
  },
@@ -128,9 +131,9 @@
128
131
  },
129
132
 
130
133
  "ref": {
131
- "type": "Object",
132
- "desc": "Reference to the QFile component",
133
- "__exemption": [ "examples" ]
134
+ "type": "Component",
135
+ "tsType": "QFile",
136
+ "desc": "Reference to the QFile component"
134
137
  }
135
138
  }
136
139
  }
@@ -11,8 +11,10 @@
11
11
  cursor: pointer
12
12
 
13
13
  &__filler
14
- opacity: 0
15
- pointer-events: none
14
+ visibility: hidden
15
+ width: 100%
16
+ border: none
17
+ padding: 0
16
18
 
17
19
  &__dnd
18
20
  outline: 1px dashed currentColor
@@ -46,7 +46,7 @@ export default createComponent({
46
46
  const fixed = computed(() =>
47
47
  props.reveal === true
48
48
  || $layout.view.value.indexOf('F') > -1
49
- || $layout.isContainer.value === true
49
+ || ($q.platform.is.ios && $layout.isContainer.value === true)
50
50
  )
51
51
 
52
52
  const containerHeight = computed(() => (
@@ -52,9 +52,8 @@
52
52
  "desc": "Emitted after a validation was triggered and at least one of the inner Quasar components models are NOT valid",
53
53
  "params": {
54
54
  "ref": {
55
- "type": "Object",
56
- "desc": "Vue reference to the first component that triggered the validation error",
57
- "__exemption": [ "examples" ]
55
+ "type": "Component",
56
+ "desc": "Vue reference to the first component that triggered the validation error"
58
57
  }
59
58
  }
60
59
  }
@@ -43,7 +43,7 @@ export default createComponent({
43
43
  const fixed = computed(() =>
44
44
  props.reveal === true
45
45
  || $layout.view.value.indexOf('H') > -1
46
- || $layout.isContainer.value === true
46
+ || ($q.platform.is.ios && $layout.isContainer.value === true)
47
47
  )
48
48
 
49
49
  const offset = computed(() => {
@@ -29,11 +29,11 @@ const matMap = {
29
29
 
30
30
  const libRE = new RegExp('^(' + Object.keys(libMap).join('|') + ')')
31
31
  const matRE = new RegExp('^(' + Object.keys(matMap).join('|') + ')')
32
- const mRE = /^M/
32
+ const mRE = /^[Mm]\s?[-+]?\.?\d/
33
33
  const imgRE = /^img:/
34
34
  const svgUseRE = /^svguse:/
35
35
  const ionRE = /^ion-/
36
- const faLaRE = /^[l|f]a[s|r|l|b|d|k]? /
36
+ const faLaRE = /^[lf]a[srlbdk]? /
37
37
 
38
38
  export default createComponent({
39
39
  name: 'QIcon',
@@ -60,14 +60,12 @@ export default createComponent({
60
60
  containerHeight = height(localScrollTarget)
61
61
 
62
62
  if (props.reverse === false) {
63
- if (scrollPosition + containerHeight + props.offset >= scrollHeight) {
63
+ if (Math.round(scrollPosition + containerHeight + props.offset) >= Math.round(scrollHeight)) {
64
64
  trigger()
65
65
  }
66
66
  }
67
- else {
68
- if (scrollPosition < props.offset) {
69
- trigger()
70
- }
67
+ else if (Math.round(scrollPosition) <= props.offset) {
68
+ trigger()
71
69
  }
72
70
  }
73
71
 
@@ -123,6 +121,7 @@ export default createComponent({
123
121
  isWorking.value = false
124
122
  isFetching.value = false
125
123
  localScrollTarget.removeEventListener('scroll', poll, passive)
124
+ poll !== void 0 && poll.cancel()
126
125
  }
127
126
  }
128
127
 
@@ -38,7 +38,7 @@ export default createComponent({
38
38
  const { proxy: { $q } } = getCurrentInstance()
39
39
 
40
40
  const isDark = useDark(props, $q)
41
- const { hasLink, linkProps, linkClass, linkTag, navigateToLink } = useRouterLink()
41
+ const { hasRouterLink, hasLink, linkProps, linkClass, linkTag, navigateToRouterLink } = useRouterLink()
42
42
 
43
43
  const rootRef = ref(null)
44
44
  const blurTargetRef = ref(null)
@@ -46,7 +46,6 @@ export default createComponent({
46
46
  const isActionable = computed(() =>
47
47
  props.clickable === true
48
48
  || hasLink.value === true
49
- || props.tag === 'a'
50
49
  || props.tag === 'label'
51
50
  )
52
51
 
@@ -99,7 +98,7 @@ export default createComponent({
99
98
  }
100
99
  }
101
100
 
102
- hasLink.value === true && navigateToLink(e)
101
+ hasRouterLink.value === true && navigateToRouterLink(e)
103
102
  emit('click', e)
104
103
  }
105
104
  }
@@ -37,11 +37,13 @@
37
37
  "definition": {
38
38
  "height": {
39
39
  "type": "Number",
40
+ "required": true,
40
41
  "desc": "Layout height",
41
42
  "examples": [ 575 ]
42
43
  },
43
44
  "width": {
44
45
  "type": "Number",
46
+ "required": true,
45
47
  "desc": "Layout height",
46
48
  "examples": [ 575 ]
47
49
  }
@@ -59,27 +61,32 @@
59
61
  "definition": {
60
62
  "position": {
61
63
  "type": "Number",
64
+ "required": true,
62
65
  "desc": "Scroll offset from top (vertical)",
63
66
  "examples": [ 120 ]
64
67
  },
65
68
 
66
69
  "direction": {
67
70
  "type": "String",
71
+ "required": true,
68
72
  "desc": "Direction of scroll",
69
73
  "values": [ "up", "down" ]
70
74
  },
71
75
  "directionChanged": {
72
76
  "type": "Boolean",
77
+ "required": true,
73
78
  "desc": "Has scroll direction changed since event was last emitted?"
74
79
  },
75
80
  "delta": {
76
81
  "type": "Number",
82
+ "required": true,
77
83
  "desc": "Vertical delta distance since event was last emitted",
78
84
  "examples": [ 120 ]
79
85
  },
80
86
 
81
87
  "inflectionPoint": {
82
88
  "type": "Number",
89
+ "required": true,
83
90
  "desc": "Scroll offset from top (vertical)",
84
91
  "examples": [ 120 ]
85
92
  }
@@ -94,7 +101,7 @@
94
101
  "height": {
95
102
  "type": "Number",
96
103
  "desc": "New scroll height of layout",
97
- "examples": [1442]
104
+ "examples": [ 1442 ]
98
105
  }
99
106
  }
100
107
  }
@@ -58,6 +58,7 @@ export default createComponent({
58
58
  const sizeStyle = useSize(props, defaultSizes)
59
59
 
60
60
  const motion = computed(() => props.indeterminate === true || props.query === true)
61
+ const widthReverse = computed(() => props.reverse !== props.query)
61
62
  const style = computed(() => ({
62
63
  ...(sizeStyle.value !== null ? sizeStyle.value : {}),
63
64
  '--q-linear-progress-speed': `${ props.animationSpeed }ms`
@@ -70,7 +71,7 @@ export default createComponent({
70
71
  + (props.rounded === true ? ' rounded-borders' : '')
71
72
  )
72
73
 
73
- const trackStyle = computed(() => width(props.buffer !== void 0 ? props.buffer : 1, props.reverse, proxy.$q))
74
+ const trackStyle = computed(() => width(props.buffer !== void 0 ? props.buffer : 1, widthReverse.value, proxy.$q))
74
75
  const trackClass = computed(() =>
75
76
  'q-linear-progress__track absolute-full'
76
77
  + ` q-linear-progress__track--with${ props.instantFeedback === true ? 'out' : '' }-transition`
@@ -78,7 +79,7 @@ export default createComponent({
78
79
  + (props.trackColor !== void 0 ? ` bg-${ props.trackColor }` : '')
79
80
  )
80
81
 
81
- const modelStyle = computed(() => width(motion.value === true ? 1 : props.value, props.reverse, proxy.$q))
82
+ const modelStyle = computed(() => width(motion.value === true ? 1 : props.value, widthReverse.value, proxy.$q))
82
83
  const modelClass = computed(() =>
83
84
  'q-linear-progress__model absolute-full'
84
85
  + ` q-linear-progress__model--with${ props.instantFeedback === true ? 'out' : '' }-transition`
@@ -51,7 +51,7 @@
51
51
  background: rgba(255,255,255,.6)
52
52
 
53
53
  &__stripe
54
- transition: width .3s
54
+ transition: width var(--q-linear-progress-speed)
55
55
  background-image: linear-gradient(45deg, rgba(255,255,255,.15) 25%, rgba(255,255,255,0) 25%, rgba(255,255,255,0) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, rgba(255,255,255,0) 75%, rgba(255,255,255,0)) !important
56
56
  background-size: 40px 40px !important
57
57
 
@@ -95,6 +95,9 @@ export default createComponent({
95
95
  class: classes.value,
96
96
  ...attrs.value
97
97
  }, props.options.map((opt, i) => {
98
+ // TODO: (Qv3) Make the 'opt' a separate property instead of
99
+ // the whole scope for consistency and flexibility
100
+ // (e.g. { opt } instead of opt)
98
101
  const child = slots[ 'label-' + i ] !== void 0
99
102
  ? () => slots[ 'label-' + i ](opt)
100
103
  : (