@rafaelaugusto/jolt 0.1.0-beta.9 → 0.1.0-rc.2
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 +167 -21
- package/dist/animate.d.ts +25 -4
- package/dist/animate.d.ts.map +1 -1
- package/dist/animate.js +67 -26
- package/dist/animate.js.map +1 -1
- package/dist/blur/index.d.ts +6 -0
- package/dist/blur/index.d.ts.map +1 -0
- package/dist/blur/index.js +196 -0
- package/dist/blur/index.js.map +1 -0
- package/dist/blur/native.d.ts +17 -0
- package/dist/blur/native.d.ts.map +1 -0
- package/dist/blur/native.js +44 -0
- package/dist/blur/native.js.map +1 -0
- package/dist/blur/types.d.ts +32 -0
- package/dist/blur/types.d.ts.map +1 -0
- package/dist/blur/types.js +2 -0
- package/dist/blur/types.js.map +1 -0
- package/dist/bottom-sheet/geometry.d.ts +18 -0
- package/dist/bottom-sheet/geometry.d.ts.map +1 -0
- package/dist/bottom-sheet/geometry.js +51 -0
- package/dist/bottom-sheet/geometry.js.map +1 -0
- package/dist/bottom-sheet/index.d.ts +56 -0
- package/dist/bottom-sheet/index.d.ts.map +1 -0
- package/dist/bottom-sheet/index.js +462 -0
- package/dist/bottom-sheet/index.js.map +1 -0
- package/dist/bottom-sheet/native.d.ts +11 -0
- package/dist/bottom-sheet/native.d.ts.map +1 -0
- package/dist/bottom-sheet/native.js +173 -0
- package/dist/bottom-sheet/native.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +40 -1
- package/dist/config.js.map +1 -1
- package/dist/decay.d.ts +1 -0
- package/dist/decay.d.ts.map +1 -1
- package/dist/decay.js +7 -0
- package/dist/decay.js.map +1 -1
- package/dist/drag-physics.d.ts +6 -1
- package/dist/drag-physics.d.ts.map +1 -1
- package/dist/drag.d.ts +17 -3
- package/dist/drag.d.ts.map +1 -1
- package/dist/drag.js +34 -11
- package/dist/drag.js.map +1 -1
- package/dist/driver/android-gradient.d.ts +5 -0
- package/dist/driver/android-gradient.d.ts.map +1 -0
- package/dist/driver/android-gradient.js +99 -0
- package/dist/driver/android-gradient.js.map +1 -0
- package/dist/driver/android-particles.d.ts +6 -0
- package/dist/driver/android-particles.d.ts.map +1 -0
- package/dist/driver/android-particles.js +93 -0
- package/dist/driver/android-particles.js.map +1 -0
- package/dist/driver/android.d.ts.map +1 -1
- package/dist/driver/android.js +27 -1
- package/dist/driver/android.js.map +1 -1
- package/dist/driver/frame.d.ts +3 -0
- package/dist/driver/frame.d.ts.map +1 -0
- package/dist/driver/frame.js +7 -0
- package/dist/driver/frame.js.map +1 -0
- package/dist/driver/index.d.ts +4 -0
- package/dist/driver/index.d.ts.map +1 -1
- package/dist/driver/index.js.map +1 -1
- package/dist/driver/ios-gradient.d.ts +5 -0
- package/dist/driver/ios-gradient.d.ts.map +1 -0
- package/dist/driver/ios-gradient.js +131 -0
- package/dist/driver/ios-gradient.js.map +1 -0
- package/dist/driver/ios-scroll-delegate.d.ts +4 -0
- package/dist/driver/ios-scroll-delegate.d.ts.map +1 -0
- package/dist/driver/ios-scroll-delegate.js +26 -0
- package/dist/driver/ios-scroll-delegate.js.map +1 -0
- package/dist/driver/ios.d.ts.map +1 -1
- package/dist/driver/ios.js +9 -0
- package/dist/driver/ios.js.map +1 -1
- package/dist/easing.d.ts +3 -1
- package/dist/easing.d.ts.map +1 -1
- package/dist/easing.js +18 -1
- package/dist/easing.js.map +1 -1
- package/dist/engine.d.ts +31 -2
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +194 -42
- package/dist/engine.js.map +1 -1
- package/dist/gesture-native.d.ts +28 -0
- package/dist/gesture-native.d.ts.map +1 -0
- package/dist/gesture-native.js +61 -0
- package/dist/gesture-native.js.map +1 -0
- package/dist/gestures/index.d.ts +69 -0
- package/dist/gestures/index.d.ts.map +1 -0
- package/dist/gestures/index.js +262 -0
- package/dist/gestures/index.js.map +1 -0
- package/dist/glass/index.d.ts +55 -0
- package/dist/glass/index.d.ts.map +1 -0
- package/dist/glass/index.js +205 -0
- package/dist/glass/index.js.map +1 -0
- package/dist/gradient-binding.d.ts +38 -0
- package/dist/gradient-binding.d.ts.map +1 -0
- package/dist/gradient-binding.js +128 -0
- package/dist/gradient-binding.js.map +1 -0
- package/dist/gradient.d.ts +105 -0
- package/dist/gradient.d.ts.map +1 -0
- package/dist/gradient.js +514 -0
- package/dist/gradient.js.map +1 -0
- package/dist/gravity.d.ts +13 -0
- package/dist/gravity.d.ts.map +1 -0
- package/dist/gravity.js +84 -0
- package/dist/gravity.js.map +1 -0
- package/dist/haptics.d.ts.map +1 -1
- package/dist/haptics.js +101 -28
- package/dist/haptics.js.map +1 -1
- package/dist/image-effect.d.ts +1 -0
- package/dist/image-effect.d.ts.map +1 -1
- package/dist/image-effect.js +10 -2
- package/dist/image-effect.js.map +1 -1
- package/dist/index.d.ts +19 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/inspector/index.d.ts +86 -0
- package/dist/inspector/index.d.ts.map +1 -0
- package/dist/inspector/index.js +419 -0
- package/dist/inspector/index.js.map +1 -0
- package/dist/inspector/plot.d.ts +4 -0
- package/dist/inspector/plot.d.ts.map +1 -0
- package/dist/inspector/plot.js +23 -0
- package/dist/inspector/plot.js.map +1 -0
- package/dist/inspector/probe.d.ts +19 -0
- package/dist/inspector/probe.d.ts.map +1 -0
- package/dist/inspector/probe.js +37 -0
- package/dist/inspector/probe.js.map +1 -0
- package/dist/inspector/tuning.d.ts +19 -0
- package/dist/inspector/tuning.d.ts.map +1 -0
- package/dist/inspector/tuning.js +37 -0
- package/dist/inspector/tuning.js.map +1 -0
- package/dist/interactive-navigation/index.d.ts +44 -0
- package/dist/interactive-navigation/index.d.ts.map +1 -0
- package/dist/interactive-navigation/index.js +350 -0
- package/dist/interactive-navigation/index.js.map +1 -0
- package/dist/keyboard.d.ts +24 -0
- package/dist/keyboard.d.ts.map +1 -1
- package/dist/keyboard.js +199 -6
- package/dist/keyboard.js.map +1 -1
- package/dist/live-spring-driver.d.ts +52 -0
- package/dist/live-spring-driver.d.ts.map +1 -0
- package/dist/live-spring-driver.js +104 -0
- package/dist/live-spring-driver.js.map +1 -0
- package/dist/mixer.d.ts +55 -0
- package/dist/mixer.d.ts.map +1 -0
- package/dist/mixer.js +286 -0
- package/dist/mixer.js.map +1 -0
- package/dist/motion-scope.d.ts +8 -2
- package/dist/motion-scope.d.ts.map +1 -1
- package/dist/motion-scope.js +24 -3
- package/dist/motion-scope.js.map +1 -1
- package/dist/motion-states.d.ts +19 -7
- package/dist/motion-states.d.ts.map +1 -1
- package/dist/motion-states.js +116 -26
- package/dist/motion-states.js.map +1 -1
- package/dist/motion-value.d.ts +227 -0
- package/dist/motion-value.d.ts.map +1 -0
- package/dist/motion-value.js +1074 -0
- package/dist/motion-value.js.map +1 -0
- package/dist/native/index.d.ts +10 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +6 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native-properties.d.ts +28 -0
- package/dist/native-properties.d.ts.map +1 -0
- package/dist/native-properties.js +154 -0
- package/dist/native-properties.js.map +1 -0
- package/dist/native-property-driver.d.ts +19 -0
- package/dist/native-property-driver.d.ts.map +1 -0
- package/dist/native-property-driver.js +69 -0
- package/dist/native-property-driver.js.map +1 -0
- package/dist/native-property.d.ts +37 -0
- package/dist/native-property.d.ts.map +1 -0
- package/dist/native-property.js +285 -0
- package/dist/native-property.js.map +1 -0
- package/dist/particles.d.ts +5 -2
- package/dist/particles.d.ts.map +1 -1
- package/dist/particles.js +16 -10
- package/dist/particles.js.map +1 -1
- package/dist/path.d.ts.map +1 -1
- package/dist/path.js +2 -2
- package/dist/path.js.map +1 -1
- package/dist/physics/index.d.ts +139 -0
- package/dist/physics/index.d.ts.map +1 -0
- package/dist/physics/index.js +316 -0
- package/dist/physics/index.js.map +1 -0
- package/dist/physics/native.d.ts +54 -0
- package/dist/physics/native.d.ts.map +1 -0
- package/dist/physics/native.js +64 -0
- package/dist/physics/native.js.map +1 -0
- package/dist/playback-group.d.ts.map +1 -1
- package/dist/playback-group.js +17 -1
- package/dist/playback-group.js.map +1 -1
- package/dist/playback.d.ts +15 -0
- package/dist/playback.d.ts.map +1 -1
- package/dist/playback.js +23 -0
- package/dist/playback.js.map +1 -1
- package/dist/predictive-back/index.d.ts +45 -0
- package/dist/predictive-back/index.d.ts.map +1 -0
- package/dist/predictive-back/index.js +220 -0
- package/dist/predictive-back/index.js.map +1 -0
- package/dist/predictive-back/presentation.d.ts +4 -0
- package/dist/predictive-back/presentation.d.ts.map +1 -0
- package/dist/predictive-back/presentation.js +3 -0
- package/dist/predictive-back/presentation.js.map +1 -0
- package/dist/press.d.ts.map +1 -1
- package/dist/press.js +11 -2
- package/dist/press.js.map +1 -1
- package/dist/reorder/handle.d.ts +6 -0
- package/dist/reorder/handle.d.ts.map +1 -0
- package/dist/reorder/handle.js +10 -0
- package/dist/reorder/handle.js.map +1 -0
- package/dist/reorder/index.d.ts +10 -0
- package/dist/reorder/index.d.ts.map +1 -0
- package/dist/reorder/index.js +233 -0
- package/dist/reorder/index.js.map +1 -0
- package/dist/reorder/list-view.d.ts +5 -0
- package/dist/reorder/list-view.d.ts.map +1 -0
- package/dist/reorder/list-view.js +238 -0
- package/dist/reorder/list-view.js.map +1 -0
- package/dist/reorder/model.d.ts +6 -0
- package/dist/reorder/model.d.ts.map +1 -0
- package/dist/reorder/model.js +30 -0
- package/dist/reorder/model.js.map +1 -0
- package/dist/reorder/surface.d.ts +6 -0
- package/dist/reorder/surface.d.ts.map +1 -0
- package/dist/reorder/surface.js +10 -0
- package/dist/reorder/surface.js.map +1 -0
- package/dist/reorder/types.d.ts +92 -0
- package/dist/reorder/types.d.ts.map +1 -0
- package/dist/reorder/types.js +2 -0
- package/dist/reorder/types.js.map +1 -0
- package/dist/sampling.d.ts +35 -0
- package/dist/sampling.d.ts.map +1 -0
- package/dist/sampling.js +123 -0
- package/dist/sampling.js.map +1 -0
- package/dist/scene-appearance.d.ts +14 -0
- package/dist/scene-appearance.d.ts.map +1 -0
- package/dist/scene-appearance.js +68 -0
- package/dist/scene-appearance.js.map +1 -0
- package/dist/scene-camera.d.ts +5 -0
- package/dist/scene-camera.d.ts.map +1 -0
- package/dist/scene-camera.js +23 -0
- package/dist/scene-camera.js.map +1 -0
- package/dist/scene-shader.d.ts +18 -0
- package/dist/scene-shader.d.ts.map +1 -0
- package/dist/scene-shader.js +76 -0
- package/dist/scene-shader.js.map +1 -0
- package/dist/scroll-header/geometry.d.ts +18 -0
- package/dist/scroll-header/geometry.d.ts.map +1 -0
- package/dist/scroll-header/geometry.js +46 -0
- package/dist/scroll-header/geometry.js.map +1 -0
- package/dist/scroll-header/index.d.ts +48 -0
- package/dist/scroll-header/index.d.ts.map +1 -0
- package/dist/scroll-header/index.js +399 -0
- package/dist/scroll-header/index.js.map +1 -0
- package/dist/scroll-header/native.d.ts +28 -0
- package/dist/scroll-header/native.d.ts.map +1 -0
- package/dist/scroll-header/native.js +43 -0
- package/dist/scroll-header/native.js.map +1 -0
- package/dist/sensors/index.d.ts +69 -0
- package/dist/sensors/index.d.ts.map +1 -0
- package/dist/sensors/index.js +149 -0
- package/dist/sensors/index.js.map +1 -0
- package/dist/sensors/native.d.ts +20 -0
- package/dist/sensors/native.d.ts.map +1 -0
- package/dist/sensors/native.js +48 -0
- package/dist/sensors/native.js.map +1 -0
- package/dist/sequence.d.ts +24 -0
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +181 -19
- package/dist/sequence.js.map +1 -1
- package/dist/shapes/android.d.ts +3 -0
- package/dist/shapes/android.d.ts.map +1 -0
- package/dist/shapes/android.js +51 -0
- package/dist/shapes/android.js.map +1 -0
- package/dist/shapes/index.d.ts +6 -0
- package/dist/shapes/index.d.ts.map +1 -0
- package/dist/shapes/index.js +238 -0
- package/dist/shapes/index.js.map +1 -0
- package/dist/shapes/ios.d.ts +3 -0
- package/dist/shapes/ios.d.ts.map +1 -0
- package/dist/shapes/ios.js +164 -0
- package/dist/shapes/ios.js.map +1 -0
- package/dist/shapes/native.d.ts +18 -0
- package/dist/shapes/native.d.ts.map +1 -0
- package/dist/shapes/native.js +10 -0
- package/dist/shapes/native.js.map +1 -0
- package/dist/shapes/path.d.ts +10 -0
- package/dist/shapes/path.d.ts.map +1 -0
- package/dist/shapes/path.js +106 -0
- package/dist/shapes/path.js.map +1 -0
- package/dist/shapes/types.d.ts +55 -0
- package/dist/shapes/types.d.ts.map +1 -0
- package/dist/shapes/types.js +11 -0
- package/dist/shapes/types.js.map +1 -0
- package/dist/shared-layout/index.d.ts +40 -0
- package/dist/shared-layout/index.d.ts.map +1 -0
- package/dist/shared-layout/index.js +267 -0
- package/dist/shared-layout/index.js.map +1 -0
- package/dist/shared-layout/native.d.ts +15 -0
- package/dist/shared-layout/native.d.ts.map +1 -0
- package/dist/shared-layout/native.js +79 -0
- package/dist/shared-layout/native.js.map +1 -0
- package/dist/shared-layout/timing.d.ts +9 -0
- package/dist/shared-layout/timing.d.ts.map +1 -0
- package/dist/shared-layout/timing.js +68 -0
- package/dist/shared-layout/timing.js.map +1 -0
- package/dist/shared-navigation/entry.d.ts +51 -0
- package/dist/shared-navigation/entry.d.ts.map +1 -0
- package/dist/shared-navigation/entry.js +619 -0
- package/dist/shared-navigation/entry.js.map +1 -0
- package/dist/shared-navigation/index.d.ts +58 -0
- package/dist/shared-navigation/index.d.ts.map +1 -0
- package/dist/shared-navigation/index.js +318 -0
- package/dist/shared-navigation/index.js.map +1 -0
- package/dist/shared-navigation/return-signal.d.ts +16 -0
- package/dist/shared-navigation/return-signal.d.ts.map +1 -0
- package/dist/shared-navigation/return-signal.js +35 -0
- package/dist/shared-navigation/return-signal.js.map +1 -0
- package/dist/shared-navigation/return-target.d.ts +32 -0
- package/dist/shared-navigation/return-target.d.ts.map +1 -0
- package/dist/shared-navigation/return-target.js +168 -0
- package/dist/shared-navigation/return-target.js.map +1 -0
- package/dist/shared-navigation/scope.d.ts +4 -0
- package/dist/shared-navigation/scope.d.ts.map +1 -0
- package/dist/shared-navigation/scope.js +2 -0
- package/dist/shared-navigation/scope.js.map +1 -0
- package/dist/shared-navigation/targets.d.ts +6 -0
- package/dist/shared-navigation/targets.d.ts.map +1 -0
- package/dist/shared-navigation/targets.js +36 -0
- package/dist/shared-navigation/targets.js.map +1 -0
- package/dist/size-layout.d.ts +19 -0
- package/dist/size-layout.d.ts.map +1 -0
- package/dist/size-layout.js +216 -0
- package/dist/size-layout.js.map +1 -0
- package/dist/size.d.ts +19 -0
- package/dist/size.d.ts.map +1 -0
- package/dist/size.js +251 -0
- package/dist/size.js.map +1 -0
- package/dist/spring.d.ts +2 -0
- package/dist/spring.d.ts.map +1 -1
- package/dist/spring.js +11 -0
- package/dist/spring.js.map +1 -1
- package/dist/svg-path.d.ts +18 -0
- package/dist/svg-path.d.ts.map +1 -1
- package/dist/svg-path.js +3 -2
- package/dist/svg-path.js.map +1 -1
- package/dist/testing/clock.d.ts +40 -0
- package/dist/testing/clock.d.ts.map +1 -0
- package/dist/testing/clock.js +116 -0
- package/dist/testing/clock.js.map +1 -0
- package/dist/testing/handoff-recorder.d.ts +8 -0
- package/dist/testing/handoff-recorder.d.ts.map +1 -0
- package/dist/testing/handoff-recorder.js +77 -0
- package/dist/testing/handoff-recorder.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/native.d.ts +46 -0
- package/dist/testing/native.d.ts.map +1 -0
- package/dist/testing/native.js +313 -0
- package/dist/testing/native.js.map +1 -0
- package/dist/testing/presentation.d.ts +11 -0
- package/dist/testing/presentation.d.ts.map +1 -0
- package/dist/testing/presentation.js +45 -0
- package/dist/testing/presentation.js.map +1 -0
- package/dist/testing/replay.d.ts +39 -0
- package/dist/testing/replay.d.ts.map +1 -0
- package/dist/testing/replay.js +99 -0
- package/dist/testing/replay.js.map +1 -0
- package/dist/testing/scroll-handoff-native.d.ts +10 -0
- package/dist/testing/scroll-handoff-native.d.ts.map +1 -0
- package/dist/testing/scroll-handoff-native.js +151 -0
- package/dist/testing/scroll-handoff-native.js.map +1 -0
- package/dist/testing/scroll-handoff.d.ts +25 -0
- package/dist/testing/scroll-handoff.d.ts.map +1 -0
- package/dist/testing/scroll-handoff.js +127 -0
- package/dist/testing/scroll-handoff.js.map +1 -0
- package/dist/testing/sensors.d.ts +13 -0
- package/dist/testing/sensors.d.ts.map +1 -0
- package/dist/testing/sensors.js +26 -0
- package/dist/testing/sensors.js.map +1 -0
- package/dist/testing/trace.d.ts +101 -0
- package/dist/testing/trace.d.ts.map +1 -0
- package/dist/testing/trace.js +263 -0
- package/dist/testing/trace.js.map +1 -0
- package/dist/timed-animation.d.ts +38 -0
- package/dist/timed-animation.d.ts.map +1 -0
- package/dist/timed-animation.js +177 -0
- package/dist/timed-animation.js.map +1 -0
- package/dist/track.d.ts +3 -0
- package/dist/track.d.ts.map +1 -1
- package/dist/track.js +281 -40
- package/dist/track.js.map +1 -1
- package/dist/transition.d.ts +54 -2
- package/dist/transition.d.ts.map +1 -1
- package/dist/transition.js +128 -8
- package/dist/transition.js.map +1 -1
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/value-observers.d.ts +22 -0
- package/dist/value-observers.d.ts.map +1 -0
- package/dist/value-observers.js +122 -0
- package/dist/value-observers.js.map +1 -0
- package/dist/value-track.d.ts +13 -0
- package/dist/value-track.d.ts.map +1 -0
- package/dist/value-track.js +59 -0
- package/dist/value-track.js.map +1 -0
- package/dist/vue/index.d.ts +33 -3
- package/dist/vue/index.d.ts.map +1 -1
- package/dist/vue/index.js +118 -3
- package/dist/vue/index.js.map +1 -1
- package/dist/zoomable.d.ts +1 -1
- package/dist/zoomable.d.ts.map +1 -1
- package/package.json +68 -3
- package/platforms/android/include.gradle +10 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/BlurEffect.java +89 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/CircleMath.java +158 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/CircleWorld.java +221 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/GestureSession.java +227 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/GestureSurface.java +54 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/GradientLayer.java +224 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrame.java +53 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrameFollower.java +57 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardObserver.java +97 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/LiveSpring.java +277 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/MotionProbe.java +70 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ParticleEmitter.java +192 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ParticleSimulation.java +114 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/PredictiveBackSession.java +212 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ReorderHandle.java +25 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSession.java +213 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSurface.java +27 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ScrollHeader.java +84 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SensorMath.java +28 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SensorSource.java +217 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/ShapeLayer.java +120 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SharedLayoutFlight.java +287 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SharedNavigationScene.java +115 -0
- package/platforms/android/java/org/rafaelaugusto/jolt/SpringState.java +39 -0
- package/platforms/android/proguard-rules.pro +20 -0
- package/platforms/ios/build.xcconfig +1 -1
- package/platforms/ios/src/JoltBlur.h +14 -0
- package/platforms/ios/src/JoltBlur.m +86 -0
- package/platforms/ios/src/JoltCircleMath.h +191 -0
- package/platforms/ios/src/JoltCircleWorld.h +18 -0
- package/platforms/ios/src/JoltCircleWorld.m +218 -0
- package/platforms/ios/src/JoltGestureSession.h +23 -0
- package/platforms/ios/src/JoltGestureSession.m +251 -0
- package/platforms/ios/src/JoltInteractiveNavigation.h +23 -0
- package/platforms/ios/src/JoltInteractiveNavigation.m +255 -0
- package/platforms/ios/src/JoltLiveSpring.h +29 -0
- package/platforms/ios/src/JoltLiveSpring.m +243 -0
- package/platforms/ios/src/JoltMotionProbe.h +9 -0
- package/platforms/ios/src/JoltMotionProbe.m +72 -0
- package/platforms/ios/src/JoltReorderSession.h +15 -0
- package/platforms/ios/src/JoltReorderSession.m +205 -0
- package/platforms/ios/src/JoltScrollHeader.h +13 -0
- package/platforms/ios/src/JoltScrollHeader.m +101 -0
- package/platforms/ios/src/JoltSensorMath.h +39 -0
- package/platforms/ios/src/JoltSensorSource.h +13 -0
- package/platforms/ios/src/JoltSensorSource.m +201 -0
- package/platforms/ios/src/JoltSharedLayoutFlight.h +19 -0
- package/platforms/ios/src/JoltSharedLayoutFlight.m +250 -0
- package/platforms/ios/src/JoltSpringState.h +35 -0
- package/platforms/ios/src/module.modulemap +10 -0
- package/src/android-plugin.d.ts +464 -0
- package/src/animate.ts +129 -15
- package/src/blur/index.ts +195 -0
- package/src/blur/native.ts +70 -0
- package/src/blur/types.ts +32 -0
- package/src/bottom-sheet/geometry.ts +84 -0
- package/src/bottom-sheet/index.ts +536 -0
- package/src/bottom-sheet/native.ts +214 -0
- package/src/config.ts +39 -1
- package/src/decay.ts +9 -0
- package/src/drag.ts +67 -21
- package/src/driver/android-gradient.ts +116 -0
- package/src/driver/android-particles.ts +118 -0
- package/src/driver/android.ts +31 -1
- package/src/driver/frame.ts +10 -0
- package/src/driver/index.ts +4 -0
- package/src/driver/ios-gradient.ts +136 -0
- package/src/driver/ios-scroll-delegate.ts +23 -0
- package/src/driver/ios.ts +10 -0
- package/src/easing.ts +21 -1
- package/src/engine.ts +209 -60
- package/src/gesture-native.ts +139 -0
- package/src/gestures/index.ts +365 -0
- package/src/glass/index.ts +218 -0
- package/src/gradient-binding.ts +158 -0
- package/src/gradient.ts +663 -0
- package/src/gravity.ts +107 -0
- package/src/haptics.ts +106 -28
- package/src/image-effect.ts +10 -2
- package/src/index.ts +56 -7
- package/src/inspector/index.ts +523 -0
- package/src/inspector/plot.ts +27 -0
- package/src/inspector/probe.ts +50 -0
- package/src/inspector/tuning.ts +51 -0
- package/src/interactive-navigation/index.ts +427 -0
- package/src/ios-plugin.d.ts +280 -0
- package/src/keyboard.ts +231 -7
- package/src/live-spring-driver.ts +181 -0
- package/src/mixer.ts +312 -0
- package/src/motion-scope.ts +39 -6
- package/src/motion-states.ts +149 -42
- package/src/motion-value.ts +1289 -0
- package/src/native/index.ts +30 -0
- package/src/native-properties.ts +188 -0
- package/src/native-property-driver.ts +123 -0
- package/src/native-property.ts +366 -0
- package/src/particles.ts +18 -17
- package/src/path.ts +2 -1
- package/src/physics/index.ts +476 -0
- package/src/physics/native.ts +121 -0
- package/src/playback-group.ts +17 -1
- package/src/playback.ts +41 -0
- package/src/predictive-back/index.ts +280 -0
- package/src/predictive-back/presentation.ts +6 -0
- package/src/press.ts +10 -2
- package/src/reorder/handle.ts +9 -0
- package/src/reorder/index.ts +243 -0
- package/src/reorder/list-view.ts +262 -0
- package/src/reorder/model.ts +47 -0
- package/src/reorder/surface.ts +10 -0
- package/src/reorder/types.ts +87 -0
- package/src/sampling.ts +173 -0
- package/src/scene-appearance.ts +92 -0
- package/src/scene-camera.ts +30 -0
- package/src/scene-shader.ts +139 -0
- package/src/scroll-header/geometry.ts +88 -0
- package/src/scroll-header/index.ts +530 -0
- package/src/scroll-header/native.ts +89 -0
- package/src/sensors/index.ts +246 -0
- package/src/sensors/native.ts +72 -0
- package/src/sequence.ts +209 -20
- package/src/shapes/android.ts +63 -0
- package/src/shapes/index.ts +267 -0
- package/src/shapes/ios.ts +194 -0
- package/src/shapes/native.ts +27 -0
- package/src/shapes/path.ts +127 -0
- package/src/shapes/types.ts +63 -0
- package/src/shared-layout/index.ts +343 -0
- package/src/shared-layout/native.ts +138 -0
- package/src/shared-layout/timing.ts +87 -0
- package/src/shared-navigation/entry.ts +695 -0
- package/src/shared-navigation/index.ts +414 -0
- package/src/shared-navigation/return-signal.ts +41 -0
- package/src/shared-navigation/return-target.ts +197 -0
- package/src/shared-navigation/scope.ts +3 -0
- package/src/shared-navigation/targets.ts +38 -0
- package/src/size-layout.ts +237 -0
- package/src/size.ts +302 -0
- package/src/spring.ts +18 -0
- package/src/svg-path.ts +8 -3
- package/src/testing/clock.ts +128 -0
- package/src/testing/handoff-recorder.ts +98 -0
- package/src/testing/index.ts +4 -0
- package/src/testing/native.ts +386 -0
- package/src/testing/presentation.ts +46 -0
- package/src/testing/replay.ts +149 -0
- package/src/testing/scroll-handoff-native.ts +201 -0
- package/src/testing/scroll-handoff.ts +140 -0
- package/src/testing/sensors.ts +41 -0
- package/src/testing/trace.ts +340 -0
- package/src/timed-animation.ts +192 -0
- package/src/track.ts +334 -38
- package/src/transition.ts +197 -9
- package/src/types.ts +11 -1
- package/src/value-observers.ts +147 -0
- package/src/value-track.ts +71 -0
- package/src/vue/index.ts +147 -1
- package/src/zoomable.ts +1 -1
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
#import "JoltSharedLayoutFlight.h"
|
|
2
|
+
#import <QuartzCore/QuartzCore.h>
|
|
3
|
+
|
|
4
|
+
@interface JoltSharedLayoutFlight () {
|
|
5
|
+
double _pose[14], _velocity[14], _interactiveStart[14], _interactiveEnd[14];
|
|
6
|
+
}
|
|
7
|
+
@property(nonatomic) BOOL navigationImage, clippedImage, fading;
|
|
8
|
+
@property(nonatomic) UIImage *pageImage;
|
|
9
|
+
@property(nonatomic) CGRect pageFrame;
|
|
10
|
+
@property(nonatomic,weak) UIWindow *host;
|
|
11
|
+
@property(nonatomic,weak) UIView *destination;
|
|
12
|
+
@property(nonatomic) NSMapTable<UIView *, NSNumber *> *hiddenViews;
|
|
13
|
+
@property(nonatomic) UIImage *sourceImage, *targetImage;
|
|
14
|
+
@property(nonatomic) CGSize sourceSize, targetSize, viewport;
|
|
15
|
+
@property(nonatomic) CGRect targetFrame;
|
|
16
|
+
@property(nonatomic) BOOL sourceScales, targetScales, disposed;
|
|
17
|
+
@property(nonatomic) NSArray<NSDictionary *> *tracks;
|
|
18
|
+
@property(nonatomic) CADisplayLink *clock;
|
|
19
|
+
@property(nonatomic) double started, duration;
|
|
20
|
+
@property(nonatomic,copy) void (^onEnd)(BOOL);
|
|
21
|
+
@end
|
|
22
|
+
static NSInteger JoltSharedActive = 0;
|
|
23
|
+
static BOOL JoltSharedUnsupportedContent(UIView *view, BOOL allowScrolling) {
|
|
24
|
+
NSString *name=NSStringFromClass(view.class), *layer=NSStringFromClass(view.layer.class);
|
|
25
|
+
for(NSString *type in @[@"WKWebView",@"SCNView",@"SKView",@"MTKView",@"GLKView",@"UIVisualEffectView"]) if([view isKindOfClass:NSClassFromString(type)])return YES;
|
|
26
|
+
if((!allowScrolling && [view isKindOfClass:UIScrollView.class]) || [layer containsString:@"Metal"] || [layer containsString:@"EAGL"] || [layer containsString:@"Player"] || [name containsString:@"Video"])return YES;
|
|
27
|
+
for(UIView *child in view.subviews)if(JoltSharedUnsupportedContent(child, allowScrolling))return YES;
|
|
28
|
+
return NO;
|
|
29
|
+
}
|
|
30
|
+
@implementation JoltSharedLayoutFlight
|
|
31
|
+
+ (NSInteger)activeCount { return JoltSharedActive; }
|
|
32
|
+
- (CGRect)geometry:(UIView *)view presentation:(BOOL)presentation {
|
|
33
|
+
if(!view || view.window!=self.host || view.bounds.size.width<=0 || view.bounds.size.height<=0)return CGRectNull;
|
|
34
|
+
for(UIView *parent=view.superview;parent;parent=parent.superview)if(parent.hidden)return CGRectNull;
|
|
35
|
+
CALayer *layer=presentation?(view.layer.presentationLayer ?: view.layer):view.layer;
|
|
36
|
+
CALayer *root=layer==view.layer?self.host.layer:(self.host.layer.presentationLayer ?: self.host.layer);
|
|
37
|
+
for(CALayer *p=layer;p;p=p.superlayer) {
|
|
38
|
+
if(fabs(p.opacity-1)>.001 || !CATransform3DIsAffine(p.transform) || !CATransform3DIsAffine(p.sublayerTransform))return CGRectNull;
|
|
39
|
+
CGAffineTransform t=CATransform3DGetAffineTransform(p.transform),s=CATransform3DGetAffineTransform(p.sublayerTransform);
|
|
40
|
+
if(fabs(t.b)>.0001 || fabs(t.c)>.0001 || t.a<=0 || t.d<=0 || fabs(t.a-t.d)>.0001 || fabs(s.b)>.0001 || fabs(s.c)>.0001 || s.a<=0 || s.d<=0 || fabs(s.a-s.d)>.0001)return CGRectNull;
|
|
41
|
+
}
|
|
42
|
+
CGRect rect=[layer convertRect:layer.bounds toLayer:root];
|
|
43
|
+
return isfinite(rect.origin.x) && isfinite(rect.origin.y) && isfinite(rect.size.width) && isfinite(rect.size.height)?rect:CGRectNull;
|
|
44
|
+
}
|
|
45
|
+
- (BOOL)visibleBounds:(UIView *)view frame:(CGRect)frame {
|
|
46
|
+
if(CGRectIsNull(frame) || !CGRectContainsRect(CGRectInset(self.host.bounds,-.5,-.5),frame))return NO;
|
|
47
|
+
for(UIView *p=view.superview;p;p=p.superview)if(p.clipsToBounds) {
|
|
48
|
+
CGRect clip=[self geometry:p presentation:NO];
|
|
49
|
+
if(CGRectIsNull(clip) || !CGRectContainsRect(CGRectInset(clip,-.5,-.5),frame))return NO;
|
|
50
|
+
}
|
|
51
|
+
return YES;
|
|
52
|
+
}
|
|
53
|
+
// Preserve both the full image pose and the viewport clipping at a drag handoff.
|
|
54
|
+
- (CGRect)visibleClip:(UIView *)view frame:(CGRect)frame {
|
|
55
|
+
if(CGRectIsNull(frame))return CGRectNull;
|
|
56
|
+
CGRect clip=CGRectIntersection(frame,self.host.bounds);
|
|
57
|
+
for(UIView *p=view.superview;p;p=p.superview)if(p.clipsToBounds) {
|
|
58
|
+
CGRect parent=[self geometry:p presentation:NO];if(CGRectIsNull(parent))return CGRectNull;
|
|
59
|
+
clip=CGRectIntersection(clip,parent);
|
|
60
|
+
}
|
|
61
|
+
return CGRectIsEmpty(clip)?CGRectNull:clip;
|
|
62
|
+
}
|
|
63
|
+
- (UIImage *)snapshot:(UIView *)view budget:(double)budget presentation:(BOOL)presentation {
|
|
64
|
+
CGFloat scale=self.host.screen.scale;
|
|
65
|
+
if(ceil(view.bounds.size.width*scale)*ceil(view.bounds.size.height*scale)>budget || JoltSharedUnsupportedContent(view, NO))return nil;
|
|
66
|
+
BOOL hidden=view.hidden; view.hidden=NO;
|
|
67
|
+
UIGraphicsImageRendererFormat *format=[UIGraphicsImageRendererFormat defaultFormat]; format.scale=scale; format.opaque=NO;
|
|
68
|
+
UIGraphicsImageRenderer *renderer=[[UIGraphicsImageRenderer alloc]initWithSize:view.bounds.size format:format];
|
|
69
|
+
[view layoutIfNeeded]; [view.layer displayIfNeeded];
|
|
70
|
+
CALayer *layer=presentation?(view.layer.presentationLayer ?: view.layer):view.layer;
|
|
71
|
+
UIImage *image=[renderer imageWithActions:^(UIGraphicsImageRendererContext *context) { [layer renderInContext:context.CGContext]; }];
|
|
72
|
+
view.hidden=hidden; return image;
|
|
73
|
+
}
|
|
74
|
+
- (void)hide:(UIView *)view {
|
|
75
|
+
if(![self.hiddenViews objectForKey:view])[self.hiddenViews setObject:@(view.hidden) forKey:view]; view.hidden=YES;
|
|
76
|
+
}
|
|
77
|
+
+ (instancetype)capture:(UIView *)view image:(BOOL)image radius:(double)radius maxPixels:(double)maxPixels {
|
|
78
|
+
if(!view.window || view.hidden)return nil;
|
|
79
|
+
JoltSharedLayoutFlight *flight=[[self alloc]initWithFrame:view.window.bounds];
|
|
80
|
+
flight.host=view.window; flight.viewport=view.window.bounds.size; flight.hiddenViews=[NSMapTable weakToStrongObjectsMapTable];
|
|
81
|
+
CGRect rect=[flight geometry:view presentation:YES]; if(![flight visibleBounds:view frame:rect])return nil;
|
|
82
|
+
flight.sourceImage=[flight snapshot:view budget:maxPixels presentation:YES]; if(!flight.sourceImage)return nil;
|
|
83
|
+
flight.sourceSize=rect.size; flight.sourceScales=image;
|
|
84
|
+
flight->_pose[0]=rect.origin.x; flight->_pose[1]=rect.origin.y; flight->_pose[2]=rect.size.width; flight->_pose[3]=rect.size.height; flight->_pose[4]=radius*rect.size.width/view.bounds.size.width;
|
|
85
|
+
flight.opaque=NO; flight.backgroundColor=UIColor.clearColor; flight.userInteractionEnabled=NO; flight.accessibilityElementsHidden=YES;
|
|
86
|
+
[flight hide:view]; [flight.host addSubview:flight]; JoltSharedActive++; return flight;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Use the decoded image, not a cropped view snapshot: preserve content when
|
|
90
|
+
// aspectFill thumbnails open into aspectFit details (and vice versa).
|
|
91
|
+
- (NSArray *)navigationGeometry:(UIImageView *)view radius:(double)radius presentation:(BOOL)presentation {
|
|
92
|
+
if(![view isKindOfClass:UIImageView.class] || !view.image || view.image.images.count || view.image.renderingMode==UIImageRenderingModeAlwaysTemplate ||
|
|
93
|
+
(view.contentMode!=UIViewContentModeScaleAspectFit && view.contentMode!=UIViewContentModeScaleAspectFill))return nil;
|
|
94
|
+
CGRect rect=[self geometry:view presentation:presentation];
|
|
95
|
+
CGRect clip=self.clippedImage?[self visibleClip:view frame:rect]:rect;
|
|
96
|
+
if(self.clippedImage?CGRectIsNull(clip):![self visibleBounds:view frame:rect])return nil;
|
|
97
|
+
CGSize image=view.image.size;
|
|
98
|
+
if(image.width<=0 || image.height<=0)return nil;
|
|
99
|
+
double scale=view.contentMode==UIViewContentModeScaleAspectFill?MAX(rect.size.width/image.width,rect.size.height/image.height):MIN(rect.size.width/image.width,rect.size.height/image.height);
|
|
100
|
+
double w=image.width*scale,h=image.height*scale;
|
|
101
|
+
NSMutableArray *pose=[@[@(rect.origin.x),@(rect.origin.y),@(rect.size.width),@(rect.size.height),@(radius*rect.size.width/view.bounds.size.width),@((rect.size.width-w)/2),@((rect.size.height-h)/2),@(w),@(h)] mutableCopy];
|
|
102
|
+
if(self.clippedImage)[pose addObjectsFromArray:@[@(clip.origin.x),@(clip.origin.y),@(clip.size.width),@(clip.size.height)]];
|
|
103
|
+
return pose;
|
|
104
|
+
}
|
|
105
|
+
+ (instancetype)captureNavigationImage:(UIView *)view radius:(double)radius maxPixels:(double)maxPixels {
|
|
106
|
+
return [self captureNavigationImage:view radius:radius maxPixels:maxPixels clipped:NO];
|
|
107
|
+
}
|
|
108
|
+
+ (instancetype)captureClippedNavigationImage:(UIView *)view radius:(double)radius maxPixels:(double)maxPixels {
|
|
109
|
+
return [self captureNavigationImage:view radius:radius maxPixels:maxPixels clipped:YES];
|
|
110
|
+
}
|
|
111
|
+
+ (instancetype)captureNavigationImage:(UIView *)view radius:(double)radius maxPixels:(double)maxPixels clipped:(BOOL)clipped {
|
|
112
|
+
if(!view.window || view.hidden)return nil;
|
|
113
|
+
JoltSharedLayoutFlight *flight=[[self alloc]initWithFrame:view.window.bounds];
|
|
114
|
+
flight.host=view.window; flight.viewport=view.window.bounds.size; flight.hiddenViews=[NSMapTable weakToStrongObjectsMapTable];
|
|
115
|
+
flight.clippedImage=clipped;
|
|
116
|
+
NSArray *pose=[flight navigationGeometry:(UIImageView *)view radius:radius presentation:YES]; if(!pose)return nil;
|
|
117
|
+
UIImage *image=((UIImageView *)view).image;
|
|
118
|
+
if(!image.CGImage || (double)CGImageGetWidth(image.CGImage)*CGImageGetHeight(image.CGImage)>maxPixels)return nil;
|
|
119
|
+
flight.navigationImage=YES; flight.sourceImage=image;
|
|
120
|
+
for(int i=0;i<pose.count;i++)flight->_pose[i<5?i:i+1]=[pose[i] doubleValue];
|
|
121
|
+
flight.opaque=NO; flight.backgroundColor=UIColor.clearColor; flight.userInteractionEnabled=NO; flight.accessibilityElementsHidden=YES;
|
|
122
|
+
[flight hide:view]; [flight.host addSubview:flight]; JoltSharedActive++; return flight;
|
|
123
|
+
}
|
|
124
|
+
- (NSString *)prepareNavigationImage:(UIView *)view radius:(double)radius maxPixels:(double)maxPixels {
|
|
125
|
+
if(self.disposed || !self.navigationImage || view.hidden)return nil;
|
|
126
|
+
NSArray *pose=[self navigationGeometry:(UIImageView *)view radius:radius presentation:NO]; if(!pose)return nil;
|
|
127
|
+
UIImage *image=((UIImageView *)view).image;
|
|
128
|
+
if(!image.CGImage || (double)CGImageGetWidth(image.CGImage)*CGImageGetHeight(image.CGImage)+self.pixels>maxPixels)return nil;
|
|
129
|
+
// Both endpoints must describe the same aspect ratio; unsupported swaps fall back.
|
|
130
|
+
if(fabs(image.size.width/image.size.height-self.sourceImage.size.width/self.sourceImage.size.height)>.001)return nil;
|
|
131
|
+
self.targetImage=image; self.destination=view; self.targetFrame=[self geometry:view presentation:NO]; [self hide:view];
|
|
132
|
+
return [[NSString alloc]initWithData:[NSJSONSerialization dataWithJSONObject:pose options:0 error:nil] encoding:NSUTF8StringEncoding];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
- (BOOL)holdPage:(UIView *)page maxPixels:(double)maxPixels {
|
|
136
|
+
if(self.disposed || self.pageImage || page.window!=self.host || JoltSharedUnsupportedContent(page, YES))return NO;
|
|
137
|
+
CGRect frame=[self geometry:page presentation:YES];if(CGRectIsNull(frame))return NO;
|
|
138
|
+
CGFloat scale=self.host.screen.scale;
|
|
139
|
+
if(ceil(page.bounds.size.width*scale)*ceil(page.bounds.size.height*scale)+self.pixels>maxPixels)return NO;
|
|
140
|
+
// Visible page only: UITableView/UIScrollView layers render their realized cells.
|
|
141
|
+
UIGraphicsImageRendererFormat *format=[UIGraphicsImageRendererFormat defaultFormat];format.scale=scale;format.opaque=NO;
|
|
142
|
+
UIGraphicsImageRenderer *renderer=[[UIGraphicsImageRenderer alloc]initWithSize:page.bounds.size format:format];
|
|
143
|
+
self.pageImage=[renderer imageWithActions:^(UIGraphicsImageRendererContext *context){[page.layer renderInContext:context.CGContext];}];
|
|
144
|
+
self.pageFrame=frame;return self.pageImage!=nil;
|
|
145
|
+
}
|
|
146
|
+
- (void)fade:(double)duration onEnd:(void (^)(BOOL))onEnd {
|
|
147
|
+
if(self.disposed){if(onEnd)onEnd(NO);return;}
|
|
148
|
+
[self.clock invalidate];self.fading=YES;self.duration=MAX(1,MIN(500,duration));self.started=CACurrentMediaTime()*1000;self.onEnd=onEnd;
|
|
149
|
+
self.clock=[CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)];[self.clock addToRunLoop:NSRunLoop.mainRunLoop forMode:NSRunLoopCommonModes];
|
|
150
|
+
}
|
|
151
|
+
- (double)pixels {
|
|
152
|
+
return (self.pageImage?CGImageGetWidth(self.pageImage.CGImage)*CGImageGetHeight(self.pageImage.CGImage):0)+(self.sourceImage?CGImageGetWidth(self.sourceImage.CGImage)*CGImageGetHeight(self.sourceImage.CGImage):0)+(self.targetImage?CGImageGetWidth(self.targetImage.CGImage)*CGImageGetHeight(self.targetImage.CGImage):0);
|
|
153
|
+
}
|
|
154
|
+
- (NSString *)state {
|
|
155
|
+
NSMutableArray *pose=[NSMutableArray new],*velocity=[NSMutableArray new];
|
|
156
|
+
for(int i=0;i<(self.navigationImage?(self.clippedImage?14:10):6);i++)[pose addObject:@(_pose[i])]; for(int i=0;i<(self.navigationImage?(self.clippedImage?14:10):5);i++)[velocity addObject:@(_velocity[i])];
|
|
157
|
+
return [[NSString alloc]initWithData:[NSJSONSerialization dataWithJSONObject:@{@"pose":pose,@"velocity":velocity} options:0 error:nil] encoding:NSUTF8StringEncoding];
|
|
158
|
+
}
|
|
159
|
+
- (NSString *)prepare:(UIView *)view image:(BOOL)image radius:(double)radius maxPixels:(double)maxPixels {
|
|
160
|
+
if(self.disposed || (view.hidden && ![self.hiddenViews objectForKey:view]))return nil;
|
|
161
|
+
CGRect rect=[self geometry:view presentation:NO]; if(![self visibleBounds:view frame:rect])return nil;
|
|
162
|
+
UIImage *snapshot=[self snapshot:view budget:maxPixels-self.pixels presentation:NO]; if(!snapshot)return nil;
|
|
163
|
+
self.targetImage=snapshot; self.targetSize=rect.size; self.targetScales=image; self.destination=view; self.targetFrame=rect; [self hide:view];
|
|
164
|
+
return [[NSString alloc]initWithData:[NSJSONSerialization dataWithJSONObject:@[@(rect.origin.x),@(rect.origin.y),@(rect.size.width),@(rect.size.height),@(radius*rect.size.width/view.bounds.size.width)] options:0 error:nil] encoding:NSUTF8StringEncoding];
|
|
165
|
+
}
|
|
166
|
+
- (BOOL)freeze:(double)maxPixels {
|
|
167
|
+
if(self.disposed)return NO;
|
|
168
|
+
if(self.clock)[self evaluate:CACurrentMediaTime()*1000];
|
|
169
|
+
[self.clock invalidate]; self.clock=nil; self.onEnd=nil;
|
|
170
|
+
CGSize size=CGSizeMake(MAX(.1,_pose[2]),MAX(.1,_pose[3])); CGFloat scale=self.host.screen.scale;
|
|
171
|
+
if(ceil(size.width*scale)*ceil(size.height*scale)+self.pixels>maxPixels)return NO;
|
|
172
|
+
UIGraphicsImageRendererFormat *format=[UIGraphicsImageRendererFormat defaultFormat]; format.scale=scale; format.opaque=NO;
|
|
173
|
+
UIGraphicsImageRenderer *renderer=[[UIGraphicsImageRenderer alloc]initWithSize:size format:format];
|
|
174
|
+
UIImage *image=[renderer imageWithActions:^(UIGraphicsImageRendererContext *context) { CGContextTranslateCTM(context.CGContext,-self->_pose[0],-self->_pose[1]); [self render]; }];
|
|
175
|
+
self.sourceImage=image; self.targetImage=nil; self.sourceSize=size; self.sourceScales=NO; self.destination=nil; _pose[5]=0; [self setNeedsDisplay]; return YES;
|
|
176
|
+
}
|
|
177
|
+
- (void)play:(NSString *)configuration onEnd:(void (^)(BOOL))onEnd {
|
|
178
|
+
if(self.disposed)return;
|
|
179
|
+
NSDictionary *config=[NSJSONSerialization JSONObjectWithData:[configuration dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
|
|
180
|
+
self.tracks=config[@"tracks"]; self.duration=0;
|
|
181
|
+
for(NSDictionary *track in self.tracks)self.duration=MAX(self.duration,[[track[@"times"] lastObject] doubleValue]);
|
|
182
|
+
self.onEnd=onEnd; self.started=CACurrentMediaTime()*1000;
|
|
183
|
+
self.clock=[CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)]; [self.clock addToRunLoop:NSRunLoop.mainRunLoop forMode:NSRunLoopCommonModes];
|
|
184
|
+
}
|
|
185
|
+
- (BOOL)beginInteractive:(NSString *)geometry {
|
|
186
|
+
if(self.disposed || self.clock || !geometry)return NO;
|
|
187
|
+
NSArray *target=[NSJSONSerialization JSONObjectWithData:[geometry dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
|
|
188
|
+
if(![target isKindOfClass:NSArray.class] || target.count!=(self.navigationImage?(self.clippedImage?13:9):5))return NO;
|
|
189
|
+
for(id value in target)if(![value isKindOfClass:NSNumber.class] || !isfinite([value doubleValue]))return NO;
|
|
190
|
+
for(int i=0;i<14;i++) { _interactiveStart[i]=_pose[i]; _interactiveEnd[i]=_pose[i]; }
|
|
191
|
+
for(int i=0;i<target.count;i++)_interactiveEnd[i<5?i:i+1]=[target[i] doubleValue];
|
|
192
|
+
_interactiveEnd[5]=1;
|
|
193
|
+
return YES;
|
|
194
|
+
}
|
|
195
|
+
- (void)updateInteractive:(double)progress {
|
|
196
|
+
if(self.disposed)return;
|
|
197
|
+
double p=MAX(0,MIN(1,isfinite(progress)?progress:0));
|
|
198
|
+
for(int i=0;i<14;i++)_pose[i]=_interactiveStart[i]+(_interactiveEnd[i]-_interactiveStart[i])*p;
|
|
199
|
+
[self setNeedsDisplay];
|
|
200
|
+
}
|
|
201
|
+
- (BOOL)destinationIsStable {
|
|
202
|
+
if(self.disposed || !self.destination || self.destination.window!=self.host)return NO;
|
|
203
|
+
// Page opacity is intentionally animated by the transition; compare geometry only.
|
|
204
|
+
CGRect current=[self.destination convertRect:self.destination.bounds toView:self.host], target=self.targetFrame;
|
|
205
|
+
return fabs(current.origin.x-target.origin.x)<=1 && fabs(current.origin.y-target.origin.y)<=1 && fabs(current.size.width-target.size.width)<=1 && fabs(current.size.height-target.size.height)<=1;
|
|
206
|
+
}
|
|
207
|
+
- (void)evaluate:(double)now {
|
|
208
|
+
double elapsed=MAX(0,now-self.started);
|
|
209
|
+
for(int k=0;k<(self.navigationImage?(self.clippedImage?14:10):6);k++) {
|
|
210
|
+
NSArray *times=self.tracks[k][@"times"],*values=self.tracks[k][@"values"]; NSUInteger j=1;
|
|
211
|
+
while(j<times.count-1 && [times[j] doubleValue]<elapsed)j++;
|
|
212
|
+
double span=[times[j] doubleValue]-[times[j-1] doubleValue]; double fraction=span<=0?1:MAX(0,MIN(1,(elapsed-[times[j-1] doubleValue])/span));
|
|
213
|
+
_pose[k]=[values[j-1] doubleValue]+([values[j] doubleValue]-[values[j-1] doubleValue])*fraction;
|
|
214
|
+
if(k!=5)_velocity[k]=elapsed>=[times.lastObject doubleValue]||span<=0?0:([values[j] doubleValue]-[values[j-1] doubleValue])*1000/span;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
- (void)tick:(CADisplayLink *)clock {
|
|
218
|
+
if(self.fading){double p=MIN(1,(CACurrentMediaTime()*1000-self.started)/self.duration);self.alpha=1-p;if(p>=1)[self end:YES];return;}
|
|
219
|
+
CGRect frame=[self geometry:self.destination presentation:NO]; CGRect target=self.targetFrame;
|
|
220
|
+
if(!CGSizeEqualToSize(self.host.bounds.size,self.viewport) || CGRectIsNull(frame) || fabs(frame.origin.x-target.origin.x)>1 || fabs(frame.origin.y-target.origin.y)>1 || fabs(frame.size.width-target.size.width)>1 || fabs(frame.size.height-target.size.height)>1) { [self end:NO]; return; }
|
|
221
|
+
double now=CACurrentMediaTime()*1000; [self evaluate:now]; [self setNeedsDisplay]; if(now-self.started>=self.duration)[self end:YES];
|
|
222
|
+
}
|
|
223
|
+
- (void)end:(BOOL)completed { void (^callback)(BOOL)=self.onEnd; self.onEnd=nil; [self.clock invalidate]; self.clock=nil; if(callback)callback(completed); }
|
|
224
|
+
- (void)drawImage:(UIImage *)image size:(CGSize)size scales:(BOOL)scales alpha:(CGFloat)alpha box:(CGRect)box blend:(CGBlendMode)blend {
|
|
225
|
+
if(!image || alpha<=0)return;
|
|
226
|
+
CGFloat scale=scales?MAX(box.size.width/size.width,box.size.height/size.height):1;
|
|
227
|
+
CGSize drawn=CGSizeMake(size.width*scale,size.height*scale);
|
|
228
|
+
[image drawInRect:CGRectMake(CGRectGetMidX(box)-drawn.width/2,CGRectGetMidY(box)-drawn.height/2,drawn.width,drawn.height) blendMode:blend alpha:alpha];
|
|
229
|
+
}
|
|
230
|
+
- (void)render {
|
|
231
|
+
if(self.pageImage)[self.pageImage drawInRect:self.pageFrame blendMode:kCGBlendModeNormal alpha:1-MAX(0,MIN(1,_pose[5]))];
|
|
232
|
+
CGRect box=CGRectMake(_pose[0],_pose[1],MAX(.1,_pose[2]),MAX(.1,_pose[3]));
|
|
233
|
+
CGFloat radius=MAX(0,MIN(_pose[4],MIN(box.size.width,box.size.height)/2)); CGContextRef context=UIGraphicsGetCurrentContext(); CGContextSaveGState(context);
|
|
234
|
+
[[UIBezierPath bezierPathWithRoundedRect:box cornerRadius:radius]addClip]; CGFloat mix=MAX(0,MIN(1,_pose[5]));
|
|
235
|
+
if(self.navigationImage) {
|
|
236
|
+
if(self.clippedImage)CGContextClipToRect(context,CGRectMake(_pose[10],_pose[11],MAX(0,_pose[12]),MAX(0,_pose[13])));
|
|
237
|
+
CGRect content=CGRectMake(box.origin.x+_pose[6],box.origin.y+_pose[7],MAX(.1,_pose[8]),MAX(.1,_pose[9]));
|
|
238
|
+
[self.sourceImage drawInRect:content]; CGContextRestoreGState(context); return;
|
|
239
|
+
}
|
|
240
|
+
CGContextBeginTransparencyLayer(context,NULL);
|
|
241
|
+
[self drawImage:self.sourceImage size:self.sourceSize scales:self.sourceScales alpha:1-mix box:box blend:kCGBlendModeNormal]; [self drawImage:self.targetImage size:self.targetSize scales:self.targetScales alpha:mix box:box blend:kCGBlendModePlusLighter];
|
|
242
|
+
CGContextEndTransparencyLayer(context); CGContextRestoreGState(context);
|
|
243
|
+
}
|
|
244
|
+
- (void)drawRect:(CGRect)rect { [self render]; }
|
|
245
|
+
- (void)dispose {
|
|
246
|
+
if(self.disposed)return; self.disposed=YES; [self.clock invalidate]; self.clock=nil; self.onEnd=nil;
|
|
247
|
+
for(UIView *view in self.hiddenViews)if(view.hidden)view.hidden=[[self.hiddenViews objectForKey:view]boolValue]; [self.hiddenViews removeAllObjects];
|
|
248
|
+
[self removeFromSuperview]; self.sourceImage=nil; self.targetImage=nil; self.pageImage=nil; self.destination=nil; JoltSharedActive--;
|
|
249
|
+
}
|
|
250
|
+
@end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#ifndef JOLT_SPRING_STATE_H
|
|
2
|
+
#define JOLT_SPRING_STATE_H
|
|
3
|
+
#include <math.h>
|
|
4
|
+
|
|
5
|
+
/* Exact constant-target solution. Position and velocity survive every retarget. */
|
|
6
|
+
typedef struct { double position, velocity; } JoltSpringState;
|
|
7
|
+
static inline JoltSpringState JoltSpringAdvance(JoltSpringState state, double target,
|
|
8
|
+
double stiffness, double damping, double mass, double seconds) {
|
|
9
|
+
if (seconds <= 0) return state;
|
|
10
|
+
const double x = state.position - target;
|
|
11
|
+
const double w = sqrt(stiffness / mass);
|
|
12
|
+
const double z = damping / (2 * sqrt(stiffness * mass));
|
|
13
|
+
double next, speed;
|
|
14
|
+
if (fabs(z - 1) < 1e-6) {
|
|
15
|
+
const double b = state.velocity + w * x, e = exp(-w * seconds);
|
|
16
|
+
next = e * (x + b * seconds);
|
|
17
|
+
speed = e * (b - w * (x + b * seconds));
|
|
18
|
+
} else if (z < 1) {
|
|
19
|
+
const double a = z * w, d = w * sqrt(1 - z * z);
|
|
20
|
+
const double b = (state.velocity + a * x) / d;
|
|
21
|
+
const double c = cos(d * seconds), s = sin(d * seconds), e = exp(-a * seconds);
|
|
22
|
+
next = e * (x * c + b * s);
|
|
23
|
+
speed = e * ((-a * x + b * d) * c + (-a * b - x * d) * s);
|
|
24
|
+
} else {
|
|
25
|
+
const double q = sqrt(z * z - 1);
|
|
26
|
+
/* Rationalized slow root avoids catastrophic cancellation at high damping. */
|
|
27
|
+
const double r1 = -w / (z + q), r2 = -w * (z + q);
|
|
28
|
+
const double c1 = (state.velocity - r2 * x) / (r1 - r2), c2 = x - c1;
|
|
29
|
+
const double e1 = exp(r1 * seconds), e2 = exp(r2 * seconds);
|
|
30
|
+
next = c1 * e1 + c2 * e2;
|
|
31
|
+
speed = c1 * r1 * e1 + c2 * r2 * e2;
|
|
32
|
+
}
|
|
33
|
+
return (JoltSpringState){target + next, speed};
|
|
34
|
+
}
|
|
35
|
+
#endif
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
module JoltMotion {
|
|
2
|
+
header "JoltBlur.h"
|
|
3
|
+
header "JoltCircleWorld.h"
|
|
4
|
+
header "JoltSensorSource.h"
|
|
5
|
+
header "JoltScrollHeader.h"
|
|
2
6
|
header "JoltImageEffect.h"
|
|
3
7
|
header "JoltPhotoZoom.h"
|
|
4
8
|
header "JoltInteractiveAnimation.h"
|
|
9
|
+
header "JoltInteractiveNavigation.h"
|
|
10
|
+
header "JoltLiveSpring.h"
|
|
11
|
+
header "JoltGestureSession.h"
|
|
12
|
+
header "JoltReorderSession.h"
|
|
13
|
+
header "JoltSharedLayoutFlight.h"
|
|
14
|
+
header "JoltMotionProbe.h"
|
|
5
15
|
export *
|
|
6
16
|
}
|