@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,115 @@
|
|
|
1
|
+
package org.rafaelaugusto.jolt;
|
|
2
|
+
|
|
3
|
+
import android.graphics.*;
|
|
4
|
+
import android.graphics.drawable.BitmapDrawable;
|
|
5
|
+
import android.view.*;
|
|
6
|
+
import android.webkit.WebView;
|
|
7
|
+
import android.widget.ImageView;
|
|
8
|
+
import java.lang.ref.WeakReference;
|
|
9
|
+
import java.util.ArrayList;
|
|
10
|
+
|
|
11
|
+
/** One static return page, retained within a pixel budget. Only the current gesture owns an overlay. */
|
|
12
|
+
public final class SharedNavigationScene extends View {
|
|
13
|
+
private final ViewGroup root;
|
|
14
|
+
private final ArrayList<WeakReference<View>> path=new ArrayList<>();
|
|
15
|
+
private final ArrayList<float[]> poses=new ArrayList<>();
|
|
16
|
+
private WeakReference<View> detail;
|
|
17
|
+
private SharedLayoutFlight.Anchor anchor;
|
|
18
|
+
private SharedLayoutFlight flight;
|
|
19
|
+
private Bitmap background;
|
|
20
|
+
private final Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
|
|
21
|
+
private final int rootWidth,rootHeight;
|
|
22
|
+
private RectF pageFrame;
|
|
23
|
+
private final double budget;
|
|
24
|
+
private double radius,progress;
|
|
25
|
+
private boolean disposed,visible;
|
|
26
|
+
private static int retained,active;
|
|
27
|
+
private static long retainedPixels;
|
|
28
|
+
private long ownedPixels;
|
|
29
|
+
private String failureReason="ready";
|
|
30
|
+
public String getFailureReason(){return failureReason;}
|
|
31
|
+
private boolean invalid(String reason){failureReason=reason;return false;}
|
|
32
|
+
|
|
33
|
+
private SharedNavigationScene(View source,double budget) {
|
|
34
|
+
super(source.getContext()); root=(ViewGroup)source.getRootView();
|
|
35
|
+
this.budget=budget;rootWidth=root.getWidth();rootHeight=root.getHeight();
|
|
36
|
+
layout(0,0,rootWidth,rootHeight);setWillNotDraw(false);
|
|
37
|
+
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
|
|
38
|
+
}
|
|
39
|
+
public long pixels(){return ownedPixels;}
|
|
40
|
+
public static int retainedCount(){return retained;}
|
|
41
|
+
public static int activeCount(){return active;}
|
|
42
|
+
public static long retainedPixelCount(){return retainedPixels;}
|
|
43
|
+
private static boolean incompatible(View view) {
|
|
44
|
+
if(view instanceof SurfaceView || view instanceof TextureView || view instanceof WebView)return true;
|
|
45
|
+
if(view instanceof ViewGroup)for(int i=0;i<((ViewGroup)view).getChildCount();i++)if(incompatible(((ViewGroup)view).getChildAt(i)))return true;
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
private static float[] pose(View v) {
|
|
49
|
+
return new float[]{v.getLeft(),v.getTop(),v.getWidth(),v.getHeight(),v.getTranslationX(),v.getTranslationY(),v.getScaleX(),v.getScaleY(),v.getRotation(),v.getScrollX(),v.getScrollY()};
|
|
50
|
+
}
|
|
51
|
+
public static SharedNavigationScene capture(View source,View page,boolean image,double radius,double budget) {
|
|
52
|
+
if(source==null || page==null || !source.isAttachedToWindow() || source.getRootView()!=page.getRootView() || !(source.getRootView() instanceof ViewGroup) || incompatible(page))return null;
|
|
53
|
+
SharedNavigationScene scene=new SharedNavigationScene(source,budget);
|
|
54
|
+
SharedLayoutFlight.Anchor anchor=SharedLayoutFlight.anchor(source,image,radius,budget);
|
|
55
|
+
if(anchor==null)return null;
|
|
56
|
+
long pagePixels=(long)page.getWidth()*page.getHeight();
|
|
57
|
+
if(pagePixels<=0 || pagePixels+anchor.pixels()>budget){anchor.dispose();return null;}
|
|
58
|
+
boolean found=false;
|
|
59
|
+
for(View p=source;p!=null;p=p.getParent() instanceof View?(View)p.getParent():null) {
|
|
60
|
+
scene.path.add(new WeakReference<>(p));scene.poses.add(pose(p));
|
|
61
|
+
if(p==page){found=true;break;}
|
|
62
|
+
}
|
|
63
|
+
if(!found){anchor.dispose();return null;}
|
|
64
|
+
int visibility=source.getVisibility();
|
|
65
|
+
try {
|
|
66
|
+
scene.background=Bitmap.createBitmap(page.getWidth(),page.getHeight(),Bitmap.Config.ARGB_8888);
|
|
67
|
+
source.setVisibility(INVISIBLE);page.draw(new Canvas(scene.background));
|
|
68
|
+
} catch(OutOfMemoryError | RuntimeException error) { anchor.dispose();if(scene.background!=null)scene.background.recycle();return null; }
|
|
69
|
+
finally {source.setVisibility(visibility);}
|
|
70
|
+
int[] a=new int[2],b=new int[2];rootLocation(scene.root,a);page.getLocationOnScreen(b);
|
|
71
|
+
scene.pageFrame=new RectF(b[0]-a[0],b[1]-a[1],b[0]-a[0]+page.getWidth(),b[1]-a[1]+page.getHeight());
|
|
72
|
+
scene.anchor=anchor;scene.ownedPixels=pagePixels+anchor.pixels();retained++;retainedPixels+=scene.ownedPixels;
|
|
73
|
+
return scene;
|
|
74
|
+
}
|
|
75
|
+
private static void rootLocation(View root,int[] xy){root.getLocationOnScreen(xy);}
|
|
76
|
+
public void bind(View view,double radius){this.detail=new WeakReference<>(view);this.radius=radius;}
|
|
77
|
+
public boolean validSource() {
|
|
78
|
+
if(disposed || root.getWidth()!=rootWidth || root.getHeight()!=rootHeight || background==null || background.isRecycled())return invalid("viewport-changed");
|
|
79
|
+
if(anchor.bitmap==null || anchor.bitmap.isRecycled())return invalid("image-unavailable");
|
|
80
|
+
// Core can detach and rebuild a covered page's native children. Its static JS
|
|
81
|
+
// identity/content/layout stamp is checked once at gesture start by the adapter.
|
|
82
|
+
View page=path.get(path.size()-1).get();
|
|
83
|
+
if(page==null || !page.isAttachedToWindow())return true;
|
|
84
|
+
for(int i=0;i<path.size();i++) {
|
|
85
|
+
View v=path.get(i).get();if(v==null)return invalid("source-unavailable");
|
|
86
|
+
if(i+1<path.size() && v.getParent()!=path.get(i+1).get())return invalid("source-reparented");
|
|
87
|
+
float[] actual=pose(v),expected=poses.get(i);
|
|
88
|
+
for(int k=0;k<actual.length;k++)if(Math.abs(actual[k]-expected[k])>.1)return invalid("source-layout-changed");
|
|
89
|
+
}
|
|
90
|
+
if(anchor.image) {
|
|
91
|
+
View view=path.get(0).get();
|
|
92
|
+
if(!(view instanceof ImageView) || !(((ImageView)view).getDrawable() instanceof BitmapDrawable) || ((BitmapDrawable)((ImageView)view).getDrawable()).getBitmap()!=anchor.bitmap)return invalid("source-image-changed");
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
public boolean begin() {
|
|
97
|
+
finish();View view=detail==null?null:detail.get();
|
|
98
|
+
if(!validSource())return false;
|
|
99
|
+
if(view==null || !view.isAttachedToWindow() || view.getRootView()!=root)return invalid("target-unavailable");
|
|
100
|
+
progress=0;root.getOverlay().add(this);visible=true;active++;
|
|
101
|
+
try {
|
|
102
|
+
flight=anchor.image?SharedLayoutFlight.captureNavigationImage(view,radius,budget-ownedPixels):SharedLayoutFlight.capture(view,false,radius,budget-ownedPixels);
|
|
103
|
+
if(flight==null || !flight.prepareAnchor(anchor,budget-ownedPixels)){finish();return invalid("unsupported-target");}
|
|
104
|
+
failureReason="ready";flight.updateInteractive(0);return true;
|
|
105
|
+
} catch(RuntimeException | OutOfMemoryError error) { finish();return invalid("unsupported-target"); }
|
|
106
|
+
}
|
|
107
|
+
public boolean isAnimating(){return flight!=null;}
|
|
108
|
+
public boolean validActive(){return !visible || (validSource() && detail!=null && detail.get()!=null && detail.get().isAttachedToWindow());}
|
|
109
|
+
public void render(double p){if(flight==null)return;progress=Math.max(0,Math.min(1,p));flight.updateInteractive(progress);invalidate();}
|
|
110
|
+
@Override protected void onDraw(Canvas canvas) {
|
|
111
|
+
if(background==null)return;paint.setAlpha((int)Math.round(progress*255));canvas.drawBitmap(background,null,pageFrame,paint);
|
|
112
|
+
}
|
|
113
|
+
public void finish(){if(flight!=null){flight.dispose();flight=null;}if(visible){root.getOverlay().remove(this);visible=false;active--;}}
|
|
114
|
+
public void dispose(){if(disposed)return;finish();disposed=true;if(anchor!=null)anchor.dispose();anchor=null;if(background!=null)background.recycle();background=null;detail=null;path.clear();poses.clear();retained--;retainedPixels-=ownedPixels;}
|
|
115
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
package org.rafaelaugusto.jolt;
|
|
2
|
+
|
|
3
|
+
/** Exact constant-target solution, matching JoltSpringState.h. No per-step allocation. */
|
|
4
|
+
public final class SpringState {
|
|
5
|
+
public double position, velocity;
|
|
6
|
+
|
|
7
|
+
public SpringState(double position, double velocity) {
|
|
8
|
+
this.position = position;
|
|
9
|
+
this.velocity = velocity;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public void advance(double target, double stiffness, double damping, double mass, double seconds) {
|
|
13
|
+
if (seconds <= 0) return;
|
|
14
|
+
double x = position - target;
|
|
15
|
+
double w = Math.sqrt(stiffness / mass);
|
|
16
|
+
double z = damping / (2 * Math.sqrt(stiffness * mass));
|
|
17
|
+
double next, speed;
|
|
18
|
+
if (Math.abs(z - 1) < 1e-6) {
|
|
19
|
+
double b = velocity + w * x, e = Math.exp(-w * seconds);
|
|
20
|
+
next = e * (x + b * seconds);
|
|
21
|
+
speed = e * (b - w * (x + b * seconds));
|
|
22
|
+
} else if (z < 1) {
|
|
23
|
+
double a = z * w, d = w * Math.sqrt(1 - z * z);
|
|
24
|
+
double b = (velocity + a * x) / d;
|
|
25
|
+
double c = Math.cos(d * seconds), s = Math.sin(d * seconds), e = Math.exp(-a * seconds);
|
|
26
|
+
next = e * (x * c + b * s);
|
|
27
|
+
speed = e * ((-a * x + b * d) * c + (-a * b - x * d) * s);
|
|
28
|
+
} else {
|
|
29
|
+
double q = Math.sqrt(z * z - 1);
|
|
30
|
+
double r1 = -w / (z + q), r2 = -w * (z + q);
|
|
31
|
+
double c1 = (velocity - r2 * x) / (r1 - r2), c2 = x - c1;
|
|
32
|
+
double e1 = Math.exp(r1 * seconds), e2 = Math.exp(r2 * seconds);
|
|
33
|
+
next = c1 * e1 + c2 * e2;
|
|
34
|
+
speed = c1 * r1 * e1 + c2 * r2 * e2;
|
|
35
|
+
}
|
|
36
|
+
position = target + next;
|
|
37
|
+
velocity = speed;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
-keep class org.rafaelaugusto.jolt.ColorTarget { *; }
|
|
2
|
+
-keep class org.rafaelaugusto.jolt.CircleWorld { *; }
|
|
3
|
+
-keep class org.rafaelaugusto.jolt.CircleWorld$* { *; }
|
|
4
|
+
-keep class org.rafaelaugusto.jolt.MotionProbe { *; }
|
|
2
5
|
-keep class org.nativescript.widgets.BorderDrawable { *; }
|
|
3
6
|
-keepnames class org.nativescript.widgets.BoxShadowDrawable
|
|
4
7
|
-keepclassmembers class org.nativescript.widgets.BoxShadowDrawable {
|
|
@@ -7,6 +10,8 @@
|
|
|
7
10
|
-keep class org.rafaelaugusto.jolt.DecorationTarget { *; }
|
|
8
11
|
-keep class org.rafaelaugusto.jolt.KeyboardFollower { *; }
|
|
9
12
|
-keep class org.rafaelaugusto.jolt.KeyboardFollower$* { *; }
|
|
13
|
+
-keep class org.rafaelaugusto.jolt.KeyboardObserver { *; }
|
|
14
|
+
-keep class org.rafaelaugusto.jolt.KeyboardObserver$* { *; }
|
|
10
15
|
-keep class org.rafaelaugusto.jolt.TextReveal { *; }
|
|
11
16
|
-keep class org.rafaelaugusto.jolt.TextReveal$* { *; }
|
|
12
17
|
-keep class org.rafaelaugusto.jolt.NumberRoll { *; }
|
|
@@ -15,3 +20,18 @@
|
|
|
15
20
|
-keep class org.rafaelaugusto.jolt.ImageEffect$* { *; }
|
|
16
21
|
-keep class org.rafaelaugusto.jolt.PhotoZoom { *; }
|
|
17
22
|
-keep class org.rafaelaugusto.jolt.PhotoZoom$* { *; }
|
|
23
|
+
-keep class org.rafaelaugusto.jolt.GradientLayer { *; }
|
|
24
|
+
-keep class org.rafaelaugusto.jolt.GradientLayer$* { *; }
|
|
25
|
+
-keep class org.rafaelaugusto.jolt.ParticleEmitter { *; }
|
|
26
|
+
-keep class org.rafaelaugusto.jolt.ParticleEmitter$* { *; }
|
|
27
|
+
-keep class org.rafaelaugusto.jolt.ReorderSession { *; }
|
|
28
|
+
-keep class org.rafaelaugusto.jolt.ReorderSession$* { *; }
|
|
29
|
+
-keep class org.rafaelaugusto.jolt.ReorderHandle { *; }
|
|
30
|
+
-keep class org.rafaelaugusto.jolt.ReorderHandle$* { *; }
|
|
31
|
+
-keep class org.rafaelaugusto.jolt.ReorderSurface { *; }
|
|
32
|
+
-keep class org.rafaelaugusto.jolt.SharedLayoutFlight { *; }
|
|
33
|
+
-keep class org.rafaelaugusto.jolt.SharedLayoutFlight$* { *; }
|
|
34
|
+
-keep class org.rafaelaugusto.jolt.PredictiveBackSession { *; }
|
|
35
|
+
-keep class org.rafaelaugusto.jolt.PredictiveBackSession$* { *; }
|
|
36
|
+
|
|
37
|
+
-keep class org.rafaelaugusto.jolt.SharedNavigationScene { *; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
OTHER_LDFLAGS = $(inherited) -framework Metal -framework MetalKit
|
|
1
|
+
OTHER_LDFLAGS = $(inherited) -framework Metal -framework MetalKit -framework CoreMotion
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#import <UIKit/UIKit.h>
|
|
2
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
3
|
+
@interface JoltBlur : NSObject
|
|
4
|
+
+ (instancetype)attach:(UIView *)view options:(NSString *)options;
|
|
5
|
+
+ (NSInteger)liveCount;
|
|
6
|
+
+ (NSInteger)activeCount;
|
|
7
|
+
- (void)paint:(double)amount;
|
|
8
|
+
- (void)play:(NSString *)program;
|
|
9
|
+
- (void)control:(double)time paused:(BOOL)paused;
|
|
10
|
+
- (void)resize;
|
|
11
|
+
- (NSString *)snapshot;
|
|
12
|
+
- (void)dispose;
|
|
13
|
+
@end
|
|
14
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#import "JoltBlur.h"
|
|
2
|
+
#import <QuartzCore/QuartzCore.h>
|
|
3
|
+
|
|
4
|
+
@interface JoltBlur ()
|
|
5
|
+
@property(nonatomic,weak) UIView *host;
|
|
6
|
+
@property(nonatomic) UIVisualEffectView *surface;
|
|
7
|
+
@property(nonatomic) UIViewPropertyAnimator *material;
|
|
8
|
+
@property(nonatomic) CADisplayLink *clock;
|
|
9
|
+
@property(nonatomic) NSArray<NSNumber *> *times, *values;
|
|
10
|
+
@property(nonatomic) double amount, duration, delay, repeats, anchor, offset;
|
|
11
|
+
@property(nonatomic) BOOL reverse, disposed, paused;
|
|
12
|
+
@property(nonatomic) NSUInteger frames;
|
|
13
|
+
@end
|
|
14
|
+
static NSInteger JoltBlurLive=0, JoltBlurActive=0;
|
|
15
|
+
@implementation JoltBlur
|
|
16
|
+
+ (NSInteger)liveCount { return JoltBlurLive; }
|
|
17
|
+
+ (NSInteger)activeCount { return JoltBlurActive; }
|
|
18
|
+
+ (instancetype)attach:(UIView *)view options:(NSString *)options {
|
|
19
|
+
NSDictionary *o=[NSJSONSerialization JSONObjectWithData:[options dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
|
|
20
|
+
JoltBlur *b=[self new];b.host=view;
|
|
21
|
+
UIBlurEffectStyle style=[o[@"style"] isEqual:@"light"]?UIBlurEffectStyleLight:[o[@"style"] isEqual:@"dark"]?UIBlurEffectStyleDark:UIBlurEffectStyleSystemMaterial;
|
|
22
|
+
b.surface=[[UIVisualEffectView alloc]initWithEffect:nil];
|
|
23
|
+
b.surface.userInteractionEnabled=NO;b.surface.accessibilityElementsHidden=YES;
|
|
24
|
+
b.surface.accessibilityIdentifier=@"jolt:blur";
|
|
25
|
+
b.surface.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
|
|
26
|
+
b.surface.clipsToBounds=YES;[view addSubview:b.surface];[b resize];
|
|
27
|
+
UIVisualEffectView *surface=b.surface;
|
|
28
|
+
b.material=[[UIViewPropertyAnimator alloc]initWithDuration:1 curve:UIViewAnimationCurveLinear animations:^{surface.effect=[UIBlurEffect effectWithStyle:style];}];
|
|
29
|
+
b.material.scrubsLinearly=YES;b.material.pausesOnCompletion=YES;
|
|
30
|
+
[b.material startAnimation];[b.material pauseAnimation];
|
|
31
|
+
[b paint:[o[@"amount"] doubleValue]];JoltBlurLive++;return b;
|
|
32
|
+
}
|
|
33
|
+
- (void)resize {
|
|
34
|
+
self.surface.frame=self.host.bounds;
|
|
35
|
+
self.surface.layer.cornerRadius=self.host.layer.cornerRadius;
|
|
36
|
+
}
|
|
37
|
+
- (void)apply:(double)value {
|
|
38
|
+
self.amount=MIN(1,MAX(0,value));self.material.fractionComplete=self.amount;
|
|
39
|
+
// Keep alpha at 1: changing effect-view alpha compromises its backdrop capture.
|
|
40
|
+
self.surface.hidden=self.amount==0;self.frames++;
|
|
41
|
+
}
|
|
42
|
+
- (void)cancel {
|
|
43
|
+
if(self.clock){[self.clock invalidate];self.clock=nil;JoltBlurActive--;}
|
|
44
|
+
self.times=nil;self.values=nil;
|
|
45
|
+
}
|
|
46
|
+
- (void)paint:(double)value {
|
|
47
|
+
if(self.disposed)return;[self cancel];[self apply:value];
|
|
48
|
+
}
|
|
49
|
+
- (void)play:(NSString *)program {
|
|
50
|
+
if(self.disposed)return;[self cancel];
|
|
51
|
+
NSDictionary *p=[NSJSONSerialization JSONObjectWithData:[program dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
|
|
52
|
+
self.times=p[@"times"];self.values=p[@"values"];self.duration=[p[@"duration"] doubleValue];self.delay=[p[@"delay"] doubleValue];self.repeats=[p[@"repeat"] doubleValue];self.reverse=[p[@"reverse"] boolValue];
|
|
53
|
+
self.offset=0;self.anchor=CACurrentMediaTime();self.paused=NO;[self advance:0];
|
|
54
|
+
self.clock=[CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)];
|
|
55
|
+
[self.clock addToRunLoop:NSRunLoop.mainRunLoop forMode:NSRunLoopCommonModes];JoltBlurActive++;
|
|
56
|
+
}
|
|
57
|
+
- (void)advance:(double)elapsed {
|
|
58
|
+
if(!self.times.count)return;
|
|
59
|
+
double t=MAX(0,elapsed-self.delay), fraction;
|
|
60
|
+
if(self.duration<=0)fraction=elapsed<self.delay?0:(self.reverse && self.repeats>=0 && ((NSInteger)self.repeats%2==1)?0:1);
|
|
61
|
+
else if(self.repeats>=0 && t>=self.duration*(self.repeats+1))fraction=self.reverse && ((NSInteger)self.repeats%2==1)?0:1;
|
|
62
|
+
else { double cycles=t/self.duration;long long cycle=(long long)floor(cycles);fraction=cycles-cycle;if(self.reverse && cycle%2==1)fraction=1-fraction; }
|
|
63
|
+
NSUInteger low=0,high=self.times.count-1;
|
|
64
|
+
while(high-low>1){NSUInteger mid=(low+high)/2;if(self.times[mid].doubleValue<=fraction)low=mid;else high=mid;}
|
|
65
|
+
double span=self.times[high].doubleValue-self.times[low].doubleValue;
|
|
66
|
+
double mix=span>0?MIN(1,MAX(0,(fraction-self.times[low].doubleValue)/span)):1;
|
|
67
|
+
[self apply:self.values[low].doubleValue+(self.values[high].doubleValue-self.values[low].doubleValue)*mix];
|
|
68
|
+
}
|
|
69
|
+
- (void)tick:(CADisplayLink *)link {
|
|
70
|
+
double elapsed=self.offset+(CACurrentMediaTime()-self.anchor)*1000;
|
|
71
|
+
[self advance:elapsed];
|
|
72
|
+
if(self.repeats>=0 && elapsed>=self.delay+self.duration*(self.repeats+1))[self cancel];
|
|
73
|
+
}
|
|
74
|
+
- (void)control:(double)time paused:(BOOL)paused {
|
|
75
|
+
if(!self.clock)return;
|
|
76
|
+
self.offset=time;self.anchor=CACurrentMediaTime();self.paused=paused;self.clock.paused=paused;[self advance:time];
|
|
77
|
+
}
|
|
78
|
+
- (NSString *)snapshot {
|
|
79
|
+
NSDictionary *s=@{@"backend":@"ios-material",@"amount":@(self.amount),@"appliedAmount":@(self.material?self.material.fractionComplete:0),@"attached":@(!self.disposed),@"nativeAnimations":@(self.clock?1:0),@"frames":@(self.frames),@"width":@(self.surface.bounds.size.width),@"height":@(self.surface.bounds.size.height)};
|
|
80
|
+
return [[NSString alloc]initWithData:[NSJSONSerialization dataWithJSONObject:s options:0 error:nil] encoding:NSUTF8StringEncoding];
|
|
81
|
+
}
|
|
82
|
+
- (void)dispose {
|
|
83
|
+
if(self.disposed)return;[self cancel];self.disposed=YES;JoltBlurLive--;
|
|
84
|
+
[self.material stopAnimation:YES];self.material=nil;[self.surface removeFromSuperview];self.surface=nil;
|
|
85
|
+
}
|
|
86
|
+
@end
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#ifndef JOLT_CIRCLE_MATH_H
|
|
2
|
+
#define JOLT_CIRCLE_MATH_H
|
|
3
|
+
#include <math.h>
|
|
4
|
+
#include <stdbool.h>
|
|
5
|
+
#include <string.h>
|
|
6
|
+
#define JOLT_CIRCLE_LIMIT 16
|
|
7
|
+
#define JOLT_CIRCLE_SNAP_LIMIT 8
|
|
8
|
+
#define JOLT_CIRCLE_DT (1.0/240.0)
|
|
9
|
+
#define JOLT_CIRCLE_SPEED 1200.0
|
|
10
|
+
typedef struct {
|
|
11
|
+
bool enabled;
|
|
12
|
+
double u,v,length,stiffness,damping;
|
|
13
|
+
} JoltCircleAttachment;
|
|
14
|
+
typedef struct {
|
|
15
|
+
int count,index,previousIndex;
|
|
16
|
+
bool active,previousActive;
|
|
17
|
+
double u[JOLT_CIRCLE_SNAP_LIMIT],v[JOLT_CIRCLE_SNAP_LIMIT];
|
|
18
|
+
double stiffness,damping,projection;
|
|
19
|
+
} JoltCircleSnap;
|
|
20
|
+
typedef struct {
|
|
21
|
+
double x,y,vx,vy,r,m,tx,ty,ax,ay,releaseX,releaseY,releaseVX,releaseVY;
|
|
22
|
+
bool released;
|
|
23
|
+
bool held,supported;
|
|
24
|
+
JoltCircleAttachment attachment,drag;
|
|
25
|
+
JoltCircleSnap snap;
|
|
26
|
+
} JoltCircle;
|
|
27
|
+
typedef struct {
|
|
28
|
+
JoltCircle bodies[JOLT_CIRCLE_LIMIT]; int count;
|
|
29
|
+
double width,height,gx,gy,restitution,damping,quiet;
|
|
30
|
+
unsigned long steps,contacts; bool sleeping;
|
|
31
|
+
} JoltCircleState;
|
|
32
|
+
static inline double JoltCircleClamp(double v,double lo,double hi){return fmax(lo,fmin(hi,v));}
|
|
33
|
+
static inline void JoltCircleLimitVelocity(JoltCircle *b){double speed=hypot(b->vx,b->vy);if(speed>JOLT_CIRCLE_SPEED){b->vx*=JOLT_CIRCLE_SPEED/speed;b->vy*=JOLT_CIRCLE_SPEED/speed;}}
|
|
34
|
+
static inline void JoltCircleWake(JoltCircleState *w){w->sleeping=false;w->quiet=0;}
|
|
35
|
+
static inline bool JoltCircleFits(JoltCircleState *w,double width,double height){
|
|
36
|
+
double area=0;
|
|
37
|
+
if(!isfinite(width)||!isfinite(height)||width<=0||height<=0)return false;
|
|
38
|
+
for(int i=0;i<w->count;i++){JoltCircle *b=&w->bodies[i];if(2*b->r>fmin(width,height))return false;area+=3.141592653589793*b->r*b->r;}
|
|
39
|
+
return area<=width*height*.4;
|
|
40
|
+
}
|
|
41
|
+
static inline bool JoltCircleKinematic(JoltCircle *b){return b->held&&!b->drag.enabled;}
|
|
42
|
+
static inline void JoltCircleWalls(JoltCircleState *w,JoltCircle *b,bool impulse){
|
|
43
|
+
double e=w->restitution;
|
|
44
|
+
if(b->x<=b->r){b->x=b->r;if(b->ax<0)b->supported=true;if(impulse&&!JoltCircleKinematic(b)&&b->vx<0){b->vx=fabs(b->vx)<40?0:-b->vx*e;w->contacts++;}}
|
|
45
|
+
if(b->x>=w->width-b->r){b->x=w->width-b->r;if(b->ax>0)b->supported=true;if(impulse&&!JoltCircleKinematic(b)&&b->vx>0){b->vx=fabs(b->vx)<40?0:-b->vx*e;w->contacts++;}}
|
|
46
|
+
if(b->y<=b->r){b->y=b->r;if(b->ay<0)b->supported=true;if(impulse&&!JoltCircleKinematic(b)&&b->vy<0){b->vy=fabs(b->vy)<40?0:-b->vy*e;w->contacts++;}}
|
|
47
|
+
if(b->y>=w->height-b->r){b->y=w->height-b->r;if(b->ay>0)b->supported=true;if(impulse&&!JoltCircleKinematic(b)&&b->vy>0){b->vy=fabs(b->vy)<40?0:-b->vy*e;w->contacts++;}}
|
|
48
|
+
}
|
|
49
|
+
static inline void JoltCircleContacts(JoltCircleState *w,bool impulse,int iterations){
|
|
50
|
+
for(int iteration=0;iteration<iterations;iteration++){
|
|
51
|
+
for(int i=0;i<w->count;i++)for(int j=i+1;j<w->count;j++){
|
|
52
|
+
JoltCircle *a=&w->bodies[i],*b=&w->bodies[j];
|
|
53
|
+
double dx=b->x-a->x,dy=b->y-a->y,d=hypot(dx,dy),radius=a->r+b->r;
|
|
54
|
+
if(d>radius+.02)continue;
|
|
55
|
+
double nx=d>1e-9?dx/d:1,ny=d>1e-9?dy/d:0;
|
|
56
|
+
double ia=JoltCircleKinematic(a)?0:1/a->m,ib=JoltCircleKinematic(b)?0:1/b->m,total=ia+ib;
|
|
57
|
+
if(total==0)continue;
|
|
58
|
+
double overlap=fmax(0,radius-d);
|
|
59
|
+
a->x-=nx*overlap*ia/total;a->y-=ny*overlap*ia/total;
|
|
60
|
+
b->x+=nx*overlap*ib/total;b->y+=ny*overlap*ib/total;
|
|
61
|
+
if(nx*a->ax+ny*a->ay>hypot(a->ax,a->ay)*.35)a->supported=true;
|
|
62
|
+
if(-nx*b->ax-ny*b->ay>hypot(b->ax,b->ay)*.35)b->supported=true;
|
|
63
|
+
double closing=(b->vx-a->vx)*nx+(b->vy-a->vy)*ny;
|
|
64
|
+
if(impulse&&closing<0){
|
|
65
|
+
double e=closing < -40?w->restitution:0,jolt=-(1+e)*closing/total;
|
|
66
|
+
a->vx-=nx*jolt*ia;a->vy-=ny*jolt*ia;b->vx+=nx*jolt*ib;b->vy+=ny*jolt*ib;
|
|
67
|
+
if(closing < -.1)w->contacts++;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
for(int i=0;i<w->count;i++)JoltCircleWalls(w,&w->bodies[i],impulse);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Targets use normalized coordinates so repeated resizes do not accumulate clamping drift.
|
|
74
|
+
static inline double JoltCircleSnapX(JoltCircleState *w,JoltCircle *b,int index) {
|
|
75
|
+
return JoltCircleClamp(b->snap.u[index]*w->width,b->r,w->width-b->r);
|
|
76
|
+
}
|
|
77
|
+
static inline double JoltCircleSnapY(JoltCircleState *w,JoltCircle *b,int index) {
|
|
78
|
+
return JoltCircleClamp(b->snap.v[index]*w->height,b->r,w->height-b->r);
|
|
79
|
+
}
|
|
80
|
+
static inline void JoltCircleAttach(JoltCircleState *w,int index,bool enabled,double x,double y,double length,double stiffness,double damping) {
|
|
81
|
+
JoltCircle *b=&w->bodies[index];
|
|
82
|
+
b->attachment=(JoltCircleAttachment){enabled,x/w->width,y/w->height,length,stiffness,damping};
|
|
83
|
+
b->snap.active=b->snap.previousActive=false;JoltCircleWake(w);
|
|
84
|
+
}
|
|
85
|
+
static inline void JoltCircleSnapTo(JoltCircleState *w,int index,int target) {
|
|
86
|
+
JoltCircle *b=&w->bodies[index];
|
|
87
|
+
if(b->held||target<0||target>=b->snap.count)return;
|
|
88
|
+
b->snap.active=true;b->snap.index=target;JoltCircleWake(w);
|
|
89
|
+
}
|
|
90
|
+
static inline void JoltCircleCancel(JoltCircleState *w,int index) {
|
|
91
|
+
JoltCircle *b=&w->bodies[index];
|
|
92
|
+
if(!b->held)return;
|
|
93
|
+
b->held=false;b->vx=b->vy=0;
|
|
94
|
+
b->snap.active=b->snap.previousActive;b->snap.index=b->snap.previousIndex;JoltCircleWake(w);
|
|
95
|
+
}
|
|
96
|
+
static inline bool JoltCircleTargetClear(JoltCircleState *w,int index,double x,double y) {
|
|
97
|
+
JoltCircle *b=&w->bodies[index];
|
|
98
|
+
for(int i=0;i<w->count;i++)if(i!=index){
|
|
99
|
+
JoltCircle *other=&w->bodies[i];
|
|
100
|
+
if(hypot(x-other->x,y-other->y)<b->r+other->r+.001)return false;
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
static inline void JoltCircleStep(JoltCircleState *w) {
|
|
105
|
+
if(w->sleeping)return;
|
|
106
|
+
const double dt=JOLT_CIRCLE_DT,decay=exp(-w->damping*dt);
|
|
107
|
+
bool quiet=true;
|
|
108
|
+
for(int i=0;i<w->count;i++){
|
|
109
|
+
JoltCircle *b=&w->bodies[i];b->supported=false;b->ax=w->gx;b->ay=w->gy;
|
|
110
|
+
if(b->held)quiet=false;
|
|
111
|
+
if(JoltCircleKinematic(b)){b->vx=(b->tx-b->x)/dt;b->vy=(b->ty-b->y)/dt;quiet=false;}
|
|
112
|
+
else {
|
|
113
|
+
double damping=0;
|
|
114
|
+
if((b->held&&b->drag.enabled)||b->attachment.enabled||b->snap.active){
|
|
115
|
+
double x,y,length,stiffness;
|
|
116
|
+
if(b->held&&b->drag.enabled){
|
|
117
|
+
x=b->tx;y=b->ty;length=b->drag.length;stiffness=b->drag.stiffness;damping=b->drag.damping;
|
|
118
|
+
}else if(b->snap.active){
|
|
119
|
+
x=JoltCircleSnapX(w,b,b->snap.index);y=JoltCircleSnapY(w,b,b->snap.index);
|
|
120
|
+
length=0;stiffness=b->snap.stiffness;damping=b->snap.damping;
|
|
121
|
+
// A selected snap is a positional controller; gravity must not offset its dock.
|
|
122
|
+
b->ax=b->ay=0;
|
|
123
|
+
}else {
|
|
124
|
+
x=b->attachment.u*w->width;y=b->attachment.v*w->height;
|
|
125
|
+
length=b->attachment.length;stiffness=b->attachment.stiffness;damping=b->attachment.damping;
|
|
126
|
+
}
|
|
127
|
+
double dx=b->x-x,dy=b->y-y,d=hypot(dx,dy);
|
|
128
|
+
double nx=d>1e-9?dx/d:0,ny=d>1e-9?dy/d:1;
|
|
129
|
+
double force=stiffness*(d-length)/b->m;
|
|
130
|
+
b->ax-=force*nx;b->ay-=force*ny;
|
|
131
|
+
}
|
|
132
|
+
// Implicit viscous damping remains bounded for the supported mass/damping range.
|
|
133
|
+
double divisor=1+damping*dt/b->m;
|
|
134
|
+
b->vx=(b->vx+b->ax*dt)/divisor*decay;
|
|
135
|
+
b->vy=(b->vy+b->ay*dt)/divisor*decay;
|
|
136
|
+
}
|
|
137
|
+
JoltCircleLimitVelocity(b);b->x+=b->vx*dt;b->y+=b->vy*dt;
|
|
138
|
+
}
|
|
139
|
+
JoltCircleContacts(w,true,8);
|
|
140
|
+
for(int i=0;i<w->count;i++){
|
|
141
|
+
JoltCircle *b=&w->bodies[i];JoltCircleLimitVelocity(b);
|
|
142
|
+
double speed=hypot(b->vx,b->vy),force=hypot(b->ax,b->ay);
|
|
143
|
+
bool equilibrium=force<=1e-9;
|
|
144
|
+
if(b->snap.active){
|
|
145
|
+
double x=JoltCircleSnapX(w,b,b->snap.index),y=JoltCircleSnapY(w,b,b->snap.index);
|
|
146
|
+
equilibrium=hypot(b->x-x,b->y-y)<=.25;
|
|
147
|
+
if(equilibrium&&speed<=4&&JoltCircleTargetClear(w,i,x,y)){b->x=x;b->y=y;b->vx=b->vy=0;}
|
|
148
|
+
}else if(b->attachment.enabled){
|
|
149
|
+
double dx=b->x-b->attachment.u*w->width,dy=b->y-b->attachment.v*w->height;
|
|
150
|
+
double gravity=hypot(w->gx,w->gy);
|
|
151
|
+
// Residual force alone hides tangential drift in a stretched spring.
|
|
152
|
+
if(gravity>1e-9){
|
|
153
|
+
double length=b->attachment.length+b->m*gravity/b->attachment.stiffness;
|
|
154
|
+
equilibrium=hypot(dx-length*w->gx/gravity,dy-length*w->gy/gravity)<=.25;
|
|
155
|
+
}else equilibrium=fabs(hypot(dx,dy)-b->attachment.length)<=.25;
|
|
156
|
+
}
|
|
157
|
+
if(speed>4||(!b->supported&&!equilibrium))quiet=false;
|
|
158
|
+
}
|
|
159
|
+
w->steps++;w->quiet=quiet?w->quiet+dt:0;
|
|
160
|
+
if(w->quiet>=.35){w->sleeping=true;for(int i=0;i<w->count;i++)w->bodies[i].vx=w->bodies[i].vy=0;}
|
|
161
|
+
}
|
|
162
|
+
static inline void JoltCircleDrag(JoltCircleState *w,int index,double x,double y) {
|
|
163
|
+
JoltCircle *b=&w->bodies[index];
|
|
164
|
+
if(!b->held){b->snap.previousActive=b->snap.active;b->snap.previousIndex=b->snap.index;b->snap.active=false;}
|
|
165
|
+
b->held=true;double inset=b->drag.enabled?0:b->r;
|
|
166
|
+
b->tx=JoltCircleClamp(x,inset,w->width-inset);b->ty=JoltCircleClamp(y,inset,w->height-inset);JoltCircleWake(w);
|
|
167
|
+
}
|
|
168
|
+
static inline void JoltCircleRelease(JoltCircleState *w,int index,double vx,double vy) {
|
|
169
|
+
JoltCircle *b=&w->bodies[index];
|
|
170
|
+
// A spring-held body releases its integrated momentum, never the pointer velocity.
|
|
171
|
+
if(!b->held||!b->drag.enabled){b->vx=vx;b->vy=vy;}
|
|
172
|
+
b->held=false;JoltCircleLimitVelocity(b);
|
|
173
|
+
b->released=true;b->releaseX=b->x;b->releaseY=b->y;b->releaseVX=b->vx;b->releaseVY=b->vy;
|
|
174
|
+
if(b->snap.count){
|
|
175
|
+
double x=b->x+b->vx*b->snap.projection,y=b->y+b->vy*b->snap.projection,best=INFINITY;
|
|
176
|
+
for(int i=0;i<b->snap.count;i++){
|
|
177
|
+
double distance=hypot(x-JoltCircleSnapX(w,b,i),y-JoltCircleSnapY(w,b,i));
|
|
178
|
+
// Strict comparison makes equal-distance ties choose the first configured point.
|
|
179
|
+
if(distance<best){best=distance;b->snap.index=i;}
|
|
180
|
+
}
|
|
181
|
+
b->snap.active=true;
|
|
182
|
+
}
|
|
183
|
+
JoltCircleWake(w);
|
|
184
|
+
}
|
|
185
|
+
static inline void JoltCircleResize(JoltCircleState *w,double width,double height) {
|
|
186
|
+
for(int i=0;i<w->count;i++){
|
|
187
|
+
JoltCircleCancel(w,i);JoltCircle *b=&w->bodies[i];b->x*=width/w->width;b->y*=height/w->height;b->vx=b->vy=0;
|
|
188
|
+
}
|
|
189
|
+
w->width=width;w->height=height;JoltCircleContacts(w,false,64);JoltCircleWake(w);
|
|
190
|
+
}
|
|
191
|
+
#endif
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#import <UIKit/UIKit.h>
|
|
2
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
3
|
+
@interface JoltCircleWorld : NSObject
|
|
4
|
+
+ (instancetype)create:(UIView *)container options:(NSString *)options;
|
|
5
|
+
- (void)connect:(UIView *)view index:(NSInteger)index;
|
|
6
|
+
- (void)setEnabled:(BOOL)enabled;
|
|
7
|
+
- (void)resize:(double)width height:(double)height;
|
|
8
|
+
- (void)impulse:(NSInteger)index x:(double)x y:(double)y;
|
|
9
|
+
- (void)attach:(NSInteger)index options:(NSString *)options;
|
|
10
|
+
- (void)snapTo:(NSInteger)index target:(NSInteger)target;
|
|
11
|
+
- (void)reset;
|
|
12
|
+
- (BOOL)supportsPointerSpring;
|
|
13
|
+
- (NSString *)snapshot;
|
|
14
|
+
- (void)dispose;
|
|
15
|
+
+ (NSUInteger)worldCount;
|
|
16
|
+
+ (NSUInteger)activeCount;
|
|
17
|
+
@end
|
|
18
|
+
NS_ASSUME_NONNULL_END
|