quasar 2.11.6 → 2.11.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/dist/api/BottomSheet.json +13 -0
  2. package/dist/api/QCarousel.json +9 -0
  3. package/dist/api/QEditor.json +49 -0
  4. package/dist/api/QTable.json +9 -0
  5. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  6. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  7. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  8. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  9. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  10. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  11. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  12. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  13. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  14. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  15. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  16. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  17. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  18. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  19. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  20. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  21. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  22. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  23. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  24. package/dist/icon-set/mdi-v7.umd.prod.js +1 -1
  25. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  26. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  27. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  28. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  29. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  30. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
  39. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
  40. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-mdi-v7.umd.prod.js +1 -1
  42. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  43. package/dist/icon-set/themify.umd.prod.js +1 -1
  44. package/dist/lang/ar-TN.umd.prod.js +1 -1
  45. package/dist/lang/ar.umd.prod.js +1 -1
  46. package/dist/lang/az-Latn.umd.prod.js +1 -1
  47. package/dist/lang/bg.umd.prod.js +1 -1
  48. package/dist/lang/bn.umd.prod.js +1 -1
  49. package/dist/lang/ca.umd.prod.js +1 -1
  50. package/dist/lang/cs.umd.prod.js +1 -1
  51. package/dist/lang/da.umd.prod.js +1 -1
  52. package/dist/lang/de.umd.prod.js +1 -1
  53. package/dist/lang/el.umd.prod.js +1 -1
  54. package/dist/lang/en-GB.umd.prod.js +1 -1
  55. package/dist/lang/en-US.umd.prod.js +1 -1
  56. package/dist/lang/eo.umd.prod.js +1 -1
  57. package/dist/lang/es.umd.prod.js +1 -1
  58. package/dist/lang/et.umd.prod.js +1 -1
  59. package/dist/lang/eu.umd.prod.js +1 -1
  60. package/dist/lang/fa-IR.umd.prod.js +1 -1
  61. package/dist/lang/fa.umd.prod.js +1 -1
  62. package/dist/lang/fi.umd.prod.js +1 -1
  63. package/dist/lang/fr.umd.prod.js +1 -1
  64. package/dist/lang/gn.umd.prod.js +1 -1
  65. package/dist/lang/he.umd.prod.js +1 -1
  66. package/dist/lang/hr.umd.prod.js +1 -1
  67. package/dist/lang/hu.umd.prod.js +1 -1
  68. package/dist/lang/id.umd.prod.js +1 -1
  69. package/dist/lang/is.umd.prod.js +1 -1
  70. package/dist/lang/it.umd.prod.js +1 -1
  71. package/dist/lang/ja.umd.prod.js +2 -2
  72. package/dist/lang/kk.umd.prod.js +1 -1
  73. package/dist/lang/km.umd.prod.js +1 -1
  74. package/dist/lang/ko-KR.umd.prod.js +1 -1
  75. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  76. package/dist/lang/lt.umd.prod.js +1 -1
  77. package/dist/lang/lu.umd.prod.js +1 -1
  78. package/dist/lang/lv.umd.prod.js +1 -1
  79. package/dist/lang/ml.umd.prod.js +1 -1
  80. package/dist/lang/mm.umd.prod.js +1 -1
  81. package/dist/lang/ms.umd.prod.js +1 -1
  82. package/dist/lang/my.umd.prod.js +1 -1
  83. package/dist/lang/nb-NO.umd.prod.js +1 -1
  84. package/dist/lang/nl.umd.prod.js +1 -1
  85. package/dist/lang/pl.umd.prod.js +1 -1
  86. package/dist/lang/pt-BR.umd.prod.js +1 -1
  87. package/dist/lang/pt.umd.prod.js +1 -1
  88. package/dist/lang/ro.umd.prod.js +1 -1
  89. package/dist/lang/ru.umd.prod.js +1 -1
  90. package/dist/lang/sk.umd.prod.js +1 -1
  91. package/dist/lang/sl.umd.prod.js +1 -1
  92. package/dist/lang/sm.umd.prod.js +1 -1
  93. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  94. package/dist/lang/sr.umd.prod.js +1 -1
  95. package/dist/lang/sv.umd.prod.js +1 -1
  96. package/dist/lang/ta.umd.prod.js +1 -1
  97. package/dist/lang/th.umd.prod.js +1 -1
  98. package/dist/lang/tr.umd.prod.js +1 -1
  99. package/dist/lang/ug.umd.prod.js +1 -1
  100. package/dist/lang/uk.umd.prod.js +1 -1
  101. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  102. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  103. package/dist/lang/vi.umd.prod.js +1 -1
  104. package/dist/lang/zh-CN.umd.prod.js +1 -1
  105. package/dist/lang/zh-TW.umd.prod.js +1 -1
  106. package/dist/quasar.cjs.prod.js +2 -2
  107. package/dist/quasar.css +2 -2
  108. package/dist/quasar.esm.js +127 -75
  109. package/dist/quasar.esm.prod.js +2 -2
  110. package/dist/quasar.prod.css +1 -1
  111. package/dist/quasar.rtl.css +2 -2
  112. package/dist/quasar.rtl.prod.css +1 -1
  113. package/dist/quasar.sass +17 -5
  114. package/dist/quasar.umd.js +127 -75
  115. package/dist/quasar.umd.prod.js +2 -2
  116. package/dist/transforms/auto-import.json +47 -3
  117. package/dist/transforms/import-map.json +22 -0
  118. package/dist/types/index.d.ts +43 -0
  119. package/dist/web-types/web-types.json +92 -1
  120. package/lang/ja.js +1 -1
  121. package/lang/ja.mjs +1 -1
  122. package/package.json +9 -6
  123. package/src/components/avatar/__tests__/{QAvatar.spec.js → QAvatar.cy.js} +7 -8
  124. package/src/components/badge/__tests__/{QBadge.spec.js → QBadge.cy.js} +1 -2
  125. package/src/components/banner/__tests__/{QBanner.spec.js → QBanner.cy.js} +7 -8
  126. package/src/components/bar/__tests__/{QBar.spec.js → QBar.cy.js} +3 -4
  127. package/src/components/breadcrumbs/__tests__/{QBreadcrumbs.spec.js → QBreadcrumbs.cy.js} +8 -9
  128. package/src/components/breadcrumbs/__tests__/{QBreadcrumbsEl.spec.js → QBreadcrumbsEl.cy.js} +5 -6
  129. package/src/components/btn/__tests__/{QBtn.spec.js → QBtn.cy.js} +4 -5
  130. package/src/components/btn/__tests__/{use-btn.spec.js → use-btn.cy.js} +1 -2
  131. package/src/components/chip/__tests__/{QChip.spec.js → QChip.cy.js} +1 -2
  132. package/src/components/date/QDate.js +10 -9
  133. package/src/components/dialog-bottom-sheet/BottomSheet.js +2 -0
  134. package/src/components/editor/QEditor.js +6 -1
  135. package/src/components/editor/QEditor.json +40 -0
  136. package/src/components/editor/editor-utils.js +5 -1
  137. package/src/components/field/QField.sass +16 -4
  138. package/src/components/input/QInput.js +24 -7
  139. package/src/components/input/use-mask.js +72 -50
  140. package/src/components/menu/__tests__/{QMenu.spec.js → QMenu.cy.js} +29 -30
  141. package/src/components/select/QSelect.js +2 -1
  142. package/src/components/select/__tests__/{QSelect.spec.js → QSelect.cy.js} +2 -3
  143. package/src/components/table/QTable.js +1 -1
  144. package/src/components/tree/QTree.js +2 -2
  145. package/src/components/uploader/__tests__/{QUploader.spec.js → QUploader.cy.js} +1 -2
  146. package/src/composables/private/__tests__/{use-anchor.spec.js → use-anchor.cy.js} +7 -8
  147. package/src/composables/private/__tests__/{use-field.spec.js → use-field.cy.js} +7 -8
  148. package/src/composables/private/__tests__/{use-model-toggle.spec.js → use-model-toggle.cy.js} +17 -18
  149. package/src/composables/private/__tests__/{use-size.spec.js → use-size.cy.js} +4 -5
  150. package/src/composables/private/__tests__/{use-transition.spec.js → use-transition.cy.js} +9 -10
  151. package/src/composables/private/__tests__/{use-validate.spec.js → use-validate.cy.js} +5 -6
  152. package/src/composables/private/use-fullscreen.json +12 -0
  153. package/src/plugins/BottomSheet.json +8 -0
  154. /package/src/components/date/__tests__/{QDate.spec.js → QDate.cy.js} +0 -0
  155. /package/src/components/dialog/__tests__/{QDialog.spec.js → QDialog.cy.js} +0 -0
  156. /package/src/components/editor/__tests__/{QEditor.spec.js → QEditor.cy.js} +0 -0
  157. /package/src/components/input/__tests__/{QInput.spec.js → QInput.cy.js} +0 -0
  158. /package/src/components/input/__tests__/{use-mask.spec.js → use-mask.cy.js} +0 -0
  159. /package/src/components/table/__tests__/{QTable.spec.js → QTable.cy.js} +0 -0
  160. /package/src/components/table/__tests__/{QTd.spec.js → QTd.cy.js} +0 -0
  161. /package/src/components/table/__tests__/{QTh.spec.js → QTh.cy.js} +0 -0
  162. /package/src/components/table/__tests__/{QTr.spec.js → QTr.cy.js} +0 -0
  163. /package/src/components/tabs/__tests__/{QRouteTab.spec.js → QRouteTab.cy.js} +0 -0
  164. /package/src/components/tabs/__tests__/{QTab.spec.js → QTab.cy.js} +0 -0
  165. /package/src/components/tabs/__tests__/{QTabs.spec.js → QTabs.cy.js} +0 -0
  166. /package/src/composables/private/__tests__/{use-file.spec.js → use-file.cy.js} +0 -0
  167. /package/src/composables/private/__tests__/{use-form.spec.js → use-form.cy.js} +0 -0
  168. /package/src/composables/private/__tests__/{use-fullscreen.spec.js → use-fullscreen.cy.js} +0 -0
  169. /package/src/composables/private/__tests__/{use-portal.spec.js → use-portal.cy.js} +0 -0
  170. /package/src/composables/private/__tests__/{use-router-link.spec.js → use-router-link.cy.js} +0 -0
