quasar 2.3.3 → 2.4.2

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 (228) hide show
  1. package/dist/api/Dialog.json +1 -1
  2. package/dist/api/Loading.json +2 -6
  3. package/dist/api/QBreadcrumbsEl.json +31 -10
  4. package/dist/api/QBtn.json +30 -14
  5. package/dist/api/QBtnDropdown.json +31 -15
  6. package/dist/api/QBtnToggle.json +3 -0
  7. package/dist/api/QChatMessage.json +4 -12
  8. package/dist/api/QExpansionItem.json +34 -12
  9. package/dist/api/QFab.json +33 -2
  10. package/dist/api/QFabAction.json +8 -0
  11. package/dist/api/QField.json +1 -0
  12. package/dist/api/QFile.json +5 -2
  13. package/dist/api/QForm.json +1 -1
  14. package/dist/api/QInput.json +1 -0
  15. package/dist/api/QItem.json +31 -10
  16. package/dist/api/QOptionGroup.json +74 -4
  17. package/dist/api/QPopupProxy.json +3 -2
  18. package/dist/api/QRange.json +592 -107
  19. package/dist/api/QRating.json +3 -1
  20. package/dist/api/QRouteTab.json +31 -11
  21. package/dist/api/QScrollArea.json +3 -2
  22. package/dist/api/QSelect.json +9 -16
  23. package/dist/api/QSlider.json +504 -39
  24. package/dist/api/QTree.json +8 -4
  25. package/dist/api/QUploader.json +16 -2
  26. package/dist/api/QVirtualScroll.json +3 -2
  27. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  28. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  29. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  30. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  31. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  32. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  33. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  34. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  35. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  36. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  37. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  38. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  39. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  40. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  42. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  43. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  44. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  45. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  46. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  47. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  48. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  49. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  50. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  51. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  52. package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
  53. package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
  54. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  55. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  56. package/dist/icon-set/themify.umd.prod.js +1 -1
  57. package/dist/lang/ar.umd.prod.js +1 -1
  58. package/dist/lang/az-Latn.umd.prod.js +1 -1
  59. package/dist/lang/bg.umd.prod.js +1 -1
  60. package/dist/lang/bn.umd.prod.js +1 -1
  61. package/dist/lang/ca.umd.prod.js +1 -1
  62. package/dist/lang/cs.umd.prod.js +1 -1
  63. package/dist/lang/da.umd.prod.js +1 -1
  64. package/dist/lang/de.umd.prod.js +1 -1
  65. package/dist/lang/el.umd.prod.js +1 -1
  66. package/dist/lang/en-GB.umd.prod.js +1 -1
  67. package/dist/lang/en-US.umd.prod.js +1 -1
  68. package/dist/lang/eo.umd.prod.js +1 -1
  69. package/dist/lang/es.umd.prod.js +1 -1
  70. package/dist/lang/et.umd.prod.js +1 -1
  71. package/dist/lang/fa-IR.umd.prod.js +1 -1
  72. package/dist/lang/fa.umd.prod.js +1 -1
  73. package/dist/lang/fi.umd.prod.js +1 -1
  74. package/dist/lang/fr.umd.prod.js +1 -1
  75. package/dist/lang/gn.umd.prod.js +1 -1
  76. package/dist/lang/he.umd.prod.js +1 -1
  77. package/dist/lang/hr.umd.prod.js +1 -1
  78. package/dist/lang/hu.umd.prod.js +1 -1
  79. package/dist/lang/id.umd.prod.js +1 -1
  80. package/dist/lang/is.umd.prod.js +1 -1
  81. package/dist/lang/it.umd.prod.js +1 -1
  82. package/dist/lang/ja.umd.prod.js +1 -1
  83. package/dist/lang/km.umd.prod.js +1 -1
  84. package/dist/lang/ko-KR.umd.prod.js +1 -1
  85. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  86. package/dist/lang/lt.umd.prod.js +1 -1
  87. package/dist/lang/lu.umd.prod.js +1 -1
  88. package/dist/lang/lv.umd.prod.js +1 -1
  89. package/dist/lang/ml.umd.prod.js +1 -1
  90. package/dist/lang/ms.umd.prod.js +1 -1
  91. package/dist/lang/nb-NO.umd.prod.js +1 -1
  92. package/dist/lang/nl.umd.prod.js +1 -1
  93. package/dist/lang/pl.umd.prod.js +1 -1
  94. package/dist/lang/pt-BR.umd.prod.js +1 -1
  95. package/dist/lang/pt.umd.prod.js +1 -1
  96. package/dist/lang/ro.umd.prod.js +1 -1
  97. package/dist/lang/ru.umd.prod.js +1 -1
  98. package/dist/lang/sk.umd.prod.js +1 -1
  99. package/dist/lang/sl.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/tr.umd.prod.js +1 -1
  106. package/dist/lang/ug.umd.prod.js +1 -1
  107. package/dist/lang/uk.umd.prod.js +1 -1
  108. package/dist/lang/vi.umd.prod.js +1 -1
  109. package/dist/lang/zh-CN.umd.prod.js +1 -1
  110. package/dist/lang/zh-TW.umd.prod.js +1 -1
  111. package/dist/quasar.cjs.prod.js +2 -2
  112. package/dist/quasar.css +275 -191
  113. package/dist/quasar.esm.prod.js +2 -2
  114. package/dist/quasar.prod.css +1 -1
  115. package/dist/quasar.rtl.css +347 -270
  116. package/dist/quasar.rtl.prod.css +1 -1
  117. package/dist/quasar.sass +275 -217
  118. package/dist/quasar.umd.js +16598 -16283
  119. package/dist/quasar.umd.prod.js +2 -2
  120. package/dist/ssr-directives/Morph.js +1 -1
  121. package/dist/transforms/loader-asset-urls.json +20 -0
  122. package/dist/types/api/slider.d.ts +46 -0
  123. package/dist/types/api/validation.d.ts +4 -0
  124. package/dist/types/api.d.ts +2 -0
  125. package/dist/types/composables.d.ts +3 -3
  126. package/dist/types/index.d.ts +611 -140
  127. package/dist/vetur/quasar-attributes.json +251 -83
  128. package/dist/vetur/quasar-tags.json +59 -17
  129. package/dist/web-types/web-types.json +580 -152
  130. package/package.json +1 -1
  131. package/src/api.extends.json +0 -1
  132. package/src/components/breadcrumbs/QBreadcrumbs.js +7 -2
  133. package/src/components/breadcrumbs/QBreadcrumbs.sass +0 -3
  134. package/src/components/breadcrumbs/QBreadcrumbsEl.js +14 -8
  135. package/src/components/btn/QBtn.js +5 -5
  136. package/src/components/btn/use-btn.js +21 -21
  137. package/src/components/btn/use-btn.json +22 -13
  138. package/src/components/btn-dropdown/QBtnDropdown.json +1 -0
  139. package/src/components/btn-toggle/QBtnToggle.json +3 -0
  140. package/src/components/checkbox/use-checkbox.js +1 -1
  141. package/src/components/chip/QChip.json +1 -2
  142. package/src/components/color/QColor.js +32 -26
  143. package/src/components/color/QColor.sass +10 -23
  144. package/src/components/date/QDate.sass +2 -0
  145. package/src/components/drawer/QDrawer.js +18 -15
  146. package/src/components/editor/QEditor.js +1 -1
  147. package/src/components/editor/QEditor.sass +10 -1
  148. package/src/components/expansion-item/QExpansionItem.js +4 -1
  149. package/src/components/expansion-item/QExpansionItem.json +2 -1
  150. package/src/components/fab/QFab.js +18 -12
  151. package/src/components/fab/QFab.json +36 -1
  152. package/src/components/fab/QFab.sass +1 -1
  153. package/src/components/fab/QFabAction.js +14 -7
  154. package/src/components/fab/QFabAction.json +10 -0
  155. package/src/components/file/QFile.js +12 -5
  156. package/src/components/file/QFile.json +6 -6
  157. package/src/components/file/QFile.sass +4 -2
  158. package/src/components/footer/QFooter.js +1 -1
  159. package/src/components/form/QForm.json +2 -3
  160. package/src/components/header/QHeader.js +1 -1
  161. package/src/components/icon/QIcon.js +2 -2
  162. package/src/components/infinite-scroll/QInfiniteScroll.js +4 -5
  163. package/src/components/item/QItem.js +2 -3
  164. package/src/components/linear-progress/QLinearProgress.js +3 -2
  165. package/src/components/option-group/QOptionGroup.js +3 -0
  166. package/src/components/option-group/QOptionGroup.json +48 -2
  167. package/src/components/parallax/QParallax.js +4 -2
  168. package/src/components/popup-edit/QPopupEdit.js +2 -5
  169. package/src/components/popup-proxy/QPopupProxy.json +2 -1
  170. package/src/components/radio/QRadio.js +2 -7
  171. package/src/components/range/QRange.js +103 -222
  172. package/src/components/range/QRange.json +11 -121
  173. package/src/components/rating/QRating.json +1 -1
  174. package/src/components/scroll-area/QScrollArea.js +3 -1
  175. package/src/components/scroll-area/QScrollArea.json +5 -6
  176. package/src/components/select/QSelect.js +4 -1
  177. package/src/components/select/QSelect.json +17 -4
  178. package/src/components/slider/QSlider.js +46 -132
  179. package/src/components/slider/QSlider.json +1 -121
  180. package/src/components/slider/QSlider.sass +198 -132
  181. package/src/components/slider/use-slider.js +453 -109
  182. package/src/components/slider/use-slider.json +546 -0
  183. package/src/components/stepper/QStepper.js +3 -3
  184. package/src/components/stepper/QStepper.sass +24 -26
  185. package/src/components/table/QTable.js +27 -47
  186. package/src/components/tabs/QRouteTab.js +1 -2
  187. package/src/components/tabs/QRouteTab.json +0 -7
  188. package/src/components/tabs/QTabs.js +71 -20
  189. package/src/components/tabs/use-tab.js +26 -13
  190. package/src/components/tree/QTree.js +14 -12
  191. package/src/components/tree/QTree.json +12 -12
  192. package/src/components/tree/QTree.sass +45 -41
  193. package/src/components/uploader/QUploader.json +14 -2
  194. package/src/components/uploader/uploader-core.js +16 -9
  195. package/src/components/virtual-scroll/QVirtualScroll.json +15 -0
  196. package/src/components/virtual-scroll/QVirtualScroll.sass +1 -0
  197. package/src/components/virtual-scroll/use-virtual-scroll.js +30 -17
  198. package/src/components/virtual-scroll/use-virtual-scroll.json +2 -5
  199. package/src/composables/private/use-field.js +5 -5
  200. package/src/composables/private/use-file.js +20 -5
  201. package/src/composables/private/use-form.js +2 -3
  202. package/src/composables/private/use-fullscreen.js +15 -4
  203. package/src/composables/private/use-router-link.js +44 -23
  204. package/src/composables/private/use-router-link.json +26 -10
  205. package/src/composables/private/use-split-attrs.js +4 -4
  206. package/src/composables/private/use-validate.js +21 -15
  207. package/src/composables/private/use-validate.json +1 -0
  208. package/src/css/core/helpers.sass +3 -0
  209. package/src/css/core/positioning.sass +5 -0
  210. package/src/css/variables.sass +4 -6
  211. package/src/directives/ScrollFire.js +1 -0
  212. package/src/icon-set.js +2 -4
  213. package/src/plugins/AppFullscreen.js +70 -53
  214. package/src/plugins/AppVisibility.js +2 -3
  215. package/src/plugins/BottomSheet.js +3 -5
  216. package/src/plugins/Dialog.js +3 -5
  217. package/src/plugins/Dialog.json +2 -3
  218. package/src/plugins/LoadingBar.js +17 -18
  219. package/src/plugins/Notify.js +296 -295
  220. package/src/plugins/Platform.js +14 -14
  221. package/src/utils/date.js +4 -4
  222. package/src/utils/dom.js +2 -2
  223. package/src/utils/open-url.js +2 -2
  224. package/src/utils/patterns.js +1 -0
  225. package/src/utils/private/define-reactive-plugin.js +10 -8
  226. package/src/utils/private/global-dialog.js +6 -8
  227. package/src/utils/private/inject-obj-prop.js +13 -0
  228. package/src/utils/private/is.js +2 -2
