quasar 1.16.3 → 1.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 (296) hide show
  1. package/dist/api/BottomSheet.json +2 -2
  2. package/dist/api/Loading.json +0 -2
  3. package/dist/api/Notify.json +15 -15
  4. package/dist/api/QAvatar.json +1 -1
  5. package/dist/api/QBreadcrumbsEl.json +32 -11
  6. package/dist/api/QBtn.json +35 -14
  7. package/dist/api/QBtnDropdown.json +36 -15
  8. package/dist/api/QBtnToggle.json +1 -1
  9. package/dist/api/QCarousel.json +7 -7
  10. package/dist/api/QCarouselSlide.json +2 -2
  11. package/dist/api/QChatMessage.json +1 -5
  12. package/dist/api/QChip.json +4 -4
  13. package/dist/api/QColor.json +6 -0
  14. package/dist/api/QDialog.json +7 -1
  15. package/dist/api/QExpansionItem.json +34 -13
  16. package/dist/api/QFab.json +34 -2
  17. package/dist/api/QFabAction.json +9 -1
  18. package/dist/api/QField.json +80 -6
  19. package/dist/api/QFile.json +80 -6
  20. package/dist/api/QImg.json +2 -2
  21. package/dist/api/QInnerLoading.json +32 -0
  22. package/dist/api/QInput.json +82 -6
  23. package/dist/api/QItem.json +31 -10
  24. package/dist/api/QOptionGroup.json +58 -1
  25. package/dist/api/QPagination.json +4 -4
  26. package/dist/api/QParallax.json +1 -1
  27. package/dist/api/QPopupEdit.json +14 -7
  28. package/dist/api/QPullToRefresh.json +1 -1
  29. package/dist/api/QRange.json +581 -96
  30. package/dist/api/QRating.json +3 -3
  31. package/dist/api/QRouteTab.json +32 -12
  32. package/dist/api/QScrollArea.json +188 -20
  33. package/dist/api/QSelect.json +81 -9
  34. package/dist/api/QSeparator.json +1 -1
  35. package/dist/api/QSlider.json +499 -34
  36. package/dist/api/QStep.json +4 -4
  37. package/dist/api/QStepper.json +4 -4
  38. package/dist/api/QTab.json +1 -1
  39. package/dist/api/QTable.json +4 -4
  40. package/dist/api/QTabs.json +9 -0
  41. package/dist/api/QTimelineEntry.json +2 -2
  42. package/dist/api/QToggle.json +1 -1
  43. package/dist/api/QTree.json +7 -1
  44. package/dist/api/QVideo.json +10 -0
  45. package/dist/icon-set/bootstrap-icons.umd.min.js +1 -1
  46. package/dist/icon-set/eva-icons.umd.min.js +1 -1
  47. package/dist/icon-set/fontawesome-v5-pro.umd.min.js +1 -1
  48. package/dist/icon-set/fontawesome-v5.umd.min.js +1 -1
  49. package/dist/icon-set/ionicons-v4.umd.min.js +1 -1
  50. package/dist/icon-set/line-awesome.umd.min.js +1 -1
  51. package/dist/icon-set/material-icons-outlined.umd.min.js +1 -1
  52. package/dist/icon-set/material-icons-round.umd.min.js +1 -1
  53. package/dist/icon-set/material-icons-sharp.umd.min.js +1 -1
  54. package/dist/icon-set/material-icons.umd.min.js +1 -1
  55. package/dist/icon-set/mdi-v3.umd.min.js +1 -1
  56. package/dist/icon-set/mdi-v4.umd.min.js +1 -1
  57. package/dist/icon-set/mdi-v5.umd.min.js +1 -1
  58. package/dist/icon-set/mdi-v6.umd.min.js +1 -1
  59. package/dist/icon-set/svg-bootstrap-icons.umd.min.js +1 -1
  60. package/dist/icon-set/svg-eva-icons.umd.min.js +1 -1
  61. package/dist/icon-set/svg-fontawesome-v5.umd.min.js +1 -1
  62. package/dist/icon-set/svg-ionicons-v4.umd.min.js +1 -1
  63. package/dist/icon-set/svg-ionicons-v5.umd.min.js +1 -1
  64. package/dist/icon-set/svg-ionicons-v6.umd.min.js +6 -0
  65. package/dist/icon-set/svg-line-awesome.umd.min.js +1 -1
  66. package/dist/icon-set/svg-material-icons-outlined.umd.min.js +1 -1
  67. package/dist/icon-set/svg-material-icons-round.umd.min.js +1 -1
  68. package/dist/icon-set/svg-material-icons-sharp.umd.min.js +1 -1
  69. package/dist/icon-set/svg-material-icons.umd.min.js +1 -1
  70. package/dist/icon-set/svg-mdi-v4.umd.min.js +1 -1
  71. package/dist/icon-set/svg-mdi-v5.umd.min.js +1 -1
  72. package/dist/icon-set/svg-mdi-v6.umd.min.js +1 -1
  73. package/dist/icon-set/svg-themify.umd.min.js +1 -1
  74. package/dist/icon-set/themify.umd.min.js +1 -1
  75. package/dist/lang/ar.umd.min.js +2 -2
  76. package/dist/lang/az-latn.umd.min.js +1 -1
  77. package/dist/lang/bg.umd.min.js +1 -1
  78. package/dist/lang/ca.umd.min.js +1 -1
  79. package/dist/lang/cs.umd.min.js +1 -1
  80. package/dist/lang/da.umd.min.js +1 -1
  81. package/dist/lang/de.umd.min.js +1 -1
  82. package/dist/lang/el.umd.min.js +1 -1
  83. package/dist/lang/en-gb.umd.min.js +1 -1
  84. package/dist/lang/en-us.umd.min.js +1 -1
  85. package/dist/lang/eo.umd.min.js +1 -1
  86. package/dist/lang/es.umd.min.js +1 -1
  87. package/dist/lang/et.umd.min.js +1 -1
  88. package/dist/lang/fa-ir.umd.min.js +1 -1
  89. package/dist/lang/fa.umd.min.js +1 -1
  90. package/dist/lang/fi.umd.min.js +1 -1
  91. package/dist/lang/fr.umd.min.js +2 -2
  92. package/dist/lang/gn.umd.min.js +1 -1
  93. package/dist/lang/he.umd.min.js +1 -1
  94. package/dist/lang/hr.umd.min.js +1 -1
  95. package/dist/lang/hu.umd.min.js +1 -1
  96. package/dist/lang/id.umd.min.js +1 -1
  97. package/dist/lang/is.umd.min.js +1 -1
  98. package/dist/lang/it.umd.min.js +1 -1
  99. package/dist/lang/ja.umd.min.js +1 -1
  100. package/dist/lang/km.umd.min.js +1 -1
  101. package/dist/lang/ko-kr.umd.min.js +1 -1
  102. package/dist/lang/kur-ckb.umd.min.js +1 -1
  103. package/dist/lang/lu.umd.min.js +1 -1
  104. package/dist/lang/lv.umd.min.js +1 -1
  105. package/dist/lang/ml.umd.min.js +1 -1
  106. package/dist/lang/ms.umd.min.js +1 -1
  107. package/dist/lang/nb-no.umd.min.js +1 -1
  108. package/dist/lang/nl.umd.min.js +1 -1
  109. package/dist/lang/pl.umd.min.js +1 -1
  110. package/dist/lang/pt-br.umd.min.js +1 -1
  111. package/dist/lang/pt.umd.min.js +1 -1
  112. package/dist/lang/ro.umd.min.js +1 -1
  113. package/dist/lang/ru.umd.min.js +1 -1
  114. package/dist/lang/sk.umd.min.js +1 -1
  115. package/dist/lang/sl.umd.min.js +1 -1
  116. package/dist/lang/sr.umd.min.js +2 -2
  117. package/dist/lang/sv.umd.min.js +1 -1
  118. package/dist/lang/ta.umd.min.js +1 -1
  119. package/dist/lang/th.umd.min.js +1 -1
  120. package/dist/lang/tr.umd.min.js +1 -1
  121. package/dist/lang/ug.umd.min.js +2 -2
  122. package/dist/lang/uk.umd.min.js +1 -1
  123. package/dist/lang/vi.umd.min.js +1 -1
  124. package/dist/lang/zh-hans.umd.min.js +2 -2
  125. package/dist/lang/zh-hant.umd.min.js +2 -2
  126. package/dist/quasar.addon.css +1 -1
  127. package/dist/quasar.addon.rtl.css +1 -1
  128. package/dist/quasar.common.js +2 -2
  129. package/dist/quasar.css +376 -225
  130. package/dist/quasar.esm.js +2 -2
  131. package/dist/quasar.ie.polyfills.js +1 -1
  132. package/dist/quasar.ie.polyfills.umd.min.js +1 -1
  133. package/dist/quasar.min.css +1 -1
  134. package/dist/quasar.rtl.css +508 -301
  135. package/dist/quasar.rtl.min.css +1 -1
  136. package/dist/quasar.sass +324 -208
  137. package/dist/quasar.styl +324 -208
  138. package/dist/quasar.umd.js +3098 -1836
  139. package/dist/quasar.umd.min.js +2 -2
  140. package/dist/quasar.umd.modern.js +3057 -1817
  141. package/dist/quasar.umd.modern.min.js +2 -2
  142. package/dist/transform-asset-urls.json +20 -0
  143. package/dist/types/index.d.ts +421 -103
  144. package/dist/types/utils/scroll.d.ts +1 -0
  145. package/dist/vetur/quasar-attributes.json +313 -89
  146. package/dist/vetur/quasar-tags.json +74 -18
  147. package/dist/web-types/web-types.json +1289 -259
  148. package/icon-set/svg-ionicons-v6.js +225 -0
  149. package/lang/ar.js +1 -1
  150. package/lang/fa-ir.js +3 -1
  151. package/lang/fa.js +3 -1
  152. package/lang/fr.js +1 -1
  153. package/lang/index.json +1 -1
  154. package/lang/kur-ckb.js +2 -2
  155. package/lang/sr.js +4 -4
  156. package/lang/ug.js +48 -46
  157. package/lang/zh-hans.js +1 -1
  158. package/lang/zh-hant.js +18 -18
  159. package/package.json +1 -1
  160. package/src/api.extends.json +1 -2
  161. package/src/components/breadcrumbs/QBreadcrumbs.js +15 -11
  162. package/src/components/breadcrumbs/QBreadcrumbs.sass +0 -3
  163. package/src/components/breadcrumbs/QBreadcrumbs.styl +0 -3
  164. package/src/components/breadcrumbs/QBreadcrumbsEl.js +25 -9
  165. package/src/components/btn/QBtn.js +3 -3
  166. package/src/components/btn-dropdown/QBtnDropdown.sass +2 -0
  167. package/src/components/btn-dropdown/QBtnDropdown.styl +2 -0
  168. package/src/components/carousel/QCarousel.js +6 -2
  169. package/src/components/carousel/QCarousel.json +9 -1
  170. package/src/components/carousel/QCarouselSlide.json +2 -2
  171. package/src/components/chat/QChatMessage.json +1 -1
  172. package/src/components/color/QColor.js +100 -85
  173. package/src/components/color/QColor.json +7 -0
  174. package/src/components/color/QColor.sass +14 -24
  175. package/src/components/color/QColor.styl +14 -24
  176. package/src/components/date/QDate.js +7 -1
  177. package/src/components/date/QDate.sass +2 -0
  178. package/src/components/date/QDate.styl +2 -0
  179. package/src/components/dialog/QDialog.js +8 -4
  180. package/src/components/dialog/QDialog.json +8 -1
  181. package/src/components/drawer/QDrawer.js +16 -15
  182. package/src/components/editor/QEditor.js +2 -2
  183. package/src/components/editor/QEditor.sass +13 -1
  184. package/src/components/editor/QEditor.styl +13 -1
  185. package/src/components/expansion-item/QExpansionItem.js +13 -11
  186. package/src/components/fab/QFab.js +20 -11
  187. package/src/components/fab/QFab.json +35 -0
  188. package/src/components/fab/QFabAction.js +16 -9
  189. package/src/components/fab/QFabAction.json +10 -0
  190. package/src/components/field/QField.js +28 -23
  191. package/src/components/field/__QField.json +72 -8
  192. package/src/components/file/QFile.js +12 -4
  193. package/src/components/file/QFile.sass +4 -3
  194. package/src/components/file/QFile.styl +4 -3
  195. package/src/components/footer/QFooter.js +1 -1
  196. package/src/components/form/QForm.js +1 -1
  197. package/src/components/header/QHeader.js +1 -1
  198. package/src/components/icon/QIcon.js +54 -49
  199. package/src/components/img/QImg.json +2 -2
  200. package/src/components/infinite-scroll/QInfiniteScroll.js +49 -36
  201. package/src/components/inner-loading/QInnerLoading.js +54 -22
  202. package/src/components/inner-loading/QInnerLoading.json +29 -0
  203. package/src/components/inner-loading/QInnerLoading.sass +3 -0
  204. package/src/components/inner-loading/QInnerLoading.styl +3 -0
  205. package/src/components/item/QItem.js +9 -15
  206. package/src/components/linear-progress/QLinearProgress.js +6 -2
  207. package/src/components/menu/QMenu.js +5 -1
  208. package/src/components/option-group/QOptionGroup.js +32 -22
  209. package/src/components/option-group/QOptionGroup.json +50 -1
  210. package/src/components/parallax/QParallax.js +3 -0
  211. package/src/components/parallax/QParallax.json +1 -1
  212. package/src/components/popup-edit/QPopupEdit.js +41 -16
  213. package/src/components/popup-edit/QPopupEdit.json +15 -8
  214. package/src/components/range/QRange.js +223 -278
  215. package/src/components/range/QRange.json +11 -122
  216. package/src/components/rating/QRating.js +56 -38
  217. package/src/components/rating/QRating.json +3 -3
  218. package/src/components/rating/QRating.sass +8 -6
  219. package/src/components/rating/QRating.styl +8 -6
  220. package/src/components/resize-observer/QResizeObserver.js +15 -10
  221. package/src/components/scroll-area/QScrollArea.js +342 -126
  222. package/src/components/scroll-area/QScrollArea.json +164 -20
  223. package/src/components/scroll-area/QScrollArea.sass +4 -0
  224. package/src/components/scroll-area/QScrollArea.styl +4 -0
  225. package/src/components/scroll-observer/QScrollObserver.js +9 -2
  226. package/src/components/select/QSelect.js +8 -2
  227. package/src/components/separator/QSeparator.js +0 -1
  228. package/src/components/separator/QSeparator.json +1 -1
  229. package/src/components/slider/QSlider.js +97 -140
  230. package/src/components/slider/QSlider.json +1 -122
  231. package/src/components/slider/QSlider.sass +205 -139
  232. package/src/components/slider/QSlider.styl +205 -139
  233. package/src/components/slider/slider-utils.js +468 -123
  234. package/src/components/slider/slider-utils.json +546 -0
  235. package/src/components/stepper/QStepper.js +1 -1
  236. package/src/components/stepper/QStepper.sass +25 -26
  237. package/src/components/stepper/QStepper.styl +25 -26
  238. package/src/components/table/QTable.sass +3 -0
  239. package/src/components/table/QTable.styl +3 -0
  240. package/src/components/tabs/QRouteTab.js +13 -13
  241. package/src/components/tabs/QRouteTab.json +0 -7
  242. package/src/components/tabs/QTab.js +71 -20
  243. package/src/components/tabs/QTabs.js +237 -52
  244. package/src/components/tabs/QTabs.json +8 -0
  245. package/src/components/tabs/QTabs.sass +6 -6
  246. package/src/components/tabs/QTabs.styl +6 -6
  247. package/src/components/time/QTime.js +6 -2
  248. package/src/components/timeline/QTimelineEntry.json +1 -1
  249. package/src/components/tree/QTree.js +10 -6
  250. package/src/components/tree/QTree.json +5 -0
  251. package/src/components/tree/QTree.sass +58 -4
  252. package/src/components/tree/QTree.styl +58 -4
  253. package/src/components/uploader/QUploaderBase.js +15 -19
  254. package/src/components/video/QVideo.js +4 -1
  255. package/src/components/video/QVideo.json +11 -0
  256. package/src/components/virtual-scroll/QVirtualScroll.sass +1 -0
  257. package/src/components/virtual-scroll/QVirtualScroll.styl +1 -0
  258. package/src/css/core/helpers.sass +3 -0
  259. package/src/css/core/helpers.styl +3 -0
  260. package/src/css/core/positioning.sass +5 -0
  261. package/src/css/core/positioning.styl +5 -0
  262. package/src/css/variables.sass +4 -6
  263. package/src/css/variables.styl +4 -6
  264. package/src/directives/Scroll.js +2 -2
  265. package/src/directives/ScrollFire.js +1 -0
  266. package/src/ie-compat/ie.js +13 -13
  267. package/src/install.js +1 -1
  268. package/src/lang.js +7 -4
  269. package/src/mixins/anchor.js +3 -13
  270. package/src/mixins/btn.js +30 -38
  271. package/src/mixins/btn.json +26 -11
  272. package/src/mixins/file.js +27 -5
  273. package/src/mixins/fullscreen.js +16 -4
  274. package/src/mixins/portal.js +10 -10
  275. package/src/mixins/router-link.js +88 -14
  276. package/src/mixins/router-link.json +26 -10
  277. package/src/mixins/validate.js +33 -15
  278. package/src/mixins/virtual-scroll.js +40 -42
  279. package/src/plugins/AppFullscreen.js +41 -16
  280. package/src/plugins/BottomSheet.json +1 -1
  281. package/src/plugins/Cookies.js +1 -1
  282. package/src/plugins/Loading.js +8 -0
  283. package/src/plugins/LoadingBar.js +9 -0
  284. package/src/plugins/Notify.js +351 -333
  285. package/src/plugins/Notify.json +10 -10
  286. package/src/plugins/Notify.sass +9 -3
  287. package/src/plugins/Notify.styl +9 -3
  288. package/src/utils/clone.js +53 -4
  289. package/src/utils/date.js +134 -69
  290. package/src/utils/dom.js +28 -9
  291. package/src/utils/extend.js +2 -2
  292. package/src/utils/focus-manager.js +8 -10
  293. package/src/utils/global-dialog.js +18 -1
  294. package/src/utils/is.js +2 -2
  295. package/src/utils/morph.js +2 -12
  296. package/src/utils/scroll.js +71 -35
