@rafaelaugusto/jolt 0.1.0-rc.4 → 0.1.0-rc.5
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.
- package/README.md +4 -2
- package/dist/color.d.ts +2 -4
- package/dist/color.d.ts.map +1 -1
- package/dist/color.js +1 -41
- package/dist/color.js.map +1 -1
- package/dist/core/color.d.ts +5 -0
- package/dist/core/color.d.ts.map +1 -0
- package/dist/core/color.js +42 -0
- package/dist/core/color.js.map +1 -0
- package/dist/core/decay.d.ts +12 -0
- package/dist/core/decay.d.ts.map +1 -0
- package/dist/core/decay.js +29 -0
- package/dist/core/decay.js.map +1 -0
- package/dist/core/decoration.d.ts +5 -0
- package/dist/core/decoration.d.ts.map +1 -0
- package/dist/core/decoration.js +22 -0
- package/dist/core/decoration.js.map +1 -0
- package/dist/core/drag-physics.d.ts +25 -0
- package/dist/core/drag-physics.d.ts.map +1 -0
- package/dist/core/drag-physics.js +75 -0
- package/dist/core/drag-physics.js.map +1 -0
- package/dist/core/driver.d.ts +41 -0
- package/dist/core/driver.d.ts.map +1 -0
- package/dist/core/driver.js +2 -0
- package/dist/core/driver.js.map +1 -0
- package/dist/core/easing.d.ts +10 -0
- package/dist/core/easing.d.ts.map +1 -0
- package/dist/core/easing.js +88 -0
- package/dist/core/easing.js.map +1 -0
- package/dist/core/gravity.d.ts +13 -0
- package/dist/core/gravity.d.ts.map +1 -0
- package/dist/core/gravity.js +84 -0
- package/dist/core/gravity.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/ownership.d.ts +7 -0
- package/dist/core/ownership.d.ts.map +1 -0
- package/dist/core/ownership.js +23 -0
- package/dist/core/ownership.js.map +1 -0
- package/dist/core/playback.d.ts +44 -0
- package/dist/core/playback.d.ts.map +1 -0
- package/dist/core/playback.js +35 -0
- package/dist/core/playback.js.map +1 -0
- package/dist/core/presets.d.ts +298 -0
- package/dist/core/presets.d.ts.map +1 -0
- package/dist/core/presets.js +127 -0
- package/dist/core/presets.js.map +1 -0
- package/dist/core/properties.d.ts +8 -0
- package/dist/core/properties.d.ts.map +1 -0
- package/dist/core/properties.js +33 -0
- package/dist/core/properties.js.map +1 -0
- package/dist/core/sampling.d.ts +35 -0
- package/dist/core/sampling.d.ts.map +1 -0
- package/dist/core/sampling.js +123 -0
- package/dist/core/sampling.js.map +1 -0
- package/dist/core/spring.d.ts +24 -0
- package/dist/core/spring.d.ts.map +1 -0
- package/dist/core/spring.js +65 -0
- package/dist/core/spring.js.map +1 -0
- package/dist/core/track.d.ts +38 -0
- package/dist/core/track.d.ts.map +1 -0
- package/dist/core/track.js +476 -0
- package/dist/core/track.js.map +1 -0
- package/dist/core/transition.d.ts +116 -0
- package/dist/core/transition.d.ts.map +1 -0
- package/dist/core/transition.js +211 -0
- package/dist/core/transition.js.map +1 -0
- package/dist/decay.d.ts +1 -11
- package/dist/decay.d.ts.map +1 -1
- package/dist/decay.js +1 -28
- package/dist/decay.js.map +1 -1
- package/dist/decoration.d.ts +2 -5
- package/dist/decoration.d.ts.map +1 -1
- package/dist/decoration.js +2 -21
- package/dist/decoration.js.map +1 -1
- package/dist/drag-physics.d.ts +1 -24
- package/dist/drag-physics.d.ts.map +1 -1
- package/dist/drag-physics.js +1 -74
- package/dist/drag-physics.js.map +1 -1
- package/dist/driver/android.d.ts.map +1 -1
- package/dist/driver/android.js +9 -0
- package/dist/driver/android.js.map +1 -1
- package/dist/driver/index.d.ts +3 -38
- package/dist/driver/index.d.ts.map +1 -1
- package/dist/driver/index.js.map +1 -1
- package/dist/easing.d.ts +1 -9
- package/dist/easing.d.ts.map +1 -1
- package/dist/easing.js +1 -87
- package/dist/easing.js.map +1 -1
- package/dist/engine.d.ts +2 -11
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +9 -16
- package/dist/engine.js.map +1 -1
- package/dist/gravity.d.ts +1 -12
- package/dist/gravity.d.ts.map +1 -1
- package/dist/gravity.js +1 -83
- package/dist/gravity.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mixer.d.ts.map +1 -1
- package/dist/mixer.js +3 -1
- package/dist/mixer.js.map +1 -1
- package/dist/motion-scope.d.ts +2 -1
- package/dist/motion-scope.d.ts.map +1 -1
- package/dist/motion-scope.js +79 -32
- package/dist/motion-scope.js.map +1 -1
- package/dist/playback.d.ts +2 -34
- package/dist/playback.d.ts.map +1 -1
- package/dist/playback.js +1 -34
- package/dist/playback.js.map +1 -1
- package/dist/presets.d.ts +2 -297
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +2 -125
- package/dist/presets.js.map +1 -1
- package/dist/properties.d.ts +2 -6
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +3 -33
- package/dist/properties.js.map +1 -1
- package/dist/sampling.d.ts +1 -34
- package/dist/sampling.d.ts.map +1 -1
- package/dist/sampling.js +1 -122
- package/dist/sampling.js.map +1 -1
- package/dist/scroll-header/geometry.d.ts +1 -0
- package/dist/scroll-header/geometry.d.ts.map +1 -1
- package/dist/scroll-header/geometry.js +5 -0
- package/dist/scroll-header/geometry.js.map +1 -1
- package/dist/scroll-header/index.d.ts +14 -0
- package/dist/scroll-header/index.d.ts.map +1 -1
- package/dist/scroll-header/index.js +113 -8
- package/dist/scroll-header/index.js.map +1 -1
- package/dist/scroll-header/native.d.ts +8 -1
- package/dist/scroll-header/native.d.ts.map +1 -1
- package/dist/scroll-header/native.js +11 -4
- package/dist/scroll-header/native.js.map +1 -1
- package/dist/scroll-header/surface.d.ts +6 -0
- package/dist/scroll-header/surface.d.ts.map +1 -0
- package/dist/scroll-header/surface.js +12 -0
- package/dist/scroll-header/surface.js.map +1 -0
- package/dist/shared-navigation/index.d.ts.map +1 -1
- package/dist/shared-navigation/index.js +6 -1
- package/dist/shared-navigation/index.js.map +1 -1
- package/dist/shared-navigation/return-target.d.ts +2 -0
- package/dist/shared-navigation/return-target.d.ts.map +1 -1
- package/dist/shared-navigation/return-target.js +59 -9
- package/dist/shared-navigation/return-target.js.map +1 -1
- package/dist/spring.d.ts +1 -23
- package/dist/spring.d.ts.map +1 -1
- package/dist/spring.js +1 -64
- package/dist/spring.js.map +1 -1
- package/dist/track.d.ts +5 -31
- package/dist/track.d.ts.map +1 -1
- package/dist/track.js +9 -470
- package/dist/track.js.map +1 -1
- package/dist/transition.d.ts +1 -115
- package/dist/transition.d.ts.map +1 -1
- package/dist/transition.js +1 -210
- package/dist/transition.js.map +1 -1
- package/dist/web/compose.d.ts +21 -0
- package/dist/web/compose.d.ts.map +1 -0
- package/dist/web/compose.js +128 -0
- package/dist/web/compose.js.map +1 -0
- package/dist/web/curve.d.ts +9 -0
- package/dist/web/curve.d.ts.map +1 -0
- package/dist/web/curve.js +42 -0
- package/dist/web/curve.js.map +1 -0
- package/dist/web/index.d.ts +3 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +3 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/plan.d.ts +11 -0
- package/dist/web/plan.d.ts.map +1 -0
- package/dist/web/plan.js +147 -0
- package/dist/web/plan.js.map +1 -0
- package/dist/web/press.d.ts +25 -0
- package/dist/web/press.d.ts.map +1 -0
- package/dist/web/press.js +174 -0
- package/dist/web/press.js.map +1 -0
- package/dist/web/public.d.ts +24 -0
- package/dist/web/public.d.ts.map +1 -0
- package/dist/web/public.js +18 -0
- package/dist/web/public.js.map +1 -0
- package/dist/web/runtime.d.ts +126 -0
- package/dist/web/runtime.d.ts.map +1 -0
- package/dist/web/runtime.js +767 -0
- package/dist/web/runtime.js.map +1 -0
- package/dist/web/types.d.ts +37 -0
- package/dist/web/types.d.ts.map +1 -0
- package/dist/web/types.js +12 -0
- package/dist/web/types.js.map +1 -0
- package/dist/web/vue/index.d.ts +27 -0
- package/dist/web/vue/index.d.ts.map +1 -0
- package/dist/web/vue/index.js +130 -0
- package/dist/web/vue/index.js.map +1 -0
- package/package.json +42 -7
- package/platforms/android/java/org/rafaelaugusto/jolt/ScrollHeader.java +137 -11
- package/platforms/android/java/org/rafaelaugusto/jolt/ScrollHeaderSurface.java +39 -0
- package/platforms/ios/src/JoltScrollHeader.h +2 -1
- package/platforms/ios/src/JoltScrollHeader.m +138 -12
- package/src/android-plugin.d.ts +5 -0
- package/src/color.ts +2 -56
- package/src/core/color.ts +55 -0
- package/src/core/decay.ts +54 -0
- package/src/core/decoration.ts +32 -0
- package/src/core/drag-physics.ts +110 -0
- package/src/core/driver.ts +53 -0
- package/src/core/easing.ts +120 -0
- package/src/core/gravity.ts +107 -0
- package/src/core/index.ts +24 -0
- package/src/core/ownership.ts +21 -0
- package/src/core/playback.ts +82 -0
- package/src/core/presets.ts +139 -0
- package/src/core/properties.ts +40 -0
- package/src/core/sampling.ts +173 -0
- package/src/core/spring.ts +113 -0
- package/src/core/track.ts +664 -0
- package/src/core/transition.ts +367 -0
- package/src/decay.ts +1 -54
- package/src/decoration.ts +7 -33
- package/src/drag-physics.ts +1 -110
- package/src/driver/android.ts +10 -0
- package/src/driver/index.ts +3 -50
- package/src/easing.ts +1 -120
- package/src/engine.ts +12 -24
- package/src/gravity.ts +1 -107
- package/src/index.ts +2 -0
- package/src/ios-plugin.d.ts +3 -1
- package/src/mixer.ts +3 -1
- package/src/motion-scope.ts +70 -29
- package/src/playback.ts +9 -73
- package/src/presets.ts +2 -128
- package/src/properties.ts +4 -45
- package/src/sampling.ts +1 -173
- package/src/scroll-header/geometry.ts +7 -0
- package/src/scroll-header/index.ts +134 -7
- package/src/scroll-header/native.ts +23 -3
- package/src/scroll-header/surface.ts +11 -0
- package/src/shared-navigation/index.ts +6 -0
- package/src/shared-navigation/return-target.ts +66 -12
- package/src/spring.ts +1 -113
- package/src/track.ts +12 -642
- package/src/transition.ts +1 -367
- package/src/web/compose.ts +172 -0
- package/src/web/curve.ts +50 -0
- package/src/web/index.ts +17 -0
- package/src/web/plan.ts +194 -0
- package/src/web/press.ts +217 -0
- package/src/web/public.ts +74 -0
- package/src/web/runtime.ts +923 -0
- package/src/web/types.ts +45 -0
- package/src/web/vue/index.ts +150 -0
package/README.md
CHANGED
|
@@ -31,7 +31,9 @@ NativeScript's `view.animate()` covers the basics and stops there: one curve for
|
|
|
31
31
|
|
|
32
32
|
Jolt computes the motion once, in JavaScript, when the animation starts, and hands it to the platform as keyframes: Core Animation on iOS, `ObjectAnimator` on Android. Those default view tracks play without per-frame JavaScript. Real-size layout, opt-in subscribers, gesture input and timeline step activation retain their documented [execution limits](https://jolt.rafaelaugusto.dev/guide/how-it-works). Springs follow real physics, and an animation that interrupts another one starts from where the view is, at the speed it was going.
|
|
33
33
|
|
|
34
|
-
The [0.1.0-rc.
|
|
34
|
+
The [0.1.0-rc.5 release candidate](https://github.com/rafaelaugustos/jolt/releases/tag/v0.1.0-rc.5) adds experimental Web playback and Vue DOM lifecycle, native pull-to-refresh, scoped background recovery, Android layer cleanup and reader-focus fixes. The preview has **74 examples in English, Portuguese, Spanish and Simplified Chinese**. Install `@rafaelaugusto/jolt@0.1.0-rc.5` and rebuild native apps; external native properties also need matching `@rafaelaugusto/jolt-native@0.1.0-rc.5`. [Stable-release acceptance](https://jolt.rafaelaugusto.dev/guide/not-there-yet) remains in progress.
|
|
35
|
+
|
|
36
|
+
For the browser, import **`@rafaelaugusto/jolt/web`**. It installs without NativeScript, Vue or React; **`@rafaelaugusto/jolt/web/vue`** optionally integrates Vue 3.5 DOM refs and enter/leave. Both entries are experimental and use the same motion compiler as native playback. See [installation](https://jolt.rafaelaugusto.dev/guide/install#experimental-web-candidate), [finite Web playback](https://jolt.rafaelaugusto.dev/guide/web-runtime) and [Vue Web motion](https://jolt.rafaelaugusto.dev/guide/web-vue). Mavis integration and its shared application proof continue separately.
|
|
35
37
|
|
|
36
38
|
## Features
|
|
37
39
|
|
|
@@ -99,7 +101,7 @@ The [0.1.0-rc.4 release candidate](https://github.com/rafaelaugustos/jolt/releas
|
|
|
99
101
|
npm install @rafaelaugusto/jolt@next
|
|
100
102
|
```
|
|
101
103
|
|
|
102
|
-
The current release candidate is **0.1.0-rc.
|
|
104
|
+
The current release candidate is **0.1.0-rc.5**, published under the `next` tag. Requires `@nativescript/core` 8.9 or later. It doesn't depend on a framework: it takes a view, or an element that holds one. Rebuild the native app after installing or upgrading Jolt. See [release status and limits](https://jolt.rafaelaugusto.dev/guide/not-there-yet) for the remaining stable-release acceptance work.
|
|
103
105
|
|
|
104
106
|
On iOS 15+, Jolt requests up to 120 Hz on ProMotion displays. Set `CADisableMinimumFrameDurationOnPhone` to `true` in the app's `App_Resources/iOS/Info.plist` and rebuild to enable higher rates on iPhone. See the [iOS setup](https://jolt.rafaelaugusto.dev/guide/install#promotion-on-ios); the system still chooses the actual refresh rate.
|
|
105
107
|
|
package/dist/color.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
+
import type { ColorProperty } from './core/color.js';
|
|
2
|
+
export { colorMixer, isColorProperty, type ColorProperty } from './core/color.js';
|
|
1
3
|
import { Color, type View } from '@nativescript/core';
|
|
2
|
-
export type ColorProperty = 'backgroundColor' | 'borderColor' | 'color';
|
|
3
4
|
export type ColorValue = string | Color;
|
|
4
5
|
export type ColorKeyframes = ColorValue | readonly (ColorValue | null)[];
|
|
5
|
-
export declare const isColorProperty: (property: string) => property is ColorProperty;
|
|
6
6
|
export declare function parseColor(value: unknown): number;
|
|
7
7
|
export declare function readColor(view: View, property: ColorProperty): number;
|
|
8
8
|
export declare function validateColorTarget(view: View, property: ColorProperty): void;
|
|
9
|
-
/** Premultiplied OKLab interpolation, clipped to the sRGB output gamut. */
|
|
10
|
-
export declare function colorMixer(from: number, to: number): (progress: number) => number;
|
|
11
9
|
//# sourceMappingURL=color.d.ts.map
|
package/dist/color.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACjF,OAAO,EAAU,KAAK,EAA0B,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAErF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,CAAA;AACvC,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAA;AACxE,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKjD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAOrE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,QAwBtE"}
|
package/dist/color.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
export { colorMixer, isColorProperty } from './core/color.js';
|
|
1
2
|
import { Button, Color, Label, TextBase, isIOS } from '@nativescript/core';
|
|
2
|
-
export const isColorProperty = (property) => property === 'backgroundColor' || property === 'borderColor' || property === 'color';
|
|
3
3
|
export function parseColor(value) {
|
|
4
4
|
if (value instanceof Color)
|
|
5
5
|
return value.argb >>> 0;
|
|
@@ -30,44 +30,4 @@ export function validateColorTarget(view, property) {
|
|
|
30
30
|
throw new TypeError('borderColor animation requires the same starting color on every edge.');
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
const clamp = (value) => Math.max(0, Math.min(1, value));
|
|
34
|
-
const linear = (channel) => channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;
|
|
35
|
-
const encoded = (channel) => channel <= 0.0031308 ? 12.92 * channel : 1.055 * channel ** (1 / 2.4) - 0.055;
|
|
36
|
-
function lab(value) {
|
|
37
|
-
const r = linear(((value >>> 16) & 255) / 255);
|
|
38
|
-
const g = linear(((value >>> 8) & 255) / 255);
|
|
39
|
-
const b = linear((value & 255) / 255);
|
|
40
|
-
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
|
|
41
|
-
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
|
|
42
|
-
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
|
|
43
|
-
return [
|
|
44
|
-
0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,
|
|
45
|
-
1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,
|
|
46
|
-
0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,
|
|
47
|
-
];
|
|
48
|
-
}
|
|
49
|
-
/** Premultiplied OKLab interpolation, clipped to the sRGB output gamut. */
|
|
50
|
-
export function colorMixer(from, to) {
|
|
51
|
-
const a = lab(from), b = lab(to);
|
|
52
|
-
const alphaA = (from >>> 24) / 255, alphaB = (to >>> 24) / 255;
|
|
53
|
-
return (progress) => {
|
|
54
|
-
const p = clamp(progress);
|
|
55
|
-
if (p === 0)
|
|
56
|
-
return from;
|
|
57
|
-
if (p === 1)
|
|
58
|
-
return to;
|
|
59
|
-
const alpha = alphaA + (alphaB - alphaA) * p;
|
|
60
|
-
if (alpha <= 0)
|
|
61
|
-
return 0;
|
|
62
|
-
const channel = (i) => (a[i] * alphaA * (1 - p) + b[i] * alphaB * p) / alpha;
|
|
63
|
-
const L = channel(0), A = channel(1), B = channel(2);
|
|
64
|
-
const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;
|
|
65
|
-
const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;
|
|
66
|
-
const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;
|
|
67
|
-
const r = Math.round(clamp(encoded(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s)) * 255);
|
|
68
|
-
const g = Math.round(clamp(encoded(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s)) * 255);
|
|
69
|
-
const blue = Math.round(clamp(encoded(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s)) * 255);
|
|
70
|
-
return ((Math.round(alpha * 255) << 24) | (r << 16) | (g << 8) | blue) >>> 0;
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
33
|
//# sourceMappingURL=color.js.map
|
package/dist/color.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color.js","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAsB,MAAM,iBAAiB,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAa,MAAM,oBAAoB,CAAA;AAIrF,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,CAAA;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnE,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAU,EAAE,QAAuB;IAC3D,MAAM,KAAK,GAAG,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/E,OAAO,KAAK,YAAY,KAAK;QAC3B,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QAClB,CAAC,CAAC,QAAQ,KAAK,iBAAiB;YAC9B,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,UAAU,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAU,EAAE,QAAuB;IACrE,IACE,QAAQ,KAAK,OAAO;QACpB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,MAAM,CAAC,CAAC,CAAC,IAAI,YAAY,QAAQ,CAAC;QAErF,MAAM,IAAI,SAAS,CACjB,mFAAmF,CACpF,CAAA;IACH,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG;YACb,IAAI,CAAC,cAAc;YACnB,IAAI,CAAC,gBAAgB;YACrB,IAAI,CAAC,iBAAiB;YACtB,IAAI,CAAC,eAAe;SACrB,CAAA;QACD,IACE,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,UAAU,CAAC,CAC3E;YAED,MAAM,IAAI,SAAS,CACjB,uEAAuE,CACxE,CAAA;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type ColorProperty = 'backgroundColor' | 'borderColor' | 'color';
|
|
2
|
+
export declare const isColorProperty: (property: string) => property is ColorProperty;
|
|
3
|
+
/** Premultiplied OKLab interpolation, clipped to the sRGB output gamut. */
|
|
4
|
+
export declare function colorMixer(from: number, to: number): (progress: number) => number;
|
|
5
|
+
//# sourceMappingURL=color.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../src/core/color.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,aAAa,GAAG,OAAO,CAAA;AACvE,eAAO,MAAM,eAAe,aAAc,MAAM,KAAG,QAAQ,IAAI,aACuB,CAAA;AAsBtF,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CA6BjF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const isColorProperty = (property) => property === 'backgroundColor' || property === 'borderColor' || property === 'color';
|
|
2
|
+
const clamp = (value) => Math.max(0, Math.min(1, value));
|
|
3
|
+
const linear = (channel) => channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;
|
|
4
|
+
const encoded = (channel) => channel <= 0.0031308 ? 12.92 * channel : 1.055 * channel ** (1 / 2.4) - 0.055;
|
|
5
|
+
function lab(value) {
|
|
6
|
+
const r = linear(((value >>> 16) & 255) / 255);
|
|
7
|
+
const g = linear(((value >>> 8) & 255) / 255);
|
|
8
|
+
const b = linear((value & 255) / 255);
|
|
9
|
+
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
|
|
10
|
+
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
|
|
11
|
+
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
|
|
12
|
+
return [
|
|
13
|
+
0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,
|
|
14
|
+
1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,
|
|
15
|
+
0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
/** Premultiplied OKLab interpolation, clipped to the sRGB output gamut. */
|
|
19
|
+
export function colorMixer(from, to) {
|
|
20
|
+
const a = lab(from), b = lab(to);
|
|
21
|
+
const alphaA = (from >>> 24) / 255, alphaB = (to >>> 24) / 255;
|
|
22
|
+
return (progress) => {
|
|
23
|
+
const p = clamp(progress);
|
|
24
|
+
if (p === 0)
|
|
25
|
+
return from;
|
|
26
|
+
if (p === 1)
|
|
27
|
+
return to;
|
|
28
|
+
const alpha = alphaA + (alphaB - alphaA) * p;
|
|
29
|
+
if (alpha <= 0)
|
|
30
|
+
return 0;
|
|
31
|
+
const channel = (i) => (a[i] * alphaA * (1 - p) + b[i] * alphaB * p) / alpha;
|
|
32
|
+
const L = channel(0), A = channel(1), B = channel(2);
|
|
33
|
+
const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;
|
|
34
|
+
const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;
|
|
35
|
+
const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;
|
|
36
|
+
const r = Math.round(clamp(encoded(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s)) * 255);
|
|
37
|
+
const g = Math.round(clamp(encoded(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s)) * 255);
|
|
38
|
+
const blue = Math.round(clamp(encoded(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s)) * 255);
|
|
39
|
+
return ((Math.round(alpha * 255) << 24) | (r << 16) | (g << 8) | blue) >>> 0;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=color.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/core/color.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface DecayMotion {
|
|
2
|
+
duration: number;
|
|
3
|
+
to: number;
|
|
4
|
+
position(time: number): number;
|
|
5
|
+
velocity(time: number): number;
|
|
6
|
+
interpolationError(start: number, end: number): number;
|
|
7
|
+
}
|
|
8
|
+
/** Velocity retains this fraction every millisecond, independently of the display's refresh rate. */
|
|
9
|
+
export declare const DEFAULT_FRICTION = 0.998;
|
|
10
|
+
/** Exponential motion, with velocity in units per second and time in milliseconds. */
|
|
11
|
+
export declare function solveDecay(from: number, velocity: number, friction: number, precision: number): DecayMotion;
|
|
12
|
+
//# sourceMappingURL=decay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decay.d.ts","sourceRoot":"","sources":["../../src/core/decay.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACvD;AAED,qGAAqG;AACrG,eAAO,MAAM,gBAAgB,QAAQ,CAAA;AAErC,sFAAsF;AACtF,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,WAAW,CAoCb"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Velocity retains this fraction every millisecond, independently of the display's refresh rate. */
|
|
2
|
+
export const DEFAULT_FRICTION = 0.998;
|
|
3
|
+
/** Exponential motion, with velocity in units per second and time in milliseconds. */
|
|
4
|
+
export function solveDecay(from, velocity, friction, precision) {
|
|
5
|
+
const rate = -Math.log(friction);
|
|
6
|
+
const distance = velocity / (1000 * rate);
|
|
7
|
+
const to = from + distance;
|
|
8
|
+
// Stop only when both the remaining distance and speed are imperceptible.
|
|
9
|
+
const duration = velocity === 0
|
|
10
|
+
? 0
|
|
11
|
+
: Math.ceil(Math.max(0, Math.log(Math.abs(distance) / precision) / rate, Math.log(Math.abs(velocity) / (precision * 10)) / rate));
|
|
12
|
+
if (!Number.isFinite(to) || !Number.isFinite(duration) || duration > 2_147_483_647) {
|
|
13
|
+
throw new RangeError('Decay velocity and friction produce an unplayable motion.');
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
duration,
|
|
17
|
+
to,
|
|
18
|
+
position: (time) => time >= duration ? to : from - distance * Math.expm1(-rate * Math.max(0, time)),
|
|
19
|
+
velocity: (time) => time >= duration ? 0 : velocity * Math.exp(-rate * Math.max(0, time)),
|
|
20
|
+
interpolationError: (start, end) => (Math.abs(distance) *
|
|
21
|
+
rate *
|
|
22
|
+
rate *
|
|
23
|
+
Math.exp(-rate * Math.max(0, start)) *
|
|
24
|
+
(end - start) ** 2) /
|
|
25
|
+
8 +
|
|
26
|
+
(end >= duration ? Math.abs(distance) * Math.exp(-rate * duration) : 0),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=decay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decay.js","sourceRoot":"","sources":["../../src/core/decay.ts"],"names":[],"mappings":"AAQA,qGAAqG;AACrG,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAA;AAErC,sFAAsF;AACtF,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,QAAgB,EAChB,QAAgB,EAChB,SAAiB;IAEjB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAChC,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IACzC,MAAM,EAAE,GAAG,IAAI,GAAG,QAAQ,CAAA;IAC1B,0EAA0E;IAC1E,MAAM,QAAQ,GACZ,QAAQ,KAAK,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,GAAG,CACN,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,GAAG,IAAI,EAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CACvD,CACF,CAAA;IAEP,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,aAAa,EAAE,CAAC;QACnF,MAAM,IAAI,UAAU,CAAC,2DAA2D,CAAC,CAAA;IACnF,CAAC;IAED,OAAO;QACL,QAAQ;QACR,EAAE;QACF,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CACjB,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACjF,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CACjB,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvE,kBAAkB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CACjC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YACjB,IAAI;YACJ,IAAI;YACJ,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;YACH,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1E,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type DecorationProperty = 'borderRadius' | 'borderWidth' | 'shadowOpacity' | 'shadowRadius' | 'shadowOffsetX' | 'shadowOffsetY' | 'elevation' | 'translationZ';
|
|
2
|
+
export declare const decorationProperties: readonly DecorationProperty[];
|
|
3
|
+
export declare const isDecorationProperty: (key: string) => key is DecorationProperty;
|
|
4
|
+
export declare function clampDecoration(property: DecorationProperty, value: number): number;
|
|
5
|
+
//# sourceMappingURL=decoration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoration.d.ts","sourceRoot":"","sources":["../../src/core/decoration.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,aAAa,GACb,eAAe,GACf,cAAc,GACd,eAAe,GACf,eAAe,GACf,WAAW,GACX,cAAc,CAAA;AAElB,eAAO,MAAM,oBAAoB,EAAE,SAAS,kBAAkB,EAS7D,CAAA;AACD,eAAO,MAAM,oBAAoB,QAAS,MAAM,KAAG,GAAG,IAAI,kBACA,CAAA;AAE1D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQnF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const decorationProperties = [
|
|
2
|
+
'borderRadius',
|
|
3
|
+
'borderWidth',
|
|
4
|
+
'shadowOpacity',
|
|
5
|
+
'shadowRadius',
|
|
6
|
+
'shadowOffsetX',
|
|
7
|
+
'shadowOffsetY',
|
|
8
|
+
'elevation',
|
|
9
|
+
'translationZ',
|
|
10
|
+
];
|
|
11
|
+
export const isDecorationProperty = (key) => decorationProperties.includes(key);
|
|
12
|
+
export function clampDecoration(property, value) {
|
|
13
|
+
if (property === 'shadowOpacity')
|
|
14
|
+
return Math.max(0, Math.min(1, value));
|
|
15
|
+
return property === 'borderRadius' ||
|
|
16
|
+
property === 'borderWidth' ||
|
|
17
|
+
property === 'shadowRadius' ||
|
|
18
|
+
property === 'elevation'
|
|
19
|
+
? Math.max(0, value)
|
|
20
|
+
: value;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=decoration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoration.js","sourceRoot":"","sources":["../../src/core/decoration.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,oBAAoB,GAAkC;IACjE,cAAc;IACd,aAAa;IACb,eAAe;IACf,cAAc;IACd,eAAe;IACf,eAAe;IACf,WAAW;IACX,cAAc;CACf,CAAA;AACD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAA6B,EAAE,CAC7E,oBAAoB,CAAC,QAAQ,CAAC,GAAyB,CAAC,CAAA;AAE1D,MAAM,UAAU,eAAe,CAAC,QAA4B,EAAE,KAAa;IACzE,IAAI,QAAQ,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;IACxE,OAAO,QAAQ,KAAK,cAAc;QAChC,QAAQ,KAAK,aAAa;QAC1B,QAAQ,KAAK,cAAc;QAC3B,QAAQ,KAAK,WAAW;QACxB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;QACpB,CAAC,CAAC,KAAK,CAAA;AACX,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface DragCurve {
|
|
2
|
+
type: 'drag';
|
|
3
|
+
velocity: number;
|
|
4
|
+
friction: number;
|
|
5
|
+
bounds: readonly [number, number];
|
|
6
|
+
snap?: readonly number[];
|
|
7
|
+
rubberband: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const clampDrag: (value: number, [min, max]: readonly [number, number]) => number;
|
|
10
|
+
/** Bounded resistance; coordinates and the resistance length are DIPs. */
|
|
11
|
+
export declare function resistDrag(value: number, bounds: readonly [number, number], length: number): number;
|
|
12
|
+
/** Recover the finger-space origin when grabbing an already rubberbanded pose. */
|
|
13
|
+
export declare function resumeDrag(value: number, bounds: readonly [number, number], length: number): {
|
|
14
|
+
origin: number;
|
|
15
|
+
length: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function dragDestination(from: number, curve: DragCurve): number;
|
|
18
|
+
/** One precomputed motion. Native keyframes play both the coast and edge recovery. */
|
|
19
|
+
export declare function solveDragRelease(from: number, curve: DragCurve): import("./decay.js").DecayMotion | {
|
|
20
|
+
to: number;
|
|
21
|
+
duration: number;
|
|
22
|
+
position: (time: number) => number;
|
|
23
|
+
velocity: (time: number) => number;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=drag-physics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag-physics.d.ts","sourceRoot":"","sources":["../../src/core/drag-physics.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,SAAS,UAAW,MAAM,cAAc,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,WACzC,CAAA;AAErC,0EAA0E;AAC1E,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,MAAM,EAAE,MAAM,UAKf;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,MAAM,EAAE,MAAM;;;EAQf;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,UAO7D;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;;;qBA8C1C,MAAM;qBAMN,MAAM;EAO1B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { solveDecay } from './decay.js';
|
|
2
|
+
import { solveSpring, springPhysics } from './spring.js';
|
|
3
|
+
export const clampDrag = (value, [min, max]) => Math.max(min, Math.min(max, value));
|
|
4
|
+
/** Bounded resistance; coordinates and the resistance length are DIPs. */
|
|
5
|
+
export function resistDrag(value, bounds, length) {
|
|
6
|
+
const edge = clampDrag(value, bounds);
|
|
7
|
+
const distance = value - edge;
|
|
8
|
+
return edge + (distance / (1 + Math.abs(distance) / length)) * 0.55;
|
|
9
|
+
}
|
|
10
|
+
/** Recover the finger-space origin when grabbing an already rubberbanded pose. */
|
|
11
|
+
export function resumeDrag(value, bounds, length) {
|
|
12
|
+
const edge = clampDrag(value, bounds);
|
|
13
|
+
const distance = value - edge;
|
|
14
|
+
// A native edge spring or external owner can exceed the usual resistance range.
|
|
15
|
+
// Expand it for this gesture so every finite visible pose has a stable inverse.
|
|
16
|
+
length = Math.max(length, Math.abs(distance) * 4);
|
|
17
|
+
return { origin: edge + distance / (0.55 - Math.abs(distance) / length), length };
|
|
18
|
+
}
|
|
19
|
+
export function dragDestination(from, curve) {
|
|
20
|
+
const projected = solveDecay(from, curve.velocity, curve.friction, 0.25).to;
|
|
21
|
+
if (curve.snap)
|
|
22
|
+
return curve.snap.reduce((best, point) => Math.abs(point - projected) < Math.abs(best - projected) ? point : best);
|
|
23
|
+
return clampDrag(projected, curve.bounds);
|
|
24
|
+
}
|
|
25
|
+
/** One precomputed motion. Native keyframes play both the coast and edge recovery. */
|
|
26
|
+
export function solveDragRelease(from, curve) {
|
|
27
|
+
const to = dragDestination(from, curve);
|
|
28
|
+
const coast = solveDecay(from, curve.velocity, curve.friction, 0.25);
|
|
29
|
+
const edge = clampDrag(from, curve.bounds);
|
|
30
|
+
const springTo = (start, target, velocity) => {
|
|
31
|
+
const motion = solveSpring(springPhysics({ duration: 500, bounce: 0 }), start, target, velocity, 0.25);
|
|
32
|
+
const position = (time) => {
|
|
33
|
+
const value = time >= motion.duration ? target : motion.position(time);
|
|
34
|
+
return curve.rubberband ? value : clampDrag(value, curve.bounds);
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
...motion,
|
|
38
|
+
position,
|
|
39
|
+
velocity: (time) => {
|
|
40
|
+
const raw = motion.position(time);
|
|
41
|
+
return time >= motion.duration ||
|
|
42
|
+
(!curve.rubberband && raw !== clampDrag(raw, curve.bounds))
|
|
43
|
+
? 0
|
|
44
|
+
: motion.velocity(time);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
if (curve.snap || from !== edge)
|
|
49
|
+
return {
|
|
50
|
+
...springTo(from, curve.snap ? to : edge, curve.velocity),
|
|
51
|
+
to: curve.snap ? to : edge,
|
|
52
|
+
};
|
|
53
|
+
if (to === coast.to)
|
|
54
|
+
return coast;
|
|
55
|
+
// Reach the boundary with the decay's actual velocity, then absorb that velocity.
|
|
56
|
+
const rate = -Math.log(curve.friction);
|
|
57
|
+
const collision = Math.max(0, -Math.log1p((-(to - from) * rate * 1000) / curve.velocity) / rate);
|
|
58
|
+
const recovery = springTo(to, to, coast.velocity(collision));
|
|
59
|
+
const duration = collision + (curve.rubberband ? recovery.duration : 0);
|
|
60
|
+
return {
|
|
61
|
+
to,
|
|
62
|
+
duration,
|
|
63
|
+
position: (time) => time >= duration
|
|
64
|
+
? to
|
|
65
|
+
: time < collision
|
|
66
|
+
? coast.position(time)
|
|
67
|
+
: recovery.position(time - collision),
|
|
68
|
+
velocity: (time) => time >= duration
|
|
69
|
+
? 0
|
|
70
|
+
: time < collision
|
|
71
|
+
? coast.velocity(time)
|
|
72
|
+
: recovery.velocity(time - collision),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=drag-physics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag-physics.js","sourceRoot":"","sources":["../../src/core/drag-physics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { PlaybackClock, PlaybackCommand } from './playback.js';
|
|
2
|
+
import type { Property } from './properties.js';
|
|
3
|
+
import type { Track } from './track.js';
|
|
4
|
+
export interface LayoutFrame {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
}
|
|
10
|
+
export interface Driver<Target> {
|
|
11
|
+
/** Milliseconds, on the clock the platform's animations run on. */
|
|
12
|
+
now(): number;
|
|
13
|
+
/** One platform animation frame; returns an idempotent cancellation function. */
|
|
14
|
+
frame(callback: () => void): () => void;
|
|
15
|
+
/** Starts the track at `startedAt + track.delay` and calls `onEnd` once, however it ends. */
|
|
16
|
+
play(view: Target, track: Track, startedAt: number, onEnd: (finished?: boolean) => void): unknown;
|
|
17
|
+
stop(view: Target, handle: unknown): void;
|
|
18
|
+
/** A platform elapsed-time marker when system animation speed affects time. */
|
|
19
|
+
clock?(duration: number): PlaybackClock;
|
|
20
|
+
/** Move only this track to an elapsed time, optionally holding it. */
|
|
21
|
+
control?(view: Target, handle: unknown, elapsed: number, paused: boolean, command?: PlaybackCommand): void;
|
|
22
|
+
/** Reapply presentation after a model write rebuilds platform drawing state. */
|
|
23
|
+
sync?(view: Target, excluding?: Property): void;
|
|
24
|
+
/** Commit only a settled channel after cancelling its native playback. */
|
|
25
|
+
commit?(view: Target, property: Property, value: number): void;
|
|
26
|
+
/** Track time, including its delay, when the platform clock differs from `now()`. */
|
|
27
|
+
elapsed?(handle: unknown): number;
|
|
28
|
+
/** The value on screen, when the platform knows it better than the track does. */
|
|
29
|
+
presented(view: Target, property: Property): number | undefined;
|
|
30
|
+
/** Calls back after `ms` of animation time, respecting platform speed settings. */
|
|
31
|
+
after(ms: number, callback: () => void): () => void;
|
|
32
|
+
/** Untransformed layout bounds in the driver's logical coordinate units. */
|
|
33
|
+
layoutFrame?(view: Target): LayoutFrame | undefined;
|
|
34
|
+
/** One callback after layout, before drawing; caller requests layout and owns cancellation. */
|
|
35
|
+
afterLayout?(view: Target, callback: () => void): () => void;
|
|
36
|
+
/** The platform's accessibility preference for reduced motion. */
|
|
37
|
+
reducedMotion?(): boolean;
|
|
38
|
+
/** Calls back when that setting may have changed; returns a cleanup function. */
|
|
39
|
+
watchReducedMotion?(callback: () => void): () => void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/core/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,MAAM,CAAC,MAAM;IAC5B,mEAAmE;IACnE,GAAG,IAAI,MAAM,CAAA;IACb,iFAAiF;IACjF,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IACvC,6FAA6F;IAC7F,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,GAClC,OAAO,CAAA;IACV,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;IACzC,+EAA+E;IAC/E,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAA;IACvC,sEAAsE;IACtE,OAAO,CAAC,CACN,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,eAAe,GACxB,IAAI,CAAA;IACP,gFAAgF;IAChF,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC/C,0EAA0E;IAC1E,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9D,qFAAqF;IACrF,OAAO,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;IACjC,kFAAkF;IAClF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;IAC/D,mFAAmF;IACnF,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IACnD,4EAA4E;IAC5E,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAA;IACnD,+FAA+F;IAC/F,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IAC5D,kEAAkE;IAClE,aAAa,CAAC,IAAI,OAAO,CAAA;IACzB,iFAAiF;IACjF,kBAAkB,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CACtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/core/driver.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type EasingFunction = (progress: number) => number;
|
|
2
|
+
export type CubicBezier = readonly [x1: number, y1: number, x2: number, y2: number];
|
|
3
|
+
export type EasingName = 'linear' | 'ease' | 'easeIn' | 'easeOut' | 'easeInOut' | 'circIn' | 'circOut' | 'circInOut' | 'backIn' | 'backOut' | 'backInOut' | 'anticipate' | `${'quad' | 'cubic' | 'quart' | 'quint' | 'sine' | 'expo'}${'In' | 'Out' | 'InOut'}`;
|
|
4
|
+
export type Easing = EasingName | CubicBezier | EasingFunction;
|
|
5
|
+
export declare const linear: EasingFunction;
|
|
6
|
+
/** Internal sampler hint. Arbitrary callbacks are never assumed to be band limited. */
|
|
7
|
+
export declare const isBuiltinEasing: (ease: EasingFunction) => boolean;
|
|
8
|
+
export declare function cubicBezier(x1: number, y1: number, x2: number, y2: number): EasingFunction;
|
|
9
|
+
export declare function resolveEasing(easing: Easing): EasingFunction;
|
|
10
|
+
//# sourceMappingURL=easing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easing.d.ts","sourceRoot":"","sources":["../../src/core/easing.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;AAEzD,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;AAEnF,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,SAAS,GACT,WAAW,GACX,QAAQ,GACR,SAAS,GACT,WAAW,GACX,QAAQ,GACR,SAAS,GACT,WAAW,GACX,YAAY,GACZ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,OAAO,EAAE,CAAA;AAExF,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,CAAA;AAE9D,eAAO,MAAM,MAAM,EAAE,cAAyB,CAAA;AAE9C,uFAAuF;AACvF,eAAO,MAAM,eAAe,SAAU,cAAc,YAAuB,CAAA;AAE3E,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAwCzE;AA6CD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAQ5D"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export const linear = (p) => p;
|
|
2
|
+
const builtins = new WeakSet([linear]);
|
|
3
|
+
/** Internal sampler hint. Arbitrary callbacks are never assumed to be band limited. */
|
|
4
|
+
export const isBuiltinEasing = (ease) => builtins.has(ease);
|
|
5
|
+
export function cubicBezier(x1, y1, x2, y2) {
|
|
6
|
+
if (x1 === y1 && x2 === y2)
|
|
7
|
+
return linear;
|
|
8
|
+
const cx = 3 * x1;
|
|
9
|
+
const bx = 3 * (x2 - x1) - cx;
|
|
10
|
+
const ax = 1 - cx - bx;
|
|
11
|
+
const cy = 3 * y1;
|
|
12
|
+
const by = 3 * (y2 - y1) - cy;
|
|
13
|
+
const ay = 1 - cy - by;
|
|
14
|
+
const sampleX = (t) => ((ax * t + bx) * t + cx) * t;
|
|
15
|
+
const sampleY = (t) => ((ay * t + by) * t + cy) * t;
|
|
16
|
+
const slopeX = (t) => (3 * ax * t + 2 * bx) * t + cx;
|
|
17
|
+
const solveX = (x) => {
|
|
18
|
+
let t = x;
|
|
19
|
+
for (let i = 0; i < 8; i++) {
|
|
20
|
+
const error = sampleX(t) - x;
|
|
21
|
+
if (Math.abs(error) < 1e-7)
|
|
22
|
+
return t;
|
|
23
|
+
const slope = slopeX(t);
|
|
24
|
+
if (Math.abs(slope) < 1e-6)
|
|
25
|
+
break;
|
|
26
|
+
t -= error / slope;
|
|
27
|
+
}
|
|
28
|
+
let low = 0;
|
|
29
|
+
let high = 1;
|
|
30
|
+
t = x;
|
|
31
|
+
for (let i = 0; i < 40; i++) {
|
|
32
|
+
const value = sampleX(t);
|
|
33
|
+
if (Math.abs(value - x) < 1e-7)
|
|
34
|
+
break;
|
|
35
|
+
if (value < x)
|
|
36
|
+
low = t;
|
|
37
|
+
else
|
|
38
|
+
high = t;
|
|
39
|
+
t = (low + high) / 2;
|
|
40
|
+
}
|
|
41
|
+
return t;
|
|
42
|
+
};
|
|
43
|
+
const result = (p) => (p <= 0 ? 0 : p >= 1 ? 1 : sampleY(solveX(p)));
|
|
44
|
+
builtins.add(result);
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
const backIn = cubicBezier(0.36, 0, 0.66, -0.56);
|
|
48
|
+
const circIn = (p) => 1 - Math.sqrt(1 - Math.min(p * p, 1));
|
|
49
|
+
const reverse = (easing) => (p) => 1 - easing(1 - p);
|
|
50
|
+
const mirror = (easing) => (p) => p <= 0.5 ? easing(2 * p) / 2 : (2 - easing(2 * (1 - p))) / 2;
|
|
51
|
+
const family = (name, easeIn) => ({
|
|
52
|
+
[`${name}In`]: easeIn,
|
|
53
|
+
[`${name}Out`]: reverse(easeIn),
|
|
54
|
+
[`${name}InOut`]: mirror(easeIn),
|
|
55
|
+
});
|
|
56
|
+
const easings = {
|
|
57
|
+
linear,
|
|
58
|
+
ease: cubicBezier(0.25, 0.1, 0.25, 1),
|
|
59
|
+
easeIn: cubicBezier(0.42, 0, 1, 1),
|
|
60
|
+
easeOut: cubicBezier(0, 0, 0.58, 1),
|
|
61
|
+
easeInOut: cubicBezier(0.42, 0, 0.58, 1),
|
|
62
|
+
circIn,
|
|
63
|
+
circOut: reverse(circIn),
|
|
64
|
+
circInOut: mirror(circIn),
|
|
65
|
+
backIn,
|
|
66
|
+
backOut: reverse(backIn),
|
|
67
|
+
backInOut: mirror(backIn),
|
|
68
|
+
anticipate: (p) => p <= 0.5 ? backIn(2 * p) / 2 : p >= 1 ? 1 : 1 - Math.pow(2, 10 - 20 * p) / 2,
|
|
69
|
+
...family('quad', (p) => p ** 2),
|
|
70
|
+
...family('cubic', (p) => p ** 3),
|
|
71
|
+
...family('quart', (p) => p ** 4),
|
|
72
|
+
...family('quint', (p) => p ** 5),
|
|
73
|
+
...family('sine', (p) => (p >= 1 ? 1 : 1 - Math.cos((p * Math.PI) / 2))),
|
|
74
|
+
...family('expo', (p) => (p <= 0 ? 0 : 2 ** (10 * p - 10))),
|
|
75
|
+
};
|
|
76
|
+
Object.values(easings).forEach((ease) => builtins.add(ease));
|
|
77
|
+
export function resolveEasing(easing) {
|
|
78
|
+
if (typeof easing === 'function')
|
|
79
|
+
return easing;
|
|
80
|
+
if (typeof easing === 'string') {
|
|
81
|
+
const resolved = easings[easing];
|
|
82
|
+
if (!resolved)
|
|
83
|
+
throw new Error(`Unknown easing "${easing}".`);
|
|
84
|
+
return resolved;
|
|
85
|
+
}
|
|
86
|
+
return cubicBezier(...easing);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=easing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easing.js","sourceRoot":"","sources":["../../src/core/easing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface GravityMotion {
|
|
2
|
+
duration: number;
|
|
3
|
+
/** Exact impact and turning-point times, in milliseconds. */
|
|
4
|
+
breakpoints: number[];
|
|
5
|
+
position(time: number): number;
|
|
6
|
+
velocity(time: number): number;
|
|
7
|
+
interpolationError(start: number, end: number): number;
|
|
8
|
+
}
|
|
9
|
+
export declare const DEFAULT_ACCELERATION = 1800;
|
|
10
|
+
export declare const DEFAULT_RESTITUTION = 0.55;
|
|
11
|
+
/** Ballistic flights against one fixed boundary; no numerical integration or frame loop. */
|
|
12
|
+
export declare function solveGravity(from: number, to: number, acceleration: number, restitution: number, velocity: number, precision: number): GravityMotion;
|
|
13
|
+
//# sourceMappingURL=gravity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gravity.d.ts","sourceRoot":"","sources":["../../src/core/gravity.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACvD;AAED,eAAO,MAAM,oBAAoB,OAAO,CAAA;AACxC,eAAO,MAAM,mBAAmB,OAAO,CAAA;AAIvC,4FAA4F;AAC5F,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,aAAa,CAoFf"}
|