@@ -2,6 +2,8 @@ import { ref, computed, watch, onBeforeUnmount, getCurrentInstance } from 'vue'
2
2
 
3
3
  import useFormChild from '../use-form-child.js'
4
4
  import { testPattern } from '../../utils/patterns.js'
5
+ import { debounce } from '../../utils.js'
6
+ import { injectProp } from '../../utils/private/inject-obj-prop.js'
5
7
 
6
8
  const lazyRulesValues = [ true, false, 'ondemand' ]
7
9
 
@@ -35,7 +37,8 @@ export default function (focused, innerLoading) {
35
37
  let validateIndex = 0, unwatchRules
36
38
 
37
39
  const hasRules = computed(() =>
38
- props.rules !== void 0
40
+ props.disable !== true
41
+ && props.rules !== void 0
39
42
  && props.rules !== null
40
43
  && props.rules.length > 0
41
44
  )
@@ -44,7 +47,7 @@ export default function (focused, innerLoading) {
44
47
  props.error === true || innerError.value === true
45
48
  )
46
49
 
47
- const computedErrorMessage = computed(() => (
50
+ const errorMessage = computed(() => (
48
51
  typeof props.errorMessage === 'string' && props.errorMessage.length > 0
49
52
  ? props.errorMessage
50
53
  : innerErrorMessage.value
@@ -69,15 +72,16 @@ export default function (focused, innerLoading) {
69
72
  }, { immediate: true })
70
73
 
71
74
  watch(focused, val => {
72
- if (props.lazyRules !== 'ondemand') {
73
- if (val === true) {
74
- if (isDirtyModel.value === null) {
75
- isDirtyModel.value = false
76
- }
75
+ if (val === true) {
76
+ if (isDirtyModel.value === null) {
77
+ isDirtyModel.value = false
77
78
  }
78
- else if (isDirtyModel.value === false && hasRules.value === true) {
79
- isDirtyModel.value = true
80
- validate()
79
+ }
80
+ else if (isDirtyModel.value === false) {
81
+ isDirtyModel.value = true
82
+
83
+ if (hasRules.value === true && props.lazyRules !== 'ondemand') {
84
+ debouncedValidate()
81
85
  }
82
86
  }
83
87
  })
@@ -88,6 +92,7 @@ export default function (focused, innerLoading) {
88
92
  isDirtyModel.value = null
89
93
  innerError.value = false
90
94
  innerErrorMessage.value = null
95
+ debouncedValidate.cancel()
91
96
  }
92
97
 
93
98
  /*
@@ -189,25 +194,26 @@ export default function (focused, innerLoading) {
189
194
  && props.lazyRules !== 'ondemand'
190
195
  && (isDirtyModel.value === true || (props.lazyRules !== true && changedRules !== true))
191
196
  ) {
192
- validate()
197
+ debouncedValidate()
193
198
  }
194
199
  }
195
200
 
201
+ const debouncedValidate = debounce(validate, 0)
202
+
196
203
  onBeforeUnmount(() => {
197
204
  unwatchRules !== void 0 && unwatchRules()
205
+ debouncedValidate.cancel()
198
206
  })
199
207
 
200
208
  // expose public methods & props
201
209
  Object.assign(proxy, { resetValidation, validate })
202
- Object.defineProperty(proxy, 'hasError', {
203
- get: () => hasError.value
204
- })
210
+ injectProp(proxy, 'hasError', () => hasError.value)
205
211
 
206
212
  return {
207
213
  isDirtyModel,
208
214
  hasRules,
209
215
  hasError,
210
- computedErrorMessage,
216
+ errorMessage,
211
217
 
212
218
  validate,
213
219
  resetValidation
@@ -28,6 +28,7 @@
28
28
 
29
29
  "rules": {
30
30
  "type": "Array",
31
+ "tsType": "ValidationRule",
31
32
  "desc": "Array of Functions/Strings; If String, then it must be a name of one of the embedded validation rules",
32
33
  "examples": [
33
34
  ":rules=\"[ val => val.length <= 3 || 'Please use maximum 3 characters' ]\"",
@@ -49,6 +49,9 @@
49
49
  outline: 0
50
50
  text-decoration: none
51
51
 
52
+ &--focusable:focus-visible
53
+ text-decoration: underline dashed currentColor 1px
54
+
52
55
  body.electron
53
56
  .q-electron-drag
54
57
  -webkit-user-select: none
@@ -69,6 +69,11 @@
69
69
  max-width: 100vw
70
70
  max-height: 100vh
71
71
 
72
+ body.q-ios-padding .fullscreen
73
+ padding-top: $ios-statusbar-height !important
74
+ padding-top: env(safe-area-inset-top) !important
75
+ padding-bottom: env(safe-area-inset-bottom) !important
76
+
72
77
  .absolute-full, .fullscreen, .fixed-full
73
78
  top: 0
74
79
  right: 0
@@ -39,20 +39,18 @@ $flex-gutter: ('none': 0, 'xs': $flex-gutter-xs, 'sm': $flex-gutter-sm, 'md': $f
39
39
  // sorry for long line; we need .sass and it doesn't support multi-line list
40
40
  $sizes: ('xs': 0, 'sm': ($breakpoint-xs + 1), 'md': ($breakpoint-sm + 1), 'lg': ($breakpoint-md + 1), 'xl': ($breakpoint-lg + 1)) !default
41
41
 
42
- $breakpoint-xs-min: 0 !default
43
- $breakpoint-xs-max: $breakpoint-xs !default
42
+ $breakpoint-xs-max: (map-get($sizes, "sm") - 0.02) !default
44
43
 
45
44
  $breakpoint-sm-min: map-get($sizes, "sm") !default
46
- $breakpoint-sm-max: $breakpoint-sm !default
45
+ $breakpoint-sm-max: (map-get($sizes, "md") - 0.02) !default
47
46
 
48
47
  $breakpoint-md-min: map-get($sizes, "md") !default
49
- $breakpoint-md-max: $breakpoint-md !default
48
+ $breakpoint-md-max: (map-get($sizes, "lg") - 0.02) !default
50
49
 
51
50
  $breakpoint-lg-min: map-get($sizes, "lg") !default
52
- $breakpoint-lg-max: $breakpoint-lg !default
51
+ $breakpoint-lg-max: (map-get($sizes, "xl") - 0.02) !default
53
52
 
54
53
  $breakpoint-xl-min: map-get($sizes, "xl") !default
55
- $breakpoint-xl-max: 9999px !default
56
54
 
57
55
  $h1: (size: 6rem, line-height: 6rem, letter-spacing: -.01562em, weight: 300) !default
58
56
  $h2: (size: 3.75rem, line-height: 3.75rem, letter-spacing: -.00833em, weight: 300) !default
@@ -61,6 +61,7 @@ export default createDirective(__QUASAR_SSR_SERVER__
61
61
  beforeUnmount (el) {
62
62
  const ctx = el.__qscrollfire
63
63
  ctx.scrollTarget.removeEventListener('scroll', ctx.scroll, passive)
64
+ ctx.scroll.cancel()
64
65
  delete el.__qscrollfire
65
66
  }
66
67
  }
package/src/icon-set.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import defineReactivePlugin from './utils/private/define-reactive-plugin.js'
2
2
  import materialIcons from '../icon-set/material-icons.js'
3
+ import { injectProp } from './utils/private/inject-obj-prop.js'
3
4
 
4
5
  const Plugin = defineReactivePlugin({
5
6
  iconMapFn: null,
@@ -42,10 +43,7 @@ const Plugin = defineReactivePlugin({
42
43
 
43
44
  $q.iconSet = this.__icons
44
45
 
45
- Object.defineProperty($q, 'iconMapFn', {
46
- get: () => this.iconMapFn,
47
- set: val => { this.iconMapFn = val }
48
- })
46
+ injectProp($q, 'iconMapFn', () => this.iconMapFn, val => { this.iconMapFn = val })
49
47
 
50
48
  if (this.__installed === true) {
51
49
  iconSet !== void 0 && this.set(iconSet)
@@ -3,15 +3,41 @@ import { changeGlobalNodesTarget } from '../utils/private/global-nodes.js'
3
3
 
4
4
  const prefixes = {}
5
5
 
6
+ function assignFn (fn) {
7
+ Object.assign(Plugin, {
8
+ request: fn,
9
+ exit: fn,
10
+ toggle: fn
11
+ })
12
+ }
13
+
6
14
  function getFullscreenElement () {
7
15
  return (
8
16
  document.fullscreenElement
9
17
  || document.mozFullScreenElement
10
18
  || document.webkitFullscreenElement
11
19
  || document.msFullscreenElement
20
+ || null
12
21
  )
13
22
  }
14
23
 
24
+ function updateEl () {
25
+ const newEl = Plugin.activeEl = Plugin.isActive === false
26
+ ? null
27
+ : getFullscreenElement()
28
+
29
+ changeGlobalNodesTarget(
30
+ newEl === null || newEl === document.documentElement
31
+ ? document.body
32
+ : newEl
33
+ )
34
+ }
35
+
36
+ function togglePluginState () {
37
+ Plugin.isActive = Plugin.isActive === false
38
+ updateEl()
39
+ }
40
+
15
41
  // needed for consistency across browsers
16
42
  function promisify (target, fn) {
17
43
  try {
@@ -31,80 +57,71 @@ const Plugin = defineReactivePlugin({
31
57
  }, {
32
58
  isCapable: false,
33
59
 
34
- request (target) {
35
- if (Plugin.isCapable === true && Plugin.isActive === false) {
36
- const el = target || document.documentElement
37
- return promisify(el, prefixes.request)
38
- }
39
-
40
- return Plugin.__getErr()
41
- },
42
-
43
- exit () {
44
- return Plugin.isCapable === true && Plugin.isActive === true
45
- ? promisify(document, prefixes.exit)
46
- : Plugin.__getErr()
47
- },
48
-
49
- toggle (target) {
50
- return Plugin.isActive === true
51
- ? Plugin.exit()
52
- : Plugin.request(target)
53
- },
54
-
55
60
  install ({ $q }) {
56
61
  $q.fullscreen = this
57
62
  }
58
63
  })
59
64
 
60
- if (__QUASAR_SSR_SERVER__ !== true) {
61
- function init () {
62
- prefixes.request = [
63
- 'requestFullscreen',
64
- 'msRequestFullscreen', 'mozRequestFullScreen', 'webkitRequestFullscreen'
65
- ].find(request => document.documentElement[ request ] !== void 0)
65
+ if (__QUASAR_SSR_SERVER__ === true) {
66
+ assignFn(() => Promise.resolve())
67
+ }
68
+ else {
69
+ prefixes.request = [
70
+ 'requestFullscreen',
71
+ 'msRequestFullscreen', 'mozRequestFullScreen', 'webkitRequestFullscreen'
72
+ ].find(request => document.documentElement[ request ] !== void 0)
66
73
 
67
- Plugin.isCapable = prefixes.request !== void 0
74
+ Plugin.isCapable = prefixes.request !== void 0
68
75
 
69
- if (Plugin.isCapable === false) {
70
- // it means the browser does NOT support it
71
- Plugin.__getErr = () => Promise.reject('Not capable')
72
- return
73
- }
76
+ if (Plugin.isCapable === false) {
77
+ // it means the browser does NOT support it
78
+ assignFn(() => Promise.reject('Not capable'))
79
+ }
80
+ else {
81
+ Object.assign(Plugin, {
82
+ request (target) {
83
+ const el = target || document.documentElement
84
+ const { activeEl } = Plugin
85
+
86
+ if (el === activeEl) {
87
+ return Promise.resolve()
88
+ }
89
+
90
+ const queue = activeEl !== null && el.contains(activeEl) === true
91
+ ? Plugin.exit()
92
+ : Promise.resolve()
74
93
 
75
- Plugin.__getErr = () => Promise.resolve()
94
+ return queue.finally(() => promisify(el, prefixes.request))
95
+ },
96
+
97
+ exit () {
98
+ return Plugin.isActive === true
99
+ ? promisify(document, prefixes.exit)
100
+ : Promise.resolve()
101
+ },
102
+
103
+ toggle (target) {
104
+ return Plugin.isActive === true
105
+ ? Plugin.exit()
106
+ : Plugin.request(target)
107
+ }
108
+ })
76
109
 
77
110
  prefixes.exit = [
78
111
  'exitFullscreen',
79
112
  'msExitFullscreen', 'mozCancelFullScreen', 'webkitExitFullscreen'
80
113
  ].find(exit => document[ exit ])
81
114
 
82
- Plugin.isActive = !!getFullscreenElement()
115
+ Plugin.isActive = Boolean(getFullscreenElement())
116
+ Plugin.isActive === true && updateEl()
83
117
 
84
118
  ;[
85
119
  'onfullscreenchange',
86
120
  'onmsfullscreenchange', 'onwebkitfullscreenchange'
87
121
  ].forEach(evt => {
88
- document[ evt ] = () => {
89
- Plugin.isActive = Plugin.isActive === false
90
-
91
- if (Plugin.isActive === false) {
92
- Plugin.activeEl = null
93
- changeGlobalNodesTarget(document.body)
94
- }
95
- else {
96
- Plugin.activeEl = getFullscreenElement()
97
- changeGlobalNodesTarget(
98
- Plugin.activeEl === document.documentElement
99
- ? document.body
100
- : Plugin.activeEl
101
- )
102
- }
103
- }
122
+ document[ evt ] = togglePluginState
104
123
  })
105
124
  }
106
-
107
- init()
108
125
  }
109
126
 
110
127
  export default Plugin
@@ -1,4 +1,5 @@
1
1
  import defineReactivePlugin from '../utils/private/define-reactive-plugin.js'
2
+ import { injectProp } from '../utils/private/inject-obj-prop.js'
2
3
 
3
4
  const Plugin = defineReactivePlugin({
4
5
  appVisible: true
@@ -9,9 +10,7 @@ const Plugin = defineReactivePlugin({
9
10
  return
10
11
  }
11
12
 
12
- Object.defineProperty($q, 'appVisible', {
13
- get: () => this.appVisible
14
- })
13
+ injectProp($q, 'appVisible', () => this.appVisible)
15
14
  }
16
15
  })
17
16
 
@@ -3,11 +3,9 @@ import globalDialog from '../utils/private/global-dialog.js'
3
3
 
4
4
  export default {
5
5
  install ({ $q, parentApp }) {
6
- if (this.__installed === true) {
7
- $q.bottomSheet = globalDialog(BottomSheet, false, parentApp)
8
- }
9
- else {
10
- this.create = $q.bottomSheet = globalDialog(BottomSheet, false, parentApp)
6
+ $q.bottomSheet = globalDialog(BottomSheet, false, parentApp)
7
+ if (this.__installed !== true) {
8
+ this.create = $q.bottomSheet
11
9
  }
12
10
  }
13
11
  }
@@ -3,11 +3,9 @@ import globalDialog from '../utils/private/global-dialog.js'
3
3
 
4
4
  export default {
5
5
  install ({ $q, parentApp }) {
6
- if (this.__installed === true) {
7
- $q.dialog = globalDialog(DialogPlugin, true, parentApp)
8
- }
9
- else {
10
- this.create = $q.dialog = globalDialog(DialogPlugin, true, parentApp)
6
+ $q.dialog = globalDialog(DialogPlugin, true, parentApp)
7
+ if (this.__installed !== true) {
8
+ this.create = $q.dialog
11
9
  }
12
10
  }
13
11
  }
@@ -306,9 +306,8 @@
306
306
  },
307
307
 
308
308
  "component": {
309
- "type": "Any",
310
- "desc": "Use custom dialog component; use along with 'componentProps' prop where possible",
311
- "__exemption": [ "examples" ]
309
+ "type": "Component",
310
+ "desc": "Use custom dialog component; use along with 'componentProps' prop where possible"
312
311
  },
313
312
 
314
313
  "componentProps": {
@@ -7,9 +7,9 @@ import { createChildApp } from '../install-quasar.js'
7
7
 
8
8
  import QAjaxBar from '../components/ajax-bar/QAjaxBar.js'
9
9
 
10
- const reqProps = { ref: 'bar' }
10
+ const barRef = ref(null)
11
11
 
12
- export default defineReactivePlugin({
12
+ const Plugin = defineReactivePlugin({
13
13
  isActive: false
14
14
  }, {
15
15
  start: noop,
@@ -31,41 +31,40 @@ export default defineReactivePlugin({
31
31
 
32
32
  const props = ref(
33
33
  $q.config.loadingBar !== void 0
34
- ? { ...$q.config.loadingBar, ...reqProps }
35
- : { ...reqProps }
34
+ ? { ...$q.config.loadingBar }
35
+ : {}
36
36
  )
37
37
 
38
38
  const el = createGlobalNode('q-loading-bar')
39
39
 
40
- const vm = createChildApp({
40
+ createChildApp({
41
41
  name: 'LoadingBar',
42
42
 
43
43
  // hide App from Vue devtools
44
44
  devtools: { hide: true },
45
45
 
46
- setup: () => () => h(QAjaxBar, props.value)
46
+ setup: () => () => h(QAjaxBar, { ...props.value, ref: barRef })
47
47
  }, parentApp).mount(el)
48
48
 
49
49
  Object.assign(this, {
50
- start: speed => {
51
- const bar = vm.$refs.bar
52
- bar.start(speed)
53
- this.isActive = bar.calls > 0
50
+ start (speed) {
51
+ barRef.value.start(speed)
52
+ Plugin.isActive = barRef.value.calls > 0
54
53
  },
55
- stop: () => {
56
- const bar = vm.$refs.bar
57
- bar.stop()
58
- this.isActive = bar.calls > 0
54
+ stop () {
55
+ barRef.value.stop()
56
+ Plugin.isActive = barRef.value.calls > 0
59
57
  },
60
58
  increment () {
61
- const bar = vm.$refs.bar
62
- bar.increment.apply(null, arguments)
59
+ barRef.value.increment.apply(null, arguments)
63
60
  },
64
- setDefaults: opts => {
61
+ setDefaults (opts) {
65
62
  if (opts === Object(opts)) {
66
- props.value = { ...props.value, ...opts, ...reqProps }
63
+ Object.assign(props.value, opts)
67
64
  }
68
65
  }
69
66
  })
70
67
  }
71
68
  })
69
+
70
+ export default Plugin