motion 12.14.0 → 12.16.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.
@@ -3348,6 +3348,152 @@
3348
3348
  // "background-color"
3349
3349
  ]);
3350
3350
 
3351
+ function camelToDash$1(str) {
3352
+ return str.replace(/([A-Z])/g, (match) => `-${match.toLowerCase()}`);
3353
+ }
3354
+
3355
+ function resolveElements(elementOrSelector, scope, selectorCache) {
3356
+ if (elementOrSelector instanceof EventTarget) {
3357
+ return [elementOrSelector];
3358
+ }
3359
+ else if (typeof elementOrSelector === "string") {
3360
+ let root = document;
3361
+ if (scope) {
3362
+ root = scope.current;
3363
+ }
3364
+ const elements = selectorCache?.[elementOrSelector] ??
3365
+ root.querySelectorAll(elementOrSelector);
3366
+ return elements ? Array.from(elements) : [];
3367
+ }
3368
+ return Array.from(elementOrSelector);
3369
+ }
3370
+
3371
+ function createSelectorEffect(subjectEffect) {
3372
+ return (subject, values) => {
3373
+ const elements = resolveElements(subject);
3374
+ const subscriptions = [];
3375
+ for (const element of elements) {
3376
+ const remove = subjectEffect(element, values);
3377
+ subscriptions.push(remove);
3378
+ }
3379
+ return () => {
3380
+ for (const remove of subscriptions)
3381
+ remove();
3382
+ };
3383
+ };
3384
+ }
3385
+
3386
+ /**
3387
+ * Provided a value and a ValueType, returns the value as that value type.
3388
+ */
3389
+ const getValueAsType = (value, type) => {
3390
+ return type && typeof value === "number"
3391
+ ? type.transform(value)
3392
+ : value;
3393
+ };
3394
+
3395
+ class MotionValueState {
3396
+ constructor() {
3397
+ this.latest = {};
3398
+ this.values = new Map();
3399
+ }
3400
+ set(name, value, render, computed, useDefaultValueType = true) {
3401
+ const existingValue = this.values.get(name);
3402
+ if (existingValue) {
3403
+ existingValue.onRemove();
3404
+ }
3405
+ const onChange = () => {
3406
+ const v = value.get();
3407
+ if (useDefaultValueType) {
3408
+ this.latest[name] = getValueAsType(v, numberValueTypes[name]);
3409
+ }
3410
+ else {
3411
+ this.latest[name] = v;
3412
+ }
3413
+ render && frame.render(render);
3414
+ };
3415
+ onChange();
3416
+ const cancelOnChange = value.on("change", onChange);
3417
+ computed && value.addDependent(computed);
3418
+ const remove = () => {
3419
+ cancelOnChange();
3420
+ render && cancelFrame(render);
3421
+ this.values.delete(name);
3422
+ computed && value.removeDependent(computed);
3423
+ };
3424
+ this.values.set(name, { value, onRemove: remove });
3425
+ return remove;
3426
+ }
3427
+ get(name) {
3428
+ return this.values.get(name)?.value;
3429
+ }
3430
+ destroy() {
3431
+ for (const value of this.values.values()) {
3432
+ value.onRemove();
3433
+ }
3434
+ }
3435
+ }
3436
+
3437
+ function createEffect(addValue) {
3438
+ const stateCache = new WeakMap();
3439
+ const subscriptions = [];
3440
+ return (subject, values) => {
3441
+ const state = stateCache.get(subject) ?? new MotionValueState();
3442
+ stateCache.set(subject, state);
3443
+ for (const key in values) {
3444
+ const value = values[key];
3445
+ const remove = addValue(subject, state, key, value);
3446
+ subscriptions.push(remove);
3447
+ }
3448
+ return () => {
3449
+ for (const cancel of subscriptions)
3450
+ cancel();
3451
+ };
3452
+ };
3453
+ }
3454
+
3455
+ function canSetAsProperty(element, name) {
3456
+ if (!(name in element))
3457
+ return false;
3458
+ const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(element), name) ||
3459
+ Object.getOwnPropertyDescriptor(element, name);
3460
+ // Check if it has a setter
3461
+ return descriptor && typeof descriptor.set === "function";
3462
+ }
3463
+ const addAttrValue = (element, state, key, value) => {
3464
+ const isProp = canSetAsProperty(element, key);
3465
+ const name = isProp
3466
+ ? key
3467
+ : key.startsWith("data") || key.startsWith("aria")
3468
+ ? camelToDash$1(key)
3469
+ : key;
3470
+ /**
3471
+ * Set attribute directly via property if available
3472
+ */
3473
+ const render = isProp
3474
+ ? () => {
3475
+ element[name] = state.latest[key];
3476
+ }
3477
+ : () => {
3478
+ const v = state.latest[key];
3479
+ if (v === null || v === undefined) {
3480
+ element.removeAttribute(name);
3481
+ }
3482
+ else {
3483
+ element.setAttribute(name, String(v));
3484
+ }
3485
+ };
3486
+ return state.set(key, value, render);
3487
+ };
3488
+ const attrEffect = /*@__PURE__*/ createSelectorEffect(
3489
+ /*@__PURE__*/ createEffect(addAttrValue));
3490
+
3491
+ const propEffect = /*@__PURE__*/ createEffect((subject, state, key, value) => {
3492
+ return state.set(key, value, () => {
3493
+ subject[key] = state.latest[key];
3494
+ }, undefined, false);
3495
+ });
3496
+
3351
3497
  /**
3352
3498
  * Maximum time between the value of two frames, beyond which we
3353
3499
  * assume the velocity has since been 0.
@@ -3670,106 +3816,6 @@
3670
3816
  return new MotionValue(init, options);
3671
3817
  }
3672
3818
 
3673
- function resolveElements(elementOrSelector, scope, selectorCache) {
3674
- if (elementOrSelector instanceof EventTarget) {
3675
- return [elementOrSelector];
3676
- }
3677
- else if (typeof elementOrSelector === "string") {
3678
- let root = document;
3679
- if (scope) {
3680
- root = scope.current;
3681
- }
3682
- const elements = selectorCache?.[elementOrSelector] ??
3683
- root.querySelectorAll(elementOrSelector);
3684
- return elements ? Array.from(elements) : [];
3685
- }
3686
- return Array.from(elementOrSelector);
3687
- }
3688
-
3689
- function createSelectorEffect(subjectEffect) {
3690
- return (subject, values) => {
3691
- const elements = resolveElements(subject);
3692
- const subscriptions = [];
3693
- for (const element of elements) {
3694
- const remove = subjectEffect(element, values);
3695
- subscriptions.push(remove);
3696
- }
3697
- return () => {
3698
- for (const remove of subscriptions)
3699
- remove();
3700
- };
3701
- };
3702
- }
3703
-
3704
- /**
3705
- * Provided a value and a ValueType, returns the value as that value type.
3706
- */
3707
- const getValueAsType = (value, type) => {
3708
- return type && typeof value === "number"
3709
- ? type.transform(value)
3710
- : value;
3711
- };
3712
-
3713
- class MotionValueState {
3714
- constructor() {
3715
- this.latest = {};
3716
- this.values = new Map();
3717
- }
3718
- set(name, value, render, computed, useDefaultValueType = true) {
3719
- const existingValue = this.values.get(name);
3720
- if (existingValue) {
3721
- existingValue.onRemove();
3722
- }
3723
- const onChange = () => {
3724
- const v = value.get();
3725
- if (useDefaultValueType) {
3726
- this.latest[name] = getValueAsType(v, numberValueTypes[name]);
3727
- }
3728
- else {
3729
- this.latest[name] = v;
3730
- }
3731
- render && frame.render(render);
3732
- };
3733
- onChange();
3734
- const cancelOnChange = value.on("change", onChange);
3735
- computed && value.addDependent(computed);
3736
- const remove = () => {
3737
- cancelOnChange();
3738
- render && cancelFrame(render);
3739
- this.values.delete(name);
3740
- computed && value.removeDependent(computed);
3741
- };
3742
- this.values.set(name, { value, onRemove: remove });
3743
- return remove;
3744
- }
3745
- get(name) {
3746
- return this.values.get(name)?.value;
3747
- }
3748
- destroy() {
3749
- for (const value of this.values.values()) {
3750
- value.onRemove();
3751
- }
3752
- }
3753
- }
3754
-
3755
- function createEffect(addValue) {
3756
- const stateCache = new WeakMap();
3757
- const subscriptions = [];
3758
- return (subject, values) => {
3759
- const state = stateCache.get(subject) ?? new MotionValueState();
3760
- stateCache.set(subject, state);
3761
- for (const key in values) {
3762
- const value = values[key];
3763
- const remove = addValue(subject, state, key, value);
3764
- subscriptions.push(remove);
3765
- }
3766
- return () => {
3767
- for (const cancel of subscriptions)
3768
- cancel();
3769
- };
3770
- };
3771
- }
3772
-
3773
3819
  const translateAlias$1 = {
3774
3820
  x: "translateX",
3775
3821
  y: "translateY",
@@ -3811,6 +3857,11 @@
3811
3857
  let computed = undefined;
3812
3858
  if (transformProps.has(key)) {
3813
3859
  if (!state.get("transform")) {
3860
+ // If this is an HTML element, we need to set the transform-box to fill-box
3861
+ // to normalise the transform relative to the element's bounding box
3862
+ if (!isHTMLElement(element) && !state.get("transformBox")) {
3863
+ addStyleValue(element, state, "transformBox", new MotionValue("fill-box"));
3864
+ }
3814
3865
  state.set("transform", new MotionValue("none"), () => {
3815
3866
  element.style.transform = buildTransform$1(state);
3816
3867
  });
@@ -3843,6 +3894,38 @@
3843
3894
  const styleEffect = /*@__PURE__*/ createSelectorEffect(
3844
3895
  /*@__PURE__*/ createEffect(addStyleValue));
3845
3896
 
3897
+ const toPx = px.transform;
3898
+ function addSVGPathValue(element, state, key, value) {
3899
+ frame.render(() => element.setAttribute("pathLength", "1"));
3900
+ if (key === "pathOffset") {
3901
+ return state.set(key, value, () => element.setAttribute("stroke-dashoffset", toPx(-state.latest[key])));
3902
+ }
3903
+ else {
3904
+ if (!state.get("stroke-dasharray")) {
3905
+ state.set("stroke-dasharray", new MotionValue("1 1"), () => {
3906
+ const { pathLength = 1, pathSpacing } = state.latest;
3907
+ element.setAttribute("stroke-dasharray", `${toPx(pathLength)} ${toPx(pathSpacing ?? 1 - Number(pathLength))}`);
3908
+ });
3909
+ }
3910
+ return state.set(key, value, undefined, state.get("stroke-dasharray"));
3911
+ }
3912
+ }
3913
+ const addSVGValue = (element, state, key, value) => {
3914
+ if (key.startsWith("path")) {
3915
+ return addSVGPathValue(element, state, key, value);
3916
+ }
3917
+ else if (key.startsWith("attr")) {
3918
+ return addAttrValue(element, state, convertAttrKey(key), value);
3919
+ }
3920
+ const handler = key in element.style ? addStyleValue : addAttrValue;
3921
+ return handler(element, state, key, value);
3922
+ };
3923
+ const svgEffect = /*@__PURE__*/ createSelectorEffect(
3924
+ /*@__PURE__*/ createEffect(addSVGValue));
3925
+ function convertAttrKey(key) {
3926
+ return key.replace(/^attr([A-Z])/, (_, firstChar) => firstChar.toLowerCase());
3927
+ }
3928
+
3846
3929
  const { schedule: microtask, cancel: cancelMicrotask } =
3847
3930
  /* @__PURE__ */ createRenderBatcher(queueMicrotask, false);
3848
3931
 
@@ -4089,6 +4172,107 @@
4089
4172
  : computedStyle[name];
4090
4173
  }
4091
4174
 
4175
+ /**
4176
+ * Checks if an element is an SVG element in a way
4177
+ * that works across iframes
4178
+ */
4179
+ function isSVGElement(element) {
4180
+ return isObject(element) && "ownerSVGElement" in element;
4181
+ }
4182
+
4183
+ const resizeHandlers = new WeakMap();
4184
+ let observer;
4185
+ const getSize = (borderBoxAxis, svgAxis, htmlAxis) => (target, borderBoxSize) => {
4186
+ if (borderBoxSize && borderBoxSize[0]) {
4187
+ return borderBoxSize[0][(borderBoxAxis + "Size")];
4188
+ }
4189
+ else if (isSVGElement(target) && "getBBox" in target) {
4190
+ return target.getBBox()[svgAxis];
4191
+ }
4192
+ else {
4193
+ return target[htmlAxis];
4194
+ }
4195
+ };
4196
+ const getWidth = /*@__PURE__*/ getSize("inline", "width", "offsetWidth");
4197
+ const getHeight = /*@__PURE__*/ getSize("block", "height", "offsetHeight");
4198
+ function notifyTarget({ target, borderBoxSize }) {
4199
+ resizeHandlers.get(target)?.forEach((handler) => {
4200
+ handler(target, {
4201
+ get width() {
4202
+ return getWidth(target, borderBoxSize);
4203
+ },
4204
+ get height() {
4205
+ return getHeight(target, borderBoxSize);
4206
+ },
4207
+ });
4208
+ });
4209
+ }
4210
+ function notifyAll(entries) {
4211
+ entries.forEach(notifyTarget);
4212
+ }
4213
+ function createResizeObserver() {
4214
+ if (typeof ResizeObserver === "undefined")
4215
+ return;
4216
+ observer = new ResizeObserver(notifyAll);
4217
+ }
4218
+ function resizeElement(target, handler) {
4219
+ if (!observer)
4220
+ createResizeObserver();
4221
+ const elements = resolveElements(target);
4222
+ elements.forEach((element) => {
4223
+ let elementHandlers = resizeHandlers.get(element);
4224
+ if (!elementHandlers) {
4225
+ elementHandlers = new Set();
4226
+ resizeHandlers.set(element, elementHandlers);
4227
+ }
4228
+ elementHandlers.add(handler);
4229
+ observer?.observe(element);
4230
+ });
4231
+ return () => {
4232
+ elements.forEach((element) => {
4233
+ const elementHandlers = resizeHandlers.get(element);
4234
+ elementHandlers?.delete(handler);
4235
+ if (!elementHandlers?.size) {
4236
+ observer?.unobserve(element);
4237
+ }
4238
+ });
4239
+ };
4240
+ }
4241
+
4242
+ const windowCallbacks = new Set();
4243
+ let windowResizeHandler;
4244
+ function createWindowResizeHandler() {
4245
+ windowResizeHandler = () => {
4246
+ const info = {
4247
+ get width() {
4248
+ return window.innerWidth;
4249
+ },
4250
+ get height() {
4251
+ return window.innerHeight;
4252
+ },
4253
+ };
4254
+ windowCallbacks.forEach((callback) => callback(info));
4255
+ };
4256
+ window.addEventListener("resize", windowResizeHandler);
4257
+ }
4258
+ function resizeWindow(callback) {
4259
+ windowCallbacks.add(callback);
4260
+ if (!windowResizeHandler)
4261
+ createWindowResizeHandler();
4262
+ return () => {
4263
+ windowCallbacks.delete(callback);
4264
+ if (!windowCallbacks.size &&
4265
+ typeof windowResizeHandler === "function") {
4266
+ window.removeEventListener("resize", windowResizeHandler);
4267
+ windowResizeHandler = undefined;
4268
+ }
4269
+ };
4270
+ }
4271
+
4272
+ function resize(a, b) {
4273
+ return typeof a === "function" ? resizeWindow(a) : resizeElement(a, b);
4274
+ }
4275
+
4092
4276
  function observeTimeline(update, timeline) {
4093
4277
  let prevProgress;
4094
4278
  const onFrame = () => {
@@ -4216,14 +4400,6 @@
4216
4400
  return reportStats;
4217
4401
  }
4218
4402
 
4219
- /**
4220
- * Checks if an element is an SVG element in a way
4221
- * that works across iframes
4222
- */
4223
- function isSVGElement(element) {
4224
- return isObject(element) && "ownerSVGElement" in element;
4225
- }
4226
-
4227
4403
  /**
4228
4404
  * Checks if an element is specifically an SVGSVGElement (the root SVG element)
4229
4405
  * in a way that works across iframes
@@ -6666,99 +6842,6 @@
6666
6842
  };
6667
6843
  const animateMini = /*@__PURE__*/ createScopedWaapiAnimate();
6668
6844
 
6669
- const resizeHandlers = new WeakMap();
6670
- let observer;
6671
- function getElementSize(target, borderBoxSize) {
6672
- if (borderBoxSize) {
6673
- const { inlineSize, blockSize } = borderBoxSize[0];
6674
- return { width: inlineSize, height: blockSize };
6675
- }
6676
- else if (isSVGElement(target) && "getBBox" in target) {
6677
- return target.getBBox();
6678
- }
6679
- else {
6680
- return {
6681
- width: target.offsetWidth,
6682
- height: target.offsetHeight,
6683
- };
6684
- }
6685
- }
6686
- function notifyTarget({ target, contentRect, borderBoxSize, }) {
6687
- resizeHandlers.get(target)?.forEach((handler) => {
6688
- handler({
6689
- target,
6690
- contentSize: contentRect,
6691
- get size() {
6692
- return getElementSize(target, borderBoxSize);
6693
- },
6694
- });
6695
- });
6696
- }
6697
- function notifyAll(entries) {
6698
- entries.forEach(notifyTarget);
6699
- }
6700
- function createResizeObserver() {
6701
- if (typeof ResizeObserver === "undefined")
6702
- return;
6703
- observer = new ResizeObserver(notifyAll);
6704
- }
6705
- function resizeElement(target, handler) {
6706
- if (!observer)
6707
- createResizeObserver();
6708
- const elements = resolveElements(target);
6709
- elements.forEach((element) => {
6710
- let elementHandlers = resizeHandlers.get(element);
6711
- if (!elementHandlers) {
6712
- elementHandlers = new Set();
6713
- resizeHandlers.set(element, elementHandlers);
6714
- }
6715
- elementHandlers.add(handler);
6716
- observer?.observe(element);
6717
- });
6718
- return () => {
6719
- elements.forEach((element) => {
6720
- const elementHandlers = resizeHandlers.get(element);
6721
- elementHandlers?.delete(handler);
6722
- if (!elementHandlers?.size) {
6723
- observer?.unobserve(element);
6724
- }
6725
- });
6726
- };
6727
- }
6728
-
6729
- const windowCallbacks = new Set();
6730
- let windowResizeHandler;
6731
- function createWindowResizeHandler() {
6732
- windowResizeHandler = () => {
6733
- const size = {
6734
- width: window.innerWidth,
6735
- height: window.innerHeight,
6736
- };
6737
- const info = {
6738
- target: window,
6739
- size,
6740
- contentSize: size,
6741
- };
6742
- windowCallbacks.forEach((callback) => callback(info));
6743
- };
6744
- window.addEventListener("resize", windowResizeHandler);
6745
- }
6746
- function resizeWindow(callback) {
6747
- windowCallbacks.add(callback);
6748
- if (!windowResizeHandler)
6749
- createWindowResizeHandler();
6750
- return () => {
6751
- windowCallbacks.delete(callback);
6752
- if (!windowCallbacks.size && windowResizeHandler) {
6753
- windowResizeHandler = undefined;
6754
- }
6755
- };
6756
- }
6757
-
6758
- function resize(a, b) {
6759
- return typeof a === "function" ? resizeWindow(a) : resizeElement(a, b);
6760
- }
6761
-
6762
6845
  /**
6763
6846
  * A time in milliseconds, beyond which we consider the scroll velocity to be 0.
6764
6847
  */
@@ -7290,6 +7373,7 @@
7290
7373
  exports.ViewTransitionBuilder = ViewTransitionBuilder;
7291
7374
  exports.acceleratedValues = acceleratedValues;
7292
7375
  exports.activeAnimations = activeAnimations;
7376
+ exports.addAttrValue = addAttrValue;
7293
7377
  exports.addStyleValue = addStyleValue;
7294
7378
  exports.addUniqueItem = addUniqueItem;
7295
7379
  exports.alpha = alpha;
@@ -7302,6 +7386,7 @@
7302
7386
  exports.anticipate = anticipate;
7303
7387
  exports.applyPxDefaults = applyPxDefaults;
7304
7388
  exports.attachSpring = attachSpring;
7389
+ exports.attrEffect = attrEffect;
7305
7390
  exports.backIn = backIn;
7306
7391
  exports.backInOut = backInOut;
7307
7392
  exports.backOut = backOut;
@@ -7410,10 +7495,12 @@
7410
7495
  exports.press = press;
7411
7496
  exports.progress = progress;
7412
7497
  exports.progressPercentage = progressPercentage;
7498
+ exports.propEffect = propEffect;
7413
7499
  exports.px = px;
7414
7500
  exports.readTransformValue = readTransformValue;
7415
7501
  exports.recordStats = recordStats;
7416
7502
  exports.removeItem = removeItem;
7503
+ exports.resize = resize;
7417
7504
  exports.resolveElements = resolveElements;
7418
7505
  exports.reverseEasing = reverseEasing;
7419
7506
  exports.rgbUnit = rgbUnit;
@@ -7437,6 +7524,7 @@
7437
7524
  exports.supportsLinearEasing = supportsLinearEasing;
7438
7525
  exports.supportsPartialKeyframes = supportsPartialKeyframes;
7439
7526
  exports.supportsScrollTimeline = supportsScrollTimeline;
7527
+ exports.svgEffect = svgEffect;
7440
7528
  exports.sync = sync;
7441
7529
  exports.testValueType = testValueType;
7442
7530
  exports.time = time;