From cd1e899edbdab38768c21a093bbd7f021aa1ba0d Mon Sep 17 00:00:00 2001 From: adithyavis Date: Thu, 9 Jul 2026 21:46:44 +0530 Subject: [PATCH 01/23] feat: web support --- example/app.json | 4 + example/index.js | 1 + example/index.web.js | 9 + example/package.json | 9 +- yarn.lock | 682 ++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 698 insertions(+), 7 deletions(-) create mode 100644 example/index.js create mode 100644 example/index.web.js diff --git a/example/app.json b/example/app.json index dca902d..95a3cb8 100644 --- a/example/app.json +++ b/example/app.json @@ -13,6 +13,10 @@ "android": { "package": "com.canvaskit.example" }, + "web": { + "bundler": "metro", + "output": "single" + }, "plugins": ["expo-router"] } } diff --git a/example/index.js b/example/index.js new file mode 100644 index 0000000..5b83418 --- /dev/null +++ b/example/index.js @@ -0,0 +1 @@ +import 'expo-router/entry'; diff --git a/example/index.web.js b/example/index.web.js new file mode 100644 index 0000000..de45bef --- /dev/null +++ b/example/index.web.js @@ -0,0 +1,9 @@ +import { LoadSkiaWeb } from '@shopify/react-native-skia/lib/module/web'; +import canvaskit from 'canvaskit-wasm/package.json'; + +LoadSkiaWeb({ + locateFile: (file) => + `https://cdn.jsdelivr.net/npm/canvaskit-wasm@${canvaskit.version}/bin/full/${file}`, +}).then(() => { + require('expo-router/entry'); +}); diff --git a/example/package.json b/example/package.json index 6c8483c..e06af27 100644 --- a/example/package.json +++ b/example/package.json @@ -2,28 +2,33 @@ "name": "react-native-canvas-kit-example", "version": "0.0.1", "private": true, - "main": "expo-router/entry", + "main": "index.js", "scripts": { "start": "expo start --dev-client", "android": "expo run:android", "ios": "expo run:ios", + "web": "expo start --web", "prebuild": "expo prebuild" }, "dependencies": { + "@expo/metro-runtime": "~6.1.2", "@react-navigation/drawer": "^7.5.0", "@react-navigation/native": "^7.1.8", "@shopify/react-native-skia": "2.2.3", + "canvaskit-wasm": "0.40.0", "expo": "~54.0.0", "expo-constants": "~18.0.8", "expo-linking": "~8.0.8", "expo-router": "~6.0.0", "expo-status-bar": "~3.0.8", "react": "19.1.0", + "react-dom": "19.1.0", "react-native": "0.81.5", "react-native-gesture-handler": "~2.28.0", "react-native-reanimated": "~4.1.0", "react-native-safe-area-context": "~5.6.0", "react-native-screens": "~4.16.0", + "react-native-web": "^0.21.0", "react-native-worklets": "0.5.1" }, "devDependencies": { @@ -31,6 +36,8 @@ "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", "@types/react": "~19.1.0", + "@types/react-dom": "^19", + "@types/react-native-web": "^0", "babel-preset-expo": "~54.0.0", "react-native-builder-bob": "^0.41.0", "react-native-monorepo-config": "^0.3.3" diff --git a/yarn.lock b/yarn.lock index c96608d..baf74dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1543,7 +1543,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.25.0": +"@babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.25.0": version: 7.29.7 resolution: "@babel/runtime@npm:7.29.7" checksum: 10c0/ca11572f7146b21e0bde6a9ed4bb6a89eafbee5f0944c7eb54d0d8a2dac962c33638a1d611e14faa71dfbb92b4b5f9236232208568a6b7d5c6f3f39ddb91771e @@ -2239,7 +2239,7 @@ __metadata: languageName: node linkType: hard -"@expo/metro-runtime@npm:^6.1.2": +"@expo/metro-runtime@npm:^6.1.2, @expo/metro-runtime@npm:~6.1.2": version: 6.1.2 resolution: "@expo/metro-runtime@npm:6.1.2" dependencies: @@ -3758,6 +3758,13 @@ __metadata: languageName: node linkType: hard +"@react-native/assets-registry@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/assets-registry@npm:0.86.0" + checksum: 10c0/9cd7e96d99bb5b1da0b83ad4362966749c367081bd4272ca65c8ce4933cea9caad6bbf1d6e404832447c9b200495d707809bbb1db2fd5d9a6f7ae25a50a96bf8 + languageName: node + linkType: hard + "@react-native/babel-plugin-codegen@npm:0.81.4": version: 0.81.4 resolution: "@react-native/babel-plugin-codegen@npm:0.81.4" @@ -3922,6 +3929,23 @@ __metadata: languageName: node linkType: hard +"@react-native/codegen@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/codegen@npm:0.86.0" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/parser": "npm:^7.29.0" + hermes-parser: "npm:0.36.0" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + tinyglobby: "npm:^0.2.15" + yargs: "npm:^17.6.2" + peerDependencies: + "@babel/core": "*" + checksum: 10c0/22ca5657595438f5e464223a65b25567b3e7106995c8ae59c5853d8cdb3df59065db54c4cb74e958bbe2930b0aded8cd518c2fc1ef13a4740a05fb1faa3ae160 + languageName: node + linkType: hard + "@react-native/community-cli-plugin@npm:0.81.5": version: 0.81.5 resolution: "@react-native/community-cli-plugin@npm:0.81.5" @@ -3945,6 +3969,29 @@ __metadata: languageName: node linkType: hard +"@react-native/community-cli-plugin@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/community-cli-plugin@npm:0.86.0" + dependencies: + "@react-native/dev-middleware": "npm:0.86.0" + debug: "npm:^4.4.0" + invariant: "npm:^2.2.4" + metro: "npm:^0.84.3" + metro-config: "npm:^0.84.3" + metro-core: "npm:^0.84.3" + semver: "npm:^7.1.3" + peerDependencies: + "@react-native-community/cli": "*" + "@react-native/metro-config": 0.86.0 + peerDependenciesMeta: + "@react-native-community/cli": + optional: true + "@react-native/metro-config": + optional: true + checksum: 10c0/62c70f1e99eb48dad8516fed9a15415e8de85ee76018f00231f4473e9fedbfc8c9b4932fc531b9307c3a6d681278b61fa7e63ba2fa250628451662f815a3366e + languageName: node + linkType: hard + "@react-native/debugger-frontend@npm:0.81.5": version: 0.81.5 resolution: "@react-native/debugger-frontend@npm:0.81.5" @@ -3952,6 +3999,24 @@ __metadata: languageName: node linkType: hard +"@react-native/debugger-frontend@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/debugger-frontend@npm:0.86.0" + checksum: 10c0/bc86a765dfbcaae35f501244d5a52aa0723196fe34ba177c2e3398491df6af1aa084ace044fde668e05bfec3daf15f735c20c79a8b98bd578b38891913e337e2 + languageName: node + linkType: hard + +"@react-native/debugger-shell@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/debugger-shell@npm:0.86.0" + dependencies: + cross-spawn: "npm:^7.0.6" + debug: "npm:^4.4.0" + fb-dotslash: "npm:0.5.8" + checksum: 10c0/4cc7626b826195403c9b9ac8ad1ed9938ad83858424aa59b980882349966aa0fa6b509066006bc7c7be2c0d20767fbc7d75c8df0007f853b57646c9157fcb3e7 + languageName: node + linkType: hard + "@react-native/dev-middleware@npm:0.81.5": version: 0.81.5 resolution: "@react-native/dev-middleware@npm:0.81.5" @@ -3971,6 +4036,26 @@ __metadata: languageName: node linkType: hard +"@react-native/dev-middleware@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/dev-middleware@npm:0.86.0" + dependencies: + "@isaacs/ttlcache": "npm:^1.4.1" + "@react-native/debugger-frontend": "npm:0.86.0" + "@react-native/debugger-shell": "npm:0.86.0" + chrome-launcher: "npm:^0.15.2" + chromium-edge-launcher: "npm:^0.3.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + open: "npm:^7.0.3" + serve-static: "npm:^1.16.2" + ws: "npm:^7.5.10" + checksum: 10c0/14e704d723d7c3eaae94552251b50b31b3769dbfbc2b48f6cabe422b1bfc640dae20751997d8fd8bbe26a22c6865a46083e4d3621d7b200b19c79e515ef54bb9 + languageName: node + linkType: hard + "@react-native/eslint-config@npm:0.81.4": version: 0.81.4 resolution: "@react-native/eslint-config@npm:0.81.4" @@ -4008,6 +4093,13 @@ __metadata: languageName: node linkType: hard +"@react-native/gradle-plugin@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/gradle-plugin@npm:0.86.0" + checksum: 10c0/02d8f7ae14c3163a6acf7098b1227a7ffd66cbfde96b6b151a02739bfbc27f123e023bd3411383e9a7a33f18e4d4d82100448615b8955a0ff95e8dee5d1ef4e8 + languageName: node + linkType: hard + "@react-native/js-polyfills@npm:0.81.5": version: 0.81.5 resolution: "@react-native/js-polyfills@npm:0.81.5" @@ -4015,6 +4107,13 @@ __metadata: languageName: node linkType: hard +"@react-native/js-polyfills@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/js-polyfills@npm:0.86.0" + checksum: 10c0/63379d40d37b09fe371cc4f8a60304479ee59667a032072dded0b1e475519ff17f27bbaa39fcd463949ea9068c65eb045d5d4639ede8236a241f6e3cd295174c + languageName: node + linkType: hard + "@react-native/normalize-colors@npm:0.81.5": version: 0.81.5 resolution: "@react-native/normalize-colors@npm:0.81.5" @@ -4022,6 +4121,20 @@ __metadata: languageName: node linkType: hard +"@react-native/normalize-colors@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/normalize-colors@npm:0.86.0" + checksum: 10c0/d836506a642e1c636015fca23c84ca372b10fb1457df98f95e8bc5716399292d5740b94efe13f9be08c21323ddc3c2c45205d316f0f5440f24e5919b5075f69a + languageName: node + linkType: hard + +"@react-native/normalize-colors@npm:^0.74.1": + version: 0.74.89 + resolution: "@react-native/normalize-colors@npm:0.74.89" + checksum: 10c0/6d0e5c91793ca5a66b4a0e5995361f474caacac56bde4772ac02b8ab470bd323076c567bd8856b0b097816d2b890e73a4040a3df01fd284adee683f5ba89d5ba + languageName: node + linkType: hard + "@react-native/virtualized-lists@npm:0.81.5": version: 0.81.5 resolution: "@react-native/virtualized-lists@npm:0.81.5" @@ -4039,6 +4152,23 @@ __metadata: languageName: node linkType: hard +"@react-native/virtualized-lists@npm:0.86.0": + version: 0.86.0 + resolution: "@react-native/virtualized-lists@npm:0.86.0" + dependencies: + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + peerDependencies: + "@types/react": ^19.2.0 + react: "*" + react-native: 0.86.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/df5006e01e2f527f4fd46b93db17f3dbf8fd18c832e4ad9b1b43c544a83b4b2fca34ba72114ad9679968043e7fa6f9fe352bcee250799b9b973d0998b446ca50 + languageName: node + linkType: hard + "@react-navigation/bottom-tabs@npm:^7.4.0": version: 7.18.8 resolution: "@react-navigation/bottom-tabs@npm:7.18.8" @@ -4444,6 +4574,25 @@ __metadata: languageName: node linkType: hard +"@types/react-dom@npm:^19": + version: 19.2.3 + resolution: "@types/react-dom@npm:19.2.3" + peerDependencies: + "@types/react": ^19.2.0 + checksum: 10c0/b486ebe0f4e2fb35e2e108df1d8fc0927ca5d6002d5771e8a739de11239fe62d0e207c50886185253c99eb9dedfeeb956ea7429e5ba17f6693c7acb4c02f8cd1 + languageName: node + linkType: hard + +"@types/react-native-web@npm:^0": + version: 0.19.2 + resolution: "@types/react-native-web@npm:0.19.2" + dependencies: + "@types/react": "npm:*" + react-native: "npm:*" + checksum: 10c0/df5a0cc071251a9626fef9aeb3e9e1e2e44a4465138cbdea01e80a7315a4a48c9da89e0d25672fda7a1c44decea9c9928f237d5367e33e7fb057f5c6402ca71d + languageName: node + linkType: hard + "@types/react@npm:~19.1.0": version: 19.1.17 resolution: "@types/react@npm:19.1.17" @@ -5201,7 +5350,7 @@ __metadata: languageName: node linkType: hard -"asap@npm:~2.0.6": +"asap@npm:~2.0.3, asap@npm:~2.0.6": version: 2.0.6 resolution: "asap@npm:2.0.6" checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d @@ -5410,6 +5559,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:0.36.0": + version: 0.36.0 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.36.0" + dependencies: + hermes-parser: "npm:0.36.0" + checksum: 10c0/3c20d2b2595e890bf7bf14b48a1dc6eb2ad2625e04f942254f3676440e20489eb8266fba8f8077194d294dfb67552b6b969bb40b93c873b88fdc319528dc2606 + languageName: node + linkType: hard + "babel-plugin-syntax-hermes-parser@npm:^0.34.0": version: 0.34.0 resolution: "babel-plugin-syntax-hermes-parser@npm:0.34.0" @@ -5908,6 +6066,19 @@ __metadata: languageName: node linkType: hard +"chromium-edge-launcher@npm:^0.3.0": + version: 0.3.0 + resolution: "chromium-edge-launcher@npm:0.3.0" + dependencies: + "@types/node": "npm:*" + escape-string-regexp: "npm:^4.0.0" + is-wsl: "npm:^2.2.0" + lighthouse-logger: "npm:^1.0.0" + mkdirp: "npm:^1.0.4" + checksum: 10c0/ad04a75bf53ebed0b7adc5bd133587369b0c2e55c92fe460eb6ccec5efe03c161a7466756173969867a2acbe02dd40449186bd74671dd892520492283d4ff43d + languageName: node + linkType: hard + "ci-info@npm:^2.0.0": version: 2.0.0 resolution: "ci-info@npm:2.0.0" @@ -6358,6 +6529,15 @@ __metadata: languageName: node linkType: hard +"cross-fetch@npm:^3.1.5": + version: 3.2.0 + resolution: "cross-fetch@npm:3.2.0" + dependencies: + node-fetch: "npm:^2.7.0" + checksum: 10c0/d8596adf0269130098a676f6739a0922f3cc7b71cc89729925411ebe851a87026171c82ea89154c4811c9867c01c44793205a52e618ce2684650218c7fbeeb9f + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -6369,6 +6549,15 @@ __metadata: languageName: node linkType: hard +"css-in-js-utils@npm:^3.1.0": + version: 3.1.0 + resolution: "css-in-js-utils@npm:3.1.0" + dependencies: + hyphenate-style-name: "npm:^1.0.3" + checksum: 10c0/8bb042e8f7701a7edadc3cce5ce2d5cf41189631d7e2aed194d5a7059b25776dded2a0466cb9da1d1f3fc6c99dcecb51e45671148d073b8a2a71e34755152e52 + languageName: node + linkType: hard + "csstype@npm:^3.0.2": version: 3.2.3 resolution: "csstype@npm:3.2.3" @@ -7725,6 +7914,15 @@ __metadata: languageName: node linkType: hard +"fb-dotslash@npm:0.5.8": + version: 0.5.8 + resolution: "fb-dotslash@npm:0.5.8" + bin: + dotslash: bin/dotslash + checksum: 10c0/6c693ecb8e61cd8571e0ad6a923e0582cf8e481695e906e17c8e31620402e06f8b80d95111a420d2f62349d9bebc2b820bae14c2c54a814e72abdc710dc1d3ed + languageName: node + linkType: hard + "fb-watchman@npm:^2.0.0, fb-watchman@npm:^2.0.2": version: 2.0.2 resolution: "fb-watchman@npm:2.0.2" @@ -7734,6 +7932,28 @@ __metadata: languageName: node linkType: hard +"fbjs-css-vars@npm:^1.0.0": + version: 1.0.2 + resolution: "fbjs-css-vars@npm:1.0.2" + checksum: 10c0/dfb64116b125a64abecca9e31477b5edb9a2332c5ffe74326fe36e0a72eef7fc8a49b86adf36c2c293078d79f4524f35e80f5e62546395f53fb7c9e69821f54f + languageName: node + linkType: hard + +"fbjs@npm:^3.0.4": + version: 3.0.5 + resolution: "fbjs@npm:3.0.5" + dependencies: + cross-fetch: "npm:^3.1.5" + fbjs-css-vars: "npm:^1.0.0" + loose-envify: "npm:^1.0.0" + object-assign: "npm:^4.1.0" + promise: "npm:^7.1.1" + setimmediate: "npm:^1.0.5" + ua-parser-js: "npm:^1.0.35" + checksum: 10c0/66d0a2fc9a774f9066e35ac2ac4bf1245931d27f3ac287c7d47e6aa1fc152b243c2109743eb8f65341e025621fb51a12038fadb9fd8fda2e3ddae04ebab06f91 + languageName: node + linkType: hard + "fd-package-json@npm:^2.0.0": version: 2.0.0 resolution: "fd-package-json@npm:2.0.0" @@ -8332,6 +8552,13 @@ __metadata: languageName: node linkType: hard +"hermes-compiler@npm:250829098.0.14": + version: 250829098.0.14 + resolution: "hermes-compiler@npm:250829098.0.14" + checksum: 10c0/b9f4024ac7377bebec61b91e1cee8f3909a8ecad0ea786c6b7c3863f8b65bd94f928850b341c82865a9435b8390d33f03e149e9d479c6870b6f5a754d101fde7 + languageName: node + linkType: hard + "hermes-estree@npm:0.29.1": version: 0.29.1 resolution: "hermes-estree@npm:0.29.1" @@ -8360,6 +8587,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.36.0": + version: 0.36.0 + resolution: "hermes-estree@npm:0.36.0" + checksum: 10c0/fe27f57b0f8c3921e9dc48c517e25f4399609ca386353f90e04d3f859bacbee93184af80a6b930db5e981e8953a5c4083147556b21b19519917e131e7533b27c + languageName: node + linkType: hard + "hermes-parser@npm:0.29.1, hermes-parser@npm:^0.29.1": version: 0.29.1 resolution: "hermes-parser@npm:0.29.1" @@ -8396,6 +8630,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.36.0": + version: 0.36.0 + resolution: "hermes-parser@npm:0.36.0" + dependencies: + hermes-estree: "npm:0.36.0" + checksum: 10c0/76e726366ac2ea91e9464853f439d582ddee9c07ccb84cac35297ce1a5d197bf96b84ab030423a22940b55a0fa5bb191bc0ebeebd95f8e34116900decdccdb86 + languageName: node + linkType: hard + "hoist-non-react-statics@npm:^3.3.0": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -8484,6 +8727,13 @@ __metadata: languageName: node linkType: hard +"hyphenate-style-name@npm:^1.0.3": + version: 1.1.0 + resolution: "hyphenate-style-name@npm:1.1.0" + checksum: 10c0/bfe88deac2414a41a0d08811e277c8c098f23993d6a1eb17f14a0f11b54c4d42865a63d3cfe1914668eefb9a188e2de58f38b55a179a238fd1fef606893e194f + languageName: node + linkType: hard + "iconv-lite@npm:^0.7.0": version: 0.7.2 resolution: "iconv-lite@npm:0.7.2" @@ -8592,6 +8842,15 @@ __metadata: languageName: node linkType: hard +"inline-style-prefixer@npm:^7.0.1": + version: 7.0.1 + resolution: "inline-style-prefixer@npm:7.0.1" + dependencies: + css-in-js-utils: "npm:^3.1.0" + checksum: 10c0/15da5a396b7f286b5b6742efe315218cd577bc96b43de08aeb76af7697d9f1ab3bfc66cf19fad2173957dd5d617a790240b9d51898bdcf4c2efb40d3f8bcb370 + languageName: node + linkType: hard + "inquirer@npm:12.11.1": version: 12.11.1 resolution: "inquirer@npm:12.11.1" @@ -10381,6 +10640,13 @@ __metadata: languageName: node linkType: hard +"memoize-one@npm:^6.0.0": + version: 6.0.0 + resolution: "memoize-one@npm:6.0.0" + checksum: 10c0/45c88e064fd715166619af72e8cf8a7a17224d6edf61f7a8633d740ed8c8c0558a4373876c9b8ffc5518c2b65a960266adf403cc215cb1e90f7e262b58991f54 + languageName: node + linkType: hard + "meow@npm:^13.0.0": version: 13.2.0 resolution: "meow@npm:13.2.0" @@ -10434,6 +10700,19 @@ __metadata: languageName: node linkType: hard +"metro-babel-transformer@npm:0.84.4": + version: 0.84.4 + resolution: "metro-babel-transformer@npm:0.84.4" + dependencies: + "@babel/core": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + hermes-parser: "npm:0.35.0" + metro-cache-key: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + checksum: 10c0/d1ac996666334bc1cfe9d399cbf4cd747b675f6f8f758c2317eebcc52bd76046ed864ddb7b270efeb8cf337940a61fb03912e5c859b7cbc54687c2f5c41a9d2a + languageName: node + linkType: hard + "metro-cache-key@npm:0.83.3": version: 0.83.3 resolution: "metro-cache-key@npm:0.83.3" @@ -10452,6 +10731,15 @@ __metadata: languageName: node linkType: hard +"metro-cache-key@npm:0.84.4": + version: 0.84.4 + resolution: "metro-cache-key@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10c0/a82ab6367f11886d960cc8fa1f3aa54f6529fe30c16059c141c3e789084c50838fdd7e1a5528534cd9c11a74c63aa5c6a7461dbfa50e8c449b6141eaf2fd05e0 + languageName: node + linkType: hard + "metro-cache@npm:0.83.3": version: 0.83.3 resolution: "metro-cache@npm:0.83.3" @@ -10476,6 +10764,18 @@ __metadata: languageName: node linkType: hard +"metro-cache@npm:0.84.4": + version: 0.84.4 + resolution: "metro-cache@npm:0.84.4" + dependencies: + exponential-backoff: "npm:^3.1.1" + flow-enums-runtime: "npm:^0.0.6" + https-proxy-agent: "npm:^7.0.5" + metro-core: "npm:0.84.4" + checksum: 10c0/3bf7f3a1f85b4f1af05f4b2c71c78e56fd3262d967ee43f02e9ff6820254063af33a70b6549e3dc5e993a6a0b9df92e9279632ad9a8b1cde2577342f93df45eb + languageName: node + linkType: hard + "metro-config@npm:0.83.3": version: 0.83.3 resolution: "metro-config@npm:0.83.3" @@ -10508,6 +10808,22 @@ __metadata: languageName: node linkType: hard +"metro-config@npm:0.84.4, metro-config@npm:^0.84.3": + version: 0.84.4 + resolution: "metro-config@npm:0.84.4" + dependencies: + connect: "npm:^3.6.5" + flow-enums-runtime: "npm:^0.0.6" + jest-validate: "npm:^29.7.0" + metro: "npm:0.84.4" + metro-cache: "npm:0.84.4" + metro-core: "npm:0.84.4" + metro-runtime: "npm:0.84.4" + yaml: "npm:^2.6.1" + checksum: 10c0/f8aaf7d8cff9b486353b62f4746b0a70f99749bd4061f5ae847524aaedcd9c5a34bf176cbbe12fb33e771e8ed3c1496654b2578fa5ba8b9e4f856f0589744d98 + languageName: node + linkType: hard + "metro-core@npm:0.83.3": version: 0.83.3 resolution: "metro-core@npm:0.83.3" @@ -10530,6 +10846,17 @@ __metadata: languageName: node linkType: hard +"metro-core@npm:0.84.4, metro-core@npm:^0.84.3": + version: 0.84.4 + resolution: "metro-core@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + lodash.throttle: "npm:^4.1.1" + metro-resolver: "npm:0.84.4" + checksum: 10c0/19d859de16b5e082c9c31bed981c579a4e6d31a626c7829b725df9ae0ffb755d0ef7809ba9f8adf22d3921f5ffdd931ed77b21b95ca2ea17895f0c99b3cab831 + languageName: node + linkType: hard + "metro-file-map@npm:0.83.3": version: 0.83.3 resolution: "metro-file-map@npm:0.83.3" @@ -10564,6 +10891,23 @@ __metadata: languageName: node linkType: hard +"metro-file-map@npm:0.84.4": + version: 0.84.4 + resolution: "metro-file-map@npm:0.84.4" + dependencies: + debug: "npm:^4.4.0" + fb-watchman: "npm:^2.0.0" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + nullthrows: "npm:^1.1.1" + walker: "npm:^1.0.7" + checksum: 10c0/09ca829570d1d6dc5beb0534da8a7f2bfcae5415b0974fd5f58b4a05da95dbafdd47f7dc8dedeb11b6562ee9a92c4d918466d02a05cda6e1eaf2c400cbbe6fb4 + languageName: node + linkType: hard + "metro-minify-terser@npm:0.83.3": version: 0.83.3 resolution: "metro-minify-terser@npm:0.83.3" @@ -10584,6 +10928,16 @@ __metadata: languageName: node linkType: hard +"metro-minify-terser@npm:0.84.4": + version: 0.84.4 + resolution: "metro-minify-terser@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + terser: "npm:^5.15.0" + checksum: 10c0/c9b36c2adb8254c38bdedad9da8bf2b7fae7f45cbd883e590430a5fc9cad808af24dd08a9420925e15733dab886528ad553e3eeb3faffc53d3ad80e7e03e5f6d + languageName: node + linkType: hard + "metro-resolver@npm:0.83.3": version: 0.83.3 resolution: "metro-resolver@npm:0.83.3" @@ -10602,6 +10956,15 @@ __metadata: languageName: node linkType: hard +"metro-resolver@npm:0.84.4": + version: 0.84.4 + resolution: "metro-resolver@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10c0/468334270598222e15cbee32af51a3b5e1f4fa6869794955b95d1134b28a58594e8e3879e841ccf00bbb5cd86c689a4481714d6c6a464931987d5333d2c55f80 + languageName: node + linkType: hard + "metro-runtime@npm:0.83.3": version: 0.83.3 resolution: "metro-runtime@npm:0.83.3" @@ -10622,6 +10985,16 @@ __metadata: languageName: node linkType: hard +"metro-runtime@npm:0.84.4, metro-runtime@npm:^0.84.3": + version: 0.84.4 + resolution: "metro-runtime@npm:0.84.4" + dependencies: + "@babel/runtime": "npm:^7.25.0" + flow-enums-runtime: "npm:^0.0.6" + checksum: 10c0/e2b2e819027940c6bbd081e5650238d52b6c6d78561cd486b8c10cd1e7fce0213c66fa7f885e37ad5377fcd5726b1c9e473fba6de13938cdf2c966e82968c05f + languageName: node + linkType: hard + "metro-source-map@npm:0.83.3": version: 0.83.3 resolution: "metro-source-map@npm:0.83.3" @@ -10657,6 +11030,23 @@ __metadata: languageName: node linkType: hard +"metro-source-map@npm:0.84.4, metro-source-map@npm:^0.84.3": + version: 0.84.4 + resolution: "metro-source-map@npm:0.84.4" + dependencies: + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-symbolicate: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + ob1: "npm:0.84.4" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + checksum: 10c0/39df4524022e07aa4b4d09dd874a9509eb9e2e1e491e80a35099020347ab6be2407851b026452296aad314b0eb7ecf14f9b6bab96bd7c31d47d8b1eb30279aaf + languageName: node + linkType: hard + "metro-symbolicate@npm:0.83.3": version: 0.83.3 resolution: "metro-symbolicate@npm:0.83.3" @@ -10689,6 +11079,22 @@ __metadata: languageName: node linkType: hard +"metro-symbolicate@npm:0.84.4": + version: 0.84.4 + resolution: "metro-symbolicate@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-source-map: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + bin: + metro-symbolicate: src/index.js + checksum: 10c0/416a9ef694150a8ec708187743b74ab67e0b4fec39c64610b3771b584830117670a62acb9aa824f84a44efbb1cfec07aaf943d1aaf349d977eecf7c72bd8c0bf + languageName: node + linkType: hard + "metro-transform-plugins@npm:0.83.3": version: 0.83.3 resolution: "metro-transform-plugins@npm:0.83.3" @@ -10717,6 +11123,20 @@ __metadata: languageName: node linkType: hard +"metro-transform-plugins@npm:0.84.4": + version: 0.84.4 + resolution: "metro-transform-plugins@npm:0.84.4" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + nullthrows: "npm:^1.1.1" + checksum: 10c0/7edb0c0d3655e9f5f5fb8bd8221ec297394b8730c959a3245ea81e50da8177ad7782f21696201a0dcb922281efd919e9548d5b819d8338e52d4b130f06333123 + languageName: node + linkType: hard + "metro-transform-worker@npm:0.83.3": version: 0.83.3 resolution: "metro-transform-worker@npm:0.83.3" @@ -10759,6 +11179,27 @@ __metadata: languageName: node linkType: hard +"metro-transform-worker@npm:0.84.4": + version: 0.84.4 + resolution: "metro-transform-worker@npm:0.84.4" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + metro: "npm:0.84.4" + metro-babel-transformer: "npm:0.84.4" + metro-cache: "npm:0.84.4" + metro-cache-key: "npm:0.84.4" + metro-minify-terser: "npm:0.84.4" + metro-source-map: "npm:0.84.4" + metro-transform-plugins: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + checksum: 10c0/95924f9bcaf6df931bba2783f440d8fab29909bdde8cecdcc3bc7603e7de71e51728a34288f045694b616c94216d1fc683493b8a470e074c9c8a7f220aa9f9b5 + languageName: node + linkType: hard + "metro@npm:0.83.3": version: 0.83.3 resolution: "metro@npm:0.83.3" @@ -10858,6 +11299,55 @@ __metadata: languageName: node linkType: hard +"metro@npm:0.84.4, metro@npm:^0.84.3": + version: 0.84.4 + resolution: "metro@npm:0.84.4" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + accepts: "npm:^2.0.0" + ci-info: "npm:^2.0.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + error-stack-parser: "npm:^2.0.6" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + hermes-parser: "npm:0.35.0" + image-size: "npm:^1.0.2" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + jsc-safe-url: "npm:^0.2.2" + lodash.throttle: "npm:^4.1.1" + metro-babel-transformer: "npm:0.84.4" + metro-cache: "npm:0.84.4" + metro-cache-key: "npm:0.84.4" + metro-config: "npm:0.84.4" + metro-core: "npm:0.84.4" + metro-file-map: "npm:0.84.4" + metro-resolver: "npm:0.84.4" + metro-runtime: "npm:0.84.4" + metro-source-map: "npm:0.84.4" + metro-symbolicate: "npm:0.84.4" + metro-transform-plugins: "npm:0.84.4" + metro-transform-worker: "npm:0.84.4" + mime-types: "npm:^3.0.1" + nullthrows: "npm:^1.1.1" + serialize-error: "npm:^2.1.0" + source-map: "npm:^0.5.6" + throat: "npm:^5.0.0" + ws: "npm:^7.5.10" + yargs: "npm:^17.6.2" + bin: + metro: src/cli.js + checksum: 10c0/ff92915119db29cd855274f3789d391cba83c50cb92e22d1e9b8c729e7f6d39495e32540a22ca4c6591eea6a847ade49fcfa5faab01b2300227e3f1fc7df359c + languageName: node + linkType: hard + "micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" @@ -11132,6 +11622,20 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^2.7.0": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + languageName: node + linkType: hard + "node-forge@npm:^1.3.3": version: 1.4.0 resolution: "node-forge@npm:1.4.0" @@ -11277,7 +11781,16 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": +"ob1@npm:0.84.4": + version: 0.84.4 + resolution: "ob1@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10c0/8bf3a3bdc2b27f1b1b60569c31ff2d9d829025f9a1ce7388b5e810242e48672c8d6b24e5972d6e30aef4d84f6894d12b13d0c6c418460d031da1972b96920bba + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -11819,6 +12332,13 @@ __metadata: languageName: node linkType: hard +"postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 + languageName: node + linkType: hard + "postcss@npm:~8.4.32": version: 8.4.49 resolution: "postcss@npm:8.4.49" @@ -11913,6 +12433,15 @@ __metadata: languageName: node linkType: hard +"promise@npm:^7.1.1": + version: 7.3.1 + resolution: "promise@npm:7.3.1" + dependencies: + asap: "npm:~2.0.3" + checksum: 10c0/742e5c0cc646af1f0746963b8776299701ad561ce2c70b49365d62c8db8ea3681b0a1bf0d4e2fe07910bf72f02d39e51e8e73dc8d7503c3501206ac908be107f + languageName: node + linkType: hard + "promise@npm:^8.3.0": version: 8.3.0 resolution: "promise@npm:8.3.0" @@ -12075,6 +12604,17 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:19.1.0": + version: 19.1.0 + resolution: "react-dom@npm:19.1.0" + dependencies: + scheduler: "npm:^0.26.0" + peerDependencies: + react: ^19.1.0 + checksum: 10c0/3e26e89bb6c67c9a6aa86cb888c7a7f8258f2e347a6d2a15299c17eb16e04c19194e3452bc3255bd34000a61e45e2cb51e46292392340432f133e5a5d2dfb5fc + languageName: node + linkType: hard + "react-fast-compare@npm:^3.2.2": version: 3.2.2 resolution: "react-fast-compare@npm:3.2.2" @@ -12151,17 +12691,22 @@ __metadata: "@babel/core": "npm:^7.25.2" "@babel/preset-env": "npm:^7.25.3" "@babel/runtime": "npm:^7.25.0" + "@expo/metro-runtime": "npm:~6.1.2" "@react-navigation/drawer": "npm:^7.5.0" "@react-navigation/native": "npm:^7.1.8" "@shopify/react-native-skia": "npm:2.2.3" "@types/react": "npm:~19.1.0" + "@types/react-dom": "npm:^19" + "@types/react-native-web": "npm:^0" babel-preset-expo: "npm:~54.0.0" + canvaskit-wasm: "npm:0.40.0" expo: "npm:~54.0.0" expo-constants: "npm:~18.0.8" expo-linking: "npm:~8.0.8" expo-router: "npm:~6.0.0" expo-status-bar: "npm:~3.0.8" react: "npm:19.1.0" + react-dom: "npm:19.1.0" react-native: "npm:0.81.5" react-native-builder-bob: "npm:^0.41.0" react-native-gesture-handler: "npm:~2.28.0" @@ -12169,6 +12714,7 @@ __metadata: react-native-reanimated: "npm:~4.1.0" react-native-safe-area-context: "npm:~5.6.0" react-native-screens: "npm:~4.16.0" + react-native-web: "npm:^0.21.0" react-native-worklets: "npm:0.5.1" languageName: unknown linkType: soft @@ -12302,6 +12848,25 @@ __metadata: languageName: node linkType: hard +"react-native-web@npm:^0.21.0": + version: 0.21.2 + resolution: "react-native-web@npm:0.21.2" + dependencies: + "@babel/runtime": "npm:^7.18.6" + "@react-native/normalize-colors": "npm:^0.74.1" + fbjs: "npm:^3.0.4" + inline-style-prefixer: "npm:^7.0.1" + memoize-one: "npm:^6.0.0" + nullthrows: "npm:^1.1.1" + postcss-value-parser: "npm:^4.2.0" + styleq: "npm:^0.1.3" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/8c184fef0045c25deff765c8e80963454a5dffd8e389a9e11cf2fec9e769ff0f82c3d56d082b1897a7ded8374d9ae8a49dac7f09377a104f1995a5ddea645095 + languageName: node + linkType: hard + "react-native-worklets@npm:0.5.1": version: 0.5.1 resolution: "react-native-worklets@npm:0.5.1" @@ -12325,6 +12890,57 @@ __metadata: languageName: node linkType: hard +"react-native@npm:*": + version: 0.86.0 + resolution: "react-native@npm:0.86.0" + dependencies: + "@react-native/assets-registry": "npm:0.86.0" + "@react-native/codegen": "npm:0.86.0" + "@react-native/community-cli-plugin": "npm:0.86.0" + "@react-native/gradle-plugin": "npm:0.86.0" + "@react-native/js-polyfills": "npm:0.86.0" + "@react-native/normalize-colors": "npm:0.86.0" + "@react-native/virtualized-lists": "npm:0.86.0" + abort-controller: "npm:^3.0.0" + anser: "npm:^1.4.9" + ansi-regex: "npm:^5.0.0" + babel-plugin-syntax-hermes-parser: "npm:0.36.0" + base64-js: "npm:^1.5.1" + commander: "npm:^12.0.0" + flow-enums-runtime: "npm:^0.0.6" + hermes-compiler: "npm:250829098.0.14" + invariant: "npm:^2.2.4" + memoize-one: "npm:^5.0.0" + metro-runtime: "npm:^0.84.3" + metro-source-map: "npm:^0.84.3" + nullthrows: "npm:^1.1.1" + pretty-format: "npm:^29.7.0" + promise: "npm:^8.3.0" + react-devtools-core: "npm:^6.1.5" + react-refresh: "npm:^0.14.0" + regenerator-runtime: "npm:^0.13.2" + scheduler: "npm:0.27.0" + semver: "npm:^7.1.3" + stacktrace-parser: "npm:^0.1.10" + tinyglobby: "npm:^0.2.15" + whatwg-fetch: "npm:^3.0.0" + ws: "npm:^7.5.10" + yargs: "npm:^17.6.2" + peerDependencies: + "@react-native/jest-preset": 0.86.0 + "@types/react": ^19.1.1 + react: ^19.2.3 + peerDependenciesMeta: + "@react-native/jest-preset": + optional: true + "@types/react": + optional: true + bin: + react-native: cli.js + checksum: 10c0/47a569c47a22b37526ac54e17d1f42c6a191ca7cd30230bc16ee5307ac53da1db89d27ba20c76e9756fb646866d89fedfc1852b1ddc15c47bde45c899079096a + languageName: node + linkType: hard + "react-native@npm:0.81.5": version: 0.81.5 resolution: "react-native@npm:0.81.5" @@ -12859,13 +13475,20 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:0.26.0": +"scheduler@npm:0.26.0, scheduler@npm:^0.26.0": version: 0.26.0 resolution: "scheduler@npm:0.26.0" checksum: 10c0/5b8d5bfddaae3513410eda54f2268e98a376a429931921a81b5c3a2873aab7ca4d775a8caac5498f8cbc7d0daeab947cf923dbd8e215d61671f9f4e392d34356 languageName: node linkType: hard +"scheduler@npm:0.27.0": + version: 0.27.0 + resolution: "scheduler@npm:0.27.0" + checksum: 10c0/4f03048cb05a3c8fddc45813052251eca00688f413a3cee236d984a161da28db28ba71bd11e7a3dd02f7af84ab28d39fb311431d3b3772fed557945beb00c452 + languageName: node + linkType: hard + "scheduler@npm:^0.25.0": version: 0.25.0 resolution: "scheduler@npm:0.25.0" @@ -13011,6 +13634,13 @@ __metadata: languageName: node linkType: hard +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 + languageName: node + linkType: hard + "setprototypeof@npm:~1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -13567,6 +14197,13 @@ __metadata: languageName: node linkType: hard +"styleq@npm:^0.1.3": + version: 0.1.3 + resolution: "styleq@npm:0.1.3" + checksum: 10c0/975d951792e65052f1f6e41aaad46492642ce4922b3dc36d4b49b37c8509f9a776794d8f275360f00116a5e6ab1e31514bdcd5840656c4e3213da6803fa12941 + languageName: node + linkType: hard + "sucrase@npm:~3.35.1": version: 3.35.1 resolution: "sucrase@npm:3.35.1" @@ -13741,7 +14378,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.12": +"tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15": version: 0.2.17 resolution: "tinyglobby@npm:0.2.17" dependencies: @@ -13774,6 +14411,13 @@ __metadata: languageName: node linkType: hard +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 + languageName: node + linkType: hard + "ts-api-utils@npm:^1.3.0": version: 1.4.3 resolution: "ts-api-utils@npm:1.4.3" @@ -13961,6 +14605,15 @@ __metadata: languageName: node linkType: hard +"ua-parser-js@npm:^1.0.35": + version: 1.0.41 + resolution: "ua-parser-js@npm:1.0.41" + bin: + ua-parser-js: script/cli.js + checksum: 10c0/45dc1f7f3ce8248e0e64640d2e29c65c0ea1fc9cb105594de84af80e2a57bba4f718b9376098ca7a5b0ffe240f8995b0fa3714afa9d36861c41370a378f1a274 + languageName: node + linkType: hard + "uglify-js@npm:^3.1.4": version: 3.19.3 resolution: "uglify-js@npm:3.19.3" @@ -14333,6 +14986,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db + languageName: node + linkType: hard + "webidl-conversions@npm:^5.0.0": version: 5.0.0 resolution: "webidl-conversions@npm:5.0.0" @@ -14358,6 +15018,16 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" From 22b4fcc5a46d62d9323f6c9117850f2189064f95 Mon Sep 17 00:00:00 2001 From: adithyavis Date: Thu, 9 Jul 2026 21:54:20 +0530 Subject: [PATCH 02/23] feat: use Stylesheet flatten for skia web --- src/components/Stage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Stage.tsx b/src/components/Stage.tsx index f9b3cec..a75ceea 100644 --- a/src/components/Stage.tsx +++ b/src/components/Stage.tsx @@ -7,7 +7,7 @@ import { useState, type ReactNode, } from 'react'; -import { View, type StyleProp, type ViewStyle } from 'react-native'; +import { StyleSheet, View, type StyleProp, type ViewStyle } from 'react-native'; import { Canvas } from '@shopify/react-native-skia'; import { Gesture, @@ -131,7 +131,7 @@ export const Stage = memo( const canvas = useMemo( () => ( Date: Fri, 10 Jul 2026 00:14:32 +0530 Subject: [PATCH 03/23] feat: use transofrm instead of matrix --- src/components/internal/portal.tsx | 4 +-- src/core/matrix.ts | 50 ++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/components/internal/portal.tsx b/src/components/internal/portal.tsx index dc3a83a..18e3bef 100644 --- a/src/components/internal/portal.tsx +++ b/src/components/internal/portal.tsx @@ -17,7 +17,7 @@ import Animated, { } from 'react-native-reanimated'; import type { NodeRegistry } from '../../core/registry'; import type { Vector2d } from '../../core/types'; -import { composeMatrix, matToRNMatrix, multiply } from '../../core/matrix'; +import { composeMatrix, matToRNTransform, multiply } from '../../core/matrix'; import { DEG_TO_RAD, type ResolvedTransform } from '../../core/transform'; import { EMPTY_SNAPSHOT, @@ -181,7 +181,7 @@ function PortalView({ return { opacity: 1, - transform: [{ matrix: matToRNMatrix(m) }], + transform: matToRNTransform(m), }; }); diff --git a/src/core/matrix.ts b/src/core/matrix.ts index 808ec9e..1dc8943 100644 --- a/src/core/matrix.ts +++ b/src/core/matrix.ts @@ -84,3 +84,53 @@ export function matToRNMatrix(m: Mat): number[] { 'worklet'; return [m[0], m[1], 0, 0, m[2], m[3], 0, 0, 0, 0, 1, 0, m[4], m[5], 0, 1]; } + +type RNTransform = ( + | { translateX: number } + | { translateY: number } + | { rotate: string } + | { skewX: string } + | { scaleX: number } + | { scaleY: number } +)[]; + +export function matToRNTransform(m: Mat): RNTransform { + 'worklet'; + let a = m[0]; + let b = m[1]; + let c = m[2]; + let d = m[3]; + const translateX = m[4]; + const translateY = m[5]; + + let scaleX = Math.hypot(a, b); + if (scaleX !== 0) { + a /= scaleX; + b /= scaleX; + } + let skew = a * c + b * d; + c -= a * skew; + d -= b * skew; + let scaleY = Math.hypot(c, d); + if (scaleY !== 0) { + c /= scaleY; + d /= scaleY; + skew /= scaleY; + } + if (a * d - b * c < 0) { + a = -a; + b = -b; + scaleX = -scaleX; + } + const rotation = Math.atan2(b, a); + const skewX = Math.atan(skew); + + return [ + { translateX }, + { translateY }, + { rotate: `${rotation}rad` }, + { skewX: `${skewX}rad` }, + { scaleX }, + { scaleY }, + ]; +} From 5d84b92dbeae375c1dcfa204d4e55466c709aa36 Mon Sep 17 00:00:00 2001 From: adithyavis Date: Fri, 10 Jul 2026 00:16:09 +0530 Subject: [PATCH 04/23] feat: don't try to match font if it fails --- src/components/shapes/Text.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/components/shapes/Text.tsx b/src/components/shapes/Text.tsx index 11dcd1b..51ff2aa 100644 --- a/src/components/shapes/Text.tsx +++ b/src/components/shapes/Text.tsx @@ -36,14 +36,21 @@ export const Text = memo( }; const matched = useMemo(() => { + if (fontProp) { + return null; + } const style = { fontFamily, fontSize, fontStyle: fontStyle.includes('italic') ? 'italic' : 'normal', fontWeight: fontStyle.includes('bold') ? 'bold' : 'normal', }; - return matchFont(style as Parameters[0]); - }, [fontFamily, fontSize, fontStyle]); + try { + return matchFont(style as Parameters[0]); + } catch { + return null; + } + }, [fontProp, fontFamily, fontSize, fontStyle]); const font = fontProp ?? matched; if (!font) { @@ -55,7 +62,7 @@ export const Text = memo( } const metrics = font.getMetrics(); const baseline = -metrics.ascent; - const boxWidth = font.measureText(text).width; + const boxWidth = font.getTextWidth(text); const boxHeight = metrics.descent - metrics.ascent; return ( From 4d17bbc37f74458c42149d60c443939a52d2f4e4 Mon Sep 17 00:00:00 2001 From: adithyavis Date: Fri, 10 Jul 2026 00:17:42 +0530 Subject: [PATCH 05/23] feat: use fromModule --- example/app/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/example/app/index.tsx b/example/app/index.tsx index 84a4ba2..0b32ae6 100644 --- a/example/app/index.tsx +++ b/example/app/index.tsx @@ -1,5 +1,6 @@ import { useState } from 'react'; import { StyleSheet, Text, View, useWindowDimensions } from 'react-native'; +import { Asset } from 'expo-asset'; import { Stage, Layer, @@ -56,7 +57,7 @@ export default function ShapesScreen() { Date: Fri, 10 Jul 2026 00:20:50 +0530 Subject: [PATCH 06/23] feat: add snaps --- example/app/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/example/app/index.tsx b/example/app/index.tsx index 0b32ae6..e73b196 100644 --- a/example/app/index.tsx +++ b/example/app/index.tsx @@ -7,6 +7,7 @@ import { Image, Transformer, Portal, + SnapGrid, type EventObject, type TransformEvent, type TransformResult, @@ -57,7 +58,7 @@ export default function ShapesScreen() { { setSelected(sel(s.id)); e.cancelBubble = true; @@ -107,6 +110,7 @@ export default function ShapesScreen() { if (selected) commit(selected, e); }} /> + From f724432d8c53f9f8e4e0f2a4808ab4d38eb6a103 Mon Sep 17 00:00:00 2001 From: adithyavis Date: Fri, 10 Jul 2026 00:21:06 +0530 Subject: [PATCH 07/23] fix: positioning --- example/src/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/src/constants.ts b/example/src/constants.ts index 0325b86..ad15f33 100644 --- a/example/src/constants.ts +++ b/example/src/constants.ts @@ -199,7 +199,7 @@ export function buildInitialTransforms( }; } out[CHIP] = { - x: Math.round(w * 0.1), + x: Math.round(w * 0.5) - 150, y: Math.round(h * 0.5), scaleX: 1, scaleY: 1, From 9e29495f1396c45704ca35e67f631af00bdcf4ec Mon Sep 17 00:00:00 2001 From: adithyavis Date: Fri, 10 Jul 2026 01:34:16 +0530 Subject: [PATCH 08/23] feat: make sure we run after enxt paint --- src/components/brush/BrushLayer.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/brush/BrushLayer.tsx b/src/components/brush/BrushLayer.tsx index fbb9f1e..febf6c9 100644 --- a/src/components/brush/BrushLayer.tsx +++ b/src/components/brush/BrushLayer.tsx @@ -5,6 +5,10 @@ import { useRegistry } from '../internal/NodeContext'; import { buildBrushPath } from '../../core/brush'; import { BRUSHES, type BrushTool } from './brushes'; +function runAfterNextPaint(callback: () => void) { + requestAnimationFrame(() => requestAnimationFrame(callback)); +} + export interface BrushStrokeEvent { points: number[]; tool: BrushTool; @@ -34,7 +38,7 @@ export const BrushLayer = memo( } setLiveVisible(false); const committedLength = points.length; - requestAnimationFrame(() => { + runAfterNextPaint(() => { if (activePointsSV.value.length === committedLength) { activePointsSV.value = []; } From 1be3a3a4c7a7d6a9e6e207ebab1c6d8abb79ca4c Mon Sep 17 00:00:00 2001 From: adithyavis Date: Fri, 10 Jul 2026 01:41:33 +0530 Subject: [PATCH 09/23] chore: dead code --- src/components/brush/BrushLayer.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/components/brush/BrushLayer.tsx b/src/components/brush/BrushLayer.tsx index febf6c9..b544336 100644 --- a/src/components/brush/BrushLayer.tsx +++ b/src/components/brush/BrushLayer.tsx @@ -1,4 +1,4 @@ -import { memo, useEffect, useRef, useState, type ReactNode } from 'react'; +import { memo, useEffect, useRef, type ReactNode } from 'react'; import { Group, Path } from '@shopify/react-native-skia'; import { useDerivedValue, useSharedValue } from 'react-native-reanimated'; import { useRegistry } from '../internal/NodeContext'; @@ -24,7 +24,6 @@ export const BrushLayer = memo( ({ tool, onStrokeEnd, children }: BrushLayerProps) => { const registry = useRegistry(); const activePointsSV = useSharedValue([]); - const [liveVisible, setLiveVisible] = useState(true); const toolRef = useRef(tool); toolRef.current = tool; @@ -36,13 +35,11 @@ export const BrushLayer = memo( if (currentTool !== null && points.length >= 2) { onStrokeEndRef.current?.({ points, tool: currentTool }); } - setLiveVisible(false); const committedLength = points.length; runAfterNextPaint(() => { if (activePointsSV.value.length === committedLength) { activePointsSV.value = []; } - setLiveVisible(true); }); }); @@ -71,7 +68,7 @@ export const BrushLayer = memo( return ( {children} - {liveVisible && activeStyle && ( + {activeStyle && ( Date: Fri, 10 Jul 2026 01:42:49 +0530 Subject: [PATCH 10/23] feat: set default tool --- example/app/brushes.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/app/brushes.tsx b/example/app/brushes.tsx index ec356fe..7f10cd1 100644 --- a/example/app/brushes.tsx +++ b/example/app/brushes.tsx @@ -12,7 +12,7 @@ import { TOOLS, type DrawnStroke, type Tool } from '../src/constants'; export default function BrushesScreen() { const { width, height } = useWindowDimensions(); - const [tool, setTool] = useState(null); + const [tool, setTool] = useState(TOOLS[0].tool); const [strokes, setStrokes] = useState([]); const strokeCounter = useRef(0); From 4ec8863335abd9ac35012b28b118af10535d0c79 Mon Sep 17 00:00:00 2001 From: adithyavis Date: Fri, 10 Jul 2026 15:41:53 +0530 Subject: [PATCH 11/23] feat: remove example --- docs/docs/intro.md | 29 ------------------------ docs/versioned_docs/version-0.x/intro.md | 29 ------------------------ 2 files changed, 58 deletions(-) diff --git a/docs/docs/intro.md b/docs/docs/intro.md index a71f8a4..55ae819 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -14,35 +14,6 @@ from scratch. React Native Canvas Kit is heavily inspired by [Konva](https://https://konvajs.org/). -```tsx -import { Stage, Layer, Circle, Rect } from 'react-native-canvas-kit'; - -export function Hello() { - return ( - - - - - - - ); -} -``` - ## The scene graph The tree mirrors a classic 2D canvas hierarchy: diff --git a/docs/versioned_docs/version-0.x/intro.md b/docs/versioned_docs/version-0.x/intro.md index a71f8a4..55ae819 100644 --- a/docs/versioned_docs/version-0.x/intro.md +++ b/docs/versioned_docs/version-0.x/intro.md @@ -14,35 +14,6 @@ from scratch. React Native Canvas Kit is heavily inspired by [Konva](https://https://konvajs.org/). -```tsx -import { Stage, Layer, Circle, Rect } from 'react-native-canvas-kit'; - -export function Hello() { - return ( - - - - - - - ); -} -``` - ## The scene graph The tree mirrors a classic 2D canvas hierarchy: From c32cc649be5f0325ad6a087ea6fac0e78ca0491b Mon Sep 17 00:00:00 2001 From: adithyavis Date: Fri, 10 Jul 2026 16:39:03 +0530 Subject: [PATCH 12/23] feat: demo component --- docs/src/components/Demo/index.tsx | 36 ++++++++++++++ docs/src/components/Demo/styles.module.css | 58 ++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 docs/src/components/Demo/index.tsx create mode 100644 docs/src/components/Demo/styles.module.css diff --git a/docs/src/components/Demo/index.tsx b/docs/src/components/Demo/index.tsx new file mode 100644 index 0000000..9bf3ad6 --- /dev/null +++ b/docs/src/components/Demo/index.tsx @@ -0,0 +1,36 @@ +import React, { useState } from 'react'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import styles from './styles.module.css'; + +interface DemoProps { + name: string; + height?: number; + title?: string; +} + +export default function Demo({ name, height = 460, title }: DemoProps) { + const src = useBaseUrl(`/demos/?demo=${name}`); + const [reloadKey, setReloadKey] = useState(0); + return ( +
+
+ + {title ?? `${name} demo`} + +
+