quasar 2.11.7 → 2.11.9

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 (163) hide show
  1. package/dist/api/QCarousel.json +9 -0
  2. package/dist/api/QEditor.json +57 -0
  3. package/dist/api/QTable.json +9 -0
  4. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  5. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  6. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  7. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  8. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  9. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  10. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  11. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  12. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  13. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  14. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  15. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  16. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  17. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  18. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  19. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  20. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  21. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  22. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  23. package/dist/icon-set/mdi-v7.umd.prod.js +1 -1
  24. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  25. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  26. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  27. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  28. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  29. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  30. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
  39. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  40. package/dist/icon-set/svg-mdi-v7.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  42. package/dist/icon-set/themify.umd.prod.js +1 -1
  43. package/dist/lang/ar-TN.umd.prod.js +1 -1
  44. package/dist/lang/ar.umd.prod.js +1 -1
  45. package/dist/lang/az-Latn.umd.prod.js +1 -1
  46. package/dist/lang/bg.umd.prod.js +1 -1
  47. package/dist/lang/bn.umd.prod.js +1 -1
  48. package/dist/lang/ca.umd.prod.js +1 -1
  49. package/dist/lang/cs.umd.prod.js +1 -1
  50. package/dist/lang/da.umd.prod.js +1 -1
  51. package/dist/lang/de.umd.prod.js +1 -1
  52. package/dist/lang/el.umd.prod.js +1 -1
  53. package/dist/lang/en-GB.umd.prod.js +1 -1
  54. package/dist/lang/en-US.umd.prod.js +1 -1
  55. package/dist/lang/eo.umd.prod.js +1 -1
  56. package/dist/lang/es.umd.prod.js +1 -1
  57. package/dist/lang/et.umd.prod.js +1 -1
  58. package/dist/lang/eu.umd.prod.js +1 -1
  59. package/dist/lang/fa-IR.umd.prod.js +1 -1
  60. package/dist/lang/fa.umd.prod.js +1 -1
  61. package/dist/lang/fi.umd.prod.js +1 -1
  62. package/dist/lang/fr.umd.prod.js +1 -1
  63. package/dist/lang/gn.umd.prod.js +1 -1
  64. package/dist/lang/he.umd.prod.js +1 -1
  65. package/dist/lang/hr.umd.prod.js +1 -1
  66. package/dist/lang/hu.umd.prod.js +1 -1
  67. package/dist/lang/id.umd.prod.js +1 -1
  68. package/dist/lang/is.umd.prod.js +1 -1
  69. package/dist/lang/it.umd.prod.js +1 -1
  70. package/dist/lang/ja.umd.prod.js +2 -2
  71. package/dist/lang/kk.umd.prod.js +1 -1
  72. package/dist/lang/km.umd.prod.js +1 -1
  73. package/dist/lang/ko-KR.umd.prod.js +1 -1
  74. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  75. package/dist/lang/lt.umd.prod.js +1 -1
  76. package/dist/lang/lu.umd.prod.js +1 -1
  77. package/dist/lang/lv.umd.prod.js +1 -1
  78. package/dist/lang/ml.umd.prod.js +1 -1
  79. package/dist/lang/mm.umd.prod.js +1 -1
  80. package/dist/lang/ms.umd.prod.js +1 -1
  81. package/dist/lang/my.umd.prod.js +1 -1
  82. package/dist/lang/nb-NO.umd.prod.js +1 -1
  83. package/dist/lang/nl.umd.prod.js +1 -1
  84. package/dist/lang/pl.umd.prod.js +1 -1
  85. package/dist/lang/pt-BR.umd.prod.js +1 -1
  86. package/dist/lang/pt.umd.prod.js +1 -1
  87. package/dist/lang/ro.umd.prod.js +1 -1
  88. package/dist/lang/ru.umd.prod.js +1 -1
  89. package/dist/lang/sk.umd.prod.js +1 -1
  90. package/dist/lang/sl.umd.prod.js +1 -1
  91. package/dist/lang/sm.umd.prod.js +1 -1
  92. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  93. package/dist/lang/sr.umd.prod.js +1 -1
  94. package/dist/lang/sv.umd.prod.js +1 -1
  95. package/dist/lang/ta.umd.prod.js +1 -1
  96. package/dist/lang/th.umd.prod.js +1 -1
  97. package/dist/lang/tr.umd.prod.js +1 -1
  98. package/dist/lang/ug.umd.prod.js +1 -1
  99. package/dist/lang/uk.umd.prod.js +1 -1
  100. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  101. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  102. package/dist/lang/vi.umd.prod.js +1 -1
  103. package/dist/lang/zh-CN.umd.prod.js +1 -1
  104. package/dist/lang/zh-TW.umd.prod.js +1 -1
  105. package/dist/quasar.cjs.prod.js +2 -2
  106. package/dist/quasar.css +2 -2
  107. package/dist/quasar.esm.js +121 -64
  108. package/dist/quasar.esm.prod.js +2 -2
  109. package/dist/quasar.prod.css +1 -1
  110. package/dist/quasar.rtl.css +2 -2
  111. package/dist/quasar.rtl.prod.css +1 -1
  112. package/dist/quasar.sass +17 -5
  113. package/dist/quasar.umd.js +121 -64
  114. package/dist/quasar.umd.prod.js +2 -2
  115. package/dist/types/index.d.ts +43 -0
  116. package/dist/web-types/web-types.json +102 -1
  117. package/lang/ja.js +1 -1
  118. package/lang/ja.mjs +1 -1
  119. package/package.json +9 -6
  120. package/src/components/avatar/__tests__/{QAvatar.spec.js → QAvatar.cy.js} +7 -8
  121. package/src/components/badge/__tests__/{QBadge.spec.js → QBadge.cy.js} +1 -2
  122. package/src/components/banner/__tests__/{QBanner.spec.js → QBanner.cy.js} +7 -8
  123. package/src/components/bar/__tests__/{QBar.spec.js → QBar.cy.js} +3 -4
  124. package/src/components/breadcrumbs/__tests__/{QBreadcrumbs.spec.js → QBreadcrumbs.cy.js} +8 -9
  125. package/src/components/breadcrumbs/__tests__/{QBreadcrumbsEl.spec.js → QBreadcrumbsEl.cy.js} +5 -6
  126. package/src/components/btn/__tests__/{QBtn.spec.js → QBtn.cy.js} +4 -5
  127. package/src/components/btn/__tests__/{use-btn.spec.js → use-btn.cy.js} +1 -2
  128. package/src/components/chip/__tests__/{QChip.spec.js → QChip.cy.js} +1 -2
  129. package/src/components/editor/QEditor.js +12 -1
  130. package/src/components/editor/QEditor.json +50 -0
  131. package/src/components/editor/editor-utils.js +5 -1
  132. package/src/components/field/QField.sass +16 -4
  133. package/src/components/input/QInput.js +24 -7
  134. package/src/components/input/use-mask.js +74 -50
  135. package/src/components/menu/__tests__/{QMenu.spec.js → QMenu.cy.js} +29 -30
  136. package/src/components/select/QSelect.js +2 -1
  137. package/src/components/select/__tests__/{QSelect.spec.js → QSelect.cy.js} +2 -3
  138. package/src/components/table/QTable.js +1 -1
  139. package/src/components/uploader/__tests__/{QUploader.spec.js → QUploader.cy.js} +1 -2
  140. package/src/composables/private/__tests__/{use-anchor.spec.js → use-anchor.cy.js} +7 -8
  141. package/src/composables/private/__tests__/{use-field.spec.js → use-field.cy.js} +7 -8
  142. package/src/composables/private/__tests__/{use-model-toggle.spec.js → use-model-toggle.cy.js} +17 -18
  143. package/src/composables/private/__tests__/{use-size.spec.js → use-size.cy.js} +4 -5
  144. package/src/composables/private/__tests__/{use-transition.spec.js → use-transition.cy.js} +9 -10
  145. package/src/composables/private/__tests__/{use-validate.spec.js → use-validate.cy.js} +5 -6
  146. package/src/composables/private/use-fullscreen.json +12 -0
  147. /package/src/components/date/__tests__/{QDate.spec.js → QDate.cy.js} +0 -0
  148. /package/src/components/dialog/__tests__/{QDialog.spec.js → QDialog.cy.js} +0 -0
  149. /package/src/components/editor/__tests__/{QEditor.spec.js → QEditor.cy.js} +0 -0
  150. /package/src/components/input/__tests__/{QInput.spec.js → QInput.cy.js} +0 -0
  151. /package/src/components/input/__tests__/{use-mask.spec.js → use-mask.cy.js} +0 -0
  152. /package/src/components/table/__tests__/{QTable.spec.js → QTable.cy.js} +0 -0
  153. /package/src/components/table/__tests__/{QTd.spec.js → QTd.cy.js} +0 -0
  154. /package/src/components/table/__tests__/{QTh.spec.js → QTh.cy.js} +0 -0
  155. /package/src/components/table/__tests__/{QTr.spec.js → QTr.cy.js} +0 -0
  156. /package/src/components/tabs/__tests__/{QRouteTab.spec.js → QRouteTab.cy.js} +0 -0
  157. /package/src/components/tabs/__tests__/{QTab.spec.js → QTab.cy.js} +0 -0
  158. /package/src/components/tabs/__tests__/{QTabs.spec.js → QTabs.cy.js} +0 -0
  159. /package/src/composables/private/__tests__/{use-file.spec.js → use-file.cy.js} +0 -0
  160. /package/src/composables/private/__tests__/{use-form.spec.js → use-form.cy.js} +0 -0
  161. /package/src/composables/private/__tests__/{use-fullscreen.spec.js → use-fullscreen.cy.js} +0 -0
  162. /package/src/composables/private/__tests__/{use-portal.spec.js → use-portal.cy.js} +0 -0
  163. /package/src/composables/private/__tests__/{use-router-link.spec.js → use-router-link.cy.js} +0 -0