package/dist/quasar.sass CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.11.6
2
+ * Quasar Framework v2.11.8
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -2379,8 +2379,14 @@ $field-transition-label-right-up: .324s cubic-bezier(.4,0,.2,1)
2379
2379
  -webkit-animation-fill-mode: both
2380
2380
  &:-webkit-autofill + .q-field__label
2381
2381
  transform: translateY(-40%) scale(.75)
2382
- &[type="number"]:invalid + .q-field__label
2383
- transform: translateY(-40%) scale(.75)
2382
+ &[type="color"],
2383
+ &[type="date"],
2384
+ &[type="datetime-local"],
2385
+ &[type="month"],
2386
+ &[type="time"],
2387
+ &[type="week"]
2388
+ + .q-field__label
2389
+ transform: translateY(-40%) scale(.75)
2384
2390
  &:invalid
2385
2391
  box-shadow: none
2386
2392
  &__native[type="file"]
@@ -2627,8 +2633,14 @@ $field-transition-label-right-up: .324s cubic-bezier(.4,0,.2,1)
2627
2633
  .q-field__native, .q-field__input
2628
2634
  &:-webkit-autofill + .q-field__label
2629
2635
  transform: translateY(-30%) scale(.75)
2630
- &[type="number"]:invalid + .q-field__label
2631
- transform: translateY(-30%) scale(.75)
2636
+ &[type="color"],
2637
+ &[type="date"],
2638
+ &[type="datetime-local"],
2639
+ &[type="month"],
2640
+ &[type="time"],
2641
+ &[type="week"]
2642
+ + .q-field__label
2643
+ transform: translateY(-30%) scale(.75)
2632
2644
  &--borderless, &--standard
