diff --git a/eslint.config.js b/eslint.config.js index 0f106f2071..0c25a33b99 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -59,4 +59,22 @@ module.exports = defineConfig([ '@typescript-eslint/no-require-imports': 'off', }, }, + + { + files: ['src/screens/**/*.{ts,tsx}', 'src/navigators/**/*.{ts,tsx}'], + rules: { + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['@expo/ui', '@expo/ui/*'], + message: + 'Screens must not import @expo/ui directly. Use an LNReader component wrapper (e.g. src/components/ExpoUI) instead.', + }, + ], + }, + ], + }, + }, ]); diff --git a/package.json b/package.json index e652f75e59..d83c4414a3 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ }, "dependencies": { "@expo/dom-webview": "^57.0.1", + "@expo/ui": "^57.0.8", "@gorhom/bottom-sheet": "^5.2.14", "@legendapp/list": "^3.3.3", "@noble/ciphers": "^2.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50749c4559..73afb2d03f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,12 +14,15 @@ importers: '@expo/dom-webview': specifier: ^57.0.1 version: 57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3) + '@expo/ui': + specifier: ^57.0.8 + version: 57.0.8(@babel/core@7.29.7(supports-color@9.4.0))(@types/react@19.2.17)(expo@57.0.7)(react-dom@19.2.8(react@19.2.3))(react-native-worklets@0.10.2(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3) '@gorhom/bottom-sheet': specifier: ^5.2.14 version: 5.2.14(24fcb93f20601afa4f41878e40cdc0fb) '@legendapp/list': specifier: ^3.3.3 - version: 3.3.3(patch_hash=37a9c8d7d9c1bd33c957ba6ea78291c7b08532dc32de4925f3d612cb41f1a659)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3) + version: 3.3.3(patch_hash=37a9c8d7d9c1bd33c957ba6ea78291c7b08532dc32de4925f3d612cb41f1a659)(react-dom@19.2.8(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3) '@noble/ciphers': specifier: ^2.2.0 version: 2.2.0 @@ -76,7 +79,7 @@ importers: version: 1.0.0-beta.22(@op-engineering/op-sqlite@15.2.14(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3))(@sinclair/typebox@0.34.52)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(zod@4.4.3) expo: specifier: ^57.0.7 - version: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + version: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-build-properties: specifier: ~57.0.6 version: 57.0.6(expo@57.0.7) @@ -1367,6 +1370,23 @@ packages: '@expo/sudo-prompt@9.3.2': resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} + '@expo/ui@57.0.8': + resolution: {integrity: sha512-aR17CRM45k4JyFahX4Xn2b6ti3aiddC4SAzvsm3iUCVacQA6tGmClu012rYNeVXhJ96csX2o7EEymfzYqgJNxw==} + peerDependencies: + '@babel/core': '*' + expo: '*' + react: '*' + react-dom: '*' + react-native: '*' + react-native-worklets: '*' + peerDependenciesMeta: + '@babel/core': + optional: true + react-dom: + optional: true + react-native-worklets: + optional: true + '@expo/ws-tunnel@2.0.0': resolution: {integrity: sha512-j+JfTRdCk820J9dU0sA2SqshQIKFOMo7ED84w9MJFcebfbNQgsLztEY/SABDkGnjatrW4xGqnUhVRxSBVyCkXw==} peerDependencies: @@ -1586,6 +1606,168 @@ packages: react: '*' react-native: '*' + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + + '@radix-ui/react-compose-refs@1.1.5': + resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.2.2': + resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.23': + resolution: {integrity: sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.19': + resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.6': + resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.16': + resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.4': + resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-portal@1.1.17': + resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.10': + resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.10': + resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.3.3': + resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.4': + resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.6': + resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.5': + resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.4': + resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@react-native-documents/picker@12.0.1': resolution: {integrity: sha512-vpJKb4t/5bnxe9+gQl+plJfKrrIsmYwANGhNH2B9E1dS1+6FDBzg4Dwmcq4ueaGfkRKEPJ606mJttVEH1ZKZaA==} peerDependencies: @@ -2284,6 +2466,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -2888,6 +3074,9 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3713,6 +3902,10 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -5145,6 +5338,11 @@ packages: react-devtools-core@6.1.5: resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + react-freeze@1.0.4: resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} engines: {node: '>=10'} @@ -5318,6 +5516,36 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-test-renderer@19.2.3: resolution: {integrity: sha512-TMR1LnSFiWZMJkCgNf5ATSvAheTT2NvKIwiVwdBPHxjBI7n/JbWd4gaZ16DVd9foAXdvDz+sB5yxZTwMjPRxpw==} peerDependencies: @@ -5957,11 +6185,31 @@ packages: urlencode@2.0.0: resolution: {integrity: sha512-K4+koEq4II9FqKKdLyMwfVFiWvTLJsdsIihXCprumjlOwpviO44E4hAhLYBLb6CEVTZh9hXXMTQHIT+Hwv5BPw==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-latest-callback@0.2.6: resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==} peerDependencies: react: '>=16.8' + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: @@ -5991,6 +6239,12 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vaul@1.1.2: + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -7214,7 +7468,7 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@expo/cli@57.0.9(2d3b22c2103703c17c2fb47b72790f37)': + '@expo/cli@57.0.9(63ca68fcd1f3d0bd8b3ae037df52e0d5)': dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/config': 57.0.5(supports-color@9.4.0)(typescript@6.0.3) @@ -7233,7 +7487,7 @@ snapshots: '@expo/plist': 0.8.1 '@expo/prebuild-config': 57.0.8(supports-color@9.4.0)(typescript@6.0.3) '@expo/require-utils': 57.0.3(supports-color@9.4.0)(typescript@6.0.3) - '@expo/router-server': 57.0.3(expo-constants@57.0.6(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(supports-color@9.4.0))(expo-font@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3))(expo-server@57.0.1)(expo@57.0.7)(react@19.2.3)(supports-color@9.4.0) + '@expo/router-server': 57.0.3(expo-constants@57.0.6(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(supports-color@9.4.0))(expo-font@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3))(expo-server@57.0.1)(expo@57.0.7)(react-dom@19.2.8(react@19.2.3))(react@19.2.3)(supports-color@9.4.0) '@expo/schema-utils': 57.0.2 '@expo/spawn-async': 1.8.0 '@expo/ws-tunnel': 2.0.0(ws@8.21.1) @@ -7250,7 +7504,7 @@ snapshots: connect: 3.7.0(supports-color@9.4.0) debug: 4.4.3(supports-color@9.4.0) dnssd-advertise: 1.1.6 - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-server: 57.0.1 fetch-nodeshim: 0.4.10 getenv: 2.0.0 @@ -7347,7 +7601,7 @@ snapshots: '@expo/dom-webview@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)': dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) @@ -7414,7 +7668,7 @@ snapshots: dependencies: '@expo/dom-webview': 57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3) anser: 1.4.10 - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) stacktrace-parser: 0.1.11 @@ -7445,7 +7699,7 @@ snapshots: postcss: 8.5.19 resolve-from: 5.0.0 optionalDependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) transitivePeerDependencies: - bufferutil - supports-color @@ -7529,14 +7783,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/router-server@57.0.3(expo-constants@57.0.6(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(supports-color@9.4.0))(expo-font@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3))(expo-server@57.0.1)(expo@57.0.7)(react@19.2.3)(supports-color@9.4.0)': + '@expo/router-server@57.0.3(expo-constants@57.0.6(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(supports-color@9.4.0))(expo-font@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3))(expo-server@57.0.1)(expo@57.0.7)(react-dom@19.2.8(react@19.2.3))(react@19.2.3)(supports-color@9.4.0)': dependencies: debug: 4.4.3(supports-color@9.4.0) - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-constants: 57.0.6(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(supports-color@9.4.0) expo-font: 57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3) expo-server: 57.0.1 react: 19.2.3 + optionalDependencies: + react-dom: 19.2.8(react@19.2.3) transitivePeerDependencies: - supports-color @@ -7559,6 +7815,21 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} + '@expo/ui@57.0.8(@babel/core@7.29.7(supports-color@9.4.0))(@types/react@19.2.17)(expo@57.0.7)(react-dom@19.2.8(react@19.2.3))(react-native-worklets@0.10.2(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)': + dependencies: + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) + sf-symbols-typescript: 2.2.0 + vaul: 1.1.2(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + optionalDependencies: + '@babel/core': 7.29.7(supports-color@9.4.0) + react-dom: 19.2.8(react@19.2.3) + react-native-worklets: 0.10.2(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + '@expo/ws-tunnel@2.0.0(ws@8.21.1)': dependencies: ws: 8.21.1 @@ -7816,11 +8087,12 @@ snapshots: dependencies: jsbi: 4.3.2 - '@legendapp/list@3.3.3(patch_hash=37a9c8d7d9c1bd33c957ba6ea78291c7b08532dc32de4925f3d612cb41f1a659)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)': + '@legendapp/list@3.3.3(patch_hash=37a9c8d7d9c1bd33c957ba6ea78291c7b08532dc32de4925f3d612cb41f1a659)(react-dom@19.2.8(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)': dependencies: react: 19.2.3 use-sync-external-store: 1.6.0(react@19.2.3) optionalDependencies: + react-dom: 19.2.8(react@19.2.3) react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) '@material/material-color-utilities@0.3.0': {} @@ -7845,7 +8117,7 @@ snapshots: dependencies: '@material/material-color-utilities': 0.3.0 color: 4.2.3 - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) @@ -7854,6 +8126,137 @@ snapshots: react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) + '@radix-ui/primitive@1.1.7': {} + + '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.17)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-context@1.2.2(@types/react@19.2.17)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-dialog@1.1.23(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.16(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-portal': 1.1.17(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + '@radix-ui/react-presence': 1.1.10(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.10(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.3) + aria-hidden: 1.2.6 + react: 19.2.3 + react-dom: 19.2.8(react@19.2.3) + react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-dismissable-layer@1.1.19(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.10(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.17)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.8(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.17)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-focus-scope@1.1.16(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.10(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.17)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.8(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-id@1.1.4(@types/react@19.2.17)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-portal@1.1.17(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.8(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-presence@1.1.10(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.8(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-primitive@2.1.10(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.17)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.8(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-slot@1.3.3(@types/react@19.2.17)(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.17)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.2.17)(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.17)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.2.17)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.2.17)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.17 + '@react-native-documents/picker@12.0.1(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)': dependencies: react: 19.2.3 @@ -7864,7 +8267,7 @@ snapshots: react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) optionalDependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) '@react-native-vector-icons/common@13.0.1(@react-native/assets-registry@0.86.0)(expo-font@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)': dependencies: @@ -8617,6 +9020,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -8858,7 +9265,7 @@ snapshots: react-refresh: 0.14.2 optionalDependencies: '@babel/runtime': 7.29.7 - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) transitivePeerDependencies: - '@babel/core' - supports-color @@ -9359,6 +9766,8 @@ snapshots: detect-newline@3.1.0: {} + detect-node-es@1.1.0: {} + diff-sequences@29.6.3: {} dnssd-advertise@1.1.6: {} @@ -9877,7 +10286,7 @@ snapshots: expo-asset@57.0.6(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0)(typescript@6.0.3): dependencies: '@expo/image-utils': 0.11.3(supports-color@9.4.0)(typescript@6.0.3) - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-constants: 57.0.6(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(supports-color@9.4.0) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) @@ -9892,7 +10301,7 @@ snapshots: chalk: 4.1.2 compression: 1.8.1(supports-color@9.4.0) connect: 3.7.0(supports-color@9.4.0) - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) express: 4.22.2(supports-color@9.4.0) freeport-async: 2.0.0 getenv: 2.0.0 @@ -9906,27 +10315,27 @@ snapshots: expo-build-properties@57.0.6(expo@57.0.7): dependencies: '@expo/schema-utils': 57.0.2 - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) resolve-from: 5.0.0 semver: 7.8.5 expo-clipboard@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) expo-constants@57.0.6(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(supports-color@9.4.0): dependencies: '@expo/env': 2.4.2(supports-color@9.4.0) - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) transitivePeerDependencies: - supports-color expo-dev-client@57.0.7(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0)): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-dev-launcher: 57.0.7(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0)) expo-dev-menu: 57.0.7(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0)) expo-dev-menu-interface: 57.0.0(expo@57.0.7) @@ -9938,44 +10347,44 @@ snapshots: expo-dev-launcher@57.0.7(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0)): dependencies: '@expo/schema-utils': 57.0.2 - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-dev-menu: 57.0.7(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0)) expo-manifests: 57.0.1(expo@57.0.7) react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) expo-dev-menu-interface@57.0.0(expo@57.0.7): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-dev-menu@57.0.7(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0)): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-dev-menu-interface: 57.0.0(expo@57.0.7) react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) expo-document-picker@57.0.1(expo@57.0.7): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-file-system@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0)): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) expo-font@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) fontfaceobserver: 2.3.0 react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) expo-haptics@57.0.1(expo@57.0.7): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-image@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) sf-symbols-typescript: 2.2.0 @@ -9984,12 +10393,12 @@ snapshots: expo-keep-awake@57.0.1(expo@57.0.7)(react@19.2.3): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react: 19.2.3 expo-linear-gradient@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) @@ -10005,13 +10414,13 @@ snapshots: expo-localization@57.0.1(expo@57.0.7)(react@19.2.3): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react: 19.2.3 rtl-detect: 1.1.2 expo-manifests@57.0.1(expo@57.0.7): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-json-utils: 57.0.1 expo-modules-autolinking@57.0.8(supports-color@9.4.0)(typescript@6.0.3): @@ -10041,7 +10450,7 @@ snapshots: expo-navigation-bar@57.0.2(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0): dependencies: debug: 4.4.3(supports-color@9.4.0) - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) transitivePeerDependencies: @@ -10051,13 +10460,13 @@ snapshots: expo-speech@57.0.1(expo@57.0.7): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-splash-screen@57.0.4(expo@57.0.7)(supports-color@9.4.0)(typescript@6.0.3): dependencies: '@expo/config-plugins': 57.0.5(supports-color@9.4.0)(typescript@6.0.3) '@expo/image-utils': 0.11.3(supports-color@9.4.0)(typescript@6.0.3) - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) xml2js: 0.6.0 transitivePeerDependencies: - supports-color @@ -10065,17 +10474,17 @@ snapshots: expo-updates-interface@57.0.1(expo@57.0.7): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) expo-web-browser@57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0)): dependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) react-native: 0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0) - expo@57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213): + expo@57.0.7(b68ae321bfe3a8002856ab9a07fab30e): dependencies: '@babel/runtime': 7.29.7 - '@expo/cli': 57.0.9(2d3b22c2103703c17c2fb47b72790f37) + '@expo/cli': 57.0.9(63ca68fcd1f3d0bd8b3ae037df52e0d5) '@expo/config': 57.0.5(supports-color@9.4.0)(typescript@6.0.3) '@expo/config-plugins': 57.0.5(supports-color@9.4.0)(typescript@6.0.3) '@expo/devtools': 57.0.1(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3) @@ -10100,6 +10509,7 @@ snapshots: whatwg-url-minimum: 0.1.2 optionalDependencies: '@expo/dom-webview': 57.0.1(expo@57.0.7)(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3) + react-dom: 19.2.8(react@19.2.3) react-native-webview: 13.17.0(react-native@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(@react-native/jest-preset@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(react@19.2.3)(supports-color@9.4.0))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@9.4.0))(supports-color@9.4.0))(@types/react@19.2.17)(react@19.2.3)(supports-color@9.4.0))(react@19.2.3) transitivePeerDependencies: - '@babel/core' @@ -10346,6 +10756,8 @@ snapshots: hasown: 2.0.4 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-package-type@0.1.0: {} get-proto@1.0.1: @@ -10945,7 +11357,7 @@ snapshots: server-only: 0.0.1 stacktrace-js: 2.0.2 optionalDependencies: - expo: 57.0.7(09a92d6f4cb27d968ea2a7d0b76b3213) + expo: 57.0.7(b68ae321bfe3a8002856ab9a07fab30e) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -12100,6 +12512,11 @@ snapshots: - bufferutil - utf-8-validate + react-dom@19.2.8(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + react-freeze@1.0.4(react@19.2.3): dependencies: react: 19.2.3 @@ -12315,6 +12732,33 @@ snapshots: react-refresh@0.14.2: {} + react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.3): + dependencies: + react: 19.2.3 + react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.3) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + + react-remove-scroll@2.7.2(@types/react@19.2.17)(react@19.2.3): + dependencies: + react: 19.2.3 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@19.2.3) + react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.3) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.17)(react@19.2.3) + use-sidecar: 1.1.3(@types/react@19.2.17)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.17 + + react-style-singleton@2.2.3(@types/react@19.2.17)(react@19.2.3): + dependencies: + get-nonce: 1.0.1 + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + react-test-renderer@19.2.3(react@19.2.3): dependencies: react: 19.2.3 @@ -13074,10 +13518,25 @@ snapshots: dependencies: iconv-lite: 0.6.3 + use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.3): + dependencies: + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + use-latest-callback@0.2.6(react@19.2.3): dependencies: react: 19.2.3 + use-sidecar@1.1.3(@types/react@19.2.17)(react@19.2.3): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + use-sync-external-store@1.6.0(react@19.2.3): dependencies: react: 19.2.3 @@ -13098,6 +13557,15 @@ snapshots: vary@1.1.2: {} + vaul@1.1.2(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3): + dependencies: + '@radix-ui/react-dialog': 1.1.23(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.8(react@19.2.3) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + vlq@1.0.1: {} w3c-xmlserializer@4.0.0: diff --git a/src/components/ExpoUI/ExpoHost.tsx b/src/components/ExpoUI/ExpoHost.tsx new file mode 100644 index 0000000000..b075b7c228 --- /dev/null +++ b/src/components/ExpoUI/ExpoHost.tsx @@ -0,0 +1,25 @@ +import { Host, type HostProps } from '@expo/ui/jetpack-compose'; +import { ThemeColors } from '@theme/types'; +import { getExpoHostThemeProps } from './theme'; + +export interface ExpoHostProps + extends Omit { + /** LNReader theme used to derive the Host's colorScheme and seedColor. */ + theme: ThemeColors; +} + +/** + * LNReader's reusable entry point into a Jetpack Compose subtree. Screens and + * other components should render Compose primitives through this wrapper (or + * one built on it) instead of importing `@expo/ui` directly, so the + * colorScheme/seedColor mapping stays centralized in one place. + */ +export function ExpoHost({ theme, children, ...rest }: ExpoHostProps) { + const { colorScheme, seedColor } = getExpoHostThemeProps(theme); + + return ( + + {children} + + ); +} diff --git a/src/components/ExpoUI/__tests__/theme.test.ts b/src/components/ExpoUI/__tests__/theme.test.ts new file mode 100644 index 0000000000..9ea575127b --- /dev/null +++ b/src/components/ExpoUI/__tests__/theme.test.ts @@ -0,0 +1,77 @@ +import { getExpoHostThemeProps, getSegmentedButtonColors } from '../theme'; +import type { ThemeColors } from '@theme/types'; + +const baseTheme = { + isDark: false, + primary: 'rgb(0, 87, 206)', + secondaryContainer: 'rgb(220, 226, 249)', + onSecondaryContainer: 'rgb(21, 27, 44)', + onSurface: 'rgb(27, 27, 31)', + outline: 'rgb(117, 119, 128)', + surfaceDisabled: 'rgba(27, 27, 31, 0.12)', + onSurfaceDisabled: 'rgba(27, 27, 31, 0.38)', +} as ThemeColors; + +describe('getExpoHostThemeProps', () => { + it('maps a light theme to a light colorScheme and its primary as seedColor', () => { + expect(getExpoHostThemeProps(baseTheme)).toEqual({ + colorScheme: 'light', + seedColor: baseTheme.primary, + }); + }); + + it('maps a dark theme to a dark colorScheme', () => { + expect( + getExpoHostThemeProps({ ...baseTheme, isDark: true } as ThemeColors), + ).toEqual({ + colorScheme: 'dark', + seedColor: baseTheme.primary, + }); + }); + + it('reflects custom theme accent colors so non-default themes stay in seed', () => { + const customTheme = { + ...baseTheme, + primary: 'rgb(250, 128, 114)', + } as ThemeColors; + + expect(getExpoHostThemeProps(customTheme).seedColor).toBe( + 'rgb(250, 128, 114)', + ); + }); +}); + +describe('getSegmentedButtonColors', () => { + it('maps the selected segment to secondaryContainer/onSecondaryContainer', () => { + const colors = getSegmentedButtonColors(baseTheme); + + expect(colors.activeContainerColor).toBe(baseTheme.secondaryContainer); + expect(colors.activeContentColor).toBe(baseTheme.onSecondaryContainer); + }); + + it('maps the unselected segment to a transparent container and onSurface text', () => { + const colors = getSegmentedButtonColors(baseTheme); + + expect(colors.inactiveContainerColor).toBe('transparent'); + expect(colors.inactiveContentColor).toBe(baseTheme.onSurface); + }); + + it('uses the theme outline color for borders in every state', () => { + const colors = getSegmentedButtonColors(baseTheme); + + expect(colors.activeBorderColor).toBe(baseTheme.outline); + expect(colors.inactiveBorderColor).toBe(baseTheme.outline); + expect(colors.disabledActiveBorderColor).toBe(baseTheme.outline); + expect(colors.disabledInactiveBorderColor).toBe(baseTheme.outline); + }); + + it('maps disabled states to surfaceDisabled/onSurfaceDisabled', () => { + const colors = getSegmentedButtonColors(baseTheme); + + expect(colors.disabledActiveContainerColor).toBe(baseTheme.surfaceDisabled); + expect(colors.disabledActiveContentColor).toBe(baseTheme.onSurfaceDisabled); + expect(colors.disabledInactiveContentColor).toBe( + baseTheme.onSurfaceDisabled, + ); + }); +}); diff --git a/src/components/ExpoUI/index.ts b/src/components/ExpoUI/index.ts new file mode 100644 index 0000000000..c4f9698050 --- /dev/null +++ b/src/components/ExpoUI/index.ts @@ -0,0 +1,4 @@ +export { ExpoHost } from './ExpoHost'; +export type { ExpoHostProps } from './ExpoHost'; +export { getExpoHostThemeProps, getSegmentedButtonColors } from './theme'; +export type { ExpoHostThemeProps } from './theme'; diff --git a/src/components/ExpoUI/theme.ts b/src/components/ExpoUI/theme.ts new file mode 100644 index 0000000000..9469fe2fae --- /dev/null +++ b/src/components/ExpoUI/theme.ts @@ -0,0 +1,47 @@ +import { type ColorSchemeName, type ColorValue } from 'react-native'; +import type { SegmentedButtonColors } from '@expo/ui/jetpack-compose'; +import { ThemeColors } from '@theme/types'; + +export interface ExpoHostThemeProps { + colorScheme: ColorSchemeName; + seedColor: ColorValue; +} + +/** + * Maps an LNReader theme to the Host props that seed Compose's Material You + * palette. `seedColor` keeps the generated palette in the theme's hue even on + * pre-Android-12 devices where dynamic color isn't otherwise available. + * Components that need exact parity with LNReader's custom themes (e.g. + * catppuccin, tako) should still pass explicit colors rather than relying on + * the seed-generated palette alone. + */ +export function getExpoHostThemeProps(theme: ThemeColors): ExpoHostThemeProps { + return { + colorScheme: theme.isDark ? 'dark' : 'light', + seedColor: theme.primary, + }; +} + +/** + * Maps LNReader's segmented-control color roles onto Compose's + * `SegmentedButtonColors`, mirroring the previous RN implementation + * (`secondaryContainer`/`onSecondaryContainer` for the selected segment). + */ +export function getSegmentedButtonColors( + theme: ThemeColors, +): SegmentedButtonColors { + return { + activeContainerColor: theme.secondaryContainer, + activeContentColor: theme.onSecondaryContainer, + activeBorderColor: theme.outline, + inactiveContainerColor: 'transparent', + inactiveContentColor: theme.onSurface, + inactiveBorderColor: theme.outline, + disabledActiveContainerColor: theme.surfaceDisabled, + disabledActiveContentColor: theme.onSurfaceDisabled, + disabledActiveBorderColor: theme.outline, + disabledInactiveContainerColor: 'transparent', + disabledInactiveContentColor: theme.onSurfaceDisabled, + disabledInactiveBorderColor: theme.outline, + }; +} diff --git a/src/components/SegmentedControl/SegmentedControl.tsx b/src/components/SegmentedControl/SegmentedControl.tsx index 4a4f1478b4..ed00db497c 100644 --- a/src/components/SegmentedControl/SegmentedControl.tsx +++ b/src/components/SegmentedControl/SegmentedControl.tsx @@ -7,6 +7,11 @@ import { GestureResponderEvent, } from 'react-native'; import MaterialCommunityIcons from '@react-native-vector-icons/material-design-icons'; +import { + SegmentedButton, + SingleChoiceSegmentedButtonRow, +} from '@expo/ui/jetpack-compose'; +import { ExpoHost, getSegmentedButtonColors } from '@components/ExpoUI'; import { ThemeColors } from '@theme/types'; export interface SegmentedControlOption { @@ -18,7 +23,7 @@ export interface SegmentedControlOption { export interface SegmentedControlProps { options: SegmentedControlOption[]; value: T; - onChange: (value: T, event: GestureResponderEvent) => void; + onChange: (value: T, event?: GestureResponderEvent) => void; theme: ThemeColors; showCheckIcon?: boolean; showLabels?: boolean; @@ -32,6 +37,39 @@ export function SegmentedControl({ showCheckIcon = true, showLabels = true, }: SegmentedControlProps) { + /** + * Compose's SegmentedButton only exposes a `Label` slot and always shows + * Material 3's default check icon on the selected segment, so icon-only + * controls (and the unsupported labels-without-check combination) keep the + * previous React Native implementation below. + */ + const useComposeSegmentedButtons = + showLabels && showCheckIcon && !options.some(option => option.icon); + + if (useComposeSegmentedButtons) { + const colors = getSegmentedButtonColors(theme); + return ( + + + {options.map(option => ( + onChange(option.value)} + colors={colors} + > + {option.label} + + ))} + + + ); + } + return ( {options.map((option, index) => { @@ -99,6 +137,9 @@ export function SegmentedControl({ } const styles = StyleSheet.create({ + host: { + width: '100%', + }, container: { flexDirection: 'row', height: 40, diff --git a/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx b/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx new file mode 100644 index 0000000000..85071ec94c --- /dev/null +++ b/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx @@ -0,0 +1,140 @@ +import { fireEvent, render, screen } from '@testing-library/react-native'; + +import { SegmentedControl } from '../SegmentedControl'; +import type { ThemeColors } from '@theme/types'; + +const mockTheme = { + isDark: false, + primary: 'rgb(0, 87, 206)', + secondaryContainer: 'rgb(220, 226, 249)', + onSecondaryContainer: 'rgb(21, 27, 44)', + onSurface: 'rgb(27, 27, 31)', + outline: 'rgb(117, 119, 128)', + surfaceDisabled: 'rgba(27, 27, 31, 0.12)', + onSurfaceDisabled: 'rgba(27, 27, 31, 0.38)', + rippleColor: 'rgba(0, 87, 206, 0.12)', +} as ThemeColors; + +const options = [ + { value: 'system', label: 'System' }, + { value: 'light', label: 'Light' }, + { value: 'dark', label: 'Dark' }, +]; + +describe('SegmentedControl (label-based, Compose path)', () => { + it('renders every option as a radio-role segment', () => { + render( + {}} + theme={mockTheme} + />, + ); + + const segments = screen.getAllByRole('radio'); + expect(segments).toHaveLength(3); + }); + + it('marks only the selected option as checked', () => { + render( + {}} + theme={mockTheme} + />, + ); + + const segments = screen.getAllByRole('radio'); + expect(segments[0].props.accessibilityState.checked).toBe(false); + expect(segments[1].props.accessibilityState.checked).toBe(true); + expect(segments[2].props.accessibilityState.checked).toBe(false); + }); + + it('calls onChange with the pressed option value', () => { + const onChange = jest.fn(); + render( + , + ); + + fireEvent.press(screen.getAllByRole('radio')[2]); + + expect(onChange).toHaveBeenCalledWith('dark'); + }); + + it('maps the selected segment to the theme secondaryContainer colors', () => { + render( + {}} + theme={mockTheme} + />, + ); + + const selected = screen.getAllByRole('radio')[1]; + expect(selected.props.colors).toMatchObject({ + activeContainerColor: mockTheme.secondaryContainer, + activeContentColor: mockTheme.onSecondaryContainer, + }); + }); +}); + +describe('SegmentedControl (icon-only, React Native fallback)', () => { + const iconOptions = [ + { value: 'left', label: 'Align left', icon: 'format-align-left' as const }, + { + value: 'center', + label: 'Align center', + icon: 'format-align-center' as const, + }, + ]; + + it('keeps the Pressable-based implementation for icon-only controls', () => { + render( + {}} + showCheckIcon={false} + showLabels={false} + theme={mockTheme} + />, + ); + + // The RN fallback renders labels as an accessibilityLabel, not visible text. + expect(screen.queryByText('Align left')).toBeNull(); + const segment = screen.getByLabelText('Align left'); + expect(segment.props.accessibilityRole).toBe('radio'); + expect(segment.props.accessibilityState).toEqual({ checked: true }); + }); + + it('still calls onChange with the option value and press event', () => { + const onChange = jest.fn(); + render( + , + ); + + fireEvent.press(screen.getByLabelText('Align center'), { + nativeEvent: {}, + }); + + expect(onChange).toHaveBeenCalledWith( + 'center', + expect.objectContaining({ nativeEvent: expect.anything() }), + ); + }); +}); diff --git a/test/mocks/expoUI.js b/test/mocks/expoUI.js new file mode 100644 index 0000000000..9da64157de --- /dev/null +++ b/test/mocks/expoUI.js @@ -0,0 +1,61 @@ +/** + * Jest can't run the native Jetpack Compose views @expo/ui renders on + * Android, so this replaces the jetpack-compose entry point with plain React + * Native primitives that preserve the props/callbacks LNReader wrappers rely + * on (selection state, onClick, colors) for behavioral testing. + */ +jest.mock('@expo/ui/jetpack-compose', () => { + const React = require('react'); + const { View, Text, Pressable } = require('react-native'); + + const Host = ({ children, style }) => + React.createElement(View, { style }, children); + + const SingleChoiceSegmentedButtonRow = ({ children }) => + React.createElement(View, { accessibilityRole: 'radiogroup' }, children); + + const MultiChoiceSegmentedButtonRow = ({ children }) => + React.createElement(View, null, children); + + const SegmentedButtonLabel = ({ children }) => + React.createElement(Text, null, children); + + const SegmentedButton = ({ + selected, + checked, + onClick, + onCheckedChange, + enabled = true, + colors, + children, + }) => + React.createElement( + Pressable, + { + accessibilityRole: 'radio', + accessibilityState: { + checked: selected ?? checked ?? false, + disabled: !enabled, + }, + disabled: !enabled, + onPress: () => { + onClick?.(); + if (onCheckedChange) onCheckedChange(!checked); + }, + testID: 'segmented-button', + colors, + }, + children, + ); + SegmentedButton.Label = SegmentedButtonLabel; + + return { + Host, + SingleChoiceSegmentedButtonRow, + MultiChoiceSegmentedButtonRow, + SegmentedButton, + useMaterialColors: jest.fn(() => ({})), + getMaterialColors: jest.fn(() => ({})), + isDynamicColorAvailable: false, + }; +}); diff --git a/test/mocks/index.js b/test/mocks/index.js index bdd4dff118..b0ed5fc58e 100644 --- a/test/mocks/index.js +++ b/test/mocks/index.js @@ -2,3 +2,4 @@ require('./nativeModules'); require('./react-native-nitro-modules'); require('./database'); require('./react-navigation'); +require('./expoUI');