diff --git a/docs/docs/video.md b/docs/docs/video.md
new file mode 100644
index 0000000000..fe4f9baabe
--- /dev/null
+++ b/docs/docs/video.md
@@ -0,0 +1,96 @@
+---
+id: video
+title: Video
+sidebar_label: Video
+slug: /video
+---
+
+React Native Skia provides a way to load video frames as images, enabling rich multimedia experiences within your applications.
+A video frame can be used anywhere a Skia image is accepted: `Image`, `ImageShader`, and `Atlas`.
+
+## Requirements
+
+- **Android:** API level 26 or higher.
+- **Video URL:** Must be a local path. We recommend using it in combination with [expo-asset](https://docs.expo.dev/versions/latest/sdk/asset/) to download the video.
+- **Animated Playback:** Available only via [Reanimated 3](/docs/animations/animations) and above.
+- **Sound Playback:** Coming soon. In the meantime, audio can be played using [expo-av](https://docs.expo.dev/versions/latest/sdk/av/).
+
+## Example
+
+Here is an example of how to use the video support in React Native Skia. This example demonstrates how to load and display video frames within a canvas, applying a color matrix for visual effects. Tapping the screen will pause and play the video.
+
+```tsx twoslash
+import React from "react";
+import {
+ Canvas,
+ ColorMatrix,
+ Fill,
+ ImageShader,
+ useVideo
+} from "@shopify/react-native-skia";
+import { Pressable, useWindowDimensions } from "react-native";
+import { useSharedValue } from "react-native-reanimated";
+
+interface VideoExampleProps {
+ localVideoFile: string;
+}
+
+// The URL needs to be a local path, we usually use expo-asset for that.
+export const VideoExample = ({ localVideoFile }: VideoExampleProps) => {
+ const paused = useSharedValue(false);
+ const { width, height } = useWindowDimensions();
+ const video = useVideo(
+ require(localVideoFile),
+ {
+ paused,
+ }
+ );
+ return (
+ (paused.value = !paused.value)}
+ >
+
+
+ );
+};
+```
+
+## Using expo-asset
+
+Below is an example where we use [expo-asset](https://docs.expo.dev/versions/latest/sdk/asset/) to load the video.
+
+```tsx twoslash
+import { useVideo } from "@shopify/react-native-skia";
+import { useAssets } from "expo-asset";
+
+// Example usage:
+// const video = useVideoFromAsset(require("./BigBuckBunny.mp4"));
+export const useVideoFromAsset = (
+ mod: number,
+ options?: Parameters[1]
+) => {
+ const [assets, error] = useAssets([mod]);
+ if (error) {
+ throw error;
+ }
+ return useVideo(assets ? assets[0].localUri : null, options);
+};
+```
\ No newline at end of file
diff --git a/docs/package.json b/docs/package.json
index 73b42014a5..f039f15d0f 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -23,6 +23,7 @@
"@svgr/webpack": "^5.5.0",
"clsx": "^1.1.1",
"docusaurus-preset-shiki-twoslash": "1.1.41",
+ "expo-asset": "^10.0.6",
"file-loader": "^6.2.0",
"its-fine": "^1.0.8",
"prism-react-renderer": "^1.2.1",
diff --git a/docs/sidebars.js b/docs/sidebars.js
index a24c18af56..52f464f48c 100644
--- a/docs/sidebars.js
+++ b/docs/sidebars.js
@@ -63,6 +63,11 @@ const sidebars = {
label: "Images",
items: ["image", "animated-images", "image-svg", "snapshotviews"],
},
+ {
+ type: "doc",
+ label: "Video",
+ id: "video",
+ },
{
collapsed: true,
type: "category",
diff --git a/docs/yarn.lock b/docs/yarn.lock
index 00af06df03..07321c81b7 100644
--- a/docs/yarn.lock
+++ b/docs/yarn.lock
@@ -159,6 +159,13 @@
"@babel/highlight" "^7.23.4"
chalk "^2.4.2"
+"@babel/code-frame@~7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
+ integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
+ dependencies:
+ "@babel/highlight" "^7.10.4"
+
"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98"
@@ -397,6 +404,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+"@babel/helper-validator-identifier@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62"
+ integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==
+
"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
@@ -420,6 +432,16 @@
"@babel/traverse" "^7.23.9"
"@babel/types" "^7.23.9"
+"@babel/highlight@^7.10.4":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e"
+ integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.24.5"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
"@babel/highlight@^7.23.4":
version "7.23.4"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b"
@@ -1845,6 +1867,72 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
+"@expo/config-plugins@~8.0.0":
+ version "8.0.4"
+ resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.4.tgz#1e781cd971fab27409ed2f8d621db6d29cce3036"
+ integrity sha512-Hi+xuyNWE2LT4LVbGttHJgl9brnsdWAhEB42gWKb5+8ae86Nr/KwUBQJsJppirBYTeLjj5ZlY0glYnAkDa2jqw==
+ dependencies:
+ "@expo/config-types" "^51.0.0-unreleased"
+ "@expo/json-file" "~8.3.0"
+ "@expo/plist" "^0.1.0"
+ "@expo/sdk-runtime-versions" "^1.0.0"
+ chalk "^4.1.2"
+ debug "^4.3.1"
+ find-up "~5.0.0"
+ getenv "^1.0.0"
+ glob "7.1.6"
+ resolve-from "^5.0.0"
+ semver "^7.5.4"
+ slash "^3.0.0"
+ slugify "^1.6.6"
+ xcode "^3.0.1"
+ xml2js "0.6.0"
+
+"@expo/config-types@^51.0.0-unreleased":
+ version "51.0.0"
+ resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-51.0.0.tgz#f5df238cd1237d7e4d9cc8217cdef3383c2a00cf"
+ integrity sha512-acn03/u8mQvBhdTQtA7CNhevMltUhbSrpI01FYBJwpVntufkU++ncQujWKlgY/OwIajcfygk1AY4xcNZ5ImkRA==
+
+"@expo/config@~9.0.0-beta.0":
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/@expo/config/-/config-9.0.2.tgz#112b93436dbca8aa3da73a46329e5b58fdd435d2"
+ integrity sha512-BKQ4/qBf3OLT8hHp5kjObk2vxwoRQ1yYQBbG/OM9Jdz32yYtrU8opTbKRAxfZEWH5i3ZHdLrPdC1rO0I6WxtTw==
+ dependencies:
+ "@babel/code-frame" "~7.10.4"
+ "@expo/config-plugins" "~8.0.0"
+ "@expo/config-types" "^51.0.0-unreleased"
+ "@expo/json-file" "^8.3.0"
+ getenv "^1.0.0"
+ glob "7.1.6"
+ require-from-string "^2.0.2"
+ resolve-from "^5.0.0"
+ semver "^7.6.0"
+ slugify "^1.3.4"
+ sucrase "3.34.0"
+
+"@expo/json-file@^8.3.0", "@expo/json-file@~8.3.0":
+ version "8.3.3"
+ resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.3.3.tgz#7926e3592f76030ce63d6b1308ac8f5d4d9341f4"
+ integrity sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A==
+ dependencies:
+ "@babel/code-frame" "~7.10.4"
+ json5 "^2.2.2"
+ write-file-atomic "^2.3.0"
+
+"@expo/plist@^0.1.0":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.3.tgz#b4fbee2c4f7a88512a4853d85319f4d95713c529"
+ integrity sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg==
+ dependencies:
+ "@xmldom/xmldom" "~0.7.7"
+ base64-js "^1.2.3"
+ xmlbuilder "^14.0.0"
+
+"@expo/sdk-runtime-versions@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c"
+ integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==
+
"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0":
version "9.3.0"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb"
@@ -2252,6 +2340,11 @@
resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.72.0.tgz#c82a76a1d86ec0c3907be76f7faf97a32bbed05d"
integrity sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==
+"@react-native/assets-registry@~0.74.83":
+ version "0.74.83"
+ resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.83.tgz#c1815dc10f9e1075e0d03b4c8a9619145969522e"
+ integrity sha512-2vkLMVnp+YTZYTNSDIBZojSsjz8sl5PscP3j4GcV6idD8V978SZfwFlk8K0ti0BzRs11mzL0Pj17km597S/eTQ==
+
"@react-native/codegen@^0.72.8":
version "0.72.8"
resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.72.8.tgz#0593f628e1310f430450a9479fbb4be35e7b63d6"
@@ -2290,9 +2383,7 @@
"@shopify/react-native-skia@link:../package":
version "0.0.0"
- dependencies:
- canvaskit-wasm "0.39.1"
- react-reconciler "0.27.0"
+ uid ""
"@sideway/address@^4.1.5":
version "4.1.5"
@@ -3190,6 +3281,16 @@
resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.21.tgz#b181202daec30d66ccd67264de23814cfd176d3a"
integrity sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==
+"@xmldom/xmldom@^0.8.8":
+ version "0.8.10"
+ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
+ integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
+
+"@xmldom/xmldom@~0.7.7":
+ version "0.7.13"
+ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3"
+ integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==
+
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
@@ -3379,6 +3480,11 @@ ansi-styles@^6.1.0:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+any-promise@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+ integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==
+
anymatch@^3.0.3, anymatch@~3.1.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
@@ -3677,7 +3783,7 @@ base16@^1.0.0:
resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70"
integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==
-base64-js@^1.1.2, base64-js@^1.3.1:
+base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
@@ -3687,6 +3793,11 @@ batch@0.6.1:
resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==
+big-integer@1.6.x:
+ version "1.6.52"
+ resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85"
+ integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==
+
big.js@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
@@ -3765,6 +3876,20 @@ boxen@^6.2.1:
widest-line "^4.0.1"
wrap-ansi "^8.0.1"
+bplist-creator@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e"
+ integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==
+ dependencies:
+ stream-buffers "2.2.x"
+
+bplist-parser@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1"
+ integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==
+ dependencies:
+ big-integer "1.6.x"
+
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -3797,6 +3922,24 @@ bser@2.1.1:
dependencies:
node-int64 "^0.4.0"
+buffer-alloc-unsafe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+ integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+ integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+ dependencies:
+ buffer-alloc-unsafe "^1.1.0"
+ buffer-fill "^1.0.0"
+
+buffer-fill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+ integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==
+
buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
@@ -4168,6 +4311,11 @@ commander@^2.20.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+commander@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+ integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+
commander@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
@@ -5401,6 +5549,23 @@ execa@^5.0.0:
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
+expo-asset@^10.0.6:
+ version "10.0.6"
+ resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-10.0.6.tgz#0894c4e824ce90e130852e6eecaba386e9f2e5aa"
+ integrity sha512-waP73/ccn/HZNNcGM4/s3X3icKjSSbEQ9mwc6tX34oYNg+XE5WdwOuZ9wgVVFrU7wZMitq22lQXd2/O0db8bxg==
+ dependencies:
+ "@react-native/assets-registry" "~0.74.83"
+ expo-constants "~16.0.0"
+ invariant "^2.2.4"
+ md5-file "^3.2.3"
+
+expo-constants@~16.0.0:
+ version "16.0.1"
+ resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-16.0.1.tgz#1285e29c85513c6e88e118289e2baab72596d3f7"
+ integrity sha512-s6aTHtglp926EsugWtxN7KnpSsE9FCEjb7CgEjQQ78Gpu4btj4wB+IXot2tlqNwqv+x7xFe5veoPGfJDGF/kVg==
+ dependencies:
+ "@expo/config" "~9.0.0-beta.0"
+
express@^4.17.3:
version "4.19.2"
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
@@ -5639,7 +5804,7 @@ find-up@^4.0.0, find-up@^4.1.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
-find-up@^5.0.0:
+find-up@^5.0.0, find-up@~5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
@@ -5856,6 +6021,11 @@ get-symbol-description@^1.0.0:
call-bind "^1.0.2"
get-intrinsic "^1.1.1"
+getenv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31"
+ integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==
+
github-slugger@^1.4.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d"
@@ -5880,6 +6050,18 @@ glob-to-regexp@^0.4.1:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+glob@7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.6:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
@@ -7094,7 +7276,7 @@ json5@^1.0.2:
dependencies:
minimist "^1.2.0"
-json5@^2.1.2, json5@^2.2.3:
+json5@^2.1.2, json5@^2.2.2, json5@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
@@ -7365,6 +7547,13 @@ markdown-escapes@^1.0.0:
resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535"
integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
+md5-file@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f"
+ integrity sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==
+ dependencies:
+ buffer-alloc "^1.1.0"
+
mdast-squeeze-paragraphs@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97"
@@ -7873,6 +8062,15 @@ multicast-dns@^7.2.5:
dns-packet "^5.2.2"
thunky "^1.0.2"
+mz@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+ integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+ dependencies:
+ any-promise "^1.0.0"
+ object-assign "^4.0.1"
+ thenify-all "^1.0.0"
+
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
@@ -8008,7 +8206,7 @@ ob1@0.76.8:
resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.8.tgz#ac4c459465b1c0e2c29aaa527e09fc463d3ffec8"
integrity sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==
-object-assign@^4.1.0, object-assign@^4.1.1:
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
@@ -8385,7 +8583,7 @@ pify@^4.0.1:
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
-pirates@^4.0.6:
+pirates@^4.0.1, pirates@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
@@ -8411,6 +8609,15 @@ pkg-up@^3.1.0:
dependencies:
find-up "^3.0.0"
+plist@^3.0.5:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9"
+ integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==
+ dependencies:
+ "@xmldom/xmldom" "^0.8.8"
+ base64-js "^1.5.1"
+ xmlbuilder "^15.1.1"
+
postcss-calc@^8.2.3:
version "8.2.4"
resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5"
@@ -9468,6 +9675,11 @@ resolve-from@^4.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
resolve-pathname@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd"
@@ -9593,7 +9805,7 @@ safe-regex-test@^1.0.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-sax@^1.2.4:
+sax@>=0.6.0, sax@^1.2.4:
version "1.3.0"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0"
integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==
@@ -9706,6 +9918,11 @@ semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.5.2, semver@^7.5.4:
dependencies:
lru-cache "^6.0.0"
+semver@^7.6.0:
+ version "7.6.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
+ integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
+
send@0.18.0:
version "0.18.0"
resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
@@ -9885,6 +10102,15 @@ signal-exit@^3.0.2, signal-exit@^3.0.3:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+simple-plist@^1.1.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017"
+ integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==
+ dependencies:
+ bplist-creator "0.1.0"
+ bplist-parser "0.3.1"
+ plist "^3.0.5"
+
sirv@^2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0"
@@ -9928,6 +10154,11 @@ slice-ansi@^2.0.0:
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
+slugify@^1.3.4, slugify@^1.6.6:
+ version "1.6.6"
+ resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b"
+ integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==
+
sockjs@^0.3.24:
version "0.3.24"
resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce"
@@ -10047,6 +10278,11 @@ std-env@^3.0.1:
resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2"
integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==
+stream-buffers@2.2.x:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4"
+ integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==
+
string-natural-compare@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4"
@@ -10210,6 +10446,19 @@ stylehacks@^5.1.1:
browserslist "^4.21.4"
postcss-selector-parser "^6.0.4"
+sucrase@3.34.0:
+ version "3.34.0"
+ resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f"
+ integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.2"
+ commander "^4.0.0"
+ glob "7.1.6"
+ lines-and-columns "^1.1.6"
+ mz "^2.7.0"
+ pirates "^4.0.1"
+ ts-interface-checker "^0.1.9"
+
sudo-prompt@^9.0.0:
version "9.2.1"
resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd"
@@ -10321,6 +10570,20 @@ text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+thenify-all@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+ integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==
+ dependencies:
+ thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
+ integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
+ dependencies:
+ any-promise "^1.0.0"
+
throat@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b"
@@ -10406,6 +10669,11 @@ ts-api-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331"
integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==
+ts-interface-checker@^0.1.9:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
+ integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
+
tsconfig-paths@^3.14.1:
version "3.15.0"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4"
@@ -10842,6 +11110,11 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+uuid@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
+ integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
+
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
@@ -11253,6 +11526,14 @@ ws@^8.13.0:
resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4"
integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==
+xcode@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c"
+ integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==
+ dependencies:
+ simple-plist "^1.1.0"
+ uuid "^7.0.3"
+
xdg-basedir@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
@@ -11265,6 +11546,29 @@ xml-js@^1.6.11:
dependencies:
sax "^1.2.4"
+xml2js@0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282"
+ integrity sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~11.0.0"
+
+xmlbuilder@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-14.0.0.tgz#876b5aec4f05ffd5feb97b0a871c855d16fbeb8c"
+ integrity sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==
+
+xmlbuilder@^15.1.1:
+ version "15.1.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"
+ integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==
+
+xmlbuilder@~11.0.0:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+ integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
index 512c0891e7..c8532d3fdb 100644
--- a/example/ios/Podfile.lock
+++ b/example/ios/Podfile.lock
@@ -442,7 +442,7 @@ PODS:
- React-perflogger (= 0.71.7)
- RNGestureHandler (2.9.0):
- React-Core
- - RNReanimated (3.6.2):
+ - RNReanimated (3.11.0):
- RCT-Folly (= 2021.07.22.00)
- React-Core
- ReactCommon/turbomodule/core
@@ -701,7 +701,7 @@ SPEC CHECKSUMS:
React-runtimeexecutor: c5c89f8f543842dd864b63ded1b0bbb9c9445328
ReactCommon: dbfbe2f7f3c5ce4ce44f43f2fd0d5950d1eb67c5
RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
- RNReanimated: 738543ef6ec0024ea0bc9f4ab3ac99af6f068448
+ RNReanimated: c112febb9548b8e0bcc5abddff308f69913c4270
RNScreens: 0df01424e9e0ed7827200d6ed1087ddd06c493f9
RNSVG: c1e76b81c76cdcd34b4e1188852892dc280eb902
SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17
diff --git a/example/jestSetup.mjs b/example/jestSetup.mjs
index 067758ab06..52726852af 100644
--- a/example/jestSetup.mjs
+++ b/example/jestSetup.mjs
@@ -10,6 +10,10 @@ JestUtils.setUpTests();
global.__reanimatedWorkletInit = () => {};
global.CanvasKit = await CanvasKitInit({});
+jest.mock("expo-asset", () => ({
+ useAssets: () => [[], undefined],
+}));
+
jest.mock("react-native-reanimated", () => {
// The mock for `call` immediately calls the callback which is incorrect
// So we override it with a no-op
diff --git a/example/package.json b/example/package.json
index dfff048074..73054d43b4 100644
--- a/example/package.json
+++ b/example/package.json
@@ -33,7 +33,7 @@
"react-dom": "18.0.0",
"react-native": "0.71.7",
"react-native-gesture-handler": "2.9.0",
- "react-native-reanimated": "3.6.2",
+ "react-native-reanimated": "3.11.0",
"react-native-safe-area-context": "4.3.4",
"react-native-screens": "3.17.0",
"react-native-svg": "13.8.0",
diff --git a/example/src/App.tsx b/example/src/App.tsx
index 4298fe44ae..4fd9c447a9 100644
--- a/example/src/App.tsx
+++ b/example/src/App.tsx
@@ -29,6 +29,7 @@ import {
Stickers,
FrostedCard,
SpeedTest,
+ Video,
} from "./Examples";
import { CI, Tests } from "./Tests";
import { HomeScreen } from "./Home";
@@ -61,6 +62,7 @@ const linking: LinkingOptions = {
Stickers: "stickers",
FrostedCard: "frosted-card",
SpeedTest: "speedtest",
+ Video: "video",
},
},
prefixes: ["rnskia://"],
@@ -194,6 +196,13 @@ const App = () => {
header: () => null,
}}
/>
+ null,
+ }}
+ />
{
+ const paused = useSharedValue(false);
+ const { width, height } = useWindowDimensions();
+ const video = useVideoFromAsset(
+ require("../../Tests/assets/BigBuckBunny.mp4"),
+ {
+ paused,
+ looping: true,
+ }
+ );
+ return (
+ (paused.value = !paused.value)}
+ >
+
+
+ );
+};
diff --git a/example/src/Examples/Video/index.ts b/example/src/Examples/Video/index.ts
new file mode 100644
index 0000000000..ba5f73c1ad
--- /dev/null
+++ b/example/src/Examples/Video/index.ts
@@ -0,0 +1 @@
+export * from "./Video";
diff --git a/example/src/Examples/index.ts b/example/src/Examples/index.ts
index 9bce87b6d5..024a807cae 100644
--- a/example/src/Examples/index.ts
+++ b/example/src/Examples/index.ts
@@ -23,3 +23,4 @@ export * from "./Transitions";
export * from "./Stickers";
export * from "./FrostedCard";
export * from "./SpeedTest";
+export * from "./Video";
diff --git a/example/src/Home/HomeScreen.tsx b/example/src/Home/HomeScreen.tsx
index 1a7f5bac70..a96f939d12 100644
--- a/example/src/Home/HomeScreen.tsx
+++ b/example/src/Home/HomeScreen.tsx
@@ -103,6 +103,7 @@ export const HomeScreen = () => {
description="Drawing Performance Test"
route="Performance"
/>
+
{
const newProps: SerializedProps = {};
+ newProps.localAssets = assets.localAssets.map((asset: string) => asset);
Object.keys(props).forEach((key) => {
const value = parseProp(props[key], assets);
newProps[key] = value;
diff --git a/example/src/Tests/useAssets.ts b/example/src/Tests/useAssets.ts
index 96e95ec425..13e8038b6d 100644
--- a/example/src/Tests/useAssets.ts
+++ b/example/src/Tests/useAssets.ts
@@ -5,6 +5,7 @@ import {
} from "@shopify/react-native-skia";
import { useCallback, useState } from "react";
import { Platform } from "react-native";
+import { useAssets as useExpoAssets } from "expo-asset";
const SkiaLogo =
Platform.OS === "web" ? require("./assets/skia_logo.png") : "skia_logo";
@@ -20,6 +21,9 @@ const NotoColorEmojiSrc =
: require("./assets/NotoColorEmoji.ttf");
export const useAssets = () => {
+ const [expoAssets, expoAssetsError] = useExpoAssets([
+ require("./assets/BigBuckBunny.mp4"),
+ ]);
const [error, setError] = useState(null);
const errorHandler = useCallback((e: Error) => setError(e), []);
const mask = useImage(require("./assets/mask.png"), errorHandler);
@@ -46,7 +50,11 @@ export const useAssets = () => {
if (error) {
throw new Error("Failed to load assets: " + error.message);
}
+ if (expoAssetsError) {
+ throw new Error("Failed to load expo assets: " + expoAssetsError.message);
+ }
if (
+ !expoAssets ||
!RobotoMedium ||
!oslo ||
!NotoColorEmoji ||
@@ -60,6 +68,7 @@ export const useAssets = () => {
return null;
}
return {
+ localAssets: expoAssets.map((asset) => asset.localUri),
RobotoMedium,
NotoColorEmoji,
NotoSansSCRegular,
diff --git a/example/src/assets/videos/bunny.mp4 b/example/src/assets/videos/bunny.mp4
new file mode 100644
index 0000000000..97cf366007
Binary files /dev/null and b/example/src/assets/videos/bunny.mp4 differ
diff --git a/example/src/components/Animations.tsx b/example/src/components/Animations.tsx
index c80d3c5e51..d5e5d7c1a7 100644
--- a/example/src/components/Animations.tsx
+++ b/example/src/components/Animations.tsx
@@ -1,4 +1,6 @@
import type { Vector } from "@shopify/react-native-skia";
+import { useVideo } from "@shopify/react-native-skia";
+import { useAssets } from "expo-asset";
import { useEffect } from "react";
import {
Easing,
@@ -8,6 +10,17 @@ import {
withTiming,
} from "react-native-reanimated";
+export const useVideoFromAsset = (
+ mod: number,
+ options?: Parameters[1]
+) => {
+ const [assets, error] = useAssets([mod]);
+ if (error) {
+ throw error;
+ }
+ return useVideo(assets ? assets[0].localUri : null, options);
+};
+
export const useLoop = ({ duration }: { duration: number }) => {
const progress = useSharedValue(0);
useEffect(() => {
@@ -30,3 +43,15 @@ export const translate = ({
"worklet";
return [{ translateX: x }, { translateY: y }];
};
+
+export const snapPoint = (
+ value: number,
+ velocity: number,
+ points: ReadonlyArray
+): number => {
+ "worklet";
+ const point = value + 0.2 * velocity;
+ const deltas = points.map((p) => Math.abs(point - p));
+ const minDelta = Math.min.apply(null, deltas);
+ return points.filter((p) => Math.abs(point - p) === minDelta)[0];
+};
diff --git a/example/src/types.ts b/example/src/types.ts
index 3c328500ff..08ffe4268e 100644
--- a/example/src/types.ts
+++ b/example/src/types.ts
@@ -25,4 +25,5 @@ export type StackParamList = {
Stickers: undefined;
FrostedCard: undefined;
SpeedTest: undefined;
+ Video: undefined;
};
diff --git a/example/yarn.lock b/example/yarn.lock
index 34b6f6bf30..53dd8fcb71 100644
--- a/example/yarn.lock
+++ b/example/yarn.lock
@@ -230,6 +230,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a"
integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==
+"@babel/helper-plugin-utils@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a"
+ integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==
+
"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0"
@@ -669,7 +674,7 @@
"@babel/helper-create-regexp-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.18.6", "@babel/plugin-transform-arrow-functions@^7.24.1":
+"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.0.0-0", "@babel/plugin-transform-arrow-functions@^7.18.6", "@babel/plugin-transform-arrow-functions@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27"
integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==
@@ -899,7 +904,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1":
+"@babel/plugin-transform-nullish-coalescing-operator@^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988"
integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==
@@ -915,13 +920,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-transform-object-assign@^7.16.7":
- version "7.24.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.24.1.tgz#46a70169e56970aafd13a6ae677d5b497fc227e7"
- integrity sha512-I1kctor9iKtupb7jv7FyjApHCuKLBKCblVAeHVK9PB6FW7GI0ac6RtobC3MwwJy8CZ1JxuhQmnbrsqI5G8hAIg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.0"
-
"@babel/plugin-transform-object-rest-spread@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff"
@@ -948,6 +946,15 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+"@babel/plugin-transform-optional-chaining@^7.0.0-0":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f"
+ integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
"@babel/plugin-transform-optional-chaining@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6"
@@ -1070,7 +1077,7 @@
babel-plugin-polyfill-regenerator "^0.6.1"
semver "^6.3.1"
-"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.18.6", "@babel/plugin-transform-shorthand-properties@^7.24.1":
+"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.0.0-0", "@babel/plugin-transform-shorthand-properties@^7.18.6", "@babel/plugin-transform-shorthand-properties@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55"
integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==
@@ -1092,7 +1099,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.18.9", "@babel/plugin-transform-template-literals@^7.24.1":
+"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.0.0-0", "@babel/plugin-transform-template-literals@^7.18.9", "@babel/plugin-transform-template-literals@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7"
integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==
@@ -9177,12 +9184,16 @@ react-native-gradle-plugin@^0.71.17:
resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.19.tgz#3379e28341fcd189bc1f4691cefc84c1a4d7d232"
integrity sha512-1dVk9NwhoyKHCSxcrM6vY6cxmojeATsBobDicX0ZKr7DgUF2cBQRTKsimQFvzH8XhOVXyH8p4HyDSZNIFI8OlQ==
-react-native-reanimated@3.6.2:
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.6.2.tgz#8a48c37251cbd3b665a659444fa9778f5b510356"
- integrity sha512-IIMREMOrxhtK35drfpzh2UhxNqAOHnuvGgtMofj7yHcMj16tmWZR2zFvMUf6z2MfmXv+aVgFQ6TRZ6yKYf7LNA==
+react-native-reanimated@3.11.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.11.0.tgz#d4265d4e0232623f5958ed60e1686ca884fc3452"
+ integrity sha512-BNw/XDgUfs8UhfY1X6IniU8kWpnotWGyt8qmQviaHisTi5lvwnaOdXQKfN1KGONx6ekdFRHRP5EFwLi0UajwKA==
dependencies:
- "@babel/plugin-transform-object-assign" "^7.16.7"
+ "@babel/plugin-transform-arrow-functions" "^7.0.0-0"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0"
+ "@babel/plugin-transform-optional-chaining" "^7.0.0-0"
+ "@babel/plugin-transform-shorthand-properties" "^7.0.0-0"
+ "@babel/plugin-transform-template-literals" "^7.0.0-0"
"@babel/preset-typescript" "^7.16.7"
convert-source-map "^2.0.0"
invariant "^2.2.4"
diff --git a/fabricexample/android/build.gradle b/fabricexample/android/build.gradle
index 34ea718194..85697575aa 100644
--- a/fabricexample/android/build.gradle
+++ b/fabricexample/android/build.gradle
@@ -3,7 +3,7 @@
buildscript {
ext {
buildToolsVersion = "33.0.0"
- minSdkVersion = 21
+ minSdkVersion = 26
compileSdkVersion = 33
targetSdkVersion = 33
diff --git a/fabricexample/jestSetup.mjs b/fabricexample/jestSetup.mjs
index 067758ab06..52726852af 100644
--- a/fabricexample/jestSetup.mjs
+++ b/fabricexample/jestSetup.mjs
@@ -10,6 +10,10 @@ JestUtils.setUpTests();
global.__reanimatedWorkletInit = () => {};
global.CanvasKit = await CanvasKitInit({});
+jest.mock("expo-asset", () => ({
+ useAssets: () => [[], undefined],
+}));
+
jest.mock("react-native-reanimated", () => {
// The mock for `call` immediately calls the callback which is incorrect
// So we override it with a no-op
diff --git a/fabricexample/src/App.tsx b/fabricexample/src/App.tsx
index 4298fe44ae..4fd9c447a9 100644
--- a/fabricexample/src/App.tsx
+++ b/fabricexample/src/App.tsx
@@ -29,6 +29,7 @@ import {
Stickers,
FrostedCard,
SpeedTest,
+ Video,
} from "./Examples";
import { CI, Tests } from "./Tests";
import { HomeScreen } from "./Home";
@@ -61,6 +62,7 @@ const linking: LinkingOptions = {
Stickers: "stickers",
FrostedCard: "frosted-card",
SpeedTest: "speedtest",
+ Video: "video",
},
},
prefixes: ["rnskia://"],
@@ -194,6 +196,13 @@ const App = () => {
header: () => null,
}}
/>
+ null,
+ }}
+ />
{
const { width: wWidth } = useWindowDimensions();
@@ -12,8 +13,10 @@ export const AnimatedImages = () => {
const S2 = 60;
const PAD = (SIZE - S2) / 2;
+ const pause = useSharedValue(false);
const example1 = useAnimatedImageValue(
- require("../../assets/birdFlying.gif")
+ require("../../assets/birdFlying.gif"),
+ pause
);
const example2 = useAnimatedImageValue(
require("../../assets/birdFlying2.gif")
@@ -21,43 +24,45 @@ export const AnimatedImages = () => {
return (
-
-
+ (pause.value = !pause.value)}>
+
+
+
);
};
diff --git a/fabricexample/src/Examples/API/Snapshot.tsx b/fabricexample/src/Examples/API/Snapshot.tsx
index 3289a10227..17b242f9c1 100644
--- a/fabricexample/src/Examples/API/Snapshot.tsx
+++ b/fabricexample/src/Examples/API/Snapshot.tsx
@@ -54,7 +54,7 @@ export const Snapshot = () => {
return (
-
+
diff --git a/fabricexample/src/Examples/Aurora/components/CoonsPatchMeshGradient.tsx b/fabricexample/src/Examples/Aurora/components/CoonsPatchMeshGradient.tsx
index 39557d3d97..fd417036ce 100644
--- a/fabricexample/src/Examples/Aurora/components/CoonsPatchMeshGradient.tsx
+++ b/fabricexample/src/Examples/Aurora/components/CoonsPatchMeshGradient.tsx
@@ -20,7 +20,7 @@ import Animated, {
} from "react-native-reanimated";
import { GestureDetector } from "react-native-gesture-handler";
-import { getSeed, perlin } from "../../../components/Animations";
+import { createNoise2D } from "../../../components/SimpleNoise";
import { symmetric } from "./Math";
import { Cubic } from "./Cubic";
@@ -140,34 +140,32 @@ export const CoonsPatchMeshGradient = ({
})
)
.flat();
- const seeds = defaultMesh.map(() => [getSeed(), getSeed(), getSeed()]);
+ const noises = defaultMesh.map(() => [
+ createNoise2D(),
+ createNoise2D(),
+ createNoise2D(),
+ ]);
const meshNoise = useDerivedValue(() => {
return defaultMesh.map((pt, i) => {
if (isEdge(pt.pos, window)) {
return pt;
}
- const [noisePos, noiseC1, noiseC2] = seeds[i];
+ const [noisePos, noiseC1, noiseC2] = noises[i];
return {
pos: add(
pt.pos,
vec(
- A * perlin(noisePos, clock.value / F, 0),
- A * perlin(noisePos, 0, clock.value / F)
+ A * noisePos(clock.value / F, 0),
+ A * noisePos(0, clock.value / F)
)
),
c1: add(
pt.c1,
- vec(
- A * perlin(noiseC1, clock.value / F, 0),
- A * perlin(noiseC1, 0, clock.value / F)
- )
+ vec(A * noiseC1(clock.value / F, 0), A * noiseC1(0, clock.value / F))
),
c2: add(
pt.c1,
- vec(
- A * perlin(noiseC2, clock.value / F, 0),
- A * perlin(noiseC2, 0, clock.value / F)
- )
+ vec(A * noiseC2(clock.value / F, 0), A * noiseC2(0, clock.value / F))
),
};
});
diff --git a/fabricexample/src/Examples/FrostedCard/FrostedCard.tsx b/fabricexample/src/Examples/FrostedCard/FrostedCard.tsx
index a2e5e55c6e..0ee1c33a47 100644
--- a/fabricexample/src/Examples/FrostedCard/FrostedCard.tsx
+++ b/fabricexample/src/Examples/FrostedCard/FrostedCard.tsx
@@ -29,6 +29,8 @@ const rct = Skia.XYWHRect(
CARD_HEIGHT
);
const rrct = Skia.RRectXY(rct, 10, 10);
+const roundedRectPath = Skia.Path.Make();
+roundedRectPath.addRRect(rrct);
const sf = 300;
const springConfig = (velocity: number) => {
@@ -71,9 +73,8 @@ export const FrostedCard = () => {
const clip = usePathValue((path) => {
"worklet";
- path.addRRect(rrct);
path.transform(matrix.value);
- });
+ }, roundedRectPath);
return (
diff --git a/fabricexample/src/Examples/Severance/Symbol.tsx b/fabricexample/src/Examples/Severance/Symbol.tsx
index 9238ae4943..285a14d21c 100644
--- a/fabricexample/src/Examples/Severance/Symbol.tsx
+++ b/fabricexample/src/Examples/Severance/Symbol.tsx
@@ -11,7 +11,7 @@ import { useWindowDimensions } from "react-native";
import type { SharedValue } from "react-native-reanimated";
import { useDerivedValue } from "react-native-reanimated";
-import { getSeed, perlin } from "../../components/Animations";
+import { createNoise2D } from "../../components/SimpleNoise";
import { FG } from "./Theme";
@@ -35,7 +35,7 @@ export const Symbol = ({ i, j, font, pointer, clock }: SymbolProps) => {
const SIZE = { width: width / COLS, height: height / ROWS };
const x = i * SIZE.width;
const y = j * SIZE.height;
- const noise = getSeed();
+ const noise = createNoise2D();
const text = DIGITS[Math.round(Math.random() * 9)];
const [symbolWidth] = font.getGlyphWidths(font.getGlyphIDs(text));
const origin = vec(x + SIZE.width / 2, y + SIZE.height / 2);
@@ -51,11 +51,11 @@ export const Symbol = ({ i, j, font, pointer, clock }: SymbolProps) => {
[pointer]
);
const dx = useDerivedValue(() => {
- const d = A * perlin(noise, x, clock.value * F);
+ const d = A * noise(x, clock.value * F);
return origin.x - symbolWidth / 2 + d;
}, [clock]);
const dy = useDerivedValue(() => {
- const d = A * perlin(noise, y, clock.value * F);
+ const d = A * noise(y, clock.value * F);
return origin.y + font.getSize() / 2 + d;
}, [clock]);
return (
diff --git a/fabricexample/src/Examples/Vertices/Vertices.tsx b/fabricexample/src/Examples/Vertices/Vertices.tsx
index 5ac91b7a5f..411257c032 100644
--- a/fabricexample/src/Examples/Vertices/Vertices.tsx
+++ b/fabricexample/src/Examples/Vertices/Vertices.tsx
@@ -11,7 +11,7 @@ import {
} from "@shopify/react-native-skia";
import { useDerivedValue } from "react-native-reanimated";
-import { getSeed, perlin } from "../../components/Animations";
+import { createNoise2D } from "../../components/SimpleNoise";
const N = 3;
const n = new Array(N + 1).fill(0).map((_, i) => i);
@@ -48,7 +48,10 @@ export const Demo = () => {
);
const clock = useClock();
- const seeds = new Array(defaultVertices.length).fill(0).map(() => getSeed());
+ const noises = useMemo(
+ () => defaultVertices.map(() => createNoise2D()),
+ [defaultVertices]
+ );
const vertices = useDerivedValue(
() =>
@@ -56,9 +59,10 @@ export const Demo = () => {
if (isEdge(vertex, window)) {
return vertex;
}
+ const noise2d = noises[i];
return {
- x: vertex.x + AX * perlin(seeds[i], clock.value / F, 0),
- y: vertex.y + AY * perlin(seeds[i], 0, clock.value / F),
+ x: vertex.x + AX * noise2d(clock.value / F, 0),
+ y: vertex.y + AY * noise2d(0, clock.value / F),
};
}),
[clock]
diff --git a/fabricexample/src/Examples/Video/Video.tsx b/fabricexample/src/Examples/Video/Video.tsx
new file mode 100644
index 0000000000..de90d4d993
--- /dev/null
+++ b/fabricexample/src/Examples/Video/Video.tsx
@@ -0,0 +1,48 @@
+import React from "react";
+import {
+ Canvas,
+ ColorMatrix,
+ Fill,
+ ImageShader,
+} from "@shopify/react-native-skia";
+import { Pressable, useWindowDimensions } from "react-native";
+import { useSharedValue } from "react-native-reanimated";
+
+import { useVideoFromAsset } from "../../components/Animations";
+
+export const Video = () => {
+ const paused = useSharedValue(false);
+ const { width, height } = useWindowDimensions();
+ const video = useVideoFromAsset(
+ require("../../Tests/assets/BigBuckBunny.mp4"),
+ {
+ paused,
+ looping: true,
+ }
+ );
+ return (
+ (paused.value = !paused.value)}
+ >
+
+
+ );
+};
diff --git a/fabricexample/src/Examples/Video/index.ts b/fabricexample/src/Examples/Video/index.ts
new file mode 100644
index 0000000000..ba5f73c1ad
--- /dev/null
+++ b/fabricexample/src/Examples/Video/index.ts
@@ -0,0 +1 @@
+export * from "./Video";
diff --git a/fabricexample/src/Examples/index.ts b/fabricexample/src/Examples/index.ts
index 9bce87b6d5..024a807cae 100644
--- a/fabricexample/src/Examples/index.ts
+++ b/fabricexample/src/Examples/index.ts
@@ -23,3 +23,4 @@ export * from "./Transitions";
export * from "./Stickers";
export * from "./FrostedCard";
export * from "./SpeedTest";
+export * from "./Video";
diff --git a/fabricexample/src/Home/HomeScreen.tsx b/fabricexample/src/Home/HomeScreen.tsx
index 8a4b636cb2..a96f939d12 100644
--- a/fabricexample/src/Home/HomeScreen.tsx
+++ b/fabricexample/src/Home/HomeScreen.tsx
@@ -48,8 +48,8 @@ export const HomeScreen = () => {
route="Aurora"
/>
{
description="Drawing Performance Test"
route="Performance"
/>
+
{
}}
/>
-
- Hello World!
-
+ Hello World!
{
-
- 👆 This is a Skia Canvas!
-
+ 👆 This is a Skia Canvas!
);
diff --git a/fabricexample/src/Tests/Screens/Snapshot5.tsx b/fabricexample/src/Tests/Screens/Snapshot5.tsx
index 1218a0dfa1..837d147c9c 100644
--- a/fabricexample/src/Tests/Screens/Snapshot5.tsx
+++ b/fabricexample/src/Tests/Screens/Snapshot5.tsx
@@ -1,4 +1,4 @@
-import React from "react";
+import React, { useState } from "react";
import { ScrollView, StyleSheet, View } from "react-native";
export const Snapshot5 = () => {
@@ -12,12 +12,15 @@ export const Snapshot5 = () => {
};
const Component = () => {
+ const [r, setRender] = useState(0);
+ console.log({ r });
return (
<>
{
ref?.scrollTo({ y: 200 });
+ setRender((p) => p + 1);
}}
>
@@ -30,6 +33,7 @@ const Component = () => {
horizontal
ref={(ref) => {
ref?.scrollTo({ x: 200 });
+ setRender((p) => p + 1);
}}
>
diff --git a/fabricexample/src/Tests/Tests.tsx b/fabricexample/src/Tests/Tests.tsx
index d67bca01b6..185e1ed8d2 100644
--- a/fabricexample/src/Tests/Tests.tsx
+++ b/fabricexample/src/Tests/Tests.tsx
@@ -8,7 +8,7 @@ import {
Skia,
} from "@shopify/react-native-skia";
import React, { useEffect, useRef, useState } from "react";
-import { PixelRatio, Platform, Text, View } from "react-native";
+import { PixelRatio, Text, View } from "react-native";
import type { SerializedNode } from "./deserialize";
import { parseNode, parseProps } from "./deserialize";
@@ -19,9 +19,7 @@ export const CI = process.env.CI === "true";
const s = 3;
const scale = s / PixelRatio.get();
const size = 256 * scale;
-// Maximum time to draw: 250 on iOS, 500ms on Android, 1000ms on CI
-// eslint-disable-next-line no-nested-ternary
-const timeToDraw = CI ? 1500 : Platform.OS === "ios" ? 250 : 500;
+const timeToDraw = CI ? 1500 : 500;
interface TestsProps {
assets: { [key: string]: any };
@@ -116,7 +114,7 @@ export const Tests = ({ assets }: TestsProps) => {
{client === null
- ? `⚪️ Connecting to server: ${hostname}. Make sure to run \`yarn e2e\` or similar`
+ ? `⚪️ Connecting to ${hostname}. Use yarn e2e to run tests.`
: "🟢 Waiting for the server to send tests"}