2633
2645
  .q-field__bottom,
2634
2646
  &.q-field--dense .q-field__control
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.11.6
2
+ * Quasar Framework v2.11.8
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -1653,7 +1653,7 @@
1653
1653
  }
1654
1654
 
1655
1655
  var installQuasar = function (parentApp, opts = {}) {
1656
- const $q = { version: '2.11.6' };
1656
+ const $q = { version: '2.11.8' };
1657
1657
 
1658
1658
  if (globalConfigIsFrozen === false) {
1659
1659
  if (opts.config !== void 0) {
@@ -13843,8 +13843,8 @@
13843
13843
  lastEmitValue = 0;
13844
13844
  }
13845
13845
  else {
13846
- const { year, month } = getViewModel(innerMask.value, innerLocale.value);
13847
- updateViewModel(year, month);
13846
+ const model = getViewModel(innerMask.value, innerLocale.value);
13847
+ updateViewModel(model.year, model.month, model);
13848
13848
  }
13849
13849
  });
13850
13850
 
@@ -13854,12 +13854,8 @@
13854
13854
  }
13855
13855
  });
13856
13856
 
13857
- vue.watch(() => viewModel.value.year, year => {
13858
- emit('navigation', { year, month: viewModel.value.month });
13859
- });
13860
-
13861
- vue.watch(() => viewModel.value.month, month => {
13862
- emit('navigation', { year: viewModel.value.year, month });
13857
+ vue.watch(() => viewModel.value.year + '|' + viewModel.value.month, () => {
13858
+ emit('navigation', { year: viewModel.value.year, month: viewModel.value.month });
13863
13859
  });
13864
13860
 
13865
13861
  vue.watch(mask, val => {
@@ -14041,7 +14037,7 @@
14041
14037
  return { year: date.year, month: date.month, day: date.day }
14042
14038
  }
14043
14039
 
14044
- function updateViewModel (year, month) {
14040
+ function updateViewModel (year, month, time) {
14045
14041
  if (minNav.value !== null && year <= minNav.value.year) {
14046
14042
  year = minNav.value.year;
14047
14043
  if (month < minNav.value.month) {
@@ -14056,6 +14052,11 @@
14056
14052
  }
14057
14053
  }
14058
14054
 
14055
+ if (time !== void 0) {
14056
+ const { hour, minute, second, millisecond, timezoneOffset, timeHash } = time;
14057
+ Object.assign(viewModel.value, { hour, minute, second, millisecond, timezoneOffset, timeHash });
14058
+ }
14059
+
14059
14060
  const newHash = year + '/' + pad(month) + '/01';
14060
14061
 
14061
14062
  if (newHash !== viewModel.value.dateHash) {
@@ -16911,7 +16912,11 @@
16911
16912
  textColor: highlight && !eVm.props.toolbarPush ? null : eVm.props.toolbarTextColor,
16912
16913
  label: btn.fixedLabel ? btn.label : label,
16913
16914
  icon: btn.fixedIcon ? (btn.icon !== null ? btn.icon : void 0) : icon,
16914
- contentClass
16915
+ contentClass,
16916
+ onShow: evt => eVm.emit('dropdownShow', evt),
16917
+ onHide: evt => eVm.emit('dropdownHide', evt),
16918
+ onBeforeShow: evt => eVm.emit('dropdownBeforeShow', evt),
16919
+ onBeforeHide: evt => eVm.emit('dropdownBeforeHide', evt)
16915
16920
  }, () => Items);
16916
16921
 
16917
16922
  return Dropdown
@@ -17223,7 +17228,11 @@
17223
17228
  ...useFullscreenEmits,
17224
17229
  'update:modelValue',
17225
17230
  'keydown', 'click', 'mouseup', 'keyup', 'touchend',
17226
- 'focus', 'blur'
17231
+ 'focus', 'blur',
17232
+ 'dropdownShow',
17233
+ 'dropdownHide',
17234
+ 'dropdownBeforeShow',
17235
+ 'dropdownBeforeHide'
17227
17236
  ],
17228
17237
 
17229
17238
  setup (props, { slots, emit, attrs }) {
@@ -17380,6 +17389,7 @@
17380
17389
  $q,
17381
17390
  props,
17382
17391
  slots,
17392
+ emit,
17383
17393
  // caret (will get injected after mount)
17384
17394
  inFullscreen,
17385
17395
  toggleFullscreen,
@@ -21287,7 +21297,7 @@
21287
21297
  };
21288
21298
 
21289
21299
  function useMask (props, emit, emitValue, inputRef) {
21290
- let maskMarked, maskReplaced, computedMask, computedUnmask;
21300
+ let maskMarked, maskReplaced, computedMask, computedUnmask, pastedTextStart, selectionAnchor;
21291
21301
 
21292
21302
  const hasMask = vue.ref(null);
21293
21303
  const innerValue = vue.ref(getInitialMaskedValue());
@@ -21489,8 +21499,15 @@
21489
21499
  }
21490
21500
 
21491
21501
  if (inputType === 'insertFromPaste' && props.reverseFillMask !== true) {
21492
- const cursor = end - 1;
21493
- moveCursor.right(inp, cursor, cursor);
21502
+ const maxEnd = inp.selectionEnd;
21503
+ let cursor = end - 1;
21504
+ // each non-marker char means we move once to right
21505
+ for (let i = pastedTextStart; i <= cursor && i < maxEnd; i++) {
21506
+ if (maskMarked[ i ] !== MARKER) {
21507
+ cursor++;
21508
+ }
21509
+ }
21510
+ moveCursor.right(inp, cursor);
21494
21511
 
21495
21512
  return
21496
21513
  }
@@ -21516,7 +21533,7 @@
21516
21533
  inp.setSelectionRange(cursor, cursor, 'forward');
21517
21534
  }
21518
21535
  else {
21519
- moveCursor.rightReverse(inp, cursor, cursor);
21536
+ moveCursor.rightReverse(inp, cursor);
21520
21537
  }
21521
21538
  }
21522
21539
  else {
@@ -21527,11 +21544,11 @@
21527
21544
  else {
21528
21545
  if (changed === true) {
21529
21546
  const cursor = Math.max(0, maskMarked.indexOf(MARKER), Math.min(preMasked.length, end) - 1);
21530
- moveCursor.right(inp, cursor, cursor);
21547
+ moveCursor.right(inp, cursor);
21531
21548
  }
21532
21549
  else {
21533
21550
  const cursor = end - 1;
21534
- moveCursor.right(inp, cursor, cursor);
21551
+ moveCursor.right(inp, cursor);
21535
21552
  }
21536
21553
  }
21537
21554
  });
@@ -21547,74 +21564,72 @@
21547
21564
  const preMasked = maskValue(unmaskValue(inp.value));
21548
21565
 
21549
21566
  start = Math.max(0, maskMarked.indexOf(MARKER), Math.min(preMasked.length, start));
21567
+ pastedTextStart = start;
21550
21568
 
21551
21569
  inp.setSelectionRange(start, end, 'forward');
21552
21570
  }
21553
21571
 
21554
21572
  const moveCursor = {
21555
- left (inp, start, end, selection) {
21556
- const noMarkBefore = maskMarked.slice(start - 1).indexOf(MARKER) === -1;
21557
- let i = Math.max(0, start - 1);
21573
+ left (inp, cursor) {
21574
+ const noMarkBefore = maskMarked.slice(cursor - 1).indexOf(MARKER) === -1;
21575
+ let i = Math.max(0, cursor - 1);
21558
21576
 
21559
21577
  for (; i >= 0; i--) {
21560
21578
  if (maskMarked[ i ] === MARKER) {
21561
- start = i;
21562
- noMarkBefore === true && start++;
21579
+ cursor = i;
21580
+ noMarkBefore === true && cursor++;
21563
21581
  break
21564
21582
  }
21565
21583
  }
21566
21584
 
21567
21585
  if (
21568
21586
  i < 0
21569
- && maskMarked[ start ] !== void 0
21570
- && maskMarked[ start ] !== MARKER
21587
+ && maskMarked[ cursor ] !== void 0
21588
+ && maskMarked[ cursor ] !== MARKER
21571
21589
  ) {
21572
- return moveCursor.right(inp, 0, 0)
21590
+ return moveCursor.right(inp, 0)
21573
21591
  }
21574
21592
 
21575
- start >= 0 && inp.setSelectionRange(
21576
- start,
21577
- selection === true ? end : start, 'backward'
21578
- );
21593
+ cursor >= 0 && inp.setSelectionRange(cursor, cursor, 'backward');
21579
21594
  },
21580
21595
 
21581
- right (inp, start, end, selection) {
21596
+ right (inp, cursor) {
21582
21597
  const limit = inp.value.length;
21583
- let i = Math.min(limit, end + 1);
21598
+ let i = Math.min(limit, cursor + 1);
21584
21599
 
21585
21600
  for (; i <= limit; i++) {
21586
21601
  if (maskMarked[ i ] === MARKER) {
21587
- end = i;
21602
+ cursor = i;
21588
21603
  break
21589
21604
  }
21590
21605
  else if (maskMarked[ i - 1 ] === MARKER) {
21591
- end = i;
21606
+ cursor = i;
21592
21607
  }
21593
21608
  }
21594
21609
 
21595
21610
  if (
21596
21611
  i > limit
21597
- && maskMarked[ end - 1 ] !== void 0
21598
- && maskMarked[ end - 1 ] !== MARKER
21612
+ && maskMarked[ cursor - 1 ] !== void 0
21613
+ && maskMarked[ cursor - 1 ] !== MARKER
21599
21614
  ) {
21600
- return moveCursor.left(inp, limit, limit)
21615
+ return moveCursor.left(inp, limit)
21601
21616
  }
21602
21617
 
21603
- inp.setSelectionRange(selection ? start : end, end, 'forward');
21618
+ inp.setSelectionRange(cursor, cursor, 'forward');
21604
21619
  },
21605
21620
 
21606
- leftReverse (inp, start, end, selection) {
21621
+ leftReverse (inp, cursor) {
21607
21622
  const
21608
21623
  localMaskMarked = getPaddedMaskMarked(inp.value.length);
21609
- let i = Math.max(0, start - 1);
21624
+ let i = Math.max(0, cursor - 1);
21610
21625
 
21611
21626
  for (; i >= 0; i--) {
21612
21627
  if (localMaskMarked[ i - 1 ] === MARKER) {
21613
- start = i;
21628
+ cursor = i;
21614
21629
  break
21615
21630
  }
21616
21631
  else if (localMaskMarked[ i ] === MARKER) {
21617
- start = i;
21632
+ cursor = i;
21618
21633
  if (i === 0) {
21619
21634
  break
21620
21635
  }
@@ -21623,45 +21638,48 @@
21623
21638
 
21624
21639
  if (
21625
21640
  i < 0
21626
- && localMaskMarked[ start ] !== void 0
21627
- && localMaskMarked[ start ] !== MARKER
21641
+ && localMaskMarked[ cursor ] !== void 0
21642
+ && localMaskMarked[ cursor ] !== MARKER
21628
21643
  ) {
21629
- return moveCursor.rightReverse(inp, 0, 0)
21644
+ return moveCursor.rightReverse(inp, 0)
21630
21645
  }
21631
21646
 
21632
- start >= 0 && inp.setSelectionRange(
21633
- start,
21634
- selection === true ? end : start, 'backward'
21635
- );
21647
+ cursor >= 0 && inp.setSelectionRange(cursor, cursor, 'backward');
21636
21648
  },
21637
21649
 
21638
- rightReverse (inp, start, end, selection) {
21650
+ rightReverse (inp, cursor) {
21639
21651
  const
21640
21652
  limit = inp.value.length,
21641
21653
  localMaskMarked = getPaddedMaskMarked(limit),
21642
- noMarkBefore = localMaskMarked.slice(0, end + 1).indexOf(MARKER) === -1;
21643
- let i = Math.min(limit, end + 1);
21654
+ noMarkBefore = localMaskMarked.slice(0, cursor + 1).indexOf(MARKER) === -1;
21655
+ let i = Math.min(limit, cursor + 1);
21644
21656
 
21645
21657
  for (; i <= limit; i++) {
21646
21658
  if (localMaskMarked[ i - 1 ] === MARKER) {
21647
- end = i;
21648
- end > 0 && noMarkBefore === true && end--;
21659
+ cursor = i;
21660
+ cursor > 0 && noMarkBefore === true && cursor--;
21649
21661
  break
21650
21662
  }
21651
21663
  }
21652
21664
 
21653
21665
  if (
21654
21666
  i > limit
21655
- && localMaskMarked[ end - 1 ] !== void 0
21656
- && localMaskMarked[ end - 1 ] !== MARKER
21667
+ && localMaskMarked[ cursor - 1 ] !== void 0
21668
+ && localMaskMarked[ cursor - 1 ] !== MARKER
21657
21669
  ) {
21658
- return moveCursor.leftReverse(inp, limit, limit)
21670
+ return moveCursor.leftReverse(inp, limit)
21659
21671
  }
21660
21672
 
21661
- inp.setSelectionRange(selection === true ? start : end, end, 'forward');
21673
+ inp.setSelectionRange(cursor, cursor, 'forward');
21662
21674
  }
21663
21675
  };
21664
21676
 
21677
+ function onMaskedClick (e) {
21678
+ emit('click', e);
21679
+
21680
+ selectionAnchor = void 0;
21681
+ }
21682
+
21665
21683
  function onMaskedKeydown (e) {
21666
21684
  emit('keydown', e);
21667
21685
 
@@ -21674,25 +21692,38 @@
21674
21692
  start = inp.selectionStart,
21675
21693
  end = inp.selectionEnd;
21676
21694
 
21695
+ if (!e.shiftKey) {
21696
+ selectionAnchor = void 0;
21697
+ }
21698
+
21677
21699
  if (e.keyCode === 37 || e.keyCode === 39) { // Left / Right
21700
+ if (e.shiftKey && selectionAnchor === void 0) {
21701
+ selectionAnchor = inp.selectionDirection === 'forward' ? start : end;
21702
+ }
21703
+
21678
21704
  const fn = moveCursor[ (e.keyCode === 39 ? 'right' : 'left') + (props.reverseFillMask === true ? 'Reverse' : '') ];
21679
21705
 
21680
21706
  e.preventDefault();
21681
- fn(inp, start, end, e.shiftKey);
21707
+ fn(inp, selectionAnchor === start ? end : start);
21708
+
21709
+ if (e.shiftKey) {
21710
+ const cursor = inp.selectionStart;
21711
+ inp.setSelectionRange(Math.min(selectionAnchor, cursor), Math.max(selectionAnchor, cursor), 'forward');
21712
+ }
21682
21713
  }
21683
21714
  else if (
21684
21715
  e.keyCode === 8 // Backspace
21685
21716
  && props.reverseFillMask !== true
21686
21717
  && start === end
21687
21718
  ) {
21688
- moveCursor.left(inp, start, end, true);
21719
+ moveCursor.left(inp, start);
21689
21720
  }
21690
21721
  else if (
21691
21722
  e.keyCode === 46 // Delete
21692
21723
  && props.reverseFillMask === true
21693
21724
  && start === end
21694
21725
  ) {
21695
- moveCursor.rightReverse(inp, start, end, true);
21726
+ moveCursor.rightReverse(inp, end);
21696
21727
  }
21697
21728
  }
21698
21729
 
@@ -21783,7 +21814,8 @@
21783
21814
  hasMask,
21784
21815
  moveCursorForPaste,
21785
21816
  updateMaskValue,
21786
- onMaskedKeydown
21817
+ onMaskedKeydown,
21818
+ onMaskedClick
21787
21819
  }
21788
21820
  }
21789
21821
 
@@ -21845,7 +21877,7 @@
21845
21877
  emits: [
21846
21878
  ...useFieldEmits,
21847
21879
  'paste', 'change',
21848
- 'keydown', 'animationend'
21880
+ 'keydown', 'click', 'animationend'
21849
21881
  ],
21850
21882
 
21851
21883
  setup (props, { emit, attrs }) {
@@ -21863,7 +21895,8 @@
21863
21895
  hasMask,
21864
21896
  moveCursorForPaste,
21865
21897
  updateMaskValue,
21866
- onMaskedKeydown
21898
+ onMaskedKeydown,
21899
+ onMaskedClick
21867
21900
  } = useMask(props, emit, emitValue, inputRef);
21868
21901
 
21869
21902
  const formDomProps = useFileFormDomProps(props, /* type guard */ true);
@@ -21900,6 +21933,8 @@
21900
21933
 
21901
21934
  if (hasMask.value === true) {
21902
21935
  evt.onKeydown = onMaskedKeydown;
21936
+ // reset selection anchor on pointer selection
21937
+ evt.onClick = onMaskedClick;
21903
21938
  }
21904
21939
 
21905
21940
  if (props.autogrow === true) {
@@ -22109,18 +22144,29 @@
22109
22144
  const inp = inputRef.value;
22110
22145
  if (inp !== null) {
22111
22146
  const parentStyle = inp.parentNode.style;
22112
- const { overflow } = inp.style;
22147
+ // chrome does not keep scroll #15498
22148
+ const { scrollTop } = inp;
22149
+ // chrome calculates a smaller scrollHeight when in a .column container
22150
+ const { overflowY, maxHeight } = $q.platform.is.firefox === true
22151
+ ? {}
22152
+ : window.getComputedStyle(inp);
22153
+ // on firefox or if overflowY is specified as scroll #14263, #14344
22154
+ // we don't touch overflow
22155
+ // firefox is not so bad in the end
22156
+ const changeOverflow = overflowY !== void 0 && overflowY !== 'scroll';
22113
22157
 
22114
22158
  // reset height of textarea to a small size to detect the real height
22115
22159
  // but keep the total control size the same
22116
- // Firefox rulez #14263, #14344
22117
- $q.platform.is.firefox !== true && (inp.style.overflow = 'hidden');
22160
+ changeOverflow === true && (inp.style.overflowY = 'hidden');
22118
22161
  parentStyle.marginBottom = (inp.scrollHeight - 1) + 'px';
22119
22162
  inp.style.height = '1px';
22120
22163
 
22121
22164
  inp.style.height = inp.scrollHeight + 'px';
22122
- inp.style.overflow = overflow;
22165
+ // we should allow scrollbars only
22166
+ // if there is maxHeight and content is taller than maxHeight
22167
+ changeOverflow === true && (inp.style.overflowY = parseInt(maxHeight, 10) < inp.scrollHeight ? 'auto' : 'hidden');
22123
22168
  parentStyle.marginBottom = '';
22169
+ inp.scrollTop = scrollTop;
22124
22170
  }
22125
22171
  });
22126
22172
  }
@@ -22197,7 +22243,10 @@
22197
22243
  hasValue,
22198
22244
 
22199
22245
  floatingLabel: vue.computed(() =>
22200
- hasValue.value === true
22246
+ (
22247
+ hasValue.value === true
22248
+ && (props.type !== 'number' || isNaN(innerValue.value) === false)
22249
+ )
22201
22250
  || fieldValueIsFilled(props.displayValue)
22202
22251
  ),
22203
22252
 
@@ -28580,7 +28629,8 @@
28580
28629
 
28581
28630
  return vue.h('div', {
28582
28631
  class: 'q-field__native row items-center',
28583
- ...attrs
28632
+ ...attrs,
28633
+ ...state.splitAttrs.listeners.value
28584
28634
  }, child)
28585
28635
  },
28586
28636
 
@@ -32868,7 +32918,7 @@
32868
32918
 
32869
32919
  if (topLeft !== void 0) {
32870
32920
  child.push(
32871
- vue.h('div', { class: 'q-table-control' }, [
32921
+ vue.h('div', { class: 'q-table__control' }, [
32872
32922
  topLeft(marginalsScope.value)
32873
32923
  ])
32874
32924
  );
@@ -35138,7 +35188,7 @@
35138
35188
  }
35139
35189
 
35140
35190
  function onClick (node, meta, e, keyboard) {
35141
- keyboard !== true && blur(meta.key);
35191
+ keyboard !== true && meta.selectable !== false && blur(meta.key);
35142
35192
 
35143
35193
  if (hasSelection.value && meta.selectable) {
35144
35194
  if (props.noSelectionUnset === false) {
@@ -35161,7 +35211,7 @@
35161
35211
  if (e !== void 0) {
35162
35212
  stopAndPrevent(e);
35163
35213
  }
35164
- keyboard !== true && blur(meta.key);
35214
+ keyboard !== true && meta.selectable !== false && blur(meta.key);
35165
35215
  setExpanded(meta.key, !meta.expanded, node, meta);
35166
35216
  }
35167
35217
 
@@ -38332,6 +38382,7 @@
38332
38382
  'q-bottom-sheet__item q-hoverable q-focusable cursor-pointer relative-position',
38333
38383
  action.class
38334
38384
  ],
38385
+ style: action.style,
38335
38386
  tabindex: 0,
38336
38387
  role: 'listitem',
38337
38388
  onClick () { onOk(action); },
@@ -38363,6 +38414,7 @@
38363
38414
  ? vue.h(QSeparator, { spaced: true, dark: isDark.value })
38364
38415
  : vue.h(QItem, {
38365
38416
  class: [ 'q-bottom-sheet__item', action.classes ],
38417
+ style: action.style,
38366
38418
  tabindex: 0,
38367
38419
  clickable: true,
38368
38420
  dark: isDark.value,
@@ -40778,7 +40830,7 @@
40778
40830
  */
40779
40831
 
40780
40832
  var index_umd = {
40781
- version: '2.11.6',
40833
+ version: '2.11.8',
40782
40834
  install (app, opts) {
40783
40835
  installQuasar(app, {
40784
40836
  components,