@vue/runtime-dom 3.5.27 → 3.5.28

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.28
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.28
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
  }
@@ -3737,7 +3749,7 @@ var VueRuntimeDOM = (function (exports) {
3737
3749
  }
3738
3750
  }
3739
3751
  let called = false;
3740
- const done = el[enterCbKey$1] = (cancelled) => {
3752
+ el[enterCbKey$1] = (cancelled) => {
3741
3753
  if (called) return;
3742
3754
  called = true;
3743
3755
  if (cancelled) {
@@ -3750,6 +3762,7 @@ var VueRuntimeDOM = (function (exports) {
3750
3762
  }
3751
3763
  el[enterCbKey$1] = void 0;
3752
3764
  };
3765
+ const done = el[enterCbKey$1].bind(null, false);
3753
3766
  if (hook) {
3754
3767
  callAsyncHook(hook, [el, done]);
3755
3768
  } else {
@@ -3769,7 +3782,7 @@ var VueRuntimeDOM = (function (exports) {
3769
3782
  }
3770
3783
  callHook(onBeforeLeave, [el]);
3771
3784
  let called = false;
3772
- const done = el[leaveCbKey] = (cancelled) => {
3785
+ el[leaveCbKey] = (cancelled) => {
3773
3786
  if (called) return;
3774
3787
  called = true;
3775
3788
  remove();
@@ -3783,6 +3796,7 @@ var VueRuntimeDOM = (function (exports) {
3783
3796
  delete leavingVNodesCache[key2];
3784
3797
  }
3785
3798
  };
3799
+ const done = el[leaveCbKey].bind(null, false);
3786
3800
  leavingVNodesCache[key2] = vnode;
3787
3801
  if (onLeave) {
3788
3802
  callAsyncHook(onLeave, [el, done]);
@@ -3895,8 +3909,7 @@ var VueRuntimeDOM = (function (exports) {
3895
3909
  const r = shallowRef(null);
3896
3910
  if (i) {
3897
3911
  const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;
3898
- let desc;
3899
- if ((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {
3912
+ if (isTemplateRefKey(refs, key)) {
3900
3913
  warn$1(`useTemplateRef('${key}') already exists.`);
3901
3914
  } else {
3902
3915
  Object.defineProperty(refs, key, {
@@ -3916,6 +3929,10 @@ var VueRuntimeDOM = (function (exports) {
3916
3929
  }
3917
3930
  return ret;
3918
3931
  }
3932
+ function isTemplateRefKey(refs, key) {
3933
+ let desc;
3934
+ return !!((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable);
3935
+ }
3919
3936
 
3920
3937
  const pendingSetRefMap = /* @__PURE__ */ new WeakMap();
3921
3938
  function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
@@ -3961,10 +3978,19 @@ var VueRuntimeDOM = (function (exports) {
3961
3978
  return false;
3962
3979
  }
3963
3980
  }
3981
+ if (isTemplateRefKey(refs, key)) {
3982
+ return false;
3983
+ }
3964
3984
  return hasOwn(rawSetupState, key);
3965
3985
  };
3966
- const canSetRef = (ref2) => {
3967
- return !knownTemplateRefs.has(ref2);
3986
+ const canSetRef = (ref2, key) => {
3987
+ if (knownTemplateRefs.has(ref2)) {
3988
+ return false;
3989
+ }
3990
+ if (key && isTemplateRefKey(refs, key)) {
3991
+ return false;
3992
+ }
3993
+ return true;
3968
3994
  };
3969
3995
  if (oldRef != null && oldRef !== ref) {
3970
3996
  invalidatePendingSetRef(oldRawRef);
@@ -3974,10 +4000,10 @@ var VueRuntimeDOM = (function (exports) {
3974
4000
  setupState[oldRef] = null;
3975
4001
  }
3976
4002
  } else if (isRef(oldRef)) {
3977
- if (canSetRef(oldRef)) {
4003
+ const oldRawRefAtom = oldRawRef;
4004
+ if (canSetRef(oldRef, oldRawRefAtom.k)) {
3978
4005
  oldRef.value = null;
3979
4006
  }
3980
- const oldRawRefAtom = oldRawRef;
3981
4007
  if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;
3982
4008
  }
3983
4009
  }
@@ -4001,7 +4027,7 @@ var VueRuntimeDOM = (function (exports) {
4001
4027
  }
4002
4028
  } else {
4003
4029
  const newVal = [refValue];
4004
- if (canSetRef(ref)) {
4030
+ if (canSetRef(ref, rawRef.k)) {
4005
4031
  ref.value = newVal;
4006
4032
  }
4007
4033
  if (rawRef.k) refs[rawRef.k] = newVal;
@@ -4016,7 +4042,7 @@ var VueRuntimeDOM = (function (exports) {
4016
4042
  setupState[ref] = value;
4017
4043
  }
4018
4044
  } else if (_isRef) {
4019
- if (canSetRef(ref)) {
4045
+ if (canSetRef(ref, rawRef.k)) {
4020
4046
  ref.value = value;
4021
4047
  }
4022
4048
  if (rawRef.k) refs[rawRef.k] = value;
@@ -6871,7 +6897,7 @@ If you want to remount the same app, move your app creation logic into a factory
6871
6897
  const dynamicProps = nextVNode.dynamicProps;
6872
6898
  for (let i = 0; i < dynamicProps.length; i++) {
6873
6899
  const key = dynamicProps[i];
6874
- if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {
6900
+ if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emits, key)) {
6875
6901
  return true;
6876
6902
  }
6877
6903
  }
@@ -6902,12 +6928,20 @@ If you want to remount the same app, move your app creation logic into a factory
6902
6928
  }
6903
6929
  for (let i = 0; i < nextKeys.length; i++) {
6904
6930
  const key = nextKeys[i];
6905
- if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {
6931
+ if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emitsOptions, key)) {
6906
6932
  return true;
6907
6933
  }
6908
6934
  }
6909
6935
  return false;
6910
6936
  }
6937
+ function hasPropValueChanged(nextProps, prevProps, key) {
6938
+ const nextProp = nextProps[key];
6939
+ const prevProp = prevProps[key];
6940
+ if (key === "style" && isObject(nextProp) && isObject(prevProp)) {
6941
+ return !looseEqual(nextProp, prevProp);
6942
+ }
6943
+ return nextProp !== prevProp;
6944
+ }
6911
6945
  function updateHOCHostEl({ vnode, parent }, el) {
6912
6946
  while (parent) {
6913
6947
  const root = parent.subTree;
@@ -7611,15 +7645,7 @@ If you want to remount the same app, move your app creation logic into a factory
7611
7645
  } else {
7612
7646
  const el = n2.el = n1.el;
7613
7647
  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
- }
7648
+ hostSetText(el, n2.children);
7623
7649
  }
7624
7650
  }
7625
7651
  };
@@ -7695,7 +7721,7 @@ If you want to remount the same app, move your app creation logic into a factory
7695
7721
  optimized
7696
7722
  );
7697
7723
  } else {
7698
- const customElement = !!(n1.el && n1.el._isVueCE) ? n1.el : null;
7724
+ const customElement = n1.el && n1.el._isVueCE ? n1.el : null;
7699
7725
  try {
7700
7726
  if (customElement) {
7701
7727
  customElement._beginPatch();
@@ -8177,8 +8203,7 @@ If you want to remount the same app, move your app creation logic into a factory
8177
8203
  hydrateSubTree();
8178
8204
  }
8179
8205
  } else {
8180
- if (root.ce && // @ts-expect-error _def is private
8181
- root.ce._def.shadowRoot !== false) {
8206
+ if (root.ce && root.ce._hasShadowRoot()) {
8182
8207
  root.ce._injectChildStyle(type);
8183
8208
  }
8184
8209
  {
@@ -8233,9 +8258,9 @@ If you want to remount the same app, move your app creation logic into a factory
8233
8258
  updateComponentPreRender(instance, next, optimized);
8234
8259
  }
8235
8260
  nonHydratedAsyncRoot.asyncDep.then(() => {
8236
- if (!instance.isUnmounted) {
8237
- componentUpdateFn();
8238
- }
8261
+ queuePostRenderEffect(() => {
8262
+ if (!instance.isUnmounted) update();
8263
+ }, parentSuspense);
8239
8264
  });
8240
8265
  return;
8241
8266
  }
@@ -8932,12 +8957,10 @@ If you want to remount the same app, move your app creation logic into a factory
8932
8957
  traverseStaticChildren(c1, c2);
8933
8958
  }
8934
8959
  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);
8960
+ if (c2.patchFlag === -1) {
8961
+ c2 = ch2[i] = cloneIfMounted(c2);
8940
8962
  }
8963
+ c2.el = c1.el;
8941
8964
  }
8942
8965
  if (c2.type === Comment && !c2.el) {
8943
8966
  c2.el = c1.el;
@@ -10649,7 +10672,7 @@ Component that was made reactive: `,
10649
10672
  return true;
10650
10673
  }
10651
10674
 
10652
- const version = "3.5.27";
10675
+ const version = "3.5.28";
10653
10676
  const warn = warn$1 ;
10654
10677
  const ErrorTypeStrings = ErrorTypeStrings$1 ;
10655
10678
  const devtools = devtools$1 ;
@@ -11904,6 +11927,12 @@ Expected function or array of functions, received type ${typeof value}.`
11904
11927
  this._update();
11905
11928
  }
11906
11929
  }
11930
+ /**
11931
+ * @internal
11932
+ */
11933
+ _hasShadowRoot() {
11934
+ return this._def.shadowRoot !== false;
11935
+ }
11907
11936
  /**
11908
11937
  * @internal
11909
11938
  */
@@ -12026,10 +12055,7 @@ Expected function or array of functions, received type ${typeof value}.`
12026
12055
  instance
12027
12056
  )
12028
12057
  );
12029
- positionMap.set(child, {
12030
- left: child.el.offsetLeft,
12031
- top: child.el.offsetTop
12032
- });
12058
+ positionMap.set(child, getPosition(child.el));
12033
12059
  }
12034
12060
  }
12035
12061
  }
@@ -12060,10 +12086,7 @@ Expected function or array of functions, received type ${typeof value}.`
12060
12086
  }
12061
12087
  }
12062
12088
  function recordPosition(c) {
12063
- newPositionMap.set(c, {
12064
- left: c.el.offsetLeft,
12065
- top: c.el.offsetTop
12066
- });
12089
+ newPositionMap.set(c, getPosition(c.el));
12067
12090
  }
12068
12091
  function applyTranslation(c) {
12069
12092
  const oldPos = positionMap.get(c);
@@ -12071,12 +12094,29 @@ Expected function or array of functions, received type ${typeof value}.`
12071
12094
  const dx = oldPos.left - newPos.left;
12072
12095
  const dy = oldPos.top - newPos.top;
12073
12096
  if (dx || dy) {
12074
- const s = c.el.style;
12075
- s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
12097
+ const el = c.el;
12098
+ const s = el.style;
12099
+ const rect = el.getBoundingClientRect();
12100
+ let scaleX = 1;
12101
+ let scaleY = 1;
12102
+ if (el.offsetWidth) scaleX = rect.width / el.offsetWidth;
12103
+ if (el.offsetHeight) scaleY = rect.height / el.offsetHeight;
12104
+ if (!Number.isFinite(scaleX) || scaleX === 0) scaleX = 1;
12105
+ if (!Number.isFinite(scaleY) || scaleY === 0) scaleY = 1;
12106
+ if (Math.abs(scaleX - 1) < 0.01) scaleX = 1;
12107
+ if (Math.abs(scaleY - 1) < 0.01) scaleY = 1;
12108
+ s.transform = s.webkitTransform = `translate(${dx / scaleX}px,${dy / scaleY}px)`;
12076
12109
  s.transitionDuration = "0s";
12077
12110
  return c;
12078
12111
  }
12079
12112
  }
12113
+ function getPosition(el) {
12114
+ const rect = el.getBoundingClientRect();
12115
+ return {
12116
+ left: rect.left,
12117
+ top: rect.top
12118
+ };
12119
+ }
12080
12120
  function hasCSSTransform(el, root, moveClass) {
12081
12121
  const clone = el.cloneNode();
12082
12122
  const _vtc = el[vtcKey];
@@ -12353,6 +12393,7 @@ Expected function or array of functions, received type ${typeof value}.`
12353
12393
  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
12354
12394
  };
12355
12395
  const withModifiers = (fn, modifiers) => {
12396
+ if (!fn) return fn;
12356
12397
  const cache = fn._withMods || (fn._withMods = {});
12357
12398
  const cacheKey = modifiers.join(".");
12358
12399
  return cache[cacheKey] || (cache[cacheKey] = ((event, ...args) => {