quasar 2.21.4 → 2.23.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 (193) hide show
  1. package/README.md +1 -1
  2. package/dist/api/Mutation.json +1 -1
  3. package/dist/api/QLinearProgress.json +1 -1
  4. package/dist/api/QUploader.json +1 -1
  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/fontawesome-v7-pro.umd.prod.js +1 -1
  12. package/dist/icon-set/fontawesome-v7.umd.prod.js +1 -1
  13. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  14. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  15. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  16. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  17. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  18. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  19. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  20. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  21. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  22. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  23. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  24. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  25. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  26. package/dist/icon-set/mdi-v7.umd.prod.js +1 -1
  27. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  28. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  29. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  30. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-fontawesome-v7.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-ionicons-v7.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-ionicons-v8.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  39. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  40. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  42. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +1 -1
  43. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
  44. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
  45. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  46. package/dist/icon-set/svg-mdi-v7.umd.prod.js +1 -1
  47. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  48. package/dist/icon-set/themify.umd.prod.js +1 -1
  49. package/dist/lang/ar-TN.umd.prod.js +1 -1
  50. package/dist/lang/ar.umd.prod.js +1 -1
  51. package/dist/lang/az-Latn.umd.prod.js +1 -1
  52. package/dist/lang/bg.umd.prod.js +1 -1
  53. package/dist/lang/bn.umd.prod.js +1 -1
  54. package/dist/lang/bs-BA.umd.prod.js +1 -1
  55. package/dist/lang/ca.umd.prod.js +1 -1
  56. package/dist/lang/cs.umd.prod.js +1 -1
  57. package/dist/lang/da.umd.prod.js +1 -1
  58. package/dist/lang/de-CH.umd.prod.js +1 -1
  59. package/dist/lang/de-DE.umd.prod.js +1 -1
  60. package/dist/lang/de.umd.prod.js +1 -1
  61. package/dist/lang/el.umd.prod.js +1 -1
  62. package/dist/lang/en-GB.umd.prod.js +1 -1
  63. package/dist/lang/en-US.umd.prod.js +1 -1
  64. package/dist/lang/eo.umd.prod.js +1 -1
  65. package/dist/lang/es.umd.prod.js +1 -1
  66. package/dist/lang/et.umd.prod.js +1 -1
  67. package/dist/lang/eu.umd.prod.js +1 -1
  68. package/dist/lang/fa-IR.umd.prod.js +1 -1
  69. package/dist/lang/fa.umd.prod.js +1 -1
  70. package/dist/lang/fi.umd.prod.js +1 -1
  71. package/dist/lang/fr.umd.prod.js +1 -1
  72. package/dist/lang/gn.umd.prod.js +1 -1
  73. package/dist/lang/he.umd.prod.js +1 -1
  74. package/dist/lang/hi.umd.prod.js +1 -1
  75. package/dist/lang/hr.umd.prod.js +1 -1
  76. package/dist/lang/hu.umd.prod.js +1 -1
  77. package/dist/lang/id.umd.prod.js +1 -1
  78. package/dist/lang/is.umd.prod.js +1 -1
  79. package/dist/lang/it.umd.prod.js +1 -1
  80. package/dist/lang/ja.umd.prod.js +1 -1
  81. package/dist/lang/kk.umd.prod.js +1 -1
  82. package/dist/lang/km.umd.prod.js +1 -1
  83. package/dist/lang/ko-KR.umd.prod.js +1 -1
  84. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  85. package/dist/lang/lb.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/mk.umd.prod.js +1 -1
  90. package/dist/lang/ml.umd.prod.js +1 -1
  91. package/dist/lang/mm.umd.prod.js +1 -1
  92. package/dist/lang/ms-MY.umd.prod.js +1 -1
  93. package/dist/lang/ms.umd.prod.js +1 -1
  94. package/dist/lang/my.umd.prod.js +1 -1
  95. package/dist/lang/nb-NO.umd.prod.js +1 -1
  96. package/dist/lang/nl.umd.prod.js +1 -1
  97. package/dist/lang/pl.umd.prod.js +1 -1
  98. package/dist/lang/pt-BR.umd.prod.js +1 -1
  99. package/dist/lang/pt.umd.prod.js +1 -1
  100. package/dist/lang/ro.umd.prod.js +1 -1
  101. package/dist/lang/ru.umd.prod.js +1 -1
  102. package/dist/lang/sk.umd.prod.js +1 -1
  103. package/dist/lang/sl.umd.prod.js +1 -1
  104. package/dist/lang/sm.umd.prod.js +1 -1
  105. package/dist/lang/sq.umd.prod.js +1 -1
  106. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  107. package/dist/lang/sr.umd.prod.js +1 -1
  108. package/dist/lang/sv.umd.prod.js +1 -1
  109. package/dist/lang/ta.umd.prod.js +1 -1
  110. package/dist/lang/th.umd.prod.js +1 -1
  111. package/dist/lang/tl.umd.prod.js +1 -1
  112. package/dist/lang/tr.umd.prod.js +1 -1
  113. package/dist/lang/ug.umd.prod.js +1 -1
  114. package/dist/lang/uk.umd.prod.js +1 -1
  115. package/dist/lang/ur-PK.umd.prod.js +1 -1
  116. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  117. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  118. package/dist/lang/vi.umd.prod.js +1 -1
  119. package/dist/lang/zh-CN.umd.prod.js +1 -1
  120. package/dist/lang/zh-TW.umd.prod.js +1 -1
  121. package/dist/quasar.client.js +654 -207
  122. package/dist/quasar.css +20 -11
  123. package/dist/quasar.prod.css +1 -1
  124. package/dist/quasar.rtl.css +25 -20
  125. package/dist/quasar.rtl.prod.css +1 -1
  126. package/dist/quasar.sass +21 -12
  127. package/dist/quasar.server.prod.cjs +35 -35
  128. package/dist/quasar.server.prod.js +25 -25
  129. package/dist/quasar.umd.js +654 -206
  130. package/dist/quasar.umd.prod.js +19 -19
  131. package/dist/transforms/import-map.json +1 -1
  132. package/dist/types/composables.d.ts +15 -5
  133. package/dist/types/index.d.ts +5 -5
  134. package/dist/web-types/web-types.json +1 -1
  135. package/package.json +6 -6
  136. package/src/components/btn/QBtn.js +1 -1
  137. package/src/components/carousel/QCarousel.js +2 -0
  138. package/src/components/chip/QChip.js +20 -4
  139. package/src/components/date/QDate.js +9 -2
  140. package/src/components/dialog/QDialog.js +9 -2
  141. package/src/components/editor/QEditor.js +18 -3
  142. package/src/components/expansion-item/QExpansionItem.js +6 -1
  143. package/src/components/fab/QFab.sass +11 -9
  144. package/src/components/input/QInput.js +42 -1
  145. package/src/components/input/QInput.json +7 -0
  146. package/src/components/input/use-mask.js +12 -4
  147. package/src/components/item/QItem.js +10 -1
  148. package/src/components/linear-progress/QLinearProgress.js +4 -11
  149. package/src/components/linear-progress/QLinearProgress.json +1 -1
  150. package/src/components/linear-progress/QLinearProgress.sass +7 -2
  151. package/src/components/menu/QMenu.js +9 -2
  152. package/src/components/range/QRange.js +2 -1
  153. package/src/components/rating/QRating.js +27 -8
  154. package/src/components/rating/QRating.sass +4 -0
  155. package/src/components/resize-observer/QResizeObserver.js +14 -3
  156. package/src/components/scroll-area/QScrollArea.js +69 -17
  157. package/src/components/slide-item/QSlideItem.js +3 -2
  158. package/src/components/slider/use-slider.js +7 -3
  159. package/src/components/stepper/StepHeader.js +11 -2
  160. package/src/components/table/QTable.js +11 -9
  161. package/src/components/table/QTh.js +20 -1
  162. package/src/components/table/table-column-selection.js +9 -1
  163. package/src/components/table/table-pagination.js +5 -2
  164. package/src/components/table/table-row-selection.js +10 -10
  165. package/src/components/tabs/QTabs.js +5 -6
  166. package/src/components/time/QTime.js +35 -10
  167. package/src/components/tooltip/QTooltip.js +112 -6
  168. package/src/components/tree/QTree.js +124 -4
  169. package/src/components/uploader/uploader-core.js +19 -4
  170. package/src/components/uploader/xhr-uploader-plugin.js +93 -43
  171. package/src/components/uploader/xhr-uploader-plugin.json +4 -4
  172. package/src/composables/private.use-field/use-field.js +2 -0
  173. package/src/composables/private.use-file/use-file.js +21 -12
  174. package/src/composables/private.use-fullscreen/use-fullscreen.js +71 -11
  175. package/src/composables/private.use-fullscreen/use-fullscreen.test.js +158 -0
  176. package/src/composables/private.use-model-toggle/use-model-toggle.js +2 -0
  177. package/src/composables/private.use-panel/use-panel.js +6 -2
  178. package/src/composables/use-animation-frame/use-animation-frame.js +47 -0
  179. package/src/composables/use-animation-frame/use-animation-frame.test.js +122 -0
  180. package/src/composables/use-interval/use-interval.js +8 -0
  181. package/src/composables/use-render-cache/use-render-cache.js +15 -10
  182. package/src/composables/use-timeout/use-timeout.js +8 -0
  183. package/src/composables.js +1 -1
  184. package/src/directives/intersection/Intersection.js +2 -2
  185. package/src/directives/mutation/Mutation.json +1 -1
  186. package/src/directives/touch-repeat/TouchRepeat.js +3 -1
  187. package/src/plugins/cookies/Cookies.js +29 -13
  188. package/src/plugins/meta/Meta.js +57 -9
  189. package/src/utils/extend/extend.js +4 -0
  190. package/src/utils/extend/extend.test.js +29 -0
  191. package/src/utils/private.click-outside/click-outside.js +27 -12
  192. package/src/utils/private.click-outside/click-outside.test.js +132 -0
  193. package/src/utils/scroll/prevent-scroll.js +4 -4
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.21.4
2
+ * Quasar Framework v2.23.0
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -1103,7 +1103,7 @@ function prepareApp(app, uiOpts, pluginOpts) {
1103
1103
  };
1104
1104
  }
1105
1105
  var install_quasar_default = function installQuasar(parentApp, opts = {}) {
1106
- const $q = { version: "2.21.4" };
1106
+ const $q = { version: "2.23.0" };
1107
1107
  if (!globalConfigIsFrozen) {
1108
1108
  if (opts.config !== void 0) Object.assign(globalConfig, opts.config);
1109
1109
  $q.config = { ...globalConfig };
@@ -2443,7 +2443,7 @@ var QBtn_default = createComponent({
2443
2443
  const blurTarget = blurTargetRef.value;
2444
2444
  if (!destroying && (touchTarget === rootRef.value || mouseTarget === rootRef.value) && blurTarget !== null && blurTarget !== document.activeElement) {
2445
2445
  blurTarget.setAttribute("tabindex", -1);
2446
- blurTarget.focus();
2446
+ blurTarget.focus({ preventScroll: true });
2447
2447
  }
2448
2448
  if (touchTarget === rootRef.value) {
2449
2449
  if (localTouchTargetEl !== null) {
@@ -2773,7 +2773,7 @@ const useModelToggleEmits = [
2773
2773
  "beforeHide",
2774
2774
  "hide"
2775
2775
  ];
2776
- function useModelToggle({ showing, canShow, hideOnRouteChange, handleShow, handleHide, processOnMount }) {
2776
+ function useModelToggle({ showing, canShow, hideOnRouteChange, handleShow, handleHide, handleRouteChange, processOnMount }) {
2777
2777
  const vm = getCurrentInstance();
2778
2778
  const { props, emit, proxy } = vm;
2779
2779
  let payload;
@@ -2826,7 +2826,10 @@ function useModelToggle({ showing, canShow, hideOnRouteChange, handleShow, handl
2826
2826
  }
2827
2827
  watch(() => props.modelValue, processModelChange);
2828
2828
  if (hideOnRouteChange !== void 0 && vmHasRouter(vm)) watch(() => proxy.$route.fullPath, () => {
2829
- if (hideOnRouteChange.value && showing.value) hide();
2829
+ if (hideOnRouteChange.value && showing.value) {
2830
+ handleRouteChange?.();
2831
+ hide();
2832
+ }
2830
2833
  });
2831
2834
  if (processOnMount) onMounted(() => {
2832
2835
  processModelChange(props.modelValue);
@@ -3284,19 +3287,25 @@ function globalHandler(evt) {
3284
3287
  }
3285
3288
  const target = evt.target;
3286
3289
  if (target === void 0 || target.nodeType === 8 || target.classList.contains("no-pointer-events")) return;
3287
- let portalIndex = portalProxyList.length - 1;
3288
- while (portalIndex >= 0) {
3289
- const proxy = portalProxyList[portalIndex].$;
3290
- if (proxy.type.name === "QTooltip") {
3291
- portalIndex--;
3290
+ let closableContentEls = null;
3291
+ let sawClosablePortal = false;
3292
+ for (let i = portalProxyList.length - 1; i >= 0; i--) {
3293
+ const proxy = portalProxyList[i].$;
3294
+ const name = proxy.type.name;
3295
+ if (name === "QTooltip") continue;
3296
+ if (name === "QDialog") {
3297
+ if (proxy.props.seamless !== true) {
3298
+ if (sawClosablePortal === false) return;
3299
+ closableContentEls = new Set(portalProxyList.slice(i + 1).map((vm) => vm.contentEl));
3300
+ break;
3301
+ }
3292
3302
  continue;
3293
3303
  }
3294
- if (proxy.type.name !== "QDialog") break;
3295
- if (!proxy.props.seamless) return;
3296
- portalIndex--;
3304
+ sawClosablePortal = true;
3297
3305
  }
3298
3306
  for (let i = registeredList.length - 1; i >= 0; i--) {
3299
3307
  const state = registeredList[i];
3308
+ if (closableContentEls !== null && !closableContentEls.has(state.innerRef.value)) return;
3300
3309
  if ((state.anchorEl.value === null || !state.anchorEl.value.contains(target)) && (target === document.body || state.innerRef.value !== null && !state.innerRef.value.contains(target))) {
3301
3310
  evt.qClickOutside = true;
3302
3311
  state.onClickOutside(evt);
@@ -3627,6 +3636,7 @@ var QMenu_default = createComponent({
3627
3636
  canShow,
3628
3637
  handleShow,
3629
3638
  handleHide,
3639
+ handleRouteChange,
3630
3640
  hideOnRouteChange,
3631
3641
  processOnMount: true
3632
3642
  });
@@ -3702,14 +3712,20 @@ var QMenu_default = createComponent({
3702
3712
  hidePortal();
3703
3713
  anchorCleanup(true);
3704
3714
  if (refocusTarget !== null && (evt === void 0 || !evt.qClickOutside)) {
3705
- ((evt?.type.indexOf("key") === 0 ? refocusTarget.closest("[tabindex]:not([tabindex^=\"-\"])") : void 0) || refocusTarget).focus();
3715
+ const target = (evt?.type.indexOf("key") === 0 ? refocusTarget.closest("[tabindex]:not([tabindex^=\"-\"])") : void 0) || refocusTarget;
3706
3716
  refocusTarget = null;
3717
+ addFocusFn(() => {
3718
+ if (target.isConnected) target.focus();
3719
+ });
3707
3720
  }
3708
3721
  registerTimeout(() => {
3709
3722
  hidePortal(true);
3710
3723
  emit("hide", evt);
3711
3724
  }, props.transitionDuration);
3712
3725
  }
3726
+ function handleRouteChange() {
3727
+ refocusTarget = null;
3728
+ }
3713
3729
  function anchorCleanup(hiding) {
3714
3730
  absoluteOffset = void 0;
3715
3731
  if (unwatchPosition !== void 0) {
@@ -4423,7 +4439,7 @@ var TouchSwipe_default = createDirective({
4423
4439
  function useRenderCache() {
4424
4440
  let cache = Object.create(null);
4425
4441
  return {
4426
- getCache: (key, defaultValue) => cache[key] === void 0 ? cache[key] = typeof defaultValue === "function" ? defaultValue() : defaultValue : cache[key],
4442
+ getCache: (key, defaultValue) => Object.hasOwn(cache, key) ? cache[key] : cache[key] = typeof defaultValue === "function" ? defaultValue() : defaultValue,
4427
4443
  setCache(key, obj) {
4428
4444
  cache[key] = obj;
4429
4445
  },
@@ -4502,8 +4518,8 @@ function usePanel() {
4502
4518
  mouse: true
4503
4519
  }
4504
4520
  ]]);
4505
- const transitionPrev = computed(() => props.transitionPrev || `slide-${props.vertical ? "down" : "right"}`);
4506
- const transitionNext = computed(() => props.transitionNext || `slide-${props.vertical ? "up" : "left"}`);
4521
+ const transitionPrev = computed(() => props.transitionPrev || `slide-${props.vertical ? "down" : proxy.$q.lang.rtl ? "left" : "right"}`);
4522
+ const transitionNext = computed(() => props.transitionNext || `slide-${props.vertical ? "up" : proxy.$q.lang.rtl ? "right" : "left"}`);
4507
4523
  const transitionStyle = computed(() => `--q-transition-duration: ${props.transitionDuration}ms`);
4508
4524
  const contentKey = computed(() => typeof props.modelValue === "string" || typeof props.modelValue === "number" ? props.modelValue : String(props.modelValue));
4509
4525
  const keepAliveProps = computed(() => ({
@@ -4613,8 +4629,33 @@ function usePanel() {
4613
4629
  };
4614
4630
  }
4615
4631
  //#endregion
4632
+ //#region src/composables/use-animation-frame/use-animation-frame.js
4633
+ function useAnimationFrame() {
4634
+ let frameId = null;
4635
+ const vm = getCurrentInstance();
4636
+ function removeAnimationFrame() {
4637
+ if (frameId !== null) {
4638
+ cancelAnimationFrame(frameId);
4639
+ frameId = null;
4640
+ }
4641
+ }
4642
+ onDeactivated(removeAnimationFrame);
4643
+ onBeforeUnmount(removeAnimationFrame);
4644
+ return {
4645
+ removeAnimationFrame,
4646
+ registerAnimationFrame(fn) {
4647
+ removeAnimationFrame();
4648
+ if (!vmIsDestroyed(vm)) frameId = requestAnimationFrame(() => {
4649
+ frameId = null;
4650
+ fn();
4651
+ });
4652
+ }
4653
+ };
4654
+ }
4655
+ //#endregion
4616
4656
  //#region src/composables/private.use-fullscreen/use-fullscreen.js
4617
4657
  let counter = 0;
4658
+ let restoreState = null;
4618
4659
  const useFullscreenProps = {
4619
4660
  fullscreen: Boolean,
4620
4661
  noRouteFullscreenExit: Boolean
@@ -4625,6 +4666,8 @@ function useFullscreen() {
4625
4666
  const { props, emit, proxy } = vm;
4626
4667
  let historyEntry, fullscreenFillerNode;
4627
4668
  const inFullscreen = ref(false);
4669
+ const { registerTick, removeTick } = useTick();
4670
+ const { registerAnimationFrame, removeAnimationFrame } = useAnimationFrame();
4628
4671
  if (vmHasRouter(vm)) watch(() => proxy.$route.fullPath, () => {
4629
4672
  if (!props.noRouteFullscreenExit) exitFullscreen();
4630
4673
  });
@@ -4640,7 +4683,15 @@ function useFullscreen() {
4640
4683
  else setFullscreen();
4641
4684
  }
4642
4685
  function setFullscreen() {
4643
- if (inFullscreen.value) return;
4686
+ if (vmIsDestroyed(vm) || inFullscreen.value) return;
4687
+ removeAnimationFrame();
4688
+ removeTick();
4689
+ if (counter === 0) restoreState = {
4690
+ left: getHorizontalScrollPosition(window),
4691
+ top: getVerticalScrollPosition(window),
4692
+ width: window.innerWidth,
4693
+ height: window.innerHeight
4694
+ };
4644
4695
  inFullscreen.value = true;
4645
4696
  proxy.$el.replaceWith(fullscreenFillerNode);
4646
4697
  document.body.append(proxy.$el);
@@ -4649,21 +4700,40 @@ function useFullscreen() {
4649
4700
  historyEntry = { handler: exitFullscreen };
4650
4701
  History_default.add(historyEntry);
4651
4702
  }
4652
- function exitFullscreen() {
4703
+ function exitFullscreenImpl(shouldRestoreElement) {
4653
4704
  if (!inFullscreen.value) return;
4654
4705
  if (historyEntry !== void 0) {
4655
4706
  History_default.remove(historyEntry);
4656
4707
  historyEntry = void 0;
4657
4708
  }
4658
- fullscreenFillerNode.replaceWith(proxy.$el);
4709
+ if (shouldRestoreElement === true) fullscreenFillerNode.replaceWith(proxy.$el);
4710
+ else fullscreenFillerNode.remove();
4659
4711
  inFullscreen.value = false;
4660
4712
  counter = Math.max(0, counter - 1);
4661
- if (counter === 0) {
4662
- document.body.classList.remove("q-body--fullscreen-mixin");
4663
- if (proxy.$el.scrollIntoView !== void 0) setTimeout(() => {
4713
+ if (counter !== 0) return;
4714
+ document.body.classList.remove("q-body--fullscreen-mixin");
4715
+ if (restoreState === null) return;
4716
+ const { left, top, width, height } = restoreState;
4717
+ restoreState = null;
4718
+ if (vmIsDestroyed(vm)) return;
4719
+ registerTick(() => {
4720
+ if (counter !== 0) return;
4721
+ registerAnimationFrame(() => {
4722
+ if (counter !== 0) return;
4723
+ if (window.innerWidth !== width || window.innerHeight !== height)
4724
+ /**
4725
+ * If user has resized the window while in fullscreen mode,
4726
+ * we cannot restore the scroll position because it will be wrong.
4727
+ * So we just scroll the element into view instead,
4728
+ * which is the best we can do.
4729
+ */
4664
4730
  proxy.$el.scrollIntoView();
4665
- }, 0);
4666
- }
4731
+ else window.scrollTo(left, top);
4732
+ });
4733
+ });
4734
+ }
4735
+ function exitFullscreen() {
4736
+ exitFullscreenImpl(true);
4667
4737
  }
4668
4738
  onBeforeMount(() => {
4669
4739
  fullscreenFillerNode = document.createElement("span");
@@ -4671,6 +4741,12 @@ function useFullscreen() {
4671
4741
  onMounted(() => {
4672
4742
  if (props.fullscreen) setFullscreen();
4673
4743
  });
4744
+ onDeactivated(() => {
4745
+ exitFullscreenImpl(proxy.$el.isConnected);
4746
+ });
4747
+ onActivated(() => {
4748
+ if (props.fullscreen) setFullscreen();
4749
+ });
4674
4750
  onBeforeUnmount(exitFullscreen);
4675
4751
  Object.assign(proxy, {
4676
4752
  toggleFullscreen,
@@ -4738,7 +4814,7 @@ var QCarousel_default = createComponent({
4738
4814
  const { proxy: { $q } } = getCurrentInstance();
4739
4815
  const isDark = useDark(props, $q);
4740
4816
  let timer = null, panelsLen;
4741
- const { updatePanelsList, getPanelContent, panelDirectives, goToPanel, previousPanel, nextPanel, getEnabledPanels, panelIndex } = usePanel();
4817
+ const { updatePanelsList, updatePanelIndex, getPanelContent, panelDirectives, goToPanel, previousPanel, nextPanel, getEnabledPanels, panelIndex } = usePanel();
4742
4818
  const { inFullscreen } = useFullscreen();
4743
4819
  const style = computed(() => !inFullscreen.value && props.height !== void 0 ? { height: props.height } : {});
4744
4820
  const direction = computed(() => props.vertical ? "vertical" : "horizontal");
@@ -4849,6 +4925,7 @@ var QCarousel_default = createComponent({
4849
4925
  }
4850
4926
  return () => {
4851
4927
  panelsLen = updatePanelsList(slots);
4928
+ updatePanelIndex();
4852
4929
  return h("div", {
4853
4930
  class: classes.value,
4854
4931
  style: style.value
@@ -5173,6 +5250,9 @@ var QCheckbox_default = createComponent({
5173
5250
  });
5174
5251
  //#endregion
5175
5252
  //#region src/components/chip/QChip.js
5253
+ function preventSpace$3(e) {
5254
+ if (e.keyCode === 32) stopAndPrevent(e);
5255
+ }
5176
5256
  const defaultSizes$1 = {
5177
5257
  xs: 8,
5178
5258
  sm: 10,
@@ -5235,7 +5315,11 @@ var QChip_default = createComponent({
5235
5315
  const chip = props.disable ? {
5236
5316
  tabindex: -1,
5237
5317
  "aria-disabled": "true"
5238
- } : { tabindex: props.tabindex || 0 };
5318
+ } : {
5319
+ tabindex: props.tabindex || 0,
5320
+ role: "button",
5321
+ "aria-pressed": props.selected ? "true" : "false"
5322
+ };
5239
5323
  return {
5240
5324
  chip,
5241
5325
  remove: {
@@ -5247,7 +5331,10 @@ var QChip_default = createComponent({
5247
5331
  };
5248
5332
  });
5249
5333
  function onKeyup(e) {
5250
- if (e.keyCode === 13) onClick(e);
5334
+ if ([13, 32].includes(e.keyCode)) {
5335
+ onClick(e);
5336
+ stopAndPrevent(e);
5337
+ }
5251
5338
  }
5252
5339
  function onClick(e) {
5253
5340
  if (!props.disable) {
@@ -5256,7 +5343,7 @@ var QChip_default = createComponent({
5256
5343
  }
5257
5344
  }
5258
5345
  function onRemove(e) {
5259
- if (e.keyCode === void 0 || e.keyCode === 13) {
5346
+ if (e.keyCode === void 0 || [13, 32].includes(e.keyCode)) {
5260
5347
  stopAndPrevent(e);
5261
5348
  if (!props.disable) {
5262
5349
  emit("update:modelValue", false);
@@ -5282,6 +5369,7 @@ var QChip_default = createComponent({
5282
5369
  name: removeIcon.value,
5283
5370
  ...attributes.value.remove,
5284
5371
  onClick: onRemove,
5372
+ onKeydown: preventSpace$3,
5285
5373
  onKeyup: onRemove
5286
5374
  }));
5287
5375
  return child;
@@ -5294,6 +5382,7 @@ var QChip_default = createComponent({
5294
5382
  };
5295
5383
  if (isClickable.value) Object.assign(data, attributes.value.chip, {
5296
5384
  onClick,
5385
+ onKeydown: preventSpace$3,
5297
5386
  onKeyup
5298
5387
  });
5299
5388
  return hDir("div", data, getContent(), "ripple", props.ripple !== false && !props.disable, () => [[Ripple_default, props.ripple]]);
@@ -6056,16 +6145,14 @@ function useSlider({ updateValue, updatePosition, getDragging, formAttrs }) {
6056
6145
  viewBox: "0 0 20 20",
6057
6146
  "aria-hidden": "true"
6058
6147
  }, [h("path", { d: props.thumbPath })]), h("div", { class: "q-slider__focus-ring fit" })];
6059
- if (props.label || props.labelAlways) {
6060
- thumbContent.push(h("div", { class: pinClass.value + " absolute fit no-pointer-events" + pinColor.value }, [h("div", {
6061
- class: labelClass.value,
6062
- style: { minWidth: props.thumbSize }
6063
- }, [h("div", {
6064
- class: textContainerClass.value,
6065
- style: textContainerStyle.value
6066
- }, [h("span", { class: textClass.value }, thumb.label.value)])])]));
6067
- if (props.name !== void 0 && !props.disable) injectFormInput(thumbContent, "push");
6068
- }
6148
+ if (props.label || props.labelAlways) thumbContent.push(h("div", { class: pinClass.value + " absolute fit no-pointer-events" + pinColor.value }, [h("div", {
6149
+ class: labelClass.value,
6150
+ style: { minWidth: props.thumbSize }
6151
+ }, [h("div", {
6152
+ class: textContainerClass.value,
6153
+ style: textContainerStyle.value
6154
+ }, [h("span", { class: textClass.value }, thumb.label.value)])])]));
6155
+ if (thumb.injectFormInput !== false && props.name !== void 0 && !props.disable) injectFormInput(thumbContent, "push");
6069
6156
  return h("div", {
6070
6157
  class: thumbClasses.value,
6071
6158
  style: style.value,
@@ -6292,8 +6379,9 @@ var QResizeObserver_default = createComponent({
6292
6379
  const { proxy } = getCurrentInstance();
6293
6380
  proxy.trigger = trigger;
6294
6381
  if (hasObserver) {
6295
- let observer;
6382
+ let observer, isDestroyed = false;
6296
6383
  const init = (stop) => {
6384
+ if (isDestroyed) return;
6297
6385
  targetEl = proxy.$el.parentNode;
6298
6386
  if (targetEl) {
6299
6387
  observer = new ResizeObserver(trigger);
@@ -6307,6 +6395,7 @@ var QResizeObserver_default = createComponent({
6307
6395
  init();
6308
6396
  });
6309
6397
  onBeforeUnmount(() => {
6398
+ isDestroyed = true;
6310
6399
  if (timer !== null) clearTimeout(timer);
6311
6400
  if (observer !== void 0) {
6312
6401
  if (observer.disconnect !== void 0) observer.disconnect();
@@ -6316,7 +6405,7 @@ var QResizeObserver_default = createComponent({
6316
6405
  return noop;
6317
6406
  }
6318
6407
  const { isHydrated } = useHydration();
6319
- let curDocView;
6408
+ let curDocView, isDestroyed = false;
6320
6409
  const cleanup = () => {
6321
6410
  if (timer !== null) {
6322
6411
  clearTimeout(timer);
@@ -6337,11 +6426,15 @@ var QResizeObserver_default = createComponent({
6337
6426
  };
6338
6427
  onMounted(() => {
6339
6428
  nextTick(() => {
6429
+ if (isDestroyed) return;
6340
6430
  targetEl = proxy.$el;
6341
6431
  if (targetEl) onObjLoad();
6342
6432
  });
6343
6433
  });
6344
- onBeforeUnmount(cleanup);
6434
+ onBeforeUnmount(() => {
6435
+ isDestroyed = true;
6436
+ cleanup();
6437
+ });
6345
6438
  return () => {
6346
6439
  if (isHydrated.value) return h("object", {
6347
6440
  class: "q--avoid-card-border",
@@ -6594,12 +6687,10 @@ var QTabs_default = createComponent({
6594
6687
  const dirNext = keyCode === (props.vertical ? 40 : 39);
6595
6688
  const dir = dirPrev ? -1 : dirNext ? 1 : void 0;
6596
6689
  if (dir !== void 0) {
6597
- const rtlDir = isRTL.value ? -1 : 1;
6598
- const index = tabs.indexOf(fromEl) + dir * rtlDir;
6599
- if (index >= 0 && index < len) {
6600
- scrollToTabEl(tabs[index]);
6601
- tabs[index].focus({ preventScroll: true });
6602
- }
6690
+ const rtlDir = props.vertical !== true && isRTL.value ? -1 : 1;
6691
+ const index = (tabs.indexOf(fromEl) + dir * rtlDir + len) % len;
6692
+ scrollToTabEl(tabs[index]);
6693
+ tabs[index].focus({ preventScroll: true });
6603
6694
  return true;
6604
6695
  }
6605
6696
  }
@@ -6774,6 +6865,7 @@ var QTabs_default = createComponent({
6774
6865
  ref: rootRef,
6775
6866
  class: classes.value,
6776
6867
  role: "tablist",
6868
+ "aria-orientation": props.vertical ? "vertical" : "horizontal",
6777
6869
  onFocusin,
6778
6870
  onFocusout
6779
6871
  }, [
@@ -8730,6 +8822,7 @@ var QDate_default = createComponent({
8730
8822
  const { $q } = proxy;
8731
8823
  const isDark = useDark(props, $q);
8732
8824
  const { getCache } = useRenderCache();
8825
+ const { isHydrated } = useHydration();
8733
8826
  const { tabindex, headerClass, getLocale, getCurrentDate } = useDatetime(props, $q);
8734
8827
  let lastEmitValue;
8735
8828
  const injectFormInput = useFormInject(useFormAttrs(props));
@@ -9043,7 +9136,7 @@ var QDate_default = createComponent({
9043
9136
  if (rangeView.value.includeFrom) res[from].editRangeFrom = true;
9044
9137
  if (rangeView.value.includeTo) res[to].editRangeTo = true;
9045
9138
  }
9046
- if (viewModel.value.year === today.value.year && viewModel.value.month === today.value.month) res[index + today.value.day - 1].today = true;
9139
+ if (isHydrated.value && viewModel.value.year === today.value.year && viewModel.value.month === today.value.month) res[index + today.value.day - 1].today = true;
9047
9140
  const left = res.length % 7;
9048
9141
  if (left > 0) {
9049
9142
  const afterDays = 7 - left;
@@ -9434,7 +9527,7 @@ var QDate_default = createComponent({
9434
9527
  }, day.event ? () => h("div", { class: "q-date__event bg-" + day.event }) : null) : h("div", String(day.i))]))))])
9435
9528
  ])],
9436
9529
  Months() {
9437
- const currentYear = viewModel.value.year === today.value.year;
9530
+ const currentYear = isHydrated.value && viewModel.value.year === today.value.year;
9438
9531
  const isDisabled = (month) => minNav.value !== null && viewModel.value.year === minNav.value.year && minNav.value.month > month || maxNav.value !== null && viewModel.value.year === maxNav.value.year && maxNav.value.month < month;
9439
9532
  const content = innerLocale.value.monthsShort.map((month, i) => {
9440
9533
  const active = viewModel.value.month === i + 1;
@@ -9473,7 +9566,7 @@ var QDate_default = createComponent({
9473
9566
  const active = viewModel.value.year === i;
9474
9567
  years.push(h("div", { class: "q-date__years-item flex flex-center" }, [h(QBtn_default, {
9475
9568
  key: "yr" + i,
9476
- class: today.value.year === i ? "q-date__today" : null,
9569
+ class: isHydrated.value && today.value.year === i ? "q-date__today" : null,
9477
9570
  flat: !active,
9478
9571
  label: i,
9479
9572
  dense: true,
@@ -9634,7 +9727,7 @@ let maxScrollTop;
9634
9727
  let vpPendingUpdate = false;
9635
9728
  let bodyLeft;
9636
9729
  let bodyTop;
9637
- let href;
9730
+ let routePath;
9638
9731
  let closeTimer = null;
9639
9732
  function onAppleScroll(e) {
9640
9733
  if (e.target === document) document.scrollingElement.scrollTop = document.scrollingElement.scrollTop;
@@ -9660,7 +9753,7 @@ function apply$1(action) {
9660
9753
  scrollPositionY = getVerticalScrollPosition(window);
9661
9754
  bodyLeft = body.style.left;
9662
9755
  bodyTop = body.style.top;
9663
- href = window.location.href;
9756
+ routePath = window.location.pathname;
9664
9757
  body.style.left = `-${scrollPositionX}px`;
9665
9758
  body.style.top = `-${scrollPositionY}px`;
9666
9759
  if (overflowX !== "hidden" && (overflowX === "scroll" || body.scrollWidth > window.innerWidth)) body.classList.add("q-body--force-scrollbar-x");
@@ -9683,7 +9776,7 @@ function apply$1(action) {
9683
9776
  document.qScrollPrevented = false;
9684
9777
  body.style.left = bodyLeft;
9685
9778
  body.style.top = bodyTop;
9686
- if (window.location.href === href) window.scrollTo(scrollPositionX, scrollPositionY);
9779
+ if (window.location.pathname === routePath) window.scrollTo(scrollPositionX, scrollPositionY);
9687
9780
  maxScrollTop = void 0;
9688
9781
  }
9689
9782
  }
@@ -9800,6 +9893,7 @@ var QDialog_default = createComponent({
9800
9893
  hideOnRouteChange,
9801
9894
  handleShow,
9802
9895
  handleHide,
9896
+ handleRouteChange,
9803
9897
  processOnMount: true
9804
9898
  });
9805
9899
  const { addToHistory, removeFromHistory } = useHistory(showing, hide, hideOnRouteChange);
@@ -9854,8 +9948,11 @@ var QDialog_default = createComponent({
9854
9948
  animating.value = true;
9855
9949
  hidePortal();
9856
9950
  if (refocusTarget !== null) {
9857
- ((evt?.type.indexOf("key") === 0 ? refocusTarget.closest("[tabindex]:not([tabindex^=\"-\"])") : void 0) || refocusTarget).focus();
9951
+ const target = (evt?.type.indexOf("key") === 0 ? refocusTarget.closest("[tabindex]:not([tabindex^=\"-\"])") : void 0) || refocusTarget;
9858
9952
  refocusTarget = null;
9953
+ addFocusFn(() => {
9954
+ if (target.isConnected) target.focus();
9955
+ });
9859
9956
  }
9860
9957
  registerTimeout(() => {
9861
9958
  hidePortal(true);
@@ -9863,6 +9960,9 @@ var QDialog_default = createComponent({
9863
9960
  emit("hide", evt);
9864
9961
  }, props.transitionDuration);
9865
9962
  }
9963
+ function handleRouteChange() {
9964
+ refocusTarget = null;
9965
+ }
9866
9966
  function focus(selector) {
9867
9967
  addFocusFn(() => {
9868
9968
  let node = innerRef.value;
@@ -10590,6 +10690,7 @@ var Caret = class {
10590
10690
  };
10591
10691
  //#endregion
10592
10692
  //#region src/components/tooltip/QTooltip.js
10693
+ let nonSelectableCount = 0;
10593
10694
  var QTooltip_default = createComponent({
10594
10695
  name: "QTooltip",
10595
10696
  inheritAttrs: false,
@@ -10641,11 +10742,13 @@ var QTooltip_default = createComponent({
10641
10742
  },
10642
10743
  emits: [...useModelToggleEmits],
10643
10744
  setup(props, { slots, emit, attrs }) {
10644
- let unwatchPosition, observer;
10745
+ let unwatchPosition, observer, removeNonSelectableTimer, hasNonSelectable = false, describedBy;
10645
10746
  const vm = getCurrentInstance();
10646
10747
  const { proxy: { $q } } = vm;
10647
10748
  const innerRef = ref(null);
10648
10749
  const showing = ref(false);
10750
+ const targetUid = useId();
10751
+ const tooltipId = computed(() => attrs.id || targetUid.value);
10649
10752
  const anchorOrigin = computed(() => parsePosition(props.anchor, $q.lang.rtl));
10650
10753
  const selfOrigin = computed(() => parsePosition(props.self, $q.lang.rtl));
10651
10754
  const hideOnRouteChange = computed(() => !props.persistent);
@@ -10667,7 +10770,8 @@ var QTooltip_default = createComponent({
10667
10770
  });
10668
10771
  Object.assign(anchorEvents, {
10669
10772
  delayShow,
10670
- delayHide
10773
+ delayHide,
10774
+ onFocusin
10671
10775
  });
10672
10776
  const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent, "tooltip");
10673
10777
  if ($q.platform.is.mobile) {
@@ -10686,9 +10790,12 @@ var QTooltip_default = createComponent({
10686
10790
  onBeforeUnmount(() => {
10687
10791
  removeClickOutside(clickOutsideProps);
10688
10792
  });
10689
- }
10793
+ } else watch(() => (props.modelValue === null || props["onUpdate:modelValue"]) && showing.value === true && props.persistent !== true, (val) => {
10794
+ (val === true ? addEscapeKey : removeEscapeKey)(onEscapeKey);
10795
+ });
10690
10796
  function handleShow(evt) {
10691
10797
  showPortal();
10798
+ addAriaDescription();
10692
10799
  registerTick(() => {
10693
10800
  observer?.disconnect();
10694
10801
  if (innerRef.value === null) {
@@ -10730,7 +10837,10 @@ var QTooltip_default = createComponent({
10730
10837
  unwatchPosition = void 0;
10731
10838
  }
10732
10839
  unconfigureScrollTarget();
10840
+ removeEscapeKey(onEscapeKey);
10733
10841
  cleanEvt(anchorEvents, "tooltipTemp");
10842
+ removeAriaDescription();
10843
+ setNonSelectable(false);
10734
10844
  }
10735
10845
  function updatePosition() {
10736
10846
  setPosition({
@@ -10745,8 +10855,12 @@ var QTooltip_default = createComponent({
10745
10855
  }
10746
10856
  function delayShow(evt) {
10747
10857
  if ($q.platform.is.mobile) {
10858
+ if (removeNonSelectableTimer !== void 0) {
10859
+ clearTimeout(removeNonSelectableTimer);
10860
+ removeNonSelectableTimer = void 0;
10861
+ }
10748
10862
  clearSelection();
10749
- document.body.classList.add("non-selectable");
10863
+ setNonSelectable(true);
10750
10864
  const target = anchorEl.value;
10751
10865
  const evts = [
10752
10866
  "touchmove",
@@ -10769,14 +10883,26 @@ var QTooltip_default = createComponent({
10769
10883
  if ($q.platform.is.mobile) {
10770
10884
  cleanEvt(anchorEvents, "tooltipTemp");
10771
10885
  clearSelection();
10772
- setTimeout(() => {
10773
- document.body.classList.remove("non-selectable");
10886
+ removeNonSelectableTimer = setTimeout(() => {
10887
+ removeNonSelectableTimer = void 0;
10888
+ setNonSelectable(false);
10774
10889
  }, 10);
10775
10890
  }
10776
10891
  registerTimeout(() => {
10777
10892
  hide(evt);
10778
10893
  }, props.hideDelay);
10779
10894
  }
10895
+ function onFocusin(evt) {
10896
+ const el = evt.target;
10897
+ if (!el) return;
10898
+ try {
10899
+ if (el.matches(":focus-visible") === false) return;
10900
+ } catch {}
10901
+ delayShow(evt);
10902
+ }
10903
+ function onEscapeKey(evt) {
10904
+ hide(evt);
10905
+ }
10780
10906
  function configureAnchorEl() {
10781
10907
  if (props.noParentEvent || anchorEl.value === null) return;
10782
10908
  const evts = $q.platform.is.mobile ? [[
@@ -10784,19 +10910,66 @@ var QTooltip_default = createComponent({
10784
10910
  "touchstart",
10785
10911
  "delayShow",
10786
10912
  "passive"
10787
- ]] : [[
10788
- anchorEl.value,
10789
- "mouseenter",
10790
- "delayShow",
10791
- "passive"
10792
- ], [
10793
- anchorEl.value,
10794
- "mouseleave",
10795
- "delayHide",
10796
- "passive"
10797
- ]];
10913
+ ]] : [
10914
+ [
10915
+ anchorEl.value,
10916
+ "mouseenter",
10917
+ "delayShow",
10918
+ "passive"
10919
+ ],
10920
+ [
10921
+ anchorEl.value,
10922
+ "mouseleave",
10923
+ "delayHide",
10924
+ "passive"
10925
+ ],
10926
+ [
10927
+ anchorEl.value,
10928
+ "focusin",
10929
+ "onFocusin",
10930
+ "passive"
10931
+ ],
10932
+ [
10933
+ anchorEl.value,
10934
+ "focusout",
10935
+ "delayHide",
10936
+ "passive"
10937
+ ]
10938
+ ];
10798
10939
  addEvt(anchorEvents, "anchor", evts);
10799
10940
  }
10941
+ function setNonSelectable(state) {
10942
+ if (hasNonSelectable === state) return;
10943
+ hasNonSelectable = state;
10944
+ nonSelectableCount += state ? 1 : -1;
10945
+ document.body.classList.toggle("non-selectable", nonSelectableCount > 0);
10946
+ if (!state && removeNonSelectableTimer !== void 0) {
10947
+ clearTimeout(removeNonSelectableTimer);
10948
+ removeNonSelectableTimer = void 0;
10949
+ }
10950
+ }
10951
+ function addAriaDescription() {
10952
+ const el = anchorEl.value, id = tooltipId.value;
10953
+ if (el === null || id === void 0) return;
10954
+ const ids = (el.getAttribute("aria-describedby") || "").split(/\s+/).filter(Boolean);
10955
+ describedBy = {
10956
+ el,
10957
+ id,
10958
+ added: !ids.includes(id)
10959
+ };
10960
+ if (describedBy.added) {
10961
+ ids.push(id);
10962
+ el.setAttribute("aria-describedby", ids.join(" "));
10963
+ }
10964
+ }
10965
+ function removeAriaDescription() {
10966
+ if (describedBy?.added === true) {
10967
+ const { el, id } = describedBy, value = (el.getAttribute("aria-describedby") || "").split(/\s+/).filter((entry) => entry !== "" && entry !== id);
10968
+ if (value.length === 0) el.removeAttribute("aria-describedby");
10969
+ else el.setAttribute("aria-describedby", value.join(" "));
10970
+ }
10971
+ describedBy = void 0;
10972
+ }
10800
10973
  function configureScrollTarget() {
10801
10974
  if (anchorEl.value !== null || props.scrollTarget !== void 0) {
10802
10975
  localScrollTarget.value = getScrollTarget(anchorEl.value, props.scrollTarget);
@@ -10807,6 +10980,7 @@ var QTooltip_default = createComponent({
10807
10980
  function getTooltipContent() {
10808
10981
  return showing.value ? h("div", {
10809
10982
  ...attrs,
10983
+ id: tooltipId.value,
10810
10984
  ref: innerRef,
10811
10985
  class: ["q-tooltip q-tooltip--style q-position-engine no-pointer-events", attrs.class],
10812
10986
  style: [attrs.style, transitionStyle.value],
@@ -10876,6 +11050,9 @@ var QItem_default = createComponent({
10876
11050
  }
10877
11051
  emit("keyup", e);
10878
11052
  }
11053
+ function onKeydown(e) {
11054
+ if (isClickable.value && e.keyCode === 32) stopAndPrevent(e);
11055
+ }
10879
11056
  function getContent() {
10880
11057
  const child = hUniqueSlot(slots.default, []);
10881
11058
  if (isClickable.value) child.unshift(h("div", {
@@ -10890,8 +11067,9 @@ var QItem_default = createComponent({
10890
11067
  ref: rootRef,
10891
11068
  class: classes.value,
10892
11069
  style: style.value,
10893
- role: "listitem",
11070
+ role: hasLink.value ? void 0 : isClickable.value ? "button" : "listitem",
10894
11071
  onClick,
11072
+ onKeydown,
10895
11073
  onKeyup
10896
11074
  };
10897
11075
  if (isClickable.value) {
@@ -11154,6 +11332,7 @@ function extend(...args) {
11154
11332
  i--;
11155
11333
  }
11156
11334
  for (; i < length; i++) if ((options = args[i]) !== null) for (name in options) {
11335
+ if (name === "__proto__") continue;
11157
11336
  src = target[name];
11158
11337
  copy = options[name];
11159
11338
  if (target === copy) continue;
@@ -11256,8 +11435,9 @@ var QEditor_default = createComponent({
11256
11435
  const editLinkUrl = ref(null);
11257
11436
  const isViewingSource = ref(false);
11258
11437
  const editable = computed(() => !props.readonly && !props.disable);
11259
- let defaultFont, offsetBottom;
11438
+ let defaultFont, offsetBottom, refreshToolbarTimer = null;
11260
11439
  let lastEmit = props.modelValue;
11440
+ const renderInitialContent = isRuntimeSsrPreHydration.value;
11261
11441
  document.execCommand("defaultParagraphSeparator", false, props.paragraphTag);
11262
11442
  defaultFont = window.getComputedStyle(document.body).fontFamily;
11263
11443
  const toolbarBackgroundClass = computed(() => props.toolbarBg ? ` bg-${props.toolbarBg}` : "");
@@ -11688,7 +11868,9 @@ var QEditor_default = createComponent({
11688
11868
  });
11689
11869
  }
11690
11870
  function refreshToolbar() {
11691
- setTimeout(() => {
11871
+ if (refreshToolbarTimer !== null) clearTimeout(refreshToolbarTimer);
11872
+ refreshToolbarTimer = setTimeout(() => {
11873
+ refreshToolbarTimer = null;
11692
11874
  editLinkUrl.value = null;
11693
11875
  proxy.$forceUpdate();
11694
11876
  }, 1);
@@ -11708,6 +11890,7 @@ var QEditor_default = createComponent({
11708
11890
  document.addEventListener("selectionchange", onSelectionchange);
11709
11891
  });
11710
11892
  onBeforeUnmount(() => {
11893
+ if (refreshToolbarTimer !== null) clearTimeout(refreshToolbarTimer);
11711
11894
  document.removeEventListener("selectionchange", onSelectionchange);
11712
11895
  });
11713
11896
  Object.assign(proxy, {
@@ -11745,6 +11928,7 @@ var QEditor_default = createComponent({
11745
11928
  class: innerClass.value,
11746
11929
  contenteditable: editable.value,
11747
11930
  placeholder: props.placeholder,
11931
+ ...renderInitialContent ? { innerHTML: props.modelValue } : {},
11748
11932
  ...splitAttrs.listeners.value,
11749
11933
  onInput,
11750
11934
  onKeydown,
@@ -11929,6 +12113,9 @@ var QSeparator_default = createComponent({
11929
12113
  //#endregion
11930
12114
  //#region src/components/expansion-item/QExpansionItem.js
11931
12115
  const itemGroups = shallowReactive({});
12116
+ function preventSpace$2(e) {
12117
+ if (e.keyCode === 32) stopAndPrevent(e);
12118
+ }
11932
12119
  const LINK_PROPS = Object.keys(useRouterLinkProps);
11933
12120
  var QExpansionItem_default = createComponent({
11934
12121
  name: "QExpansionItem",
@@ -12027,7 +12214,7 @@ var QExpansionItem_default = createComponent({
12027
12214
  emit("click", e);
12028
12215
  }
12029
12216
  function toggleIconKeyboard(e) {
12030
- if (e.keyCode === 13) toggleIcon(e, true);
12217
+ if ([13, 32].includes(e.keyCode)) toggleIcon(e, true);
12031
12218
  }
12032
12219
  function toggleIcon(e, keyboard) {
12033
12220
  if (!keyboard && !e.qAvoidFocus) blurTargetRef.value?.focus();
@@ -12072,6 +12259,7 @@ var QExpansionItem_default = createComponent({
12072
12259
  tabindex: 0,
12073
12260
  ...toggleAriaAttrs.value,
12074
12261
  onClick: toggleIcon,
12262
+ onKeydown: preventSpace$2,
12075
12263
  onKeyup: toggleIconKeyboard
12076
12264
  });
12077
12265
  child.unshift(h("div", {
@@ -12707,6 +12895,7 @@ function useField(state) {
12707
12895
  if (!$q.platform.is.mobile) (state.targetRef?.value || state.rootRef.value).focus();
12708
12896
  else if (state.rootRef.value.contains(document.activeElement)) document.activeElement.blur();
12709
12897
  if (props.type === "file") state.inputRef.value.value = null;
12898
+ state.onClear?.();
12710
12899
  emit("update:modelValue", null);
12711
12900
  if (state.changeEvent) emit("change", null);
12712
12901
  emit("clear", props.modelValue);
@@ -12917,7 +13106,7 @@ function useFile({ editable, dnd, getFileInput, addFilesToQueue }) {
12917
13106
  if (rejectedFiles.length !== 0) emit("rejected", rejectedFiles);
12918
13107
  };
12919
13108
  if (props.accept !== void 0 && !extensions.value.includes("*/")) {
12920
- files = filterFiles(files, rejectedFiles, "accept", (file) => extensions.value.some((ext) => file.type.toUpperCase().startsWith(ext) || file.name.toUpperCase().endsWith(ext)));
13109
+ files = filterFiles(files, rejectedFiles, "accept", (file) => extensions.value.some((ext) => (ext.endsWith("/") ? file.type.toUpperCase().startsWith(ext) : file.type.toUpperCase() === ext) || file.name.toUpperCase().endsWith(ext)));
12921
13110
  if (files.length === 0) return done();
12922
13111
  }
12923
13112
  if (props.maxFileSize !== void 0) {
@@ -12927,18 +13116,29 @@ function useFile({ editable, dnd, getFileInput, addFilesToQueue }) {
12927
13116
  }
12928
13117
  if (!props.multiple && files.length !== 0) files = [files[0]];
12929
13118
  files.forEach((file) => {
12930
- file.__key = file.webkitRelativePath + file.lastModified + file.name + file.size;
13119
+ file.__key = JSON.stringify([
13120
+ file.webkitRelativePath,
13121
+ file.lastModified,
13122
+ file.name,
13123
+ file.size
13124
+ ]);
12931
13125
  });
12932
13126
  if (append) {
12933
- const filenameMap = currentFileList.map((entry) => entry.__key);
12934
- files = filterFiles(files, rejectedFiles, "duplicate", (file) => !filenameMap.includes(file.__key));
13127
+ const filenameSet = new Set(currentFileList.map((entry) => entry.__key));
13128
+ files = filterFiles(files, rejectedFiles, "duplicate", (file) => {
13129
+ if (filenameSet.has(file.__key)) return false;
13130
+ filenameSet.add(file.__key);
13131
+ return true;
13132
+ });
12935
13133
  }
12936
13134
  if (files.length === 0) return done();
12937
13135
  if (props.maxTotalSize !== void 0) {
12938
13136
  let size = append ? currentFileList.reduce((total, file) => total + file.size, 0) : 0;
12939
13137
  files = filterFiles(files, rejectedFiles, "max-total-size", (file) => {
12940
- size += file.size;
12941
- return size <= maxTotalSizeNumber.value;
13138
+ const newSize = size + file.size;
13139
+ if (newSize > maxTotalSizeNumber.value) return false;
13140
+ size = newSize;
13141
+ return true;
12942
13142
  });
12943
13143
  if (files.length === 0) return done();
12944
13144
  }
@@ -14106,6 +14306,9 @@ function useMask(props, emit, emitValue, inputRef) {
14106
14306
  watch(() => props.unmaskedValue, () => {
14107
14307
  if (hasMask.value) updateMaskValue(innerValue.value);
14108
14308
  });
14309
+ watch(() => props.maskTokens, () => {
14310
+ if (hasMask.value) updateMaskValue(innerValue.value, true);
14311
+ }, { deep: true });
14109
14312
  function getInitialMaskedValue() {
14110
14313
  updateMaskInternals();
14111
14314
  if (hasMask.value) {
@@ -14179,12 +14382,12 @@ function useMask(props, emit, emitValue, inputRef) {
14179
14382
  maskReplaced = maskMarked.split(MARKER).join(fillChar);
14180
14383
  }
14181
14384
  function updateMaskValue(rawVal, updateMaskInternalsFlag, inputType) {
14182
- const inp = inputRef.value, end = inp.selectionEnd, endReverse = inp.value.length - end, unmasked = unmaskValue(rawVal);
14385
+ const inp = inputRef.value, end = inp?.selectionEnd ?? 0, endReverse = inp === null ? 0 : inp.value.length - end, unmasked = unmaskValue(rawVal);
14183
14386
  if (updateMaskInternalsFlag === true) updateMaskInternals();
14184
14387
  const preMasked = maskValue(unmasked, updateMaskInternalsFlag), masked = props.fillMask !== false ? fillWithMask(preMasked) : preMasked, changed = innerValue.value !== masked;
14185
- if (inp.value !== masked) inp.value = masked;
14388
+ if (inp !== null && inp.value !== masked) inp.value = masked;
14186
14389
  if (changed) innerValue.value = masked;
14187
- if (document.activeElement === inp) nextTick(() => {
14390
+ if (inp !== null && document.activeElement === inp) nextTick(() => {
14188
14391
  if (masked === maskReplaced) {
14189
14392
  const cursor = props.reverseFillMask ? maskReplaced.length : 0;
14190
14393
  inp.setSelectionRange(cursor, cursor, "forward");
@@ -14382,6 +14585,7 @@ var QInput_default = createComponent({
14382
14585
  Number,
14383
14586
  FileList
14384
14587
  ],
14588
+ modelModifiers: Object,
14385
14589
  shadowText: String,
14386
14590
  type: {
14387
14591
  type: String,
@@ -14466,6 +14670,12 @@ var QInput_default = createComponent({
14466
14670
  if (inputRef.value) inputRef.value.value = props.modelValue;
14467
14671
  });
14468
14672
  watch(() => props.modelValue, (v) => {
14673
+ if (emitTimer !== null) {
14674
+ cancelPendingValueEmission();
14675
+ typedNumber = false;
14676
+ stopValueWatcher = false;
14677
+ delete temp.value;
14678
+ }
14469
14679
  if (hasMask.value) {
14470
14680
  if (stopValueWatcher) {
14471
14681
  stopValueWatcher = false;
@@ -14476,6 +14686,7 @@ var QInput_default = createComponent({
14476
14686
  innerValue.value = v;
14477
14687
  if (props.type === "number" && Object.hasOwn(temp, "value")) if (typedNumber) typedNumber = false;
14478
14688
  else delete temp.value;
14689
+ if (props.modelModifiers?.trim === true && Object.hasOwn(temp, "value") && (typeof temp.value !== "string" || temp.value.trim() !== v)) delete temp.value;
14479
14690
  }
14480
14691
  if (props.autogrow) nextTick(adjustHeight);
14481
14692
  });
@@ -14515,6 +14726,7 @@ var QInput_default = createComponent({
14515
14726
  }
14516
14727
  if (hasMask.value) updateMaskValue(val, false, e.inputType);
14517
14728
  else {
14729
+ if (props.modelModifiers?.trim === true) temp.value = val;
14518
14730
  emitValue(val);
14519
14731
  if (isTypeText.value && e.target === document.activeElement) {
14520
14732
  const { selectionStart, selectionEnd } = e.target;
@@ -14532,7 +14744,7 @@ var QInput_default = createComponent({
14532
14744
  function emitValue(val, stopWatcher) {
14533
14745
  emitValueFn = () => {
14534
14746
  emitTimer = null;
14535
- if (props.type !== "number" && Object.hasOwn(temp, "value")) delete temp.value;
14747
+ if (props.type !== "number" && (props.modelModifiers?.trim !== true || hasMask.value) && Object.hasOwn(temp, "value")) delete temp.value;
14536
14748
  if (props.modelValue !== val && emitCachedValue !== val) {
14537
14749
  emitCachedValue = val;
14538
14750
  if (stopWatcher === true) stopValueWatcher = true;
@@ -14553,6 +14765,19 @@ var QInput_default = createComponent({
14553
14765
  emitTimer = setTimeout(emitValueFn, props.debounce);
14554
14766
  } else emitValueFn();
14555
14767
  }
14768
+ function cancelPendingValueEmission() {
14769
+ if (emitTimer !== null) {
14770
+ clearTimeout(emitTimer);
14771
+ emitTimer = null;
14772
+ }
14773
+ emitValueFn = void 0;
14774
+ }
14775
+ function onClear() {
14776
+ cancelPendingValueEmission();
14777
+ typedNumber = false;
14778
+ stopValueWatcher = false;
14779
+ delete temp.value;
14780
+ }
14556
14781
  function adjustHeight() {
14557
14782
  requestAnimationFrame(() => {
14558
14783
  const inp = inputRef.value;
@@ -14609,6 +14834,7 @@ var QInput_default = createComponent({
14609
14834
  hasShadow: computed(() => props.type !== "file" && typeof props.shadowText === "string" && props.shadowText.length !== 0),
14610
14835
  inputRef,
14611
14836
  emitValue,
14837
+ onClear,
14612
14838
  hasValue,
14613
14839
  floatingLabel: computed(() => hasValue.value && (props.type !== "number" || Number.isFinite(Number(innerValue.value))) || fieldValueIsFilled(props.displayValue)),
14614
14840
  getControl: () => h(isTextarea.value ? "textarea" : "input", {
@@ -14655,7 +14881,7 @@ function update$3(el, ctx, value) {
14655
14881
  if (ctx.handler !== handler) ctx.handler = handler;
14656
14882
  if (changed) {
14657
14883
  ctx.cfg = cfg;
14658
- ctx.observer?.unobserve(el);
14884
+ ctx.observer?.disconnect();
14659
14885
  ctx.observer = new IntersectionObserver(([entry]) => {
14660
14886
  if (typeof ctx.handler === "function") {
14661
14887
  if (entry.rootBounds === null && document.body.contains(el)) {
@@ -14672,7 +14898,7 @@ function update$3(el, ctx, value) {
14672
14898
  function destroy$1(el) {
14673
14899
  const ctx = el.__qvisible;
14674
14900
  if (ctx !== void 0) {
14675
- ctx.observer?.unobserve(el);
14901
+ ctx.observer?.disconnect();
14676
14902
  delete el.__qvisible;
14677
14903
  }
14678
14904
  }
@@ -15234,8 +15460,8 @@ const defaultSizes = {
15234
15460
  lg: 10,
15235
15461
  xl: 14
15236
15462
  };
15237
- function width(val, reverse, $q) {
15238
- return { transform: reverse ? `translateX(${$q.lang.rtl ? "-" : ""}100%) scale3d(${-val},1,1)` : `scale3d(${val},1,1)` };
15463
+ function width(val) {
15464
+ return { transform: `scale3d(${val},1,1)` };
15239
15465
  }
15240
15466
  var QLinearProgress_default = createComponent({
15241
15467
  name: "QLinearProgress",
@@ -15265,16 +15491,15 @@ var QLinearProgress_default = createComponent({
15265
15491
  const isDark = useDark(props, proxy.$q);
15266
15492
  const sizeStyle = useSize(props, defaultSizes);
15267
15493
  const motion = computed(() => props.indeterminate || props.query);
15268
- const widthReverse = computed(() => props.reverse !== props.query);
15269
15494
  const style = computed(() => ({
15270
15495
  ...sizeStyle.value !== null ? sizeStyle.value : {},
15271
15496
  "--q-linear-progress-speed": `${props.animationSpeed}ms`
15272
15497
  }));
15273
15498
  const classes = computed(() => "q-linear-progress" + (props.color !== void 0 ? ` text-${props.color}` : "") + (props.reverse || props.query ? " q-linear-progress--reverse" : "") + (props.rounded ? " rounded-borders" : ""));
15274
- const trackStyle = computed(() => width(props.buffer !== void 0 ? props.buffer : 1, widthReverse.value, proxy.$q));
15499
+ const trackStyle = computed(() => width(props.buffer !== void 0 ? props.buffer : 1));
15275
15500
  const transitionSuffix = computed(() => `with${props.instantFeedback ? "out" : ""}-transition`);
15276
15501
  const trackClass = computed(() => `q-linear-progress__track absolute-full q-linear-progress__track--${transitionSuffix.value} q-linear-progress__track--${isDark.value ? "dark" : "light"}` + (props.trackColor !== void 0 ? ` bg-${props.trackColor}` : ""));
15277
- const modelStyle = computed(() => width(motion.value ? 1 : props.value, widthReverse.value, proxy.$q));
15502
+ const modelStyle = computed(() => width(motion.value ? 1 : props.value));
15278
15503
  const modelClass = computed(() => `q-linear-progress__model absolute-full q-linear-progress__model--${transitionSuffix.value} q-linear-progress__model--${motion.value ? "in" : ""}determinate`);
15279
15504
  const stripeStyle = computed(() => ({ width: `${props.value * 100}%` }));
15280
15505
  const stripeClass = computed(() => `q-linear-progress__stripe absolute-${props.reverse ? "right" : "left"} q-linear-progress__stripe--${transitionSuffix.value}`);
@@ -16734,6 +16959,7 @@ var QRange_default = createComponent({
16734
16959
  });
16735
16960
  const maxEvents = computed(() => getEvents("max"));
16736
16961
  const getMaxThumb = methods.getThumbRenderFn({
16962
+ injectFormInput: false,
16737
16963
  focusValue: "max",
16738
16964
  getNodeData: () => ({
16739
16965
  ...maxEvents.value,
@@ -16832,8 +17058,8 @@ var QRange_default = createComponent({
16832
17058
  }
16833
17059
  }
16834
17060
  model.value = model.value.min === null || model.value.max === null ? {
16835
- min: pos.min || props.min,
16836
- max: pos.max || props.max
17061
+ min: pos.min ?? props.min,
17062
+ max: pos.max ?? props.max
16837
17063
  } : {
16838
17064
  min: pos.min,
16839
17065
  max: pos.max
@@ -16928,7 +17154,7 @@ var QRating_default = createComponent({
16928
17154
  selIconLen,
16929
17155
  selIcon: selIconLen > 0 ? props.iconSelected[selIconLen - 1] : props.iconSelected,
16930
17156
  halfIconLen,
16931
- halfIcon: halfIconLen > 0 ? props.iconHalf[selIconLen - 1] : props.iconHalf,
17157
+ halfIcon: halfIconLen > 0 ? props.iconHalf[halfIconLen - 1] : props.iconHalf,
16932
17158
  colorLen,
16933
17159
  color: colorLen > 0 ? props.color[colorLen - 1] : props.color,
16934
17160
  selColorLen,
@@ -16949,14 +17175,14 @@ var QRating_default = createComponent({
16949
17175
  return (i, label) => `${label} ${i}`;
16950
17176
  });
16951
17177
  const stars = computed(() => {
16952
- const acc = [], icons = iconData.value, ceil = Math.ceil(props.modelValue), tabindex = editable.value ? 0 : null;
17178
+ const acc = [], icons = iconData.value, ceil = Math.ceil(props.modelValue), tabIndex = Number.isInteger(props.modelValue) && props.modelValue >= 1 && props.modelValue <= props.max ? props.modelValue : 1;
16953
17179
  const halfIndex = props.iconHalf === void 0 || ceil === props.modelValue ? -1 : ceil;
16954
17180
  for (let i = 1; i <= props.max; i++) {
16955
17181
  const active = mouseModel.value === 0 && props.modelValue >= i || mouseModel.value > 0 && mouseModel.value >= i, half = halfIndex === i && mouseModel.value < i, exSelected = mouseModel.value > 0 && (half ? ceil : props.modelValue) >= i && mouseModel.value < i, color = half ? i <= icons.halfColorLen ? props.colorHalf[i - 1] : icons.halfColor : icons.selColor !== void 0 && active ? i <= icons.selColorLen ? props.colorSelected[i - 1] : icons.selColor : i <= icons.colorLen ? props.color[i - 1] : icons.color, name = (half ? i <= icons.halfIconLen ? props.iconHalf[i - 1] : icons.halfIcon : icons.selIcon !== void 0 && (active || exSelected) ? i <= icons.selIconLen ? props.iconSelected[i - 1] : icons.selIcon : i <= icons.iconLen ? props.icon[i - 1] : icons.icon) || $q.iconSet.rating.icon;
16956
17182
  acc.push({
16957
17183
  name: (half ? i <= icons.halfIconLen ? props.iconHalf[i - 1] : icons.halfIcon : icons.selIcon !== void 0 && (active || exSelected) ? i <= icons.selIconLen ? props.iconSelected[i - 1] : icons.selIcon : i <= icons.iconLen ? props.icon[i - 1] : icons.icon) || $q.iconSet.rating.icon,
16958
17184
  attrs: {
16959
- tabindex,
17185
+ tabindex: editable.value ? i === tabIndex ? 0 : -1 : null,
16960
17186
  role: "radio",
16961
17187
  "aria-checked": props.modelValue === i ? "true" : "false",
16962
17188
  "aria-label": iconLabel.value(i, name)
@@ -16982,17 +17208,25 @@ var QRating_default = createComponent({
16982
17208
  function setHoverValue(value) {
16983
17209
  if (editable.value) mouseModel.value = value;
16984
17210
  }
16985
- function onKeyup(e, i) {
17211
+ function onKeydown(e, i) {
16986
17212
  switch (e.keyCode) {
16987
17213
  case 13:
16988
17214
  case 32:
16989
17215
  set(i);
16990
17216
  return stopAndPrevent(e);
16991
- case 37:
17217
+ case 37: {
17218
+ const index = i + ($q.lang.rtl ? 1 : -1);
17219
+ if (iconRefs[`rt${index}`]) iconRefs[`rt${index}`].focus();
17220
+ return stopAndPrevent(e);
17221
+ }
17222
+ case 39: {
17223
+ const index = i + ($q.lang.rtl ? -1 : 1);
17224
+ if (iconRefs[`rt${index}`]) iconRefs[`rt${index}`].focus();
17225
+ return stopAndPrevent(e);
17226
+ }
16992
17227
  case 40:
16993
17228
  if (iconRefs[`rt${i - 1}`]) iconRefs[`rt${i - 1}`].focus();
16994
17229
  return stopAndPrevent(e);
16995
- case 39:
16996
17230
  case 38:
16997
17231
  if (iconRefs[`rt${i + 1}`]) iconRefs[`rt${i + 1}`].focus();
16998
17232
  return stopAndPrevent(e);
@@ -17026,8 +17260,8 @@ var QRating_default = createComponent({
17026
17260
  setHoverValue(i);
17027
17261
  },
17028
17262
  onBlur: resetMouseModel,
17029
- onKeyup(e) {
17030
- onKeyup(e, i);
17263
+ onKeydown(e) {
17264
+ onKeydown(e, i);
17031
17265
  }
17032
17266
  }, hMergeSlot(slots[`tip-${i}`], [h(QIcon_default, {
17033
17267
  class: iconClass,
@@ -17142,11 +17376,11 @@ var QScrollArea_default = createComponent({
17142
17376
  ],
17143
17377
  verticalOffset: {
17144
17378
  type: Array,
17145
- default: [0, 0]
17379
+ default: () => [0, 0]
17146
17380
  },
17147
17381
  horizontalOffset: {
17148
17382
  type: Array,
17149
- default: [0, 0]
17383
+ default: () => [0, 0]
17150
17384
  },
17151
17385
  contentStyle: [
17152
17386
  Array,
@@ -17219,11 +17453,11 @@ var QScrollArea_default = createComponent({
17219
17453
  scroll.horizontal.percentage = computed(() => {
17220
17454
  const diff = scroll.horizontal.size.value - container.horizontal.value;
17221
17455
  if (diff <= 0) return 0;
17222
- const p = between(Math.abs(scroll.horizontal.position.value) / diff, 0, 1);
17456
+ const p = between(getHorizontalLogicalPosition(scroll.horizontal.position.value) / diff, 0, 1);
17223
17457
  return Math.round(p * 1e4) / 1e4;
17224
17458
  });
17225
17459
  scroll.horizontal.thumbHidden = computed(() => !(props.visible === null ? hover.value : props.visible) && !tempShowing.value && !panning.value || scroll.horizontal.size.value <= container.horizontal.value + 1);
17226
- scroll.horizontal.thumbStart = computed(() => props.horizontalOffset[0] + scroll.horizontal.percentage.value * (container.horizontalInner.value - scroll.horizontal.thumbSize.value));
17460
+ scroll.horizontal.thumbStart = computed(() => props.horizontalOffset[proxy.$q.lang.rtl ? 1 : 0] + scroll.horizontal.percentage.value * (container.horizontalInner.value - scroll.horizontal.thumbSize.value));
17227
17461
  scroll.horizontal.thumbSize = computed(() => Math.round(between(container.horizontalInner.value * container.horizontalInner.value / scroll.horizontal.size.value, getMinThumbSize(container.horizontalInner.value), container.horizontalInner.value)));
17228
17462
  scroll.horizontal.style = computed(() => ({
17229
17463
  ...props.thumbStyle,
@@ -17299,22 +17533,28 @@ var QScrollArea_default = createComponent({
17299
17533
  const data = scroll[axis];
17300
17534
  if (e.isFirst) {
17301
17535
  if (data.thumbHidden.value) return;
17302
- panRefPos = data.position.value;
17536
+ panRefPos = axis === "horizontal" ? getHorizontalLogicalPosition(data.position.value) : data.position.value;
17303
17537
  panning.value = true;
17304
17538
  } else if (!panning.value) return;
17305
17539
  if (e.isFinal) panning.value = false;
17306
17540
  const dProp = dirProps[axis];
17307
17541
  const multiplier = (data.size.value - container[axis].value) / (container[axis + "Inner"].value - data.thumbSize.value);
17308
17542
  const distance = e.distance[dProp.dist];
17309
- setScroll(panRefPos + (e.direction === dProp.dir ? 1 : -1) * distance * multiplier, axis);
17543
+ const direction = (e.direction === dProp.dir ? 1 : -1) * (axis === "horizontal" && proxy.$q.lang.rtl ? -1 : 1);
17544
+ const pos = panRefPos + direction * distance * multiplier;
17545
+ setScroll(axis === "horizontal" ? getHorizontalNativePosition(pos) : pos, axis);
17310
17546
  }
17311
17547
  function onMousedown(evt, axis) {
17312
17548
  const data = scroll[axis];
17313
17549
  if (!data.thumbHidden.value) {
17314
- const startOffset = axis === "vertical" ? props.verticalOffset[0] : props.horizontalOffset[0];
17315
- const offset = evt[dirProps[axis].offset] - startOffset;
17550
+ const isHorizontalRtl = axis === "horizontal" && proxy.$q.lang.rtl;
17551
+ const startOffset = axis === "vertical" ? props.verticalOffset[0] : props.horizontalOffset[isHorizontalRtl ? 1 : 0];
17552
+ const offset = (isHorizontalRtl ? container.horizontal.value - evt.offsetX : evt[dirProps[axis].offset]) - startOffset;
17316
17553
  const thumbStart = data.thumbStart.value - startOffset;
17317
- if (offset < thumbStart || offset > thumbStart + data.thumbSize.value) setScroll(between((offset - data.thumbSize.value / 2) / (container[axis + "Inner"].value - data.thumbSize.value), 0, 1) * Math.max(0, data.size.value - container[axis].value), axis);
17554
+ if (offset < thumbStart || offset > thumbStart + data.thumbSize.value) {
17555
+ const percentage = between((offset - data.thumbSize.value / 2) / (container[axis + "Inner"].value - data.thumbSize.value), 0, 1);
17556
+ setScroll(isHorizontalRtl ? getHorizontalNativePosition(percentage * Math.max(0, data.size.value - container[axis].value)) : percentage * Math.max(0, data.size.value - container[axis].value), axis);
17557
+ }
17318
17558
  if (data.ref.value !== null) data.ref.value.dispatchEvent(new MouseEvent(evt.type, evt));
17319
17559
  }
17320
17560
  }
@@ -17330,6 +17570,14 @@ var QScrollArea_default = createComponent({
17330
17570
  function setScroll(offset, axis) {
17331
17571
  targetRef.value[dirProps[axis].scroll] = offset;
17332
17572
  }
17573
+ function getHorizontalLogicalPosition(position, rtl = proxy.$q.lang.rtl) {
17574
+ if (!rtl) return position;
17575
+ return rtlHasScrollBug ? Math.max(0, scroll.horizontal.size.value - container.horizontal.value) - position : -position;
17576
+ }
17577
+ function getHorizontalNativePosition(position, rtl = proxy.$q.lang.rtl) {
17578
+ if (!rtl) return position;
17579
+ return rtlHasScrollBug ? Math.max(0, scroll.horizontal.size.value - container.horizontal.value) - position : -position;
17580
+ }
17333
17581
  let mouseEventTimer = null;
17334
17582
  function onMouseenter() {
17335
17583
  if (mouseEventTimer !== null) clearTimeout(mouseEventTimer);
@@ -17346,8 +17594,8 @@ var QScrollArea_default = createComponent({
17346
17594
  hover.value = false;
17347
17595
  }
17348
17596
  let scrollPosition = null;
17349
- watch(() => proxy.$q.lang.rtl, (rtl) => {
17350
- if (targetRef.value !== null) setHorizontalScrollPosition(targetRef.value, Math.abs(scroll.horizontal.position.value) * (rtl ? -1 : 1));
17597
+ watch(() => proxy.$q.lang.rtl, (rtl, oldRtl) => {
17598
+ if (targetRef.value !== null) setHorizontalScrollPosition(targetRef.value, getHorizontalNativePosition(getHorizontalLogicalPosition(scroll.horizontal.position.value, oldRtl), rtl));
17351
17599
  });
17352
17600
  onDeactivated(() => {
17353
17601
  scrollPosition = {
@@ -17377,7 +17625,8 @@ var QScrollArea_default = createComponent({
17377
17625
  }),
17378
17626
  setScrollPosition: localSetScrollPosition,
17379
17627
  setScrollPercentage(axis, percentage, duration) {
17380
- localSetScrollPosition(axis, percentage * (scroll[axis].size.value - container[axis].value) * (axis === "horizontal" && proxy.$q.lang.rtl ? -1 : 1), duration);
17628
+ const offset = percentage * (scroll[axis].size.value - container[axis].value);
17629
+ localSetScrollPosition(axis, axis === "horizontal" ? getHorizontalNativePosition(offset) : offset, duration);
17381
17630
  }
17382
17631
  });
17383
17632
  const store = {
@@ -18968,11 +19217,12 @@ var QSlideItem_default = createComponent({
18968
19217
  if (pan.scale === 1) {
18969
19218
  node.style.transform = `translate${pan.axis}(${pan.dir * 100}%)`;
18970
19219
  if (timer !== null) clearTimeout(timer);
19220
+ const showing = pan.showing;
18971
19221
  timer = setTimeout(() => {
18972
19222
  timer = null;
18973
- emit(pan.showing, { reset });
19223
+ emit(showing, { reset });
18974
19224
  emit("action", {
18975
- side: pan.showing,
19225
+ side: showing,
18976
19226
  reset
18977
19227
  });
18978
19228
  }, 230);
@@ -19629,6 +19879,9 @@ var QSplitter_default = createComponent({
19629
19879
  });
19630
19880
  //#endregion
19631
19881
  //#region src/components/stepper/StepHeader.js
19882
+ function preventSpace$1(e) {
19883
+ if (e.keyCode === 32) stopAndPrevent(e);
19884
+ }
19632
19885
  var StepHeader_default = createComponent({
19633
19886
  name: "StepHeader",
19634
19887
  props: {
@@ -19690,13 +19943,19 @@ var StepHeader_default = createComponent({
19690
19943
  if (!isActive.value) props.goToPanel(props.step.name);
19691
19944
  }
19692
19945
  function onKeyup(e) {
19693
- if (e.keyCode === 13 && !isActive.value) props.goToPanel(props.step.name);
19946
+ if ([13, 32].includes(e.keyCode)) {
19947
+ if (!isActive.value) props.goToPanel(props.step.name);
19948
+ stopAndPrevent(e);
19949
+ }
19694
19950
  }
19695
19951
  return () => {
19696
19952
  const data = { class: classes.value };
19697
19953
  if (headerNav.value) {
19698
19954
  data.onClick = onActivate;
19955
+ data.onKeydown = preventSpace$1;
19699
19956
  data.onKeyup = onKeyup;
19957
+ data.role = "button";
19958
+ data["aria-current"] = isActive.value ? "step" : void 0;
19700
19959
  Object.assign(data, isDisable.value ? {
19701
19960
  tabindex: -1,
19702
19961
  "aria-disabled": "true"
@@ -19879,6 +20138,13 @@ var QTh_default = createComponent({
19879
20138
  const onClick = (evt) => {
19880
20139
  emit("click", evt);
19881
20140
  };
20141
+ const onKeyup = (evt, col) => {
20142
+ if (evt.key === "Enter" || evt.key === " ") {
20143
+ props.props.sort(col);
20144
+ onClick(evt);
20145
+ evt.preventDefault();
20146
+ }
20147
+ };
19882
20148
  return () => {
19883
20149
  if (props.props === void 0) return h("th", {
19884
20150
  class: props.autoWidth ? "q-table--col-auto-width" : "",
@@ -19886,7 +20152,7 @@ var QTh_default = createComponent({
19886
20152
  }, hSlot(slots.default));
19887
20153
  let col, child;
19888
20154
  const name = vm.vnode.key;
19889
- if (name) {
20155
+ if (name !== null) {
19890
20156
  col = props.props.colsMap[name];
19891
20157
  if (col === void 0) return;
19892
20158
  } else col = props.props.col;
@@ -19898,14 +20164,25 @@ var QTh_default = createComponent({
19898
20164
  name: $q.iconSet.table.arrowUp
19899
20165
  }));
19900
20166
  } else child = hSlot(slots.default);
19901
- return h("th", {
20167
+ const data = {
19902
20168
  class: col.__thClass + (props.autoWidth ? " q-table--col-auto-width" : ""),
19903
20169
  style: col.headerStyle,
19904
20170
  onClick: (evt) => {
19905
20171
  if (col.sortable) props.props.sort(col);
19906
20172
  onClick(evt);
19907
20173
  }
19908
- }, child);
20174
+ };
20175
+ if (col.sortable) {
20176
+ data.tabindex = 0;
20177
+ data["aria-sort"] = col.__ariaSort;
20178
+ data.onKeydown = (evt) => {
20179
+ if (evt.key === " ") evt.preventDefault();
20180
+ };
20181
+ data.onKeyup = (evt) => {
20182
+ onKeyup(evt, col);
20183
+ };
20184
+ }
20185
+ return h("th", data, child);
19909
20186
  };
19910
20187
  }
19911
20188
  });
@@ -20163,8 +20440,8 @@ function useTablePaginationState(vm, getCellValue) {
20163
20440
  function requestServerInteraction(prop = {}) {
20164
20441
  nextTick(() => {
20165
20442
  emit("request", {
20166
- pagination: prop.pagination || computedPagination.value,
20167
- filter: prop.filter || props.filter,
20443
+ pagination: prop.pagination === void 0 ? computedPagination.value : prop.pagination,
20444
+ filter: prop.filter === void 0 ? props.filter : prop.filter,
20168
20445
  getCellValue
20169
20446
  });
20170
20447
  });
@@ -20267,21 +20544,15 @@ const useTableRowSelectionProps = {
20267
20544
  };
20268
20545
  const useTableRowSelectionEmits = ["update:selected", "selection"];
20269
20546
  function useTableRowSelection(props, emit, computedRows, getRowKey) {
20270
- const selectedKeys = computed(() => {
20271
- const keys = {};
20272
- props.selected.map(getRowKey.value).forEach((key) => {
20273
- keys[key] = true;
20274
- });
20275
- return keys;
20276
- });
20547
+ const selectedKeys = computed(() => new Set(props.selected.map(getRowKey.value)));
20277
20548
  const hasSelectionMode = computed(() => props.selection !== "none");
20278
20549
  const singleSelection = computed(() => props.selection === "single");
20279
20550
  const multipleSelection = computed(() => props.selection === "multiple");
20280
- const allRowsSelected = computed(() => computedRows.value.length !== 0 && computedRows.value.every((row) => selectedKeys.value[getRowKey.value(row)]));
20281
- const someRowsSelected = computed(() => !allRowsSelected.value && computedRows.value.some((row) => selectedKeys.value[getRowKey.value(row)]));
20551
+ const allRowsSelected = computed(() => computedRows.value.length !== 0 && computedRows.value.every((row) => selectedKeys.value.has(getRowKey.value(row))));
20552
+ const someRowsSelected = computed(() => !allRowsSelected.value && computedRows.value.some((row) => selectedKeys.value.has(getRowKey.value(row))));
20282
20553
  const rowsSelectedNumber = computed(() => props.selected.length);
20283
20554
  function isRowSelected(key) {
20284
- return selectedKeys.value[key] === true;
20555
+ return selectedKeys.value.has(key);
20285
20556
  }
20286
20557
  function clearSelection() {
20287
20558
  emit("update:selected", []);
@@ -20369,6 +20640,7 @@ function useTableColumnSelection(props, computedPagination, hasSelectionMode) {
20369
20640
  ...col,
20370
20641
  align,
20371
20642
  __iconClass: `q-table__sort-icon q-table__sort-icon--${align}`,
20643
+ __ariaSort: col.sortable === true ? col.name === sortBy ? descending ? "descending" : "ascending" : "none" : void 0,
20372
20644
  __thClass: alignClass + (col.headerClasses !== void 0 ? " " + col.headerClasses : "") + (col.sortable ? " sortable" : "") + (col.name === sortBy ? ` sorted ${descending ? "sort-desc" : ""}` : ""),
20373
20645
  __tdStyle: col.style !== void 0 ? typeof col.style !== "function" ? () => col.style : col.style : () => null,
20374
20646
  __tdClass: col.classes !== void 0 ? typeof col.classes !== "function" ? () => alignClass + " " + col.classes : (row) => alignClass + " " + col.classes(row) : () => alignClass
@@ -20379,7 +20651,7 @@ function useTableColumnSelection(props, computedPagination, hasSelectionMode) {
20379
20651
  colList,
20380
20652
  computedCols,
20381
20653
  computedColsMap: computed(() => {
20382
- const names = {};
20654
+ const names = Object.create(null);
20383
20655
  computedCols.value.forEach((col) => {
20384
20656
  names[col.name] = col;
20385
20657
  });
@@ -20532,9 +20804,15 @@ var QTable_default = createComponent({
20532
20804
  const cardDefaultClass = computed(() => " q-table__card" + (isDark.value ? " q-table__card--dark q-dark" : "") + (props.square ? " q-table--square" : "") + (props.flat ? " q-table--flat" : "") + (props.bordered ? " q-table--bordered" : ""));
20533
20805
  const containerClass = computed(() => `q-table__container q-table--${props.separator}-separator column no-wrap` + (props.grid ? " q-table--grid" : cardDefaultClass.value) + (isDark.value ? " q-table--dark" : "") + (props.dense ? " q-table--dense" : "") + (props.wrapCells ? "" : " q-table--no-wrap") + (inFullscreen.value ? " fullscreen scroll" : ""));
20534
20806
  const rootContainerClass = computed(() => containerClass.value + (props.loading ? " q-table--loading" : ""));
20535
- watch(() => props.tableStyle + props.tableClass + props.tableHeaderStyle + props.tableHeaderClass + containerClass.value, () => {
20807
+ watch([
20808
+ () => props.tableStyle,
20809
+ () => props.tableClass,
20810
+ () => props.tableHeaderStyle,
20811
+ () => props.tableHeaderClass,
20812
+ containerClass
20813
+ ], () => {
20536
20814
  if (hasVirtScroll.value) virtScrollRef.value?.reset();
20537
- });
20815
+ }, { deep: true });
20538
20816
  const { innerPagination, computedPagination, isServerSide, requestServerInteraction, setPagination } = useTablePaginationState(vm, getCellValue);
20539
20817
  const { computedFilterMethod } = useTableFilter(props, setPagination);
20540
20818
  const { isRowExpanded, setExpanded, updateExpanded } = useTableRowExpand(props, emit);
@@ -20958,10 +21236,10 @@ var QTable_default = createComponent({
20958
21236
  if (props.onRowClick !== void 0 || props.onRowDblclick !== void 0 || props.onRowContextmenu !== void 0) {
20959
21237
  data.class[0] += " cursor-pointer";
20960
21238
  if (props.onRowClick !== void 0) data.onClick = (evt) => {
20961
- emit("RowClick", evt, scope.row, scope.pageIndex);
21239
+ emit("rowClick", evt, scope.row, scope.pageIndex);
20962
21240
  };
20963
21241
  if (props.onRowDblclick !== void 0) data.onDblclick = (evt) => {
20964
- emit("RowDblclick", evt, scope.row, scope.pageIndex);
21242
+ emit("rowDblclick", evt, scope.row, scope.pageIndex);
20965
21243
  };
20966
21244
  if (props.onRowContextmenu !== void 0) data.onContextmenu = (evt) => {
20967
21245
  emit("rowContextmenu", evt, scope.row, scope.pageIndex);
@@ -21098,6 +21376,9 @@ function getCurrentTime() {
21098
21376
  millisecond: d.getMilliseconds()
21099
21377
  };
21100
21378
  }
21379
+ function preventSpace(e) {
21380
+ if (e.keyCode === 32) stopAndPrevent(e);
21381
+ }
21101
21382
  function getWheelDist(a, b, threshold) {
21102
21383
  const diff = Math.abs(a - b);
21103
21384
  return Math.min(diff, threshold - diff);
@@ -21338,10 +21619,16 @@ var QTime_default = createComponent({
21338
21619
  }
21339
21620
  };
21340
21621
  function setAmOnKey(e) {
21341
- if (e.keyCode === 13) setAm();
21622
+ if ([13, 32].includes(e.keyCode)) {
21623
+ setAm();
21624
+ stopAndPrevent(e);
21625
+ }
21342
21626
  }
21343
21627
  function setPmOnKey(e) {
21344
- if (e.keyCode === 13) setPm();
21628
+ if ([13, 32].includes(e.keyCode)) {
21629
+ setPm();
21630
+ stopAndPrevent(e);
21631
+ }
21345
21632
  }
21346
21633
  function onClick(evt) {
21347
21634
  if (!shouldAbortInteraction()) {
@@ -21353,8 +21640,10 @@ var QTime_default = createComponent({
21353
21640
  if (!shouldAbortInteraction()) updateClock(evt, getClockRect());
21354
21641
  }
21355
21642
  function onKeyupHour(e) {
21356
- if (e.keyCode === 13) view.value = "hour";
21357
- else if ([37, 39].includes(e.keyCode)) {
21643
+ if ([13, 32].includes(e.keyCode)) {
21644
+ view.value = "hour";
21645
+ stopAndPrevent(e);
21646
+ } else if ([37, 39].includes(e.keyCode)) {
21358
21647
  const payload = e.keyCode === 37 ? -1 : 1;
21359
21648
  if (validHours.value !== null) {
21360
21649
  const values = computedFormat24h.value ? validHours.value.values : validHours.value[isAM.value ? "am" : "pm"].values;
@@ -21368,8 +21657,10 @@ var QTime_default = createComponent({
21368
21657
  }
21369
21658
  }
21370
21659
  function onKeyupMinute(e) {
21371
- if (e.keyCode === 13) view.value = "minute";
21372
- else if ([37, 39].includes(e.keyCode)) {
21660
+ if ([13, 32].includes(e.keyCode)) {
21661
+ view.value = "minute";
21662
+ stopAndPrevent(e);
21663
+ } else if ([37, 39].includes(e.keyCode)) {
21373
21664
  const payload = e.keyCode === 37 ? -1 : 1;
21374
21665
  if (validMinutes.value !== null) {
21375
21666
  const values = validMinutes.value.values;
@@ -21380,13 +21671,15 @@ var QTime_default = createComponent({
21380
21671
  }
21381
21672
  }
21382
21673
  function onKeyupSecond(e) {
21383
- if (e.keyCode === 13) view.value = "second";
21384
- else if ([37, 39].includes(e.keyCode)) {
21674
+ if ([13, 32].includes(e.keyCode)) {
21675
+ view.value = "second";
21676
+ stopAndPrevent(e);
21677
+ } else if ([37, 39].includes(e.keyCode)) {
21385
21678
  const payload = e.keyCode === 37 ? -1 : 1;
21386
21679
  if (validSeconds.value !== null) {
21387
21680
  const values = validSeconds.value.values;
21388
21681
  if (values.length === 0) return;
21389
- if (innerModel.value.seconds === null) setSecond(values[0]);
21682
+ if (innerModel.value.second === null) setSecond(values[0]);
21390
21683
  else setSecond(values[(values.length + values.indexOf(innerModel.value.second) + payload) % values.length]);
21391
21684
  } else setSecond((60 + (innerModel.value.second === null ? -payload : innerModel.value.second) + payload) % 60);
21392
21685
  }
@@ -21470,13 +21763,19 @@ var QTime_default = createComponent({
21470
21763
  h("div", {
21471
21764
  class: "q-time__link " + (view.value === "hour" ? "q-time__link--active" : "cursor-pointer"),
21472
21765
  tabindex: tabindex.value,
21766
+ role: "button",
21767
+ "aria-pressed": view.value === "hour" ? "true" : "false",
21473
21768
  onClick: setView.hour,
21769
+ onKeydown: preventSpace,
21474
21770
  onKeyup: onKeyupHour
21475
21771
  }, stringModel.value.hour),
21476
21772
  h("div", ":"),
21477
21773
  h("div", minLink.value ? {
21478
21774
  class: "q-time__link " + (view.value === "minute" ? "q-time__link--active" : "cursor-pointer"),
21479
21775
  tabindex: tabindex.value,
21776
+ role: "button",
21777
+ "aria-pressed": view.value === "minute" ? "true" : "false",
21778
+ onKeydown: preventSpace,
21480
21779
  onKeyup: onKeyupMinute,
21481
21780
  onClick: setView.minute
21482
21781
  } : { class: "q-time__link" }, stringModel.value.minute)
@@ -21484,6 +21783,9 @@ var QTime_default = createComponent({
21484
21783
  if (props.withSeconds) label.push(h("div", ":"), h("div", secLink.value ? {
21485
21784
  class: "q-time__link " + (view.value === "second" ? "q-time__link--active" : "cursor-pointer"),
21486
21785
  tabindex: tabindex.value,
21786
+ role: "button",
21787
+ "aria-pressed": view.value === "second" ? "true" : "false",
21788
+ onKeydown: preventSpace,
21487
21789
  onKeyup: onKeyupSecond,
21488
21790
  onClick: setView.second
21489
21791
  } : { class: "q-time__link" }, stringModel.value.second));
@@ -21494,12 +21796,18 @@ var QTime_default = createComponent({
21494
21796
  if (!computedFormat24h.value) child.push(h("div", { class: "q-time__header-ampm column items-between no-wrap" }, [h("div", {
21495
21797
  class: "q-time__link " + (isAM.value ? "q-time__link--active" : "cursor-pointer"),
21496
21798
  tabindex: tabindex.value,
21799
+ role: "button",
21800
+ "aria-pressed": isAM.value ? "true" : "false",
21497
21801
  onClick: setAm,
21802
+ onKeydown: preventSpace,
21498
21803
  onKeyup: setAmOnKey
21499
21804
  }, "AM"), h("div", {
21500
21805
  class: "q-time__link " + (isAM.value ? "cursor-pointer" : "q-time__link--active"),
21501
21806
  tabindex: tabindex.value,
21807
+ role: "button",
21808
+ "aria-pressed": isAM.value ? "false" : "true",
21502
21809
  onClick: setPm,
21810
+ onKeydown: preventSpace,
21503
21811
  onKeyup: setPmOnKey
21504
21812
  }, "PM")]));
21505
21813
  return h("div", { class: "q-time__header flex flex-center no-wrap " + headerClass.value }, child);
@@ -21741,9 +22049,11 @@ var QTree_default = createComponent({
21741
22049
  const lazy = ref({});
21742
22050
  const innerTicked = ref(props.ticked || []);
21743
22051
  const innerExpanded = ref(props.expanded || []);
21744
- let blurTargets = {};
22052
+ const focusedKey = ref(null);
22053
+ let blurTargets = {}, headerTargets = {};
21745
22054
  onBeforeUpdate(() => {
21746
22055
  blurTargets = {};
22056
+ headerTargets = {};
21747
22057
  });
21748
22058
  const classes = computed(() => `q-tree q-tree--${props.dense ? "dense" : "standard"}` + (props.noConnectors ? " q-tree--no-connectors" : "") + (isDark.value ? " q-tree--dark" : "") + (props.color !== void 0 ? ` text-${props.color}` : ""));
21749
22059
  const hasSelection = computed(() => props.selected !== void 0);
@@ -21816,6 +22126,25 @@ var QTree_default = createComponent({
21816
22126
  props.nodes.forEach((node) => travel(node, null));
21817
22127
  return acc;
21818
22128
  });
22129
+ const focusableKeys = computed(() => {
22130
+ const acc = [];
22131
+ function travel(nodes) {
22132
+ nodes.forEach((node) => {
22133
+ const localMeta = meta.value[node[props.nodeKey]];
22134
+ if (props.filter && localMeta.matchesFilter !== true) return;
22135
+ if (localMeta.link === true) acc.push(localMeta.key);
22136
+ if (localMeta.expanded === true && Array.isArray(node[props.childrenKey])) travel(node[props.childrenKey]);
22137
+ });
22138
+ }
22139
+ travel(props.nodes);
22140
+ return acc;
22141
+ });
22142
+ const tabKey = computed(() => {
22143
+ const keys = focusableKeys.value;
22144
+ if (keys.includes(focusedKey.value)) return focusedKey.value;
22145
+ const selected = keys.find((key) => meta.value[key].selected === true);
22146
+ return selected !== void 0 ? selected : keys[0];
22147
+ });
21819
22148
  watch(() => props.ticked, (val) => {
21820
22149
  innerTicked.value = val;
21821
22150
  });
@@ -21946,16 +22275,25 @@ var QTree_default = createComponent({
21946
22275
  class: `q-tree__node relative-position q-tree__node--${isParent ? "parent" : "child"}`
21947
22276
  }, [h("div", {
21948
22277
  class: "q-tree__node-header relative-position row no-wrap items-center" + (m.link === true ? " q-tree__node--link q-hoverable q-focusable" : "") + (m.selected === true ? " q-tree__node--selected" : "") + (m.disabled === true ? " q-tree__node--disabled" : ""),
21949
- tabindex: m.link === true ? 0 : -1,
21950
- ariaExpanded: children.length !== 0 ? m.expanded : null,
22278
+ ref: (el) => {
22279
+ headerTargets[m.key] = el;
22280
+ },
22281
+ tabindex: m.link === true && m.key === tabKey.value ? 0 : -1,
22282
+ "aria-expanded": isParent ? m.expanded ? "true" : "false" : null,
22283
+ "aria-selected": m.selectable ? m.selected ? "true" : "false" : null,
22284
+ "aria-disabled": m.disabled === true ? "true" : null,
21951
22285
  role: "treeitem",
22286
+ onFocus() {
22287
+ if (m.link === true) focusedKey.value = m.key;
22288
+ },
21952
22289
  onClick: (e) => {
21953
22290
  onClick(node, m, e);
21954
22291
  },
21955
- onKeypress(e) {
22292
+ onKeydown(e) {
21956
22293
  if (shouldIgnoreKey(e) !== true) {
21957
22294
  if (e.keyCode === 13) onClick(node, m, e, true);
21958
22295
  else if (e.keyCode === 32) onExpandClick(node, m, e, true);
22296
+ else if (onNavigationKey(m, e.keyCode)) stopAndPrevent(e);
21959
22297
  }
21960
22298
  }
21961
22299
  }, [
@@ -22011,7 +22349,59 @@ var QTree_default = createComponent({
22011
22349
  function blur(key) {
22012
22350
  blurTargets[key]?.focus();
22013
22351
  }
22352
+ function focusNode(key) {
22353
+ if (key !== void 0) {
22354
+ focusedKey.value = key;
22355
+ headerTargets[key]?.focus();
22356
+ }
22357
+ }
22358
+ function getFirstFocusableChild(children) {
22359
+ for (const child of children) {
22360
+ if (props.filter && child.matchesFilter !== true) continue;
22361
+ if (child.link === true) return child.key;
22362
+ if (child.expanded === true) {
22363
+ const key = getFirstFocusableChild(child.children);
22364
+ if (key !== void 0) return key;
22365
+ }
22366
+ }
22367
+ }
22368
+ function onNavigationKey(localMeta, keyCode) {
22369
+ const keys = focusableKeys.value, index = keys.indexOf(localMeta.key);
22370
+ if (keyCode === 36) {
22371
+ focusNode(keys[0]);
22372
+ return true;
22373
+ }
22374
+ if (keyCode === 35) {
22375
+ focusNode(keys.at(-1));
22376
+ return true;
22377
+ }
22378
+ if (keyCode === 38) {
22379
+ focusNode(keys[index - 1]);
22380
+ return true;
22381
+ }
22382
+ if (keyCode === 40) {
22383
+ focusNode(keys[index + 1]);
22384
+ return true;
22385
+ }
22386
+ if (keyCode === 39) {
22387
+ if (localMeta.isParent !== true && !localMeta.lazy) return true;
22388
+ if (localMeta.expanded !== true) setExpanded(localMeta.key, true);
22389
+ else focusNode(getFirstFocusableChild(localMeta.children));
22390
+ return true;
22391
+ }
22392
+ if (keyCode === 37) {
22393
+ if (localMeta.expanded === true) setExpanded(localMeta.key, false);
22394
+ else {
22395
+ let parent = localMeta.parent;
22396
+ while (parent !== null && parent.link !== true) parent = parent.parent;
22397
+ focusNode(parent?.key);
22398
+ }
22399
+ return true;
22400
+ }
22401
+ return false;
22402
+ }
22014
22403
  function onClick(node, localMeta, e, keyboard) {
22404
+ if (localMeta.link === true) focusedKey.value = localMeta.key;
22015
22405
  if (keyboard !== true && localMeta.selectable !== false) blur(localMeta.key);
22016
22406
  if (hasSelection.value && localMeta.selectable) {
22017
22407
  if (!props.noSelectionUnset) emit("update:selected", localMeta.key !== props.selected ? localMeta.key : null);
@@ -22020,6 +22410,7 @@ var QTree_default = createComponent({
22020
22410
  if (typeof node.handler === "function") node.handler(node);
22021
22411
  }
22022
22412
  function onExpandClick(node, localMeta, e, keyboard) {
22413
+ if (localMeta.link === true) focusedKey.value = localMeta.key;
22023
22414
  if (e !== void 0) stopAndPrevent(e);
22024
22415
  if (keyboard !== true && localMeta.selectable !== false) blur(localMeta.key);
22025
22416
  setExpanded(localMeta.key, !localMeta.expanded, node, localMeta);
@@ -22110,7 +22501,7 @@ function getRenderer(getPlugin, expose) {
22110
22501
  return;
22111
22502
  }
22112
22503
  file.__uploaded = status === "uploaded" ? file.size : uploadedSize;
22113
- file.__progress = status === "uploaded" ? 1 : Math.min(.9999, file.__uploaded / file.size);
22504
+ file.__progress = status === "uploaded" ? 1 : file.size === 0 ? 0 : Math.min(.9999, file.__uploaded / file.size);
22114
22505
  file.__progressLabel = getProgressLabel(file.__progress);
22115
22506
  proxy.$forceUpdate();
22116
22507
  }
@@ -22167,7 +22558,9 @@ function getRenderer(getPlugin, expose) {
22167
22558
  }
22168
22559
  }
22169
22560
  function removeUploadedFiles() {
22170
- if (!props.disable) batchRemoveFiles(["uploaded"], () => {
22561
+ if (!props.disable) batchRemoveFiles(["uploaded"], ({ size }) => {
22562
+ state.uploadedSize.value -= size;
22563
+ uploadSize.value -= size;
22171
22564
  state.uploadedFiles.value = [];
22172
22565
  });
22173
22566
  }
@@ -22198,8 +22591,12 @@ function getRenderer(getPlugin, expose) {
22198
22591
  }
22199
22592
  function removeFile(file) {
22200
22593
  if (props.disable) return;
22201
- if (file.__status === "uploaded") state.uploadedFiles.value = state.uploadedFiles.value.filter((f) => f.__key !== file.__key);
22202
- else if (file.__status === "uploading") file.__abort();
22594
+ const isUploading = file.__status === "uploading";
22595
+ if (file.__status === "uploaded") {
22596
+ state.uploadedSize.value -= file.size;
22597
+ uploadSize.value -= file.size;
22598
+ state.uploadedFiles.value = state.uploadedFiles.value.filter((f) => f.__key !== file.__key);
22599
+ } else if (isUploading) uploadSize.value -= file.size;
22203
22600
  else uploadSize.value -= file.size;
22204
22601
  state.files.value = state.files.value.filter((f) => {
22205
22602
  if (f.__key !== file.__key) return true;
@@ -22207,6 +22604,7 @@ function getRenderer(getPlugin, expose) {
22207
22604
  return false;
22208
22605
  });
22209
22606
  state.queuedFiles.value = state.queuedFiles.value.filter((f) => f.__key !== file.__key);
22607
+ if (isUploading) file.__abort();
22210
22608
  emit("removed", [file]);
22211
22609
  }
22212
22610
  function revokeImgURLs() {
@@ -22431,6 +22829,7 @@ function injectPlugin({ props, emit, helpers }) {
22431
22829
  const xhrs = ref([]);
22432
22830
  const promises = ref([]);
22433
22831
  const workingThreads = ref(0);
22832
+ const abortedPromises = /* @__PURE__ */ new WeakSet();
22434
22833
  const xhrProps = computed(() => ({
22435
22834
  url: getFn(props.url),
22436
22835
  method: getFn(props.method),
@@ -22443,12 +22842,14 @@ function injectPlugin({ props, emit, helpers }) {
22443
22842
  }));
22444
22843
  const isUploading = computed(() => workingThreads.value > 0);
22445
22844
  const isBusy = computed(() => promises.value.length !== 0);
22446
- let abortPromises;
22845
+ const getLiveFiles = (files) => files.filter((file) => helpers.files.value.includes(file));
22447
22846
  function abort() {
22448
22847
  xhrs.value.forEach((x) => {
22449
22848
  x.abort();
22450
22849
  });
22451
- if (promises.value.length !== 0) abortPromises = true;
22850
+ promises.value.forEach((promise) => {
22851
+ abortedPromises.add(promise);
22852
+ });
22452
22853
  }
22453
22854
  function upload() {
22454
22855
  const queue = [...helpers.queuedFiles.value];
@@ -22460,36 +22861,57 @@ function injectPlugin({ props, emit, helpers }) {
22460
22861
  }
22461
22862
  function runFactory(files) {
22462
22863
  workingThreads.value++;
22864
+ const failed = (err, promise) => {
22865
+ if (helpers.isAlive()) {
22866
+ if (promise !== void 0) promises.value = promises.value.filter((p) => p !== promise);
22867
+ const liveFiles = getLiveFiles(files);
22868
+ if (liveFiles.length !== 0) {
22869
+ helpers.queuedFiles.value.push(...liveFiles);
22870
+ liveFiles.forEach((f) => {
22871
+ helpers.updateFileStatus(f, "failed");
22872
+ });
22873
+ emit("factoryFailed", err, liveFiles);
22874
+ }
22875
+ workingThreads.value--;
22876
+ }
22877
+ };
22463
22878
  if (typeof props.factory !== "function") {
22464
- performUpload(files, {});
22879
+ startUpload({});
22465
22880
  return;
22466
22881
  }
22467
- const res = props.factory(files);
22468
- if (!res) {
22469
- emit("factoryFailed", /* @__PURE__ */ new Error("QUploader: factory() does not return properly"), files);
22470
- workingThreads.value--;
22471
- } else if (typeof res.catch === "function" && typeof res.then === "function") {
22882
+ let res;
22883
+ try {
22884
+ res = props.factory(files);
22885
+ } catch (err) {
22886
+ failed(err);
22887
+ return;
22888
+ }
22889
+ if (Object(res) !== res) failed(/* @__PURE__ */ new Error("QUploader: factory() does not return properly"));
22890
+ else if (typeof res.catch === "function" && typeof res.then === "function") {
22472
22891
  promises.value.push(res);
22473
- const failed = (err) => {
22474
- if (helpers.isAlive()) {
22475
- promises.value = promises.value.filter((p) => p !== res);
22476
- if (promises.value.length === 0) abortPromises = false;
22477
- helpers.queuedFiles.value.push(...files);
22478
- files.forEach((f) => {
22479
- helpers.updateFileStatus(f, "failed");
22480
- });
22481
- emit("factoryFailed", err, files);
22482
- workingThreads.value--;
22483
- }
22484
- };
22485
22892
  res.then((factory) => {
22486
- if (abortPromises) failed(/* @__PURE__ */ new Error("Aborted"));
22893
+ if (abortedPromises.has(res)) failed(/* @__PURE__ */ new Error("Aborted"), res);
22894
+ else if (Object(factory) !== factory) failed(/* @__PURE__ */ new Error("QUploader: factory() does not return properly"), res);
22487
22895
  else if (helpers.isAlive()) {
22488
22896
  promises.value = promises.value.filter((p) => p !== res);
22489
- performUpload(files, factory);
22897
+ startUpload(factory);
22490
22898
  }
22491
- }).catch(failed);
22492
- } else performUpload(files, res || {});
22899
+ }).catch((err) => {
22900
+ failed(err, res);
22901
+ });
22902
+ } else startUpload(res);
22903
+ function startUpload(factory) {
22904
+ const liveFiles = getLiveFiles(files);
22905
+ if (liveFiles.length === 0) {
22906
+ workingThreads.value--;
22907
+ return;
22908
+ }
22909
+ try {
22910
+ performUpload(liveFiles, factory);
22911
+ } catch (err) {
22912
+ failed(err);
22913
+ }
22914
+ }
22493
22915
  }
22494
22916
  function performUpload(files, factory) {
22495
22917
  const form = new FormData(), xhr = new XMLHttpRequest();
@@ -22497,6 +22919,10 @@ function injectPlugin({ props, emit, helpers }) {
22497
22919
  const url = getProp("url", files);
22498
22920
  if (!url) {
22499
22921
  console.error("q-uploader: invalid or no URL specified");
22922
+ helpers.queuedFiles.value.push(...files);
22923
+ files.forEach((f) => {
22924
+ helpers.updateFileStatus(f, "failed");
22925
+ });
22500
22926
  workingThreads.value--;
22501
22927
  return;
22502
22928
  }
@@ -22513,7 +22939,7 @@ function injectPlugin({ props, emit, helpers }) {
22513
22939
  let size = localUploadedSize - uploadIndexSize;
22514
22940
  for (let i = uploadIndex; size > 0 && i < files.length; i++) {
22515
22941
  const file = files[i];
22516
- if (size > file.size) {
22942
+ if (size >= file.size) {
22517
22943
  size -= file.size;
22518
22944
  uploadIndex++;
22519
22945
  uploadIndexSize += file.size;
@@ -22527,25 +22953,33 @@ function injectPlugin({ props, emit, helpers }) {
22527
22953
  xhr.addEventListener("readystatechange", () => {
22528
22954
  if (xhr.readyState < 4) return;
22529
22955
  if (xhr.status && xhr.status < 400) {
22530
- helpers.uploadedFiles.value.push(...files);
22531
- files.forEach((f) => {
22532
- helpers.updateFileStatus(f, "uploaded");
22533
- });
22534
- emit("uploaded", {
22535
- files,
22536
- xhr
22537
- });
22956
+ const liveFiles = getLiveFiles(files);
22957
+ const liveUploadSize = liveFiles.reduce((total, file) => total + file.size, 0);
22958
+ helpers.uploadedSize.value += liveUploadSize - localUploadedSize;
22959
+ if (liveFiles.length !== 0) {
22960
+ helpers.uploadedFiles.value.push(...liveFiles);
22961
+ liveFiles.forEach((f) => {
22962
+ helpers.updateFileStatus(f, "uploaded");
22963
+ });
22964
+ emit("uploaded", {
22965
+ files: liveFiles,
22966
+ xhr
22967
+ });
22968
+ }
22538
22969
  } else {
22539
22970
  aborted = true;
22540
22971
  helpers.uploadedSize.value -= localUploadedSize;
22541
- helpers.queuedFiles.value.push(...files);
22542
- files.forEach((f) => {
22543
- helpers.updateFileStatus(f, "failed");
22544
- });
22545
- emit("failed", {
22546
- files,
22547
- xhr
22548
- });
22972
+ const liveFiles = getLiveFiles(files);
22973
+ if (liveFiles.length !== 0) {
22974
+ helpers.queuedFiles.value.push(...liveFiles);
22975
+ liveFiles.forEach((f) => {
22976
+ helpers.updateFileStatus(f, "failed");
22977
+ });
22978
+ emit("failed", {
22979
+ files: liveFiles,
22980
+ xhr
22981
+ });
22982
+ }
22549
22983
  }
22550
22984
  workingThreads.value--;
22551
22985
  xhrs.value = xhrs.value.filter((x) => x !== xhr);
@@ -23820,7 +24254,7 @@ var TouchRepeat_default = createDirective({
23820
24254
  if (keyRegex.test(key)) {
23821
24255
  const parsedKey = Number.parseInt(key, 10);
23822
24256
  const keyCode = Number.isNaN(parsedKey) ? keyCodes[key.toLowerCase()] : parsedKey;
23823
- if (keyCode >= 0) acc.push(keyCode);
24257
+ if (keyCode !== void 0) acc.push(...[keyCode].flat());
23824
24258
  }
23825
24259
  return acc;
23826
24260
  }, []);
@@ -24386,7 +24820,11 @@ function stringifyCookieValue(value) {
24386
24820
  function read(string) {
24387
24821
  if (string === "") return string;
24388
24822
  if (string.indexOf("\"") === 0) string = string.slice(1, -1).replaceAll(String.raw`\"`, "\"").replaceAll(String.raw`\\`, "\\");
24389
- string = decodeURIComponent(string.replaceAll("+", " "));
24823
+ try {
24824
+ string = decodeURIComponent(string.replaceAll("+", " "));
24825
+ } catch {
24826
+ return;
24827
+ }
24390
24828
  try {
24391
24829
  const parsed = JSON.parse(string);
24392
24830
  if (parsed === Object(parsed) || Array.isArray(parsed)) string = parsed;
@@ -24410,15 +24848,19 @@ function parseExpireToSeconds(str) {
24410
24848
  const unit = match[2];
24411
24849
  totalSeconds += value * numberUnitMultiplierMap[unit];
24412
24850
  }
24413
- return hasMatch ? totalSeconds : void 0;
24851
+ if (hasMatch) return totalSeconds;
24852
+ const timestamp = Date.parse(str);
24853
+ return Number.isNaN(timestamp) ? void 0 : Math.round((timestamp - Date.now()) / 1e3);
24414
24854
  }
24415
24855
  function set(key, val, opts = {}, ssr) {
24416
24856
  let maxAge;
24417
24857
  let isDeletion = false;
24418
24858
  if (opts.expires !== void 0) {
24419
24859
  if (Number.isFinite(opts.expires)) maxAge = Math.round(opts.expires * 86400);
24420
- else if (opts.expires instanceof Date) maxAge = Math.round((opts.expires.getTime() - Date.now()) / 1e3);
24421
- else if (typeof opts.expires === "string") maxAge = parseExpireToSeconds(opts.expires);
24860
+ else if (opts.expires instanceof Date) {
24861
+ const timestamp = opts.expires.getTime();
24862
+ if (Number.isFinite(timestamp)) maxAge = Math.round((timestamp - Date.now()) / 1e3);
24863
+ } else if (typeof opts.expires === "string") maxAge = parseExpireToSeconds(opts.expires);
24422
24864
  if (maxAge !== void 0) isDeletion = maxAge <= 0;
24423
24865
  }
24424
24866
  const keyValue = `${encodeURIComponent(key)}=${stringifyCookieValue(val)}`;
@@ -24438,8 +24880,8 @@ function set(key, val, opts = {}, ssr) {
24438
24880
  ssr.res.setHeader("Set-Cookie", ssr.req.qCookies);
24439
24881
  let all = ssr.req.headers.cookie || "";
24440
24882
  if (maxAge !== void 0 && isDeletion) {
24441
- const localVal = get(key, ssr);
24442
- if (localVal !== void 0) all = all.replace(`${key}=${localVal}; `, "").replace(`; ${key}=${localVal}`, "").replace(`${key}=${localVal}`, "");
24883
+ const encodedKey = encodeURIComponent(key);
24884
+ all = all.split("; ").filter((entry) => entry.split("=", 1)[0] !== encodedKey).join("; ");
24443
24885
  } else all = all ? `${keyValue}; ${all}` : keyValue;
24444
24886
  ssr.req.headers.cookie = all;
24445
24887
  } else document.cookie = cookie;
@@ -24449,11 +24891,15 @@ function get(key, ssr) {
24449
24891
  let result = key ? null : {}, i = 0, parts, name, cookie;
24450
24892
  for (; i < l; i++) {
24451
24893
  parts = cookies[i].split("=");
24452
- name = decodeURIComponent(parts.shift());
24894
+ try {
24895
+ name = decodeURIComponent(parts.shift());
24896
+ } catch {
24897
+ continue;
24898
+ }
24453
24899
  cookie = parts.join("=");
24454
24900
  if (!key) result[name] = cookie;
24455
24901
  else if (key === name) {
24456
- result = read(cookie);
24902
+ result = read(cookie) ?? null;
24457
24903
  break;
24458
24904
  }
24459
24905
  }
@@ -24852,6 +25298,7 @@ const Plugin$7 = createReactivePlugin({ isActive: false }, {
24852
25298
  //#region src/plugins/meta/Meta.js
24853
25299
  let updateId = null;
24854
25300
  let currentClientMeta;
25301
+ String.raw`\u003C`, String.raw`\u003E`, String.raw`\u0026`, String.raw`\u2028`, String.raw`\u2029`;
24855
25302
  const clientList = [];
24856
25303
  function normalize(meta) {
24857
25304
  if (meta.title) {
@@ -25796,10 +26243,10 @@ function runSequentialPromises(sequentialPromises, { threadsNumber = 1, abortOnF
25796
26243
  //#endregion
25797
26244
  //#region src/index.dev.js
25798
26245
  const Quasar = {
25799
- version: "2.21.4",
26246
+ version: "2.23.0",
25800
26247
  install: install_quasar_default,
25801
26248
  lang: Plugin$5,
25802
26249
  iconSet: Plugin$4
25803
26250
  };
25804
26251
  //#endregion
25805
- export { AddressbarColor_default as AddressbarColor, Plugin as AppFullscreen, Plugin$1 as AppVisibility, BottomSheet_default as BottomSheet, ClosePopup_default as ClosePopup, Plugin$2 as Cookies, Plugin$3 as Dark, Dialog_default as Dialog, EventBus, Plugin$4 as IconSet, Intersection_default as Intersection, Plugin$5 as Lang, Plugin$6 as Loading, Plugin$7 as LoadingBar, Plugin$8 as LocalStorage, Meta_default as Meta, Morph_default as Morph, Mutation_default as Mutation, Notify_default as Notify, Platform, QAjaxBar_default as QAjaxBar, QAvatar_default as QAvatar, QBadge_default as QBadge, QBanner_default as QBanner, QBar_default as QBar, QBreadcrumbs_default as QBreadcrumbs, QBreadcrumbsEl_default as QBreadcrumbsEl, QBtn_default as QBtn, QBtnDropdown_default as QBtnDropdown, QBtnGroup_default as QBtnGroup, QBtnToggle_default as QBtnToggle, QCard_default as QCard, QCardActions_default as QCardActions, QCardSection_default as QCardSection, QCarousel_default as QCarousel, QCarouselControl_default as QCarouselControl, QCarouselSlide_default as QCarouselSlide, QChatMessage_default as QChatMessage, QCheckbox_default as QCheckbox, QChip_default as QChip, QCircularProgress_default as QCircularProgress, QColor_default as QColor, QDate_default as QDate, QDialog_default as QDialog, QDrawer_default as QDrawer, QEditor_default as QEditor, QExpansionItem_default as QExpansionItem, QFab_default as QFab, QFabAction_default as QFabAction, QField_default as QField, QFile_default as QFile, QFooter_default as QFooter, QForm_default as QForm, QFormChildMixin_default as QFormChildMixin, QHeader_default as QHeader, QIcon_default as QIcon, QImg_default as QImg, QInfiniteScroll_default as QInfiniteScroll, QInnerLoading_default as QInnerLoading, QInput_default as QInput, QIntersection_default as QIntersection, QItem_default as QItem, QItemLabel_default as QItemLabel, QItemSection_default as QItemSection, QKnob_default as QKnob, QLayout_default as QLayout, QLinearProgress_default as QLinearProgress, QList_default as QList, QMarkupTable_default as QMarkupTable, QMenu_default as QMenu, QNoSsr_default as QNoSsr, QOptionGroup_default as QOptionGroup, QPage_default as QPage, QPageContainer_default as QPageContainer, QPageScroller_default as QPageScroller, QPageSticky_default as QPageSticky, QPagination_default as QPagination, QParallax_default as QParallax, QPopupEdit_default as QPopupEdit, QPopupProxy_default as QPopupProxy, QPullToRefresh_default as QPullToRefresh, QRadio_default as QRadio, QRange_default as QRange, QRating_default as QRating, QResizeObserver_default as QResizeObserver, QResponsive_default as QResponsive, QRouteTab_default as QRouteTab, QScrollArea_default as QScrollArea, QScrollObserver_default as QScrollObserver, QSelect_default as QSelect, QSeparator_default as QSeparator, QSkeleton_default as QSkeleton, QSlideItem_default as QSlideItem, QSlideTransition_default as QSlideTransition, QSlider_default as QSlider, QSpace_default as QSpace, QSpinner_default as QSpinner, QSpinnerAudio_default as QSpinnerAudio, QSpinnerBall_default as QSpinnerBall, QSpinnerBars_default as QSpinnerBars, QSpinnerBox_default as QSpinnerBox, QSpinnerClock_default as QSpinnerClock, QSpinnerComment_default as QSpinnerComment, QSpinnerCube_default as QSpinnerCube, QSpinnerDots_default as QSpinnerDots, QSpinnerFacebook_default as QSpinnerFacebook, QSpinnerGears_default as QSpinnerGears, QSpinnerGrid_default as QSpinnerGrid, QSpinnerHearts_default as QSpinnerHearts, QSpinnerHourglass_default as QSpinnerHourglass, QSpinnerInfinity_default as QSpinnerInfinity, QSpinnerIos_default as QSpinnerIos, QSpinnerOrbit_default as QSpinnerOrbit, QSpinnerOval_default as QSpinnerOval, QSpinnerPie_default as QSpinnerPie, QSpinnerPuff_default as QSpinnerPuff, QSpinnerRadio_default as QSpinnerRadio, QSpinnerRings_default as QSpinnerRings, QSpinnerTail_default as QSpinnerTail, QSplitter_default as QSplitter, QStep_default as QStep, QStepper_default as QStepper, QStepperNavigation_default as QStepperNavigation, QTab_default as QTab, QTabPanel_default as QTabPanel, QTabPanels_default as QTabPanels, QTable_default as QTable, QTabs_default as QTabs, QTd_default as QTd, QTh_default as QTh, QTime_default as QTime, QTimeline_default as QTimeline, QTimelineEntry_default as QTimelineEntry, QToggle_default as QToggle, QToolbar_default as QToolbar, QToolbarTitle_default as QToolbarTitle, QTooltip_default as QTooltip, QTr_default as QTr, QTree_default as QTree, QUploader_default as QUploader, QUploaderAddTrigger_default as QUploaderAddTrigger, QVideo_default as QVideo, QVirtualScroll_default as QVirtualScroll, Quasar, Ripple_default as Ripple, Screen_default as Screen, Scroll_default as Scroll, ScrollFire_default as ScrollFire, Plugin$9 as SessionStorage, TouchHold_default as TouchHold, TouchPan_default as TouchPan, TouchRepeat_default as TouchRepeat, TouchSwipe_default as TouchSwipe, cloneDeep as clone, colors_default as colors, copyToClipboard, createMetaMixin, createUploaderComponent, date_default as date, debounce, dom_default as dom, event_default as event, exportFile, extend, format_default as format, frameDebounce, getCssVar, is_default as is, morph, noop, openUrl as openURL, patterns_default as patterns, runSequentialPromises, scroll_default as scroll, setCssVar, throttle, uid_default as uid, useDialogPluginComponent, useFormChild, useHydration, useId, useInterval, useMeta, useQuasar, useRenderCache, useSplitAttrs, useTick, useTimeout };
26252
+ export { AddressbarColor_default as AddressbarColor, Plugin as AppFullscreen, Plugin$1 as AppVisibility, BottomSheet_default as BottomSheet, ClosePopup_default as ClosePopup, Plugin$2 as Cookies, Plugin$3 as Dark, Dialog_default as Dialog, EventBus, Plugin$4 as IconSet, Intersection_default as Intersection, Plugin$5 as Lang, Plugin$6 as Loading, Plugin$7 as LoadingBar, Plugin$8 as LocalStorage, Meta_default as Meta, Morph_default as Morph, Mutation_default as Mutation, Notify_default as Notify, Platform, QAjaxBar_default as QAjaxBar, QAvatar_default as QAvatar, QBadge_default as QBadge, QBanner_default as QBanner, QBar_default as QBar, QBreadcrumbs_default as QBreadcrumbs, QBreadcrumbsEl_default as QBreadcrumbsEl, QBtn_default as QBtn, QBtnDropdown_default as QBtnDropdown, QBtnGroup_default as QBtnGroup, QBtnToggle_default as QBtnToggle, QCard_default as QCard, QCardActions_default as QCardActions, QCardSection_default as QCardSection, QCarousel_default as QCarousel, QCarouselControl_default as QCarouselControl, QCarouselSlide_default as QCarouselSlide, QChatMessage_default as QChatMessage, QCheckbox_default as QCheckbox, QChip_default as QChip, QCircularProgress_default as QCircularProgress, QColor_default as QColor, QDate_default as QDate, QDialog_default as QDialog, QDrawer_default as QDrawer, QEditor_default as QEditor, QExpansionItem_default as QExpansionItem, QFab_default as QFab, QFabAction_default as QFabAction, QField_default as QField, QFile_default as QFile, QFooter_default as QFooter, QForm_default as QForm, QFormChildMixin_default as QFormChildMixin, QHeader_default as QHeader, QIcon_default as QIcon, QImg_default as QImg, QInfiniteScroll_default as QInfiniteScroll, QInnerLoading_default as QInnerLoading, QInput_default as QInput, QIntersection_default as QIntersection, QItem_default as QItem, QItemLabel_default as QItemLabel, QItemSection_default as QItemSection, QKnob_default as QKnob, QLayout_default as QLayout, QLinearProgress_default as QLinearProgress, QList_default as QList, QMarkupTable_default as QMarkupTable, QMenu_default as QMenu, QNoSsr_default as QNoSsr, QOptionGroup_default as QOptionGroup, QPage_default as QPage, QPageContainer_default as QPageContainer, QPageScroller_default as QPageScroller, QPageSticky_default as QPageSticky, QPagination_default as QPagination, QParallax_default as QParallax, QPopupEdit_default as QPopupEdit, QPopupProxy_default as QPopupProxy, QPullToRefresh_default as QPullToRefresh, QRadio_default as QRadio, QRange_default as QRange, QRating_default as QRating, QResizeObserver_default as QResizeObserver, QResponsive_default as QResponsive, QRouteTab_default as QRouteTab, QScrollArea_default as QScrollArea, QScrollObserver_default as QScrollObserver, QSelect_default as QSelect, QSeparator_default as QSeparator, QSkeleton_default as QSkeleton, QSlideItem_default as QSlideItem, QSlideTransition_default as QSlideTransition, QSlider_default as QSlider, QSpace_default as QSpace, QSpinner_default as QSpinner, QSpinnerAudio_default as QSpinnerAudio, QSpinnerBall_default as QSpinnerBall, QSpinnerBars_default as QSpinnerBars, QSpinnerBox_default as QSpinnerBox, QSpinnerClock_default as QSpinnerClock, QSpinnerComment_default as QSpinnerComment, QSpinnerCube_default as QSpinnerCube, QSpinnerDots_default as QSpinnerDots, QSpinnerFacebook_default as QSpinnerFacebook, QSpinnerGears_default as QSpinnerGears, QSpinnerGrid_default as QSpinnerGrid, QSpinnerHearts_default as QSpinnerHearts, QSpinnerHourglass_default as QSpinnerHourglass, QSpinnerInfinity_default as QSpinnerInfinity, QSpinnerIos_default as QSpinnerIos, QSpinnerOrbit_default as QSpinnerOrbit, QSpinnerOval_default as QSpinnerOval, QSpinnerPie_default as QSpinnerPie, QSpinnerPuff_default as QSpinnerPuff, QSpinnerRadio_default as QSpinnerRadio, QSpinnerRings_default as QSpinnerRings, QSpinnerTail_default as QSpinnerTail, QSplitter_default as QSplitter, QStep_default as QStep, QStepper_default as QStepper, QStepperNavigation_default as QStepperNavigation, QTab_default as QTab, QTabPanel_default as QTabPanel, QTabPanels_default as QTabPanels, QTable_default as QTable, QTabs_default as QTabs, QTd_default as QTd, QTh_default as QTh, QTime_default as QTime, QTimeline_default as QTimeline, QTimelineEntry_default as QTimelineEntry, QToggle_default as QToggle, QToolbar_default as QToolbar, QToolbarTitle_default as QToolbarTitle, QTooltip_default as QTooltip, QTr_default as QTr, QTree_default as QTree, QUploader_default as QUploader, QUploaderAddTrigger_default as QUploaderAddTrigger, QVideo_default as QVideo, QVirtualScroll_default as QVirtualScroll, Quasar, Ripple_default as Ripple, Screen_default as Screen, Scroll_default as Scroll, ScrollFire_default as ScrollFire, Plugin$9 as SessionStorage, TouchHold_default as TouchHold, TouchPan_default as TouchPan, TouchRepeat_default as TouchRepeat, TouchSwipe_default as TouchSwipe, cloneDeep as clone, colors_default as colors, copyToClipboard, createMetaMixin, createUploaderComponent, date_default as date, debounce, dom_default as dom, event_default as event, exportFile, extend, format_default as format, frameDebounce, getCssVar, is_default as is, morph, noop, openUrl as openURL, patterns_default as patterns, runSequentialPromises, scroll_default as scroll, setCssVar, throttle, uid_default as uid, useAnimationFrame, useDialogPluginComponent, useFormChild, useHydration, useId, useInterval, useMeta, useQuasar, useRenderCache, useSplitAttrs, useTick, useTimeout };