@@ -101,12 +101,19 @@
101
101
  "type": "Boolean",
102
102
  "desc": "(Accessibility) When Dialog gets shown, do not switch focus on it",
103
103
  "category": "behavior"
104
+ },
105
+
106
+ "no-shake": {
107
+ "type": "Boolean",
108
+ "desc": "Do not shake up the Dialog to catch user's attention",
109
+ "category": "behavior",
110
+ "addedIn": "v1.17"
104
111
  }
105
112
  },
106
113
 
107
114
  "events": {
108
115
  "shake": {
109
- "desc": "Shakes up the Dialog in order to catch user's attention"
116
+ "desc": "Emitted when the Dialog shakes in order to catch user's attention, unless the 'no-shake' property is set"
110
117
  },
111
118
 
112
119
  "escape-key": {
@@ -114,11 +114,10 @@ export default Vue.extend({
114
114
  }
115
115
  },
116
116
 
117
- 'layout.totalWidth' (val) {
118
- this.__updateLocal('belowBreakpoint', (
119
- this.behavior === 'mobile' ||
120
- (this.behavior !== 'desktop' && val <= this.breakpoint)
121
- ))
117
+ 'layout.totalWidth' () {
118
+ if (this.layout.container === true || document.qScrollPrevented !== true) {
119
+ this.__updateBelowBreakpoint()
120
+ }
122
121
  },
123
122
 
124
123
  side (newSide, oldSide) {
@@ -134,22 +133,17 @@ export default Vue.extend({
134
133
  this.layout[newSide].offset = this.offset
135
134
  },
136
135
 
137
- behavior (val) {
138
- this.__updateLocal('belowBreakpoint', (
139
- val === 'mobile' ||
140
- (val !== 'desktop' && this.layout.totalWidth <= this.breakpoint)
141
- ))
136
+ behavior () {
137
+ this.__updateBelowBreakpoint()
142
138
  },
143
139
 
144
- breakpoint (val) {
145
- this.__updateLocal('belowBreakpoint', (
146
- this.behavior === 'mobile' ||
147
- (this.behavior !== 'desktop' && this.layout.totalWidth <= val)
148
- ))
140
+ breakpoint () {
141
+ this.__updateBelowBreakpoint()
149
142
  },
150
143
 
151
144
  'layout.container' (val) {
152
145
  this.showing === true && this.__preventScroll(val !== true)
146
+ val === true && this.__updateBelowBreakpoint()
153
147
  },
154
148
 
155
149
  'layout.scrollbarWidth' () {
@@ -583,6 +577,13 @@ export default Vue.extend({
583
577
 
584
578
  __updateSizeOnLayout (miniToOverlay, size) {
585
579
  this.__update('size', miniToOverlay === true ? this.miniWidth : size)
580
+ },
581
+
582
+ __updateBelowBreakpoint () {
583
+ this.__updateLocal('belowBreakpoint', (
584
+ this.behavior === 'mobile' ||
585
+ (this.behavior !== 'desktop' && this.layout.totalWidth <= this.breakpoint)
586
+ ))
586
587
  }
587
588
  },
588
589
 
@@ -516,7 +516,7 @@ export default Vue.extend({
516
516
 
517
517
  return h('div', {
518
518
  style: {
519
- height: this.inFullscreen === true ? '100vh' : null
519
+ height: this.inFullscreen === true ? '100%' : null
520
520
  },
521
521
  class: this.classes,
522
522
  attrs: this.attrs,
@@ -537,7 +537,7 @@ export default Vue.extend({
537
537
  },
538
538
  domProps: isSSR
539
539
  ? { innerHTML: this.value }
540
- : undefined,
540
+ : void 0,
541
541
  on
542
542
  }
543
543
  )
@@ -6,10 +6,18 @@
6
6
  &.disabled
7
7
  border-style: dashed
8
8
 
9
- > div:first-child, &__toolbars-container, &__toolbars-container > div:first-child
9
+ &.fullscreen
10
+ max-height: 100%
11
+
12
+ > div:first-child,
13
+ &__toolbars-container,
14
+ &__toolbars-container > div:first-child
10
15
  border-top-left-radius: inherit
11
16
  border-top-right-radius: inherit
12
17
 
18
+ &__toolbars-container
19
+ max-width: 100%
20
+
13
21
  &__content
14
22
  outline: 0
15
23
  padding: $editor-content-padding
@@ -17,14 +25,18 @@
17
25
  border-bottom-left-radius: inherit
18
26
  border-bottom-right-radius: inherit
19
27
  overflow: auto
28
+ max-width: 100%
29
+
20
30
  pre
21
31
  white-space: pre-wrap
32
+
22
33
  hr
23
34
  border: 0
24
35
  outline: 0
25
36
  margin: 1px
26
37
  height: 1px
27
38
  background: $editor-hr-color
39
+
28
40
  &:empty:not(:focus):before
29
41
  content: attr(placeholder)
30
42
  opacity: .7
@@ -6,10 +6,18 @@
6
6
  &.disabled
7
7
  border-style: dashed
8
8
 
9
- > div:first-child, &__toolbars-container, &__toolbars-container > div:first-child
9
+ &.fullscreen
10
+ max-height: 100%
11
+
12
+ > div:first-child,
13
+ &__toolbars-container,
14
+ &__toolbars-container > div:first-child
10
15
  border-top-left-radius: inherit
11
16
  border-top-right-radius: inherit
12
17
 
18
+ &__toolbars-container
19
+ max-width: 100%
20
+
13
21
  &__content
14
22
  outline: 0
15
23
  padding: $editor-content-padding
@@ -17,14 +25,18 @@
17
25
  border-bottom-left-radius: inherit
18
26
  border-bottom-right-radius: inherit
19
27
  overflow: auto
28
+ max-width: 100%
29
+
20
30
  pre
21
31
  white-space: pre-wrap
32
+
22
33
  hr
23
34
  border: 0
24
35
  outline: 0
25
36
  margin: 1px
26
37
  height: 1px
27
38
  background: $editor-hr-color
39
+
28
40
  &:empty:not(:focus):before
29
41
  content: attr(placeholder)
30
42
  opacity: .7
@@ -7,7 +7,7 @@ import QIcon from '../icon/QIcon.js'
7
7
  import QSlideTransition from '../slide-transition/QSlideTransition.js'
8
8
  import QSeparator from '../separator/QSeparator.js'
9
9
 
10
- import { RouterLinkMixin } from '../../mixins/router-link.js'
10
+ import RouterLinkMixin from '../../mixins/router-link.js'
11
11
  import ModelToggleMixin from '../../mixins/model-toggle.js'
12
12
  import DarkMixin from '../../mixins/dark.js'
13
13
 
@@ -92,7 +92,7 @@ export default Vue.extend({
92
92
  },
93
93
 
94
94
  isClickable () {
95
- return this.hasRouterLink === true || this.expandIconToggle !== true
95
+ return this.hasLink === true || this.expandIconToggle !== true
96
96
  },
97
97
 
98
98
  expansionIcon () {
@@ -102,13 +102,13 @@ export default Vue.extend({
102
102
  },
103
103
 
104
104
  activeToggleIcon () {
105
- return this.disable !== true && (this.hasRouterLink === true || this.expandIconToggle === true)
105
+ return this.disable !== true && (this.hasLink === true || this.expandIconToggle === true)
106
106
  }
107
107
  },
108
108
 
109
109
  methods: {
110
110
  __onHeaderClick (e) {
111
- this.hasRouterLink !== true && this.toggle(e)
111
+ this.hasLink !== true && this.toggle(e)
112
112
  this.$emit('click', e)
113
113
  },
114
114
 
@@ -219,18 +219,20 @@ export default Vue.extend({
219
219
  }
220
220
 
221
221
  if (this.isClickable === true) {
222
- const evtProp = this.hasRouterLink === true ? 'nativeOn' : 'on'
223
-
224
222
  data.props.clickable = true
225
- data[evtProp] = {
223
+ data[this.hasRouterLink === true ? 'nativeOn' : 'on'] = {
226
224
  ...this.qListeners,
227
225
  click: this.__onHeaderClick
228
226
  }
229
227
 
230
- this.hasRouterLink === true && Object.assign(
231
- data.props,
232
- this.routerLinkProps
233
- )
228
+ if (this.hasLink === true) {
229
+ Object.assign(
230
+ data.props,
231
+ this.linkProps.props
232
+ )
233
+
234
+ data.attrs = this.linkProps.attrs
235
+ }
234
236
  }
235
237
 
236
238
  return h(QItem, data, child)
@@ -80,6 +80,10 @@ export default Vue.extend({
80
80
  'aria-haspopup': 'true',
81
81
  ...this.qAttrs
82
82
  }
83
+ },
84
+
85
+ slotScope () {
86
+ return { opened: this.showing }
83
87
  }
84
88
  },
85
89
 
@@ -90,6 +94,15 @@ export default Vue.extend({
90
94
  if (this.$refs.trigger && this.$refs.trigger.$el) {
91
95
  this.$refs.trigger.$el.focus()
92
96
  }
97
+ },
98
+
99
+ __getIcon (h, kebab, camel) {
100
+ const slotFn = this.$scopedSlots[kebab]
101
+ const staticClass = `q-fab__${kebab} absolute-full`
102
+
103
+ return slotFn === void 0
104
+ ? h(QIcon, { staticClass, props: { name: this[kebab] || this.$q.iconSet.fab[camel] } })
105
+ : h('div', { staticClass }, slotFn(this.slotScope))
93
106
  }
94
107
  },
95
108
 
@@ -98,20 +111,16 @@ export default Vue.extend({
98
111
 
99
112
  this.hideIcon !== true && child.push(
100
113
  h('div', { staticClass: 'q-fab__icon-holder', class: this.iconHolderClasses }, [
101
- h(QIcon, {
102
- staticClass: 'q-fab__icon absolute-full',
103
- props: { name: this.icon || this.$q.iconSet.fab.icon }
104
- }),
105
- h(QIcon, {
106
- staticClass: 'q-fab__active-icon absolute-full',
107
- props: { name: this.activeIcon || this.$q.iconSet.fab.activeIcon }
108
- })
114
+ this.__getIcon(h, 'icon', 'icon'),
115
+ this.__getIcon(h, 'active-icon', 'activeIcon')
109
116
  ])
110
117
  )
111
118
 
112
- this.label !== '' && child[this.labelProps.action](
113
- h('div', this.labelProps.data, [ this.label ])
114
- )
119
+ if (this.label !== '' || this.$scopedSlots.label !== void 0) {
120
+ child[this.labelProps.action](
121
+ h('div', this.labelProps.data, this.$scopedSlots.label !== void 0 ? this.$scopedSlots.label(this.slotScope) : [ this.label ])
122
+ )
123
+ }
115
124
 
116
125
  return h('div', {
117
126
  staticClass: 'q-fab z-fab row inline justify-center',
@@ -57,6 +57,41 @@
57
57
  }
58
58
  },
59
59
 
60
+ "scopedSlots": {
61
+ "icon": {
62
+ "desc": "Slot for icon shown when FAB is closed; Suggestion: QIcon",
63
+ "scope": {
64
+ "opened": {
65
+ "type": "Boolean",
66
+ "desc": "FAB is opened"
67
+ }
68
+ },
69
+ "addedIn": "v1.17"
70
+ },
71
+
72
+ "active-icon": {
73
+ "desc": "Slot for icon shown when FAB is opened; Suggestion: QIcon",
74
+ "scope": {
75
+ "opened": {
76
+ "type": "Boolean",
77
+ "desc": "FAB is opened"
78
+ }
79
+ },
80
+ "addedIn": "v1.17"
81
+ },
82
+
83
+ "label": {
84
+ "desc": "Slot for label",
85
+ "scope": {
86
+ "opened": {
87
+ "type": "Boolean",
88
+ "desc": "FAB is opened"
89
+ }
90
+ },
91
+ "addedIn": "v1.17"
92
+ }
93
+ },
94
+
60
95
  "events": {
61
96
  "input": {
62
97
  "desc": "Emitted when fab actions are shown/hidden; Captured by v-model directive"
@@ -75,15 +75,22 @@ export default Vue.extend({
75
75
  render (h) {
76
76
  const child = []
77
77
 
78
- this.icon !== '' && child.push(
79
- h(QIcon, {
80
- props: { name: this.icon }
81
- })
82
- )
83
-
84
- this.label !== '' && child[this.labelProps.action](
85
- h('div', this.labelProps.data, [ this.label ])
86
- )
78
+ if (this.$scopedSlots.icon !== void 0) {
79
+ child.push(this.$scopedSlots.icon())
80
+ }
81
+ else if (this.icon !== '') {
82
+ child.push(
83
+ h(QIcon, {
84
+ props: { name: this.icon }
85
+ })
86
+ )
87
+ }
88
+
89
+ if (this.label !== '' || this.$scopedSlots.label !== void 0) {
90
+ child[this.labelProps.action](
91
+ h('div', this.labelProps.data, this.$scopedSlots.label !== void 0 ? this.$scopedSlots.label() : [ this.label ])
92
+ )
93
+ }
87
94
 
88
95
  return h(QBtn, {
89
96
  class: this.classes,
@@ -36,6 +36,16 @@
36
36
  "slots": {
37
37
  "default": {
38
38
  "desc": "Suggestion for this slot: QTooltip"
39
+ },
40
+
41
+ "icon": {
42
+ "desc": "Slot for icon; Suggestion: QIcon",
43
+ "addedIn": "v1.17"
44
+ },
45
+
46
+ "label": {
47
+ "desc": "Slot for label",
48
+ "addedIn": "v1.17"
39
49
  }
40
50
  },
41
51
 
@@ -163,7 +163,7 @@ export default Vue.extend({
163
163
  'q-field--error': this.hasError,
164
164
 
165
165
  'q-field--readonly': this.readonly === true && this.disable !== true,
166
- [this.disable === true ? 'q-field--disabled' : 'q-validation-component']: true
166
+ 'q-field--disabled': this.disable === true
167
167
  }
168
168
  },
169
169
 
@@ -220,6 +220,17 @@ export default Vue.extend({
220
220
  }
221
221
  },
222
222
 
223
+ bottomSlotScope () {
224
+ return {
225
+ id: this.targetUid,
226
+ field: this.$el,
227
+ editable: this.editable,
228
+ focused: this.focused,
229
+ value: this.value,
230
+ errorMessage: this.computedErrorMessage
231
+ }
232
+ },
233
+
223
234
  attrs () {
224
235
  const attrs = {
225
236
  for: this.targetUid
@@ -238,19 +249,11 @@ export default Vue.extend({
238
249
 
239
250
  methods: {
240
251
  focus () {
241
- this.focusFn !== void 0 && removeFocusFn(this.focusFn)
242
- this.focusFn = addFocusFn(() => {
243
- if (this.showPopup !== void 0) {
244
- this.showPopup()
245
- return
246
- }
247
-
248
- this.__focus()
249
- })
252
+ addFocusFn(this.__focus)
250
253
  },
251
254
 
252
255
  blur () {
253
- this.focusFn !== void 0 && removeFocusFn(this.focusFn)
256
+ removeFocusFn(this.__focus)
254
257
  const el = document.activeElement
255
258
  // IE can have null document.activeElement
256
259
  if (el !== null && this.$el.contains(el)) {
@@ -393,24 +396,26 @@ export default Vue.extend({
393
396
  let msg, key
394
397
 
395
398
  if (this.hasError === true) {
396
- if (this.computedErrorMessage !== void 0) {
399
+ key = 'q--slot-error'
400
+
401
+ if (this.$scopedSlots.error !== void 0) {
402
+ msg = this.$scopedSlots.error(this.bottomSlotScope)
403
+ }
404
+ else if (this.computedErrorMessage !== void 0) {
397
405
  msg = [ h('div', { attrs: { role: 'alert' } }, [ this.computedErrorMessage ]) ]
398
406
  key = this.computedErrorMessage
399
407
  }
400
- else {
401
- msg = slot(this, 'error')
402
- key = 'q--slot-error'
403
- }
404
408
  }
405
409
  else if (this.hideHint !== true || this.focused === true) {
406
- if (this.hint !== void 0) {
410
+ key = 'q--slot-hint'
411
+
412
+ if (this.$scopedSlots.hint !== void 0) {
413
+ msg = this.$scopedSlots.hint(this.bottomSlotScope)
414
+ }
415
+ else if (this.hint !== void 0) {
407
416
  msg = [ h('div', [ this.hint ]) ]
408
417
  key = this.hint
409
418
  }
410
- else {
411
- msg = slot(this, 'hint')
412
- key = 'q--slot-hint'
413
- }
414
419
  }
415
420
 
416
421
  const hasCounter = this.counter === true || this.$scopedSlots.counter !== void 0
@@ -518,7 +523,7 @@ export default Vue.extend({
518
523
  this.$nextTick(() => {
519
524
  this.resetValidation()
520
525
 
521
- if (this.lazyRules !== 'ondemand' && this.$q.platform.is.mobile !== true) {
526
+ if (this.$q.platform.is.mobile !== true) {
522
527
  this.isDirty = false
523
528
  }
524
529
  })
@@ -534,7 +539,7 @@ export default Vue.extend({
534
539
  this.__onPostRender !== void 0 && this.$nextTick(this.__onPostRender)
535
540
 
536
541
  return h('label', {
537
- staticClass: 'q-field row no-wrap items-start',
542
+ staticClass: 'q-field q-validation-component row no-wrap items-start',
538
543
  class: this.classes,
539
544
  attrs: this.attrs
540
545
  }, [
@@ -209,14 +209,6 @@
209
209
  "addedIn": "v1.12.9"
210
210
  },
211
211
 
212
- "error": {
213
- "desc": "Slot for errors; Enabled only if 'bottom-slots' prop is used; Suggestion: <div>"
214
- },
215
-
216
- "hint": {
217
- "desc": "Slot for hint text; Enabled only if 'bottom-slots' prop is used; Suggestion: <div>"
218
- },
219
-
220
212
  "counter": {
221
213
  "desc": "Slot for counter text; Enabled only if 'bottom-slots' prop is used; Suggestion: <div>"
222
214
  },
@@ -226,6 +218,78 @@
226
218
  }
227
219
  },
228
220
 
221
+ "scopedSlots": {
222
+ "error": {
223
+ "desc": "Slot for errors; Enabled only if 'bottom-slots' prop is used; Suggestion: <div>",
224
+ "scope": {
225
+ "id": {
226
+ "type": "String",
227
+ "desc": "Element id used in the `for` attribute of the field label. Can be used to link the control to the label",
228
+ "examples": [ "qf_363270c0-7a83-62b1-8dcf-6dfd64ee38fa" ]
229
+ },
230
+ "field": {
231
+ "type": "Object",
232
+ "desc": "DOM element of the field",
233
+ "__exemption": [ "examples" ]
234
+ },
235
+ "editable": {
236
+ "type": "Boolean",
237
+ "desc": "Field is editable"
238
+ },
239
+ "focused": {
240
+ "type": "Boolean",
241
+ "desc": "Field has focus"
242
+ },
243
+ "value": {
244
+ "type": "Any",
245
+ "desc": "Field's value",
246
+ "examples": [ 0.241, "Text" ]
247
+ },
248
+ "errorMessage": {
249
+ "type": "String",
250
+ "desc": "Error message (from errorMessage prop or generated by rules)",
251
+ "examples": [ "The field is required" ]
252
+ }
253
+ },
254
+ "addedIn": "v1.17"
255
+ },
256
+
257
+ "hint": {
258
+ "desc": "Slot for hint text; Enabled only if 'bottom-slots' prop is used; Suggestion: <div>",
259
+ "scope": {
260
+ "id": {
261
+ "type": "String",
262
+ "desc": "Element id used in the `for` attribute of the field label. Can be used to link the control to the label",
263
+ "examples": [ "qf_363270c0-7a83-62b1-8dcf-6dfd64ee38fa" ]
264
+ },
265
+ "field": {
266
+ "type": "Object",
267
+ "desc": "DOM element of the field",
268
+ "__exemption": [ "examples" ]
269
+ },
270
+ "editable": {
271
+ "type": "Boolean",
272
+ "desc": "Field is editable"
273
+ },
274
+ "focused": {
275
+ "type": "Boolean",
276
+ "desc": "Field has focus"
277
+ },
278
+ "value": {
279
+ "type": "Any",
280
+ "desc": "Field's value",
281
+ "examples": [ 0.241, "Text" ]
282
+ },
283
+ "errorMessage": {
284
+ "type": "String",
285
+ "desc": "Error message (from errorMessage prop or generated by rules)",
286
+ "examples": [ "The field is required" ]
287
+ }
288
+ },
289
+ "addedIn": "v1.17"
290
+ }
291
+ },
292
+
229
293
  "events": {
230
294
  "clear": {
231
295
  "desc": "When using the 'clearable' property, this event is emitted when the clear icon is clicked",
@@ -9,6 +9,7 @@ import FileMixin, { FileValueMixin } from '../../mixins/file.js'
9
9
  import { isSSR } from '../../plugins/Platform'
10
10
  import { humanStorageSize } from '../../utils/format.js'
11
11
  import cache from '../../utils/cache.js'
12
+ import { prevent } from '../../utils/event.js'
12
13
 
13
14
  export default Vue.extend({
14
15
  name: 'QFile',
@@ -115,9 +116,16 @@ export default Vue.extend({
115
116
  this.$emit('input', this.multiple === true ? files : files[0])
116
117
  },
117
118
 
119
+ __onKeydown (e) {
120
+ // prevent form submit if ENTER is pressed
121
+ e.keyCode === 13 && prevent(e)
122
+ },
123
+
118
124
  __onKeyup (e) {
119
- // only on ENTER
120
- e.keyCode === 13 && this.pickFiles(e)
125
+ // only on ENTER and SPACE to match native input field
126
+ if (e.keyCode === 13 || e.keyCode === 32) {
127
+ this.pickFiles(e)
128
+ }
121
129
  },
122
130
 
123
131
  __getFileInput () {
@@ -159,6 +167,7 @@ export default Vue.extend({
159
167
  if (this.editable === true) {
160
168
  data.on = cache(this, 'native', {
161
169
  dragover: this.__onDragOver,
170
+ keydown: this.__onKeydown,
162
171
  keyup: this.__onKeyup
163
172
  })
164
173
  }
@@ -174,8 +183,7 @@ export default Vue.extend({
174
183
  return [
175
184
  h('input', {
176
185
  class: [ this.inputClass, 'q-file__filler' ],
177
- style: this.inputStyle,
178
- tabindex: -1
186
+ style: this.inputStyle
179
187
  })
180
188
  ]
181
189
  },
@@ -2,7 +2,6 @@
2
2
 
3
3
  .q-field__native
4
4
  word-break: break-all
5
- overflow: hidden
6
5
 
7
6
  .q-field__input
8
7
  opacity: 0 !important
@@ -11,8 +10,10 @@
11
10
  cursor: pointer
12
11
 
13
12
  &__filler
14
- opacity: 0
15
- pointer-events: none
13
+ visibility: hidden
14
+ width: 100%
15
+ border: none
16
+ padding: 0
16
17
 
17
18
  &__dnd
18
19
  outline: 1px dashed currentColor
@@ -2,7 +2,6 @@
2
2
 
3
3
  .q-field__native
4
4
  word-break: break-all
5
- overflow: hidden
6
5
 
7
6
  .q-field__input
8
7
  opacity: 0 !important
@@ -11,8 +10,10 @@
11
10
  cursor: pointer
12
11
 
13
12
  &__filler
14
- opacity: 0
15
- pointer-events: none
13
+ visibility: hidden
14
+ width: 100%
15
+ border: none
16
+ padding: 0
16
17
 
17
18
  &__dnd
18
19
  outline: 1px dashed currentColor
@@ -87,7 +87,7 @@ export default Vue.extend({
87
87
  fixed () {
88
88
  return this.reveal === true ||
89
89
  this.layout.view.indexOf('F') > -1 ||
90
- this.layout.container === true
90
+ (this.$q.platform.is.ios && this.layout.container === true)
91
91
  },
92
92
 
93
93
  containerHeight () {