package/dist/quasar.css CHANGED
@@ -2269,7 +2269,7 @@ body.q-ios-padding .q-dialog__inner > div {
2269
2269
  .q-field__native:-webkit-autofill + .q-field__label, .q-field__input:-webkit-autofill + .q-field__label {
2270
2270
  transform: translateY(-40%) scale(0.75);
2271
2271
  }
2272
- .q-field__native[type=number]:invalid + .q-field__label, .q-field__input[type=number]:invalid + .q-field__label {
2272
+ .q-field__native[type=color] + .q-field__label, .q-field__native[type=date] + .q-field__label, .q-field__native[type=datetime-local] + .q-field__label, .q-field__native[type=month] + .q-field__label, .q-field__native[type=time] + .q-field__label, .q-field__native[type=week] + .q-field__label, .q-field__input[type=color] + .q-field__label, .q-field__input[type=date] + .q-field__label, .q-field__input[type=datetime-local] + .q-field__label, .q-field__input[type=month] + .q-field__label, .q-field__input[type=time] + .q-field__label, .q-field__input[type=week] + .q-field__label {
2273
2273
  transform: translateY(-40%) scale(0.75);
2274
2274
  }
2275
2275
  .q-field__native:invalid, .q-field__input:invalid {
@@ -2549,7 +2549,7 @@ body.q-ios-padding .q-dialog__inner > div {
2549
2549
  .q-field--dense .q-field__native:-webkit-autofill + .q-field__label, .q-field--dense .q-field__input:-webkit-autofill + .q-field__label {
2550
2550
  transform: translateY(-30%) scale(0.75);
2551
2551
  }
2552
- .q-field--dense .q-field__native[type=number]:invalid + .q-field__label, .q-field--dense .q-field__input[type=number]:invalid + .q-field__label {
2552
+ .q-field--dense .q-field__native[type=color] + .q-field__label, .q-field--dense .q-field__native[type=date] + .q-field__label, .q-field--dense .q-field__native[type=datetime-local] + .q-field__label, .q-field--dense .q-field__native[type=month] + .q-field__label, .q-field--dense .q-field__native[type=time] + .q-field__label, .q-field--dense .q-field__native[type=week] + .q-field__label, .q-field--dense .q-field__input[type=color] + .q-field__label, .q-field--dense .q-field__input[type=date] + .q-field__label, .q-field--dense .q-field__input[type=datetime-local] + .q-field__label, .q-field--dense .q-field__input[type=month] + .q-field__label, .q-field--dense .q-field__input[type=time] + .q-field__label, .q-field--dense .q-field__input[type=week] + .q-field__label {
2553
2553
  transform: translateY(-30%) scale(0.75);
2554
2554
  }
2555
2555
  .q-field--borderless .q-field__bottom, .q-field--borderless.q-field--dense .q-field__control, .q-field--standard .q-field__bottom, .q-field--standard.q-field--dense .q-field__control {
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.11.7
2
+ * Quasar Framework v2.11.9
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -1651,7 +1651,7 @@ function prepareApp (app, uiOpts, pluginOpts) {
1651
1651
  }
1652
1652
 
1653
1653
  var installQuasar = function (parentApp, opts = {}) {
1654
- const $q = { version: '2.11.7' };
1654
+ const $q = { version: '2.11.9' };
1655
1655
 
1656
1656
  if (globalConfigIsFrozen === false) {
1657
1657
  if (opts.config !== void 0) {
@@ -16910,7 +16910,11 @@ function getDropdown (eVm, btn) {
16910
16910
  textColor: highlight && !eVm.props.toolbarPush ? null : eVm.props.toolbarTextColor,
16911
16911
  label: btn.fixedLabel ? btn.label : label,
16912
16912
  icon: btn.fixedIcon ? (btn.icon !== null ? btn.icon : void 0) : icon,
16913
- contentClass
16913
+ contentClass,
16914
+ onShow: evt => eVm.emit('dropdownShow', evt),
16915
+ onHide: evt => eVm.emit('dropdownHide', evt),
16916
+ onBeforeShow: evt => eVm.emit('dropdownBeforeShow', evt),
16917
+ onBeforeHide: evt => eVm.emit('dropdownBeforeHide', evt)
16914
16918
  }, () => Items);
16915
16919
 
16916
16920
  return Dropdown
@@ -17222,7 +17226,13 @@ var QEditor = createComponent({
17222
17226
  ...useFullscreenEmits,
17223
17227
  'update:modelValue',
17224
17228
  'keydown', 'click', 'mouseup', 'keyup', 'touchend',
17225
- 'focus', 'blur'
17229
+ 'focus', 'blur',
17230
+ 'dropdownShow',
17231
+ 'dropdownHide',
17232
+ 'dropdownBeforeShow',
17233
+ 'dropdownBeforeHide',
17234
+ 'linkShow',
17235
+ 'linkHide'
17226
17236
  ],
17227
17237
 
17228
17238
  setup (props, { slots, emit, attrs }) {
@@ -17379,6 +17389,7 @@ var QEditor = createComponent({
17379
17389
  $q,
17380
17390
  props,
17381
17391
  slots,
17392
+ emit,
17382
17393
  // caret (will get injected after mount)
17383
17394
  inFullscreen,
17384
17395
  toggleFullscreen,
@@ -17399,6 +17410,10 @@ var QEditor = createComponent({
17399
17410
  }
17400
17411
  });
17401
17412
 
17413
+ watch(editLinkUrl, v => {
17414
+ emit(`link-${ v ? 'Show' : 'Hide' }`);
17415
+ });
17416
+
17402
17417
  const hasToolbar = computed(() => props.toolbar && props.toolbar.length > 0);
17403
17418
 
17404
17419
  const keys = computed(() => {
@@ -21291,7 +21306,7 @@ const useMaskProps = {
21291
21306
  };
21292
21307
 
21293
21308
  function useMask (props, emit, emitValue, inputRef) {
21294
- let maskMarked, maskReplaced, computedMask, computedUnmask;
21309
+ let maskMarked, maskReplaced, computedMask, computedUnmask, pastedTextStart, selectionAnchor;
21295
21310
 
21296
21311
  const hasMask = ref(null);
21297
21312
  const innerValue = ref(getInitialMaskedValue());
@@ -21493,8 +21508,15 @@ function useMask (props, emit, emitValue, inputRef) {
21493
21508
  }
21494
21509
 
21495
21510
  if (inputType === 'insertFromPaste' && props.reverseFillMask !== true) {
21496
- const cursor = end - 1;
21497
- moveCursor.right(inp, cursor, cursor);
21511
+ const maxEnd = inp.selectionEnd;
21512
+ let cursor = end - 1;
21513
+ // each non-marker char means we move once to right
21514
+ for (let i = pastedTextStart; i <= cursor && i < maxEnd; i++) {
21515
+ if (maskMarked[ i ] !== MARKER) {
21516
+ cursor++;
21517
+ }
21518
+ }
21519
+ moveCursor.right(inp, cursor);
21498
21520
 
21499
21521
  return
21500
21522
  }
@@ -21520,7 +21542,7 @@ function useMask (props, emit, emitValue, inputRef) {
21520
21542
  inp.setSelectionRange(cursor, cursor, 'forward');
21521
21543
  }
21522
21544
  else {
21523
- moveCursor.rightReverse(inp, cursor, cursor);
21545
+ moveCursor.rightReverse(inp, cursor);
21524
21546
  }
21525
21547
  }
21526
21548
  else {
@@ -21531,11 +21553,11 @@ function useMask (props, emit, emitValue, inputRef) {
21531
21553
  else {
21532
21554
  if (changed === true) {
21533
21555
  const cursor = Math.max(0, maskMarked.indexOf(MARKER), Math.min(preMasked.length, end) - 1);
21534
- moveCursor.right(inp, cursor, cursor);
21556
+ moveCursor.right(inp, cursor);
21535
21557
  }
21536
21558
  else {
21537
21559
  const cursor = end - 1;
21538
- moveCursor.right(inp, cursor, cursor);
21560
+ moveCursor.right(inp, cursor);
21539
21561
  }
21540
21562
  }
21541
21563
  });
@@ -21551,74 +21573,72 @@ function useMask (props, emit, emitValue, inputRef) {
21551
21573
  const preMasked = maskValue(unmaskValue(inp.value));
21552
21574
 
21553
21575
  start = Math.max(0, maskMarked.indexOf(MARKER), Math.min(preMasked.length, start));
21576
+ pastedTextStart = start;
21554
21577
 
21555
21578
  inp.setSelectionRange(start, end, 'forward');
21556
21579
  }
21557
21580
 
21558
21581
  const moveCursor = {
21559
- left (inp, start, end, selection) {
21560
- const noMarkBefore = maskMarked.slice(start - 1).indexOf(MARKER) === -1;
21561
- let i = Math.max(0, start - 1);
21582
+ left (inp, cursor) {
21583
+ const noMarkBefore = maskMarked.slice(cursor - 1).indexOf(MARKER) === -1;
21584
+ let i = Math.max(0, cursor - 1);
21562
21585
 
21563
21586
  for (; i >= 0; i--) {
21564
21587
  if (maskMarked[ i ] === MARKER) {
21565
- start = i;
21566
- noMarkBefore === true && start++;
21588
+ cursor = i;
21589
+ noMarkBefore === true && cursor++;
21567
21590
  break
21568
21591
  }
21569
21592
  }
21570
21593
 
21571
21594
  if (
21572
21595
  i < 0
21573
- && maskMarked[ start ] !== void 0
21574
- && maskMarked[ start ] !== MARKER
21596
+ && maskMarked[ cursor ] !== void 0
21597
+ && maskMarked[ cursor ] !== MARKER
21575
21598
  ) {
21576
- return moveCursor.right(inp, 0, 0)
21599
+ return moveCursor.right(inp, 0)
21577
21600
  }
21578
21601
 
21579
- start >= 0 && inp.setSelectionRange(
21580
- start,
21581
- selection === true ? end : start, 'backward'
21582
- );
21602
+ cursor >= 0 && inp.setSelectionRange(cursor, cursor, 'backward');
21583
21603
  },
21584
21604
 
21585
- right (inp, start, end, selection) {
21605
+ right (inp, cursor) {
21586
21606
  const limit = inp.value.length;
21587
- let i = Math.min(limit, end + 1);
21607
+ let i = Math.min(limit, cursor + 1);
21588
21608
 
21589
21609
  for (; i <= limit; i++) {
21590
21610
  if (maskMarked[ i ] === MARKER) {
21591
- end = i;
21611
+ cursor = i;
21592
21612
  break
21593
21613
  }
21594
21614
  else if (maskMarked[ i - 1 ] === MARKER) {
21595
- end = i;
21615
+ cursor = i;
21596
21616
  }
21597
21617
  }
21598
21618
 
21599
21619
  if (
21600
21620
  i > limit
21601
- && maskMarked[ end - 1 ] !== void 0
21602
- && maskMarked[ end - 1 ] !== MARKER
21621
+ && maskMarked[ cursor - 1 ] !== void 0
21622
+ && maskMarked[ cursor - 1 ] !== MARKER
21603
21623
  ) {
21604
- return moveCursor.left(inp, limit, limit)
21624
+ return moveCursor.left(inp, limit)
21605
21625
  }
21606
21626
 
21607
- inp.setSelectionRange(selection ? start : end, end, 'forward');
21627
+ inp.setSelectionRange(cursor, cursor, 'forward');
21608
21628
  },
21609
21629
 
21610
- leftReverse (inp, start, end, selection) {
21630
+ leftReverse (inp, cursor) {
21611
21631
  const
21612
21632
  localMaskMarked = getPaddedMaskMarked(inp.value.length);
21613
- let i = Math.max(0, start - 1);
21633
+ let i = Math.max(0, cursor - 1);
21614
21634
 
21615
21635
  for (; i >= 0; i--) {
21616
21636
  if (localMaskMarked[ i - 1 ] === MARKER) {
21617
- start = i;
21637
+ cursor = i;
21618
21638
  break
21619
21639
  }
21620
21640
  else if (localMaskMarked[ i ] === MARKER) {
21621
- start = i;
21641
+ cursor = i;
21622
21642
  if (i === 0) {
21623
21643
  break
21624
21644
  }
@@ -21627,45 +21647,48 @@ function useMask (props, emit, emitValue, inputRef) {
21627
21647
 
21628
21648
  if (
21629
21649
  i < 0
21630
- && localMaskMarked[ start ] !== void 0
21631
- && localMaskMarked[ start ] !== MARKER
21650
+ && localMaskMarked[ cursor ] !== void 0
21651
+ && localMaskMarked[ cursor ] !== MARKER
21632
21652
  ) {
21633
- return moveCursor.rightReverse(inp, 0, 0)
21653
+ return moveCursor.rightReverse(inp, 0)
21634
21654
  }
21635
21655
 
21636
- start >= 0 && inp.setSelectionRange(
21637
- start,
21638
- selection === true ? end : start, 'backward'
21639
- );
21656
+ cursor >= 0 && inp.setSelectionRange(cursor, cursor, 'backward');
21640
21657
  },
21641
21658
 
21642
- rightReverse (inp, start, end, selection) {
21659
+ rightReverse (inp, cursor) {
21643
21660
  const
21644
21661
  limit = inp.value.length,
21645
21662
  localMaskMarked = getPaddedMaskMarked(limit),
21646
- noMarkBefore = localMaskMarked.slice(0, end + 1).indexOf(MARKER) === -1;
21647
- let i = Math.min(limit, end + 1);
21663
+ noMarkBefore = localMaskMarked.slice(0, cursor + 1).indexOf(MARKER) === -1;
21664
+ let i = Math.min(limit, cursor + 1);
21648
21665
 
21649
21666
  for (; i <= limit; i++) {
21650
21667
  if (localMaskMarked[ i - 1 ] === MARKER) {
21651
- end = i;
21652
- end > 0 && noMarkBefore === true && end--;
21668
+ cursor = i;
21669
+ cursor > 0 && noMarkBefore === true && cursor--;
21653
21670
  break
21654
21671
  }
21655
21672
  }
21656
21673
 
21657
21674
  if (
21658
21675
  i > limit
21659
- && localMaskMarked[ end - 1 ] !== void 0
21660
- && localMaskMarked[ end - 1 ] !== MARKER
21676
+ && localMaskMarked[ cursor - 1 ] !== void 0
21677
+ && localMaskMarked[ cursor - 1 ] !== MARKER
21661
21678
  ) {
21662
- return moveCursor.leftReverse(inp, limit, limit)
21679
+ return moveCursor.leftReverse(inp, limit)
21663
21680
  }
21664
21681
 
21665
- inp.setSelectionRange(selection === true ? start : end, end, 'forward');
21682
+ inp.setSelectionRange(cursor, cursor, 'forward');
21666
21683
  }
21667
21684
  };
21668
21685
 
21686
+ function onMaskedClick (e) {
21687
+ emit('click', e);
21688
+
21689
+ selectionAnchor = void 0;
21690
+ }
21691
+
21669
21692
  function onMaskedKeydown (e) {
21670
21693
  emit('keydown', e);
21671
21694
 
@@ -21678,25 +21701,40 @@ function useMask (props, emit, emitValue, inputRef) {
21678
21701
  start = inp.selectionStart,
21679
21702
  end = inp.selectionEnd;
21680
21703
 
21704
+ if (!e.shiftKey) {
21705
+ selectionAnchor = void 0;
21706
+ }
21707
+
21681
21708
  if (e.keyCode === 37 || e.keyCode === 39) { // Left / Right
21709
+ if (e.shiftKey && selectionAnchor === void 0) {
21710
+ selectionAnchor = inp.selectionDirection === 'forward' ? start : end;
21711
+ }
21712
+
21682
21713
  const fn = moveCursor[ (e.keyCode === 39 ? 'right' : 'left') + (props.reverseFillMask === true ? 'Reverse' : '') ];
21683
21714
 
21684
21715
  e.preventDefault();
21685
- fn(inp, start, end, e.shiftKey);
21716
+ fn(inp, selectionAnchor === start ? end : start);
21717
+
21718
+ if (e.shiftKey) {
21719
+ const cursor = inp.selectionStart;
21720
+ inp.setSelectionRange(Math.min(selectionAnchor, cursor), Math.max(selectionAnchor, cursor), 'forward');
21721
+ }
21686
21722
  }
21687
21723
  else if (
21688
21724
  e.keyCode === 8 // Backspace
21689
21725
  && props.reverseFillMask !== true
21690
21726
  && start === end
21691
21727
  ) {
21692
- moveCursor.left(inp, start, end, true);
21728
+ moveCursor.left(inp, start);
21729
+ inp.setSelectionRange(inp.selectionStart, end, 'backward');
21693
21730
  }
21694
21731
  else if (
21695
21732
  e.keyCode === 46 // Delete
21696
21733
  && props.reverseFillMask === true
21697
21734
  && start === end
21698
21735
  ) {
21699
- moveCursor.rightReverse(inp, start, end, true);
21736
+ moveCursor.rightReverse(inp, end);
21737
+ inp.setSelectionRange(start, inp.selectionEnd, 'forward');
21700
21738
  }
21701
21739
  }
21702
21740
 
@@ -21787,7 +21825,8 @@ function useMask (props, emit, emitValue, inputRef) {
21787
21825
  hasMask,
21788
21826
  moveCursorForPaste,
21789
21827
  updateMaskValue,
21790
- onMaskedKeydown
21828
+ onMaskedKeydown,
21829
+ onMaskedClick
21791
21830
  }
21792
21831
  }
21793
21832
 
@@ -21849,7 +21888,7 @@ var QInput = createComponent({
21849
21888
  emits: [
21850
21889
  ...useFieldEmits,
21851
21890
  'paste', 'change',
21852
- 'keydown', 'animationend'
21891
+ 'keydown', 'click', 'animationend'
21853
21892
  ],
21854
21893
 
21855
21894
  setup (props, { emit, attrs }) {
@@ -21867,7 +21906,8 @@ var QInput = createComponent({
21867
21906
  hasMask,
21868
21907
  moveCursorForPaste,
21869
21908
  updateMaskValue,
21870
- onMaskedKeydown
21909
+ onMaskedKeydown,
21910
+ onMaskedClick
21871
21911
  } = useMask(props, emit, emitValue, inputRef);
21872
21912
 
21873
21913
  const formDomProps = useFileFormDomProps(props, /* type guard */ true);
@@ -21904,6 +21944,8 @@ var QInput = createComponent({
21904
21944
 
21905
21945
  if (hasMask.value === true) {
21906
21946
  evt.onKeydown = onMaskedKeydown;
21947
+ // reset selection anchor on pointer selection
21948
+ evt.onClick = onMaskedClick;
21907
21949
  }
21908
21950
 
21909
21951
  if (props.autogrow === true) {
@@ -22113,18 +22155,29 @@ var QInput = createComponent({
22113
22155
  const inp = inputRef.value;
22114
22156
  if (inp !== null) {
22115
22157
  const parentStyle = inp.parentNode.style;
22116
- const { overflow } = inp.style;
22158
+ // chrome does not keep scroll #15498
22159
+ const { scrollTop } = inp;
22160
+ // chrome calculates a smaller scrollHeight when in a .column container
22161
+ const { overflowY, maxHeight } = $q.platform.is.firefox === true
22162
+ ? {}
22163
+ : window.getComputedStyle(inp);
22164
+ // on firefox or if overflowY is specified as scroll #14263, #14344
22165
+ // we don't touch overflow
22166
+ // firefox is not so bad in the end
22167
+ const changeOverflow = overflowY !== void 0 && overflowY !== 'scroll';
22117
22168
 
22118
22169
  // reset height of textarea to a small size to detect the real height
22119
22170
  // but keep the total control size the same
22120
- // Firefox rulez #14263, #14344
22121
- $q.platform.is.firefox !== true && (inp.style.overflow = 'hidden');
22171
+ changeOverflow === true && (inp.style.overflowY = 'hidden');
22122
22172
  parentStyle.marginBottom = (inp.scrollHeight - 1) + 'px';
22123
22173
  inp.style.height = '1px';
22124
22174
 
22125
22175
  inp.style.height = inp.scrollHeight + 'px';
22126
- inp.style.overflow = overflow;
22176
+ // we should allow scrollbars only
22177
+ // if there is maxHeight and content is taller than maxHeight
22178
+ changeOverflow === true && (inp.style.overflowY = parseInt(maxHeight, 10) < inp.scrollHeight ? 'auto' : 'hidden');
22127
22179
  parentStyle.marginBottom = '';
22180
+ inp.scrollTop = scrollTop;
22128
22181
  }
22129
22182
  });
22130
22183
  }
@@ -22201,7 +22254,10 @@ var QInput = createComponent({
22201
22254
  hasValue,
22202
22255
 
22203
22256
  floatingLabel: computed(() =>
22204
- hasValue.value === true
22257
+ (
22258
+ hasValue.value === true
22259
+ && (props.type !== 'number' || isNaN(innerValue.value) === false)
22260
+ )
22205
22261
  || fieldValueIsFilled(props.displayValue)
22206
22262
  ),
22207
22263
 
@@ -28584,7 +28640,8 @@ var QSelect = createComponent({
28584
28640
 
28585
28641
  return h('div', {
28586
28642
  class: 'q-field__native row items-center',
28587
- ...attrs
28643
+ ...attrs,
28644
+ ...state.splitAttrs.listeners.value
28588
28645
  }, child)
28589
28646
  },
28590
28647
 
@@ -32872,7 +32929,7 @@ var QTable = createComponent({
32872
32929
 
32873
32930
  if (topLeft !== void 0) {
32874
32931
  child.push(
32875
- h('div', { class: 'q-table-control' }, [
32932
+ h('div', { class: 'q-table__control' }, [
32876
32933
  topLeft(marginalsScope.value)
32877
32934
  ])
32878
32935
  );
@@ -40594,7 +40651,7 @@ function runSequentialPromises (
40594
40651
  */
40595
40652
 
40596
40653
  const Quasar = {
40597
- version: '2.11.7',
40654
+ version: '2.11.9',
40598
40655
  install: installQuasar,
40599
40656
  lang: Plugin$8,
40600
40657
  iconSet: Plugin$7