@vue/runtime-dom 3.5.27 → 3.5.29

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.
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @vue/runtime-dom v3.5.27
2
+ * @vue/runtime-dom v3.5.29
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
5
  **/
6
- import { warn, BaseTransitionPropsValidators, h, BaseTransition, assertNumber, getCurrentInstance, onBeforeUpdate, queuePostFlushCb, onMounted, watch, onUnmounted, Fragment, Static, camelize, callWithAsyncErrorHandling, defineComponent, nextTick, unref, createVNode, useTransitionState, onUpdated, toRaw, getTransitionRawChildren, setTransitionHooks, resolveTransitionHooks, Text, createRenderer, createHydrationRenderer, isRuntimeOnly } from '@vue/runtime-core';
6
+ import { warn, BaseTransitionPropsValidators, h, BaseTransition, assertNumber, getCurrentInstance, onBeforeUpdate, queuePostFlushCb, onMounted, watch, onUnmounted, Fragment, Static, camelize, callWithAsyncErrorHandling, nextTick, unref, createVNode, defineComponent, useTransitionState, onUpdated, toRaw, getTransitionRawChildren, setTransitionHooks, resolveTransitionHooks, Text, createRenderer, isRuntimeOnly, createHydrationRenderer } from '@vue/runtime-core';
7
7
  export * from '@vue/runtime-core';
8
- import { extend, isObject, toNumber, isArray, NOOP, normalizeCssVarValue, isString, hyphenate, capitalize, isSpecialBooleanAttr, includeBooleanAttr, isSymbol, isFunction, isOn, isModelListener, camelize as camelize$1, isPlainObject, hasOwn, EMPTY_OBJ, looseToNumber, looseIndexOf, isSet, looseEqual, invokeArrayFns, isHTMLTag, isSVGTag, isMathMLTag } from '@vue/shared';
8
+ import { extend, isObject, toNumber, isArray, NOOP, normalizeCssVarValue, isString, hyphenate, capitalize, includeBooleanAttr, isSymbol, isSpecialBooleanAttr, isFunction, isOn, isModelListener, camelize as camelize$1, hasOwn, isPlainObject, EMPTY_OBJ, looseIndexOf, isSet, looseEqual, looseToNumber, invokeArrayFns, isHTMLTag, isSVGTag, isMathMLTag } from '@vue/shared';
9
9
 
10
10
  let policy = void 0;
11
11
  const tt = typeof window !== "undefined" && window.trustedTypes;
@@ -1259,6 +1259,12 @@ class VueElement extends BaseClass {
1259
1259
  this._update();
1260
1260
  }
1261
1261
  }
1262
+ /**
1263
+ * @internal
1264
+ */
1265
+ _hasShadowRoot() {
1266
+ return this._def.shadowRoot !== false;
1267
+ }
1262
1268
  /**
1263
1269
  * @internal
1264
1270
  */
@@ -1393,10 +1399,7 @@ const TransitionGroupImpl = /* @__PURE__ */ decorate({
1393
1399
  instance
1394
1400
  )
1395
1401
  );
1396
- positionMap.set(child, {
1397
- left: child.el.offsetLeft,
1398
- top: child.el.offsetTop
1399
- });
1402
+ positionMap.set(child, getPosition(child.el));
1400
1403
  }
1401
1404
  }
1402
1405
  }
@@ -1427,10 +1430,7 @@ function callPendingCbs(c) {
1427
1430
  }
1428
1431
  }
1429
1432
  function recordPosition(c) {
1430
- newPositionMap.set(c, {
1431
- left: c.el.offsetLeft,
1432
- top: c.el.offsetTop
1433
- });
1433
+ newPositionMap.set(c, getPosition(c.el));
1434
1434
  }
1435
1435
  function applyTranslation(c) {
1436
1436
  const oldPos = positionMap.get(c);
@@ -1438,12 +1438,29 @@ function applyTranslation(c) {
1438
1438
  const dx = oldPos.left - newPos.left;
1439
1439
  const dy = oldPos.top - newPos.top;
1440
1440
  if (dx || dy) {
1441
- const s = c.el.style;
1442
- s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
1441
+ const el = c.el;
1442
+ const s = el.style;
1443
+ const rect = el.getBoundingClientRect();
1444
+ let scaleX = 1;
1445
+ let scaleY = 1;
1446
+ if (el.offsetWidth) scaleX = rect.width / el.offsetWidth;
1447
+ if (el.offsetHeight) scaleY = rect.height / el.offsetHeight;
1448
+ if (!Number.isFinite(scaleX) || scaleX === 0) scaleX = 1;
1449
+ if (!Number.isFinite(scaleY) || scaleY === 0) scaleY = 1;
1450
+ if (Math.abs(scaleX - 1) < 0.01) scaleX = 1;
1451
+ if (Math.abs(scaleY - 1) < 0.01) scaleY = 1;
1452
+ s.transform = s.webkitTransform = `translate(${dx / scaleX}px,${dy / scaleY}px)`;
1443
1453
  s.transitionDuration = "0s";
1444
1454
  return c;
1445
1455
  }
1446
1456
  }
1457
+ function getPosition(el) {
1458
+ const rect = el.getBoundingClientRect();
1459
+ return {
1460
+ left: rect.left,
1461
+ top: rect.top
1462
+ };
1463
+ }
1447
1464
  function hasCSSTransform(el, root, moveClass) {
1448
1465
  const clone = el.cloneNode();
1449
1466
  const _vtc = el[vtcKey];
@@ -1754,6 +1771,7 @@ const modifierGuards = {
1754
1771
  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
1755
1772
  };
1756
1773
  const withModifiers = (fn, modifiers) => {
1774
+ if (!fn) return fn;
1757
1775
  const cache = fn._withMods || (fn._withMods = {});
1758
1776
  const cacheKey = modifiers.join(".");
1759
1777
  return cache[cacheKey] || (cache[cacheKey] = ((event, ...args) => {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @vue/runtime-dom v3.5.27
2
+ * @vue/runtime-dom v3.5.29
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
5
  **/
@@ -337,6 +337,7 @@ var VueRuntimeDOM = (function (exports) {
337
337
 
338
338
  let activeEffectScope;
339
339
  class EffectScope {
340
+ // TODO isolatedDeclarations "__v_skip"
340
341
  constructor(detached = false) {
341
342
  this.detached = detached;
342
343
  /**
@@ -356,6 +357,7 @@ var VueRuntimeDOM = (function (exports) {
356
357
  */
357
358
  this.cleanups = [];
358
359
  this._isPaused = false;
360
+ this.__v_skip = true;
359
361
  this.parent = activeEffectScope;
360
362
  if (!detached && activeEffectScope) {
361
363
  this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(
@@ -3412,7 +3414,22 @@ var VueRuntimeDOM = (function (exports) {
3412
3414
  function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {
3413
3415
  o: { nextSibling, parentNode, querySelector, insert, createText }
3414
3416
  }, hydrateChildren) {
3415
- function hydrateDisabledTeleport(node2, vnode2, targetStart, targetAnchor) {
3417
+ function hydrateAnchor(target2, targetNode) {
3418
+ let targetAnchor = targetNode;
3419
+ while (targetAnchor) {
3420
+ if (targetAnchor && targetAnchor.nodeType === 8) {
3421
+ if (targetAnchor.data === "teleport start anchor") {
3422
+ vnode.targetStart = targetAnchor;
3423
+ } else if (targetAnchor.data === "teleport anchor") {
3424
+ vnode.targetAnchor = targetAnchor;
3425
+ target2._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);
3426
+ break;
3427
+ }
3428
+ }
3429
+ targetAnchor = nextSibling(targetAnchor);
3430
+ }
3431
+ }
3432
+ function hydrateDisabledTeleport(node2, vnode2) {
3416
3433
  vnode2.anchor = hydrateChildren(
3417
3434
  nextSibling(node2),
3418
3435
  vnode2,
@@ -3422,8 +3439,6 @@ var VueRuntimeDOM = (function (exports) {
3422
3439
  slotScopeIds,
3423
3440
  optimized
3424
3441
  );
3425
- vnode2.targetStart = targetStart;
3426
- vnode2.targetAnchor = targetAnchor;
3427
3442
  }
3428
3443
  const target = vnode.target = resolveTarget(
3429
3444
  vnode.props,
@@ -3434,27 +3449,22 @@ var VueRuntimeDOM = (function (exports) {
3434
3449
  const targetNode = target._lpa || target.firstChild;
3435
3450
  if (vnode.shapeFlag & 16) {
3436
3451
  if (disabled) {
3437
- hydrateDisabledTeleport(
3438
- node,
3439
- vnode,
3440
- targetNode,
3441
- targetNode && nextSibling(targetNode)
3442
- );
3452
+ hydrateDisabledTeleport(node, vnode);
3453
+ hydrateAnchor(target, targetNode);
3454
+ if (!vnode.targetAnchor) {
3455
+ prepareAnchor(
3456
+ target,
3457
+ vnode,
3458
+ createText,
3459
+ insert,
3460
+ // if target is the same as the main view, insert anchors before current node
3461
+ // to avoid hydrating mismatch
3462
+ parentNode(node) === target ? node : null
3463
+ );
3464
+ }
3443
3465
  } else {
3444
3466
  vnode.anchor = nextSibling(node);
3445
- let targetAnchor = targetNode;
3446
- while (targetAnchor) {
3447
- if (targetAnchor && targetAnchor.nodeType === 8) {
3448
- if (targetAnchor.data === "teleport start anchor") {
3449
- vnode.targetStart = targetAnchor;
3450
- } else if (targetAnchor.data === "teleport anchor") {
3451
- vnode.targetAnchor = targetAnchor;
3452
- target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);
3453
- break;
3454
- }
3455
- }
3456
- targetAnchor = nextSibling(targetAnchor);
3457
- }
3467
+ hydrateAnchor(target, targetNode);
3458
3468
  if (!vnode.targetAnchor) {
3459
3469
  prepareAnchor(target, vnode, createText, insert);
3460
3470
  }
@@ -3472,7 +3482,9 @@ var VueRuntimeDOM = (function (exports) {
3472
3482
  updateCssVars(vnode, disabled);
3473
3483
  } else if (disabled) {
3474
3484
  if (vnode.shapeFlag & 16) {
3475
- hydrateDisabledTeleport(node, vnode, node, nextSibling(node));
3485
+ hydrateDisabledTeleport(node, vnode);
3486
+ vnode.targetStart = node;
3487
+ vnode.targetAnchor = nextSibling(node);
3476
3488
  }
3477
3489
  }
3478
3490
  return vnode.anchor && nextSibling(vnode.anchor);
@@ -3496,13 +3508,13 @@ var VueRuntimeDOM = (function (exports) {
3496
3508
  ctx.ut();
3497
3509
  }
3498
3510
  }
3499
- function prepareAnchor(target, vnode, createText, insert) {
3511
+ function prepareAnchor(target, vnode, createText, insert, anchor = null) {
3500
3512
  const targetStart = vnode.targetStart = createText("");
3501
3513
  const targetAnchor = vnode.targetAnchor = createText("");
3502
3514
  targetStart[TeleportEndKey] = targetAnchor;
3503
3515
  if (target) {
3504
- insert(targetStart, target);
3505
- insert(targetAnchor, target);
3516
+ insert(targetStart, target, anchor);
3517
+ insert(targetAnchor, target, anchor);
3506
3518
  }
3507
3519
  return targetAnchor;
3508
3520
  }
@@ -3724,6 +3736,7 @@ var VueRuntimeDOM = (function (exports) {
3724
3736
  callHook(hook, [el]);
3725
3737
  },
3726
3738
  enter(el) {
3739
+ if (leavingVNodesCache[key] === vnode) return;
3727
3740
  let hook = onEnter;
3728
3741
  let afterHook = onAfterEnter;
3729
3742
  let cancelHook = onEnterCancelled;
@@ -3737,7 +3750,7 @@ var VueRuntimeDOM = (function (exports) {
3737
3750
  }
3738
3751
  }
3739
3752
  let called = false;
3740
- const done = el[enterCbKey$1] = (cancelled) => {
3753
+ el[enterCbKey$1] = (cancelled) => {
3741
3754
  if (called) return;
3742
3755
  called = true;
3743
3756
  if (cancelled) {
@@ -3750,6 +3763,7 @@ var VueRuntimeDOM = (function (exports) {
3750
3763
  }
3751
3764
  el[enterCbKey$1] = void 0;
3752
3765
  };
3766
+ const done = el[enterCbKey$1].bind(null, false);
3753
3767
  if (hook) {
3754
3768
  callAsyncHook(hook, [el, done]);
3755
3769
  } else {
@@ -3769,7 +3783,7 @@ var VueRuntimeDOM = (function (exports) {
3769
3783
  }
3770
3784
  callHook(onBeforeLeave, [el]);
3771
3785
  let called = false;
3772
- const done = el[leaveCbKey] = (cancelled) => {
3786
+ el[leaveCbKey] = (cancelled) => {
3773
3787
  if (called) return;
3774
3788
  called = true;
3775
3789
  remove();
@@ -3783,6 +3797,7 @@ var VueRuntimeDOM = (function (exports) {
3783
3797
  delete leavingVNodesCache[key2];
3784
3798
  }
3785
3799
  };
3800
+ const done = el[leaveCbKey].bind(null, false);
3786
3801
  leavingVNodesCache[key2] = vnode;
3787
3802
  if (onLeave) {
3788
3803
  callAsyncHook(onLeave, [el, done]);
@@ -3895,8 +3910,7 @@ var VueRuntimeDOM = (function (exports) {
3895
3910
  const r = shallowRef(null);
3896
3911
  if (i) {
3897
3912
  const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;
3898
- let desc;
3899
- if ((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {
3913
+ if (isTemplateRefKey(refs, key)) {
3900
3914
  warn$1(`useTemplateRef('${key}') already exists.`);
3901
3915
  } else {
3902
3916
  Object.defineProperty(refs, key, {
@@ -3916,6 +3930,10 @@ var VueRuntimeDOM = (function (exports) {
3916
3930
  }
3917
3931
  return ret;
3918
3932
  }
3933
+ function isTemplateRefKey(refs, key) {
3934
+ let desc;
3935
+ return !!((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable);
3936
+ }
3919
3937
 
3920
3938
  const pendingSetRefMap = /* @__PURE__ */ new WeakMap();
3921
3939
  function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
@@ -3961,10 +3979,19 @@ var VueRuntimeDOM = (function (exports) {
3961
3979
  return false;
3962
3980
  }
3963
3981
  }
3982
+ if (isTemplateRefKey(refs, key)) {
3983
+ return false;
3984
+ }
3964
3985
  return hasOwn(rawSetupState, key);
3965
3986
  };
3966
- const canSetRef = (ref2) => {
3967
- return !knownTemplateRefs.has(ref2);
3987
+ const canSetRef = (ref2, key) => {
3988
+ if (knownTemplateRefs.has(ref2)) {
3989
+ return false;
3990
+ }
3991
+ if (key && isTemplateRefKey(refs, key)) {
3992
+ return false;
3993
+ }
3994
+ return true;
3968
3995
  };
3969
3996
  if (oldRef != null && oldRef !== ref) {
3970
3997
  invalidatePendingSetRef(oldRawRef);
@@ -3974,10 +4001,10 @@ var VueRuntimeDOM = (function (exports) {
3974
4001
  setupState[oldRef] = null;
3975
4002
  }
3976
4003
  } else if (isRef(oldRef)) {
3977
- if (canSetRef(oldRef)) {
4004
+ const oldRawRefAtom = oldRawRef;
4005
+ if (canSetRef(oldRef, oldRawRefAtom.k)) {
3978
4006
  oldRef.value = null;
3979
4007
  }
3980
- const oldRawRefAtom = oldRawRef;
3981
4008
  if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;
3982
4009
  }
3983
4010
  }
@@ -4001,7 +4028,7 @@ var VueRuntimeDOM = (function (exports) {
4001
4028
  }
4002
4029
  } else {
4003
4030
  const newVal = [refValue];
4004
- if (canSetRef(ref)) {
4031
+ if (canSetRef(ref, rawRef.k)) {
4005
4032
  ref.value = newVal;
4006
4033
  }
4007
4034
  if (rawRef.k) refs[rawRef.k] = newVal;
@@ -4016,7 +4043,7 @@ var VueRuntimeDOM = (function (exports) {
4016
4043
  setupState[ref] = value;
4017
4044
  }
4018
4045
  } else if (_isRef) {
4019
- if (canSetRef(ref)) {
4046
+ if (canSetRef(ref, rawRef.k)) {
4020
4047
  ref.value = value;
4021
4048
  }
4022
4049
  if (rawRef.k) refs[rawRef.k] = value;
@@ -5803,13 +5830,24 @@ If this is a native custom element, make sure to exclude it from component resol
5803
5830
  }
5804
5831
  let awaitable = getAwaitable();
5805
5832
  unsetCurrentInstance();
5833
+ const cleanup = () => {
5834
+ if (getCurrentInstance() !== ctx) ctx.scope.off();
5835
+ unsetCurrentInstance();
5836
+ };
5806
5837
  if (isPromise(awaitable)) {
5807
5838
  awaitable = awaitable.catch((e) => {
5808
5839
  setCurrentInstance(ctx);
5840
+ Promise.resolve().then(() => Promise.resolve().then(cleanup));
5809
5841
  throw e;
5810
5842
  });
5811
5843
  }
5812
- return [awaitable, () => setCurrentInstance(ctx)];
5844
+ return [
5845
+ awaitable,
5846
+ () => {
5847
+ setCurrentInstance(ctx);
5848
+ Promise.resolve().then(cleanup);
5849
+ }
5850
+ ];
5813
5851
  }
5814
5852
 
5815
5853
  function createDuplicateChecker() {
@@ -6871,7 +6909,7 @@ If you want to remount the same app, move your app creation logic into a factory
6871
6909
  const dynamicProps = nextVNode.dynamicProps;
6872
6910
  for (let i = 0; i < dynamicProps.length; i++) {
6873
6911
  const key = dynamicProps[i];
6874
- if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {
6912
+ if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emits, key)) {
6875
6913
  return true;
6876
6914
  }
6877
6915
  }
@@ -6902,12 +6940,20 @@ If you want to remount the same app, move your app creation logic into a factory
6902
6940
  }
6903
6941
  for (let i = 0; i < nextKeys.length; i++) {
6904
6942
  const key = nextKeys[i];
6905
- if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {
6943
+ if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emitsOptions, key)) {
6906
6944
  return true;
6907
6945
  }
6908
6946
  }
6909
6947
  return false;
6910
6948
  }
6949
+ function hasPropValueChanged(nextProps, prevProps, key) {
6950
+ const nextProp = nextProps[key];
6951
+ const prevProp = prevProps[key];
6952
+ if (key === "style" && isObject(nextProp) && isObject(prevProp)) {
6953
+ return !looseEqual(nextProp, prevProp);
6954
+ }
6955
+ return nextProp !== prevProp;
6956
+ }
6911
6957
  function updateHOCHostEl({ vnode, parent }, el) {
6912
6958
  while (parent) {
6913
6959
  const root = parent.subTree;
@@ -7611,15 +7657,7 @@ If you want to remount the same app, move your app creation logic into a factory
7611
7657
  } else {
7612
7658
  const el = n2.el = n1.el;
7613
7659
  if (n2.children !== n1.children) {
7614
- if (isHmrUpdating && n2.patchFlag === -1 && "__elIndex" in n1) {
7615
- const childNodes = container.childNodes;
7616
- const newChild = hostCreateText(n2.children);
7617
- const oldChild = childNodes[n2.__elIndex = n1.__elIndex];
7618
- hostInsert(newChild, container, oldChild);
7619
- hostRemove(oldChild);
7620
- } else {
7621
- hostSetText(el, n2.children);
7622
- }
7660
+ hostSetText(el, n2.children);
7623
7661
  }
7624
7662
  }
7625
7663
  };
@@ -7695,7 +7733,7 @@ If you want to remount the same app, move your app creation logic into a factory
7695
7733
  optimized
7696
7734
  );
7697
7735
  } else {
7698
- const customElement = !!(n1.el && n1.el._isVueCE) ? n1.el : null;
7736
+ const customElement = n1.el && n1.el._isVueCE ? n1.el : null;
7699
7737
  try {
7700
7738
  if (customElement) {
7701
7739
  customElement._beginPatch();
@@ -8177,8 +8215,7 @@ If you want to remount the same app, move your app creation logic into a factory
8177
8215
  hydrateSubTree();
8178
8216
  }
8179
8217
  } else {
8180
- if (root.ce && // @ts-expect-error _def is private
8181
- root.ce._def.shadowRoot !== false) {
8218
+ if (root.ce && root.ce._hasShadowRoot()) {
8182
8219
  root.ce._injectChildStyle(type);
8183
8220
  }
8184
8221
  {
@@ -8233,9 +8270,9 @@ If you want to remount the same app, move your app creation logic into a factory
8233
8270
  updateComponentPreRender(instance, next, optimized);
8234
8271
  }
8235
8272
  nonHydratedAsyncRoot.asyncDep.then(() => {
8236
- if (!instance.isUnmounted) {
8237
- componentUpdateFn();
8238
- }
8273
+ queuePostRenderEffect(() => {
8274
+ if (!instance.isUnmounted) update();
8275
+ }, parentSuspense);
8239
8276
  });
8240
8277
  return;
8241
8278
  }
@@ -8932,12 +8969,10 @@ If you want to remount the same app, move your app creation logic into a factory
8932
8969
  traverseStaticChildren(c1, c2);
8933
8970
  }
8934
8971
  if (c2.type === Text) {
8935
- if (c2.patchFlag !== -1) {
8936
- c2.el = c1.el;
8937
- } else {
8938
- c2.__elIndex = i + // take fragment start anchor into account
8939
- (n1.type === Fragment ? 1 : 0);
8972
+ if (c2.patchFlag === -1) {
8973
+ c2 = ch2[i] = cloneIfMounted(c2);
8940
8974
  }
8975
+ c2.el = c1.el;
8941
8976
  }
8942
8977
  if (c2.type === Comment && !c2.el) {
8943
8978
  c2.el = c1.el;
@@ -10649,7 +10684,7 @@ Component that was made reactive: `,
10649
10684
  return true;
10650
10685
  }
10651
10686
 
10652
- const version = "3.5.27";
10687
+ const version = "3.5.29";
10653
10688
  const warn = warn$1 ;
10654
10689
  const ErrorTypeStrings = ErrorTypeStrings$1 ;
10655
10690
  const devtools = devtools$1 ;
@@ -11904,6 +11939,12 @@ Expected function or array of functions, received type ${typeof value}.`
11904
11939
  this._update();
11905
11940
  }
11906
11941
  }
11942
+ /**
11943
+ * @internal
11944
+ */
11945
+ _hasShadowRoot() {
11946
+ return this._def.shadowRoot !== false;
11947
+ }
11907
11948
  /**
11908
11949
  * @internal
11909
11950
  */
@@ -12026,10 +12067,7 @@ Expected function or array of functions, received type ${typeof value}.`
12026
12067
  instance
12027
12068
  )
12028
12069
  );
12029
- positionMap.set(child, {
12030
- left: child.el.offsetLeft,
12031
- top: child.el.offsetTop
12032
- });
12070
+ positionMap.set(child, getPosition(child.el));
12033
12071
  }
12034
12072
  }
12035
12073
  }
@@ -12060,10 +12098,7 @@ Expected function or array of functions, received type ${typeof value}.`
12060
12098
  }
12061
12099
  }
12062
12100
  function recordPosition(c) {
12063
- newPositionMap.set(c, {
12064
- left: c.el.offsetLeft,
12065
- top: c.el.offsetTop
12066
- });
12101
+ newPositionMap.set(c, getPosition(c.el));
12067
12102
  }
12068
12103
  function applyTranslation(c) {
12069
12104
  const oldPos = positionMap.get(c);
@@ -12071,12 +12106,29 @@ Expected function or array of functions, received type ${typeof value}.`
12071
12106
  const dx = oldPos.left - newPos.left;
12072
12107
  const dy = oldPos.top - newPos.top;
12073
12108
  if (dx || dy) {
12074
- const s = c.el.style;
12075
- s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
12109
+ const el = c.el;
12110
+ const s = el.style;
12111
+ const rect = el.getBoundingClientRect();
12112
+ let scaleX = 1;
12113
+ let scaleY = 1;
12114
+ if (el.offsetWidth) scaleX = rect.width / el.offsetWidth;
12115
+ if (el.offsetHeight) scaleY = rect.height / el.offsetHeight;
12116
+ if (!Number.isFinite(scaleX) || scaleX === 0) scaleX = 1;
12117
+ if (!Number.isFinite(scaleY) || scaleY === 0) scaleY = 1;
12118
+ if (Math.abs(scaleX - 1) < 0.01) scaleX = 1;
12119
+ if (Math.abs(scaleY - 1) < 0.01) scaleY = 1;
12120
+ s.transform = s.webkitTransform = `translate(${dx / scaleX}px,${dy / scaleY}px)`;
12076
12121
  s.transitionDuration = "0s";
12077
12122
  return c;
12078
12123
  }
12079
12124
  }
12125
+ function getPosition(el) {
12126
+ const rect = el.getBoundingClientRect();
12127
+ return {
12128
+ left: rect.left,
12129
+ top: rect.top
12130
+ };
12131
+ }
12080
12132
  function hasCSSTransform(el, root, moveClass) {
12081
12133
  const clone = el.cloneNode();
12082
12134
  const _vtc = el[vtcKey];
@@ -12353,6 +12405,7 @@ Expected function or array of functions, received type ${typeof value}.`
12353
12405
  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
12354
12406
  };
12355
12407
  const withModifiers = (fn, modifiers) => {
12408
+ if (!fn) return fn;
12356
12409
  const cache = fn._withMods || (fn._withMods = {});
12357
12410
  const cacheKey = modifiers.join(".");
12358
12411
  return cache[cacheKey] || (cache[cacheKey] = ((event, ...